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