| // 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, ×tamp)); |
| 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 |