| // Copyright 2026 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| |
| #ifndef THIRD_PARTY_CREDENTIO_TSP_VERIFIED_TIMESTAMP_H_ |
| #define THIRD_PARTY_CREDENTIO_TSP_VERIFIED_TIMESTAMP_H_ |
| |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include "absl/status/status.h" |
| #include "absl/status/statusor.h" |
| #include "absl/strings/string_view.h" |
| #include "absl/time/time.h" |
| #include "absl/types/span.h" |
| #include "crypto/algorithms.h" |
| |
| namespace credentio { |
| |
| // Represents a TimeStampToken (RFC 3161 section 2.4.2) that has passed |
| // signature checks. The trustworthiness of signatures is not checked, callers |
| // should verify this before use. |
| class VerifiedTimestamp final { |
| public: |
| static absl::StatusOr<VerifiedTimestamp> Create( |
| absl::Time asserted_time, std::vector<std::string> certificate_chain, |
| std::string message_imprint_hash, |
| HashAlgorithm message_imprint_hash_algorithm, std::string nonce) { |
| if (certificate_chain.empty()) { |
| return absl::InvalidArgumentError("certificate_chain must not be empty"); |
| } |
| return VerifiedTimestamp(asserted_time, std::move(certificate_chain), |
| std::move(message_imprint_hash), |
| message_imprint_hash_algorithm, std::move(nonce)); |
| } |
| |
| // The time at which the timestamp was generated (genTime in RFC 3161). |
| absl::Time asserted_time() const { return asserted_time_; } |
| |
| // The signing certificate of the Time Stamping Authority (TSA), DER-encoded. |
| absl::string_view tsa_certificate() const { |
| return certificate_chain_.front(); |
| } |
| |
| // The full certificate chain of the TSA, starting with the signing |
| // certificate, DER-encoded. |
| absl::Span<const std::string> certificate_chain() const { |
| return certificate_chain_; |
| } |
| |
| // The hash value of the data that was timestamped (hashedMessage in RFC |
| // 3161). |
| absl::string_view message_imprint_hash() const { |
| return message_imprint_hash_; |
| } |
| |
| // The hash algorithm used to calculate the message imprint. |
| HashAlgorithm message_imprint_hash_algorithm() const { |
| return message_imprint_hash_algorithm_; |
| } |
| |
| // The ASN.1 / DER INTEGER element, with tag / length prefix. May be empty if |
| // the field was absent in the source TimeStampToken. |
| absl::string_view nonce() const { return nonce_; } |
| |
| private: |
| VerifiedTimestamp(absl::Time asserted_time, |
| std::vector<std::string>&& certificate_chain, |
| std::string&& message_imprint_hash, |
| HashAlgorithm message_imprint_hash_algorithm, |
| std::string nonce) |
| : asserted_time_(asserted_time), |
| certificate_chain_(std::move(certificate_chain)), |
| message_imprint_hash_(std::move(message_imprint_hash)), |
| message_imprint_hash_algorithm_(message_imprint_hash_algorithm), |
| nonce_(std::move(nonce)) {} |
| |
| absl::Time asserted_time_; |
| std::vector<std::string> certificate_chain_; |
| std::string message_imprint_hash_; |
| HashAlgorithm message_imprint_hash_algorithm_; |
| std::string nonce_; |
| }; |
| |
| } // namespace credentio |
| |
| #endif // THIRD_PARTY_CREDENTIO_TSP_VERIFIED_TIMESTAMP_H_ |