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 <mattm@google.com> Reviewed-by: David Benjamin <davidben@google.com> Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/pki/cert_issuer_source_static.cc b/pki/cert_issuer_source_static.cc index fc20eb9..162b8de 100644 --- a/pki/cert_issuer_source_static.cc +++ b/pki/cert_issuer_source_static.cc
@@ -17,6 +17,16 @@ void CertIssuerSourceStatic::Clear() { intermediates_.clear(); } +std::vector<std::shared_ptr<const ParsedCertificate>> +CertIssuerSourceStatic::Certs() const { + std::vector<std::shared_ptr<const ParsedCertificate>> 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 1e60934..a0395ef 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 <unordered_map> +#include <vector> #include <openssl/base.h> @@ -30,6 +31,9 @@ // Clears the set of certificates. void Clear(); + // Returns a vector containing all the certificates added to this source. + std::vector<std::shared_ptr<const ParsedCertificate>> 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 36f809a..8b0a36c 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 <gmock/gmock.h> #include <gtest/gtest.h> #include "cert_issuer_source_sync_unittest.h" #include "parsed_certificate.h" @@ -24,7 +25,7 @@ CertIssuerSourceStatic source_; }; -INSTANTIATE_TYPED_TEST_SUITE_P(CertIssuerSourceStaticTest, +INSTANTIATE_TYPED_TEST_SUITE_P(CertIssuerSourceStaticSyncTest, CertIssuerSourceSyncTest, CertIssuerSourceStaticTestDelegate); @@ -35,6 +36,40 @@ GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST( CertIssuerSourceSyncNotNormalizedTest); +TEST(CertIssuerSourceStaticTest, AddCertsGetCertsAndClear) { + std::string test_dir = "testdata/cert_issuer_source_static_unittest/"; + std::shared_ptr<const ParsedCertificate> cert1 = + ReadCertFromFile(test_dir + "root.pem"); + ASSERT_TRUE(cert1); + std::shared_ptr<const ParsedCertificate> cert2 = + ReadCertFromFile(test_dir + "i1_1.pem"); + ASSERT_TRUE(cert2); + std::shared_ptr<const ParsedCertificate> 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