diff --git a/src/pki/cert_issuer_source_static.cc b/src/pki/cert_issuer_source_static.cc index fc20eb967..162b8de40 100644 --- a/src/pki/cert_issuer_source_static.cc +++ b/src/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/src/pki/cert_issuer_source_static.h b/src/pki/cert_issuer_source_static.h index 1e6093444..a0395efb8 100644 --- a/src/pki/cert_issuer_source_static.h +++ b/src/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/src/pki/cert_issuer_source_static_unittest.cc b/src/pki/cert_issuer_source_static_unittest.cc index 36f809aa9..8b0a36c63 100644 --- a/src/pki/cert_issuer_source_static_unittest.cc +++ b/src/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