blob: fe2abab28a777c1a42c42f3285afc98d16b3e61c [file]
// 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.
//
#include "cose/timestamp_creator.h"
#include <memory>
#include <string>
#include <utility>
#include "absl/status/status.h"
#include "absl/status/status_matchers.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "absl/time/clock_interface.h"
#include "absl/time/simulated_clock.h"
#include "absl/time/time.h"
#include "cose/sig_structure.h"
#include "cose/simple_cms_parser.h"
#include "crypto/default/hasher.h"
#include "crypto/timestamp_write_handler.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "testing/create_test_crypto_write_handler.h"
#include "testing/local_key_crypto_write_handler.h"
#include "tsp/parsed_timestamp_token.h"
#include "tsp/timestamp_verifier.h"
#include "tsp/verified_timestamp.h"
namespace credentio {
namespace {
constexpr absl::Time kTestTime = absl::FromUnixSeconds(1741403167);
absl::StatusOr<std::unique_ptr<TimestampWriteHandler>> CreateTimestampHandler(
absl::Clock* clock) {
return CreateTestCryptoWriteHandler({.clock = clock});
}
absl::StatusOr<std::string> CreateTimestamp(
TimestampCreator& creator, TimestampCreator::Options options,
CoseSign1TaggedStructure cose_sign1) {
absl::StatusOr<std::string> result =
absl::InternalError("Callback not called");
// We pass a ref to this temporary struct to catch bugs where the
// provided ref might be accessed after CreateTimestamp returns.
CoseSign1TaggedStructure cose_sign1_copy = cose_sign1;
creator.CreateTimestamp(cose_sign1_copy, std::move(options),
[&](absl::StatusOr<std::string> cb_result) {
result = std::move(cb_result);
});
return result;
}
TEST(TimestampCreator, CreateTimestamp) {
// Create a timestamp creator.
absl::SimulatedClock clock;
clock.SetTime(kTestTime);
absl::StatusOr<std::unique_ptr<TimestampWriteHandler>> timestamp_handler =
CreateTimestampHandler(&clock);
ABSL_ASSERT_OK(timestamp_handler);
TimestampCreator timestamp_creator(timestamp_handler->get(),
&DefaultHasherFactory());
// Create a timestamp.
CoseSign1TaggedStructure cose_sign1{.protected_header = "def",
.signature = "abc"};
absl::StatusOr<std::string> timestamp =
CreateTimestamp(timestamp_creator, /*options=*/{}, cose_sign1);
ABSL_ASSERT_OK(timestamp);
// Verify the timestamp.
TimestampVerifier verifier(/*tsa_roots=*/nullptr);
SimpleCmsParser parser;
absl::StatusOr<std::unique_ptr<ParsedTimestampToken>> parsed_token =
parser.ParseTimestampToken(*timestamp);
ABSL_ASSERT_OK(parsed_token);
absl::StatusOr<VerifiedTimestamp> verified_timestamp =
verifier.VerifyTimestampToken(**parsed_token);
ABSL_ASSERT_OK(verified_timestamp);
EXPECT_EQ(verified_timestamp->asserted_time(), kTestTime);
}
} // namespace
} // namespace credentio