From aaf59e8d8d17308442d9211e670c7f9718362ceb Mon Sep 17 00:00:00 2001 From: Matt Mueller Date: Wed, 7 Aug 2024 16:27:09 -0700 Subject: [PATCH] Add Certs method to CertIssuerSourceStatic to return all certs. Change-Id: Ib7ec2588f545102a49862491e84028c0527e6363 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/70067 Commit-Queue: Matt Mueller Reviewed-by: David Benjamin Commit-Queue: David Benjamin --- pki/cert_issuer_source_static.cc | 10 ++++++ pki/cert_issuer_source_static.h | 4 +++ pki/cert_issuer_source_static_unittest.cc | 37 ++++++++++++++++++++++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/pki/cert_issuer_source_static.cc b/pki/cert_issuer_source_static.cc index fc20eb967..162b8de40 100644 --- a/pki/cert_issuer_source_static.cc +++ b/pki/cert_issuer_source_static.cc @@ -17,6 +17,16 @@ void CertIssuerSourceStatic::AddCert( void CertIssuerSourceStatic::Clear() { intermediates_.clear(); } +std::vector> +CertIssuerSourceStatic::Certs() const { + std::vector> result; + result.reserve(intermediates_.size()); + for (const auto& [key, cert] : intermediates_) { + result.push_back(cert); + } + return result; +} + void CertIssuerSourceStatic::SyncGetIssuersOf(const ParsedCertificate *cert, ParsedCertificateList *issuers) { auto range = diff --git a/pki/cert_issuer_source_static.h b/pki/cert_issuer_source_static.h index 1e6093444..a0395efb8 100644 --- a/pki/cert_issuer_source_static.h +++ b/pki/cert_issuer_source_static.h @@ -6,6 +6,7 @@ #define BSSL_PKI_CERT_ISSUER_SOURCE_STATIC_H_ #include +#include #include @@ -30,6 +31,9 @@ class OPENSSL_EXPORT CertIssuerSourceStatic : public CertIssuerSource { // Clears the set of certificates. void Clear(); + // Returns a vector containing all the certificates added to this source. + std::vector> Certs() const; + size_t size() const { return intermediates_.size(); } // CertIssuerSource implementation: diff --git a/pki/cert_issuer_source_static_unittest.cc b/pki/cert_issuer_source_static_unittest.cc index 36f809aa9..8b0a36c63 100644 --- a/pki/cert_issuer_source_static_unittest.cc +++ b/pki/cert_issuer_source_static_unittest.cc @@ -4,6 +4,7 @@ #include "cert_issuer_source_static.h" +#include #include #include "cert_issuer_source_sync_unittest.h" #include "parsed_certificate.h" @@ -24,7 +25,7 @@ class CertIssuerSourceStaticTestDelegate { CertIssuerSourceStatic source_; }; -INSTANTIATE_TYPED_TEST_SUITE_P(CertIssuerSourceStaticTest, +INSTANTIATE_TYPED_TEST_SUITE_P(CertIssuerSourceStaticSyncTest, CertIssuerSourceSyncTest, CertIssuerSourceStaticTestDelegate); @@ -35,6 +36,40 @@ INSTANTIATE_TYPED_TEST_SUITE_P(CertIssuerSourceStaticNormalizationTest, GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST( CertIssuerSourceSyncNotNormalizedTest); +TEST(CertIssuerSourceStaticTest, AddCertsGetCertsAndClear) { + std::string test_dir = "testdata/cert_issuer_source_static_unittest/"; + std::shared_ptr cert1 = + ReadCertFromFile(test_dir + "root.pem"); + ASSERT_TRUE(cert1); + std::shared_ptr cert2 = + ReadCertFromFile(test_dir + "i1_1.pem"); + ASSERT_TRUE(cert2); + std::shared_ptr cert3 = + ReadCertFromFile(test_dir + "i1_2.pem"); + ASSERT_TRUE(cert3); + + CertIssuerSourceStatic source; + EXPECT_TRUE(source.Certs().empty()); + EXPECT_EQ(source.size(), 0u); + + source.AddCert(cert1); + EXPECT_THAT(source.Certs(), testing::UnorderedElementsAre(cert1)); + EXPECT_EQ(source.size(), 1u); + + source.AddCert(cert2); + EXPECT_THAT(source.Certs(), testing::UnorderedElementsAre(cert1, cert2)); + EXPECT_EQ(source.size(), 2u); + + source.AddCert(cert3); + EXPECT_THAT(source.Certs(), + testing::UnorderedElementsAre(cert1, cert2, cert3)); + EXPECT_EQ(source.size(), 3u); + + source.Clear(); + EXPECT_TRUE(source.Certs().empty()); + EXPECT_EQ(source.size(), 0u); +} + } // namespace } // namespace bssl