blob: 62a0baebc35ca5dbe26cd86cc2c31d8aaba7c975 [file] [edit]
// 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/simple_cms_parser.h"
#include <memory>
#include <string>
#include <utility>
#include "absl/status/status.h"
#include "absl/status/status_matchers.h"
#include "absl/strings/escaping.h"
#include "absl/strings/string_view.h"
#include "crypto/algorithms.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "tsp/parsed_timestamp_token.h"
namespace credentio {
namespace {
using ::absl_testing::IsOk;
using ::absl_testing::IsOkAndHolds;
using ::absl_testing::StatusIs;
using ::testing::IsEmpty;
using ::testing::Not;
constexpr absl::string_view kTestTimestampBase64 =
"MIIELgYJKoZIhvcNAQcCoIIEHzCCBBsCAQMxDzANBglghkgBZQMEAgEFADBtBgsqhkiG9w0B"
"CRABBKBeBFwwWgIBAQYLKoZIhvcSBAGEtwkwLzALBglghkgBZQMEAgEEIEvMhz4zDmm90cO7"
"V4KzzQtZsdcDbHNnB3pLBuM40dwzAgEBGA8yMDI1MDMwODAzMDYwN1owAAEB/6CCAdswggHX"
"MIIBXKADAgECAhRpQze1ZW5xPO9VZQ1jQeMUoEASTDAKBggqhkjOPQQDAjAmMSQwIgYDVQQD"
"DBtHb29nbGUgQzJQQSBUZXN0aW5nIFJvb3QgQ0EwIBcNMjUwMjA0MjE0MjE0WhgPMjEyNTAx"
"MTEyMTQyMTRaMCIxIDAeBgNVBAMMF0dvb2dsZSBDMlBBIFRlc3RpbmcgVFNBMFkwEwYHKoZI"
"zj0CAQYIKoZIzj0DAQcDQgAEuUuyy7wwl0MJLdRXgI9wjWXiWdDtjpXuMBoBdO3vBtGc3yVu"
"NwyZ/NjiaqFzocy0VipiPhR47u22OS/MjY98aaNqMGgwDgYDVR0PAQH/BAQDAgeAMBYGA1Ud"
"JQEB/wQMMAoGCCsGAQUFBwMIMB0GA1UdDgQWBBR5bJKsXm0pzYLB7sDOTEAtdVfIjDAfBgNV"
"HSMEGDAWgBTTMOrQr2ny9gYyywPGUZGx/KENtzAKBggqhkjOPQQDAgNpADBmAjEA/AIooYzK"
"ZhXynaBcMPIlIxscmd8e78W995pZgXprq3AIK3sgV6ElZvKD9/Wn/dDtAjEArTIsjov8VNA9"
"FoHedkGbg5zD1BnXvWqKwMp3XBbzeaOYUCn1o0WUW/bJC30DU14RMYIBtTCCAbECAQEwPjAm"
"MSQwIgYDVQQDDBtHb29nbGUgQzJQQSBUZXN0aW5nIFJvb3QgQ0ECFGlDN7VlbnE871VlDWNB"
"4xSgQBJMMA0GCWCGSAFlAwQCAQUAoIIBAjAvBgkqhkiG9w0BCQQxIgQgN8dNxTh6LWv1EaL+"
"ofr4okM1B8iSO/Gl00H5EaCJS+YwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqG"
"SIb3DQEJBTEPFw0xNTAzMzAxODAxMjNaMFwGCSqGSIb3DQEJDzFPME0wCwYJYIZIAWUDBAEq"
"MAsGCWCGSAFlAwQBFjALBglghkgBZQMEAQIwCgYIKoZIhvcNAwcwCwYJKoZIhvcNAQEHMAsG"
"CWCGSAFlAwQCATA3BgsqhkiG9w0BCRACLzEoMCYwJDAiBCDJQ1abcB8vef+N3PQLpUzfC7V8"
"WkIdUyUW/U2T9Y4EqDANBgkqhkiG9w0BAQEFAARIMEYCIQC4cdlBBcD7HlrGTj+8Kcfjj2+i"
"/xnE9/c61emmfJfTlQIhAKTiTMV71p0tHgFHyxsCIyIPCc96VfgYQ1qBMBolMeHf";
TEST(SimpleCmsParserTest, ParseValidTimestampToken) {
std::string timestamp;
ASSERT_TRUE(absl::Base64Unescape(kTestTimestampBase64, &timestamp));
SimpleCmsParser parser;
auto parsed_token = parser.ParseTimestampToken(timestamp);
ASSERT_TRUE(parsed_token.ok());
std::unique_ptr<ParsedTimestampToken> token = std::move(*parsed_token);
ASSERT_NE(token, nullptr);
EXPECT_THAT(token->VerifySignature(), IsOk());
EXPECT_THAT(token->GetMessageImprintHashAlgorithm(),
IsOkAndHolds(HashAlgorithm::kSha256));
EXPECT_THAT(token->GetCertificateChain(), IsOkAndHolds(Not(IsEmpty())));
EXPECT_THAT(token->GetSigningCertificateV2Bytes(),
IsOkAndHolds(Not(IsEmpty())));
EXPECT_THAT(token->GetTstInfoBytes(), IsOkAndHolds(Not(IsEmpty())));
}
TEST(SimpleCmsParserTest, ParseInvalidCmsBytes) {
SimpleCmsParser parser;
EXPECT_THAT(parser.ParseTimestampToken("invalid binary data"),
StatusIs(absl::StatusCode::kInvalidArgument));
}
} // namespace
} // namespace credentio