| // Copyright 2016 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "trust_store_in_memory.h" |
| |
| namespace bssl { |
| |
| TrustStoreInMemory::TrustStoreInMemory() = default; |
| TrustStoreInMemory::~TrustStoreInMemory() = default; |
| |
| bool TrustStoreInMemory::IsEmpty() const { |
| return entries_.empty(); |
| } |
| |
| void TrustStoreInMemory::Clear() { |
| entries_.clear(); |
| } |
| |
| void TrustStoreInMemory::AddTrustAnchor( |
| std::shared_ptr<const ParsedCertificate> cert) { |
| AddCertificate(std::move(cert), CertificateTrust::ForTrustAnchor()); |
| } |
| |
| void TrustStoreInMemory::AddTrustAnchorWithExpiration( |
| std::shared_ptr<const ParsedCertificate> cert) { |
| AddCertificate(std::move(cert), |
| CertificateTrust::ForTrustAnchor().WithEnforceAnchorExpiry()); |
| } |
| |
| void TrustStoreInMemory::AddTrustAnchorWithConstraints( |
| std::shared_ptr<const ParsedCertificate> cert) { |
| AddCertificate( |
| std::move(cert), |
| CertificateTrust::ForTrustAnchor().WithEnforceAnchorConstraints()); |
| } |
| |
| void TrustStoreInMemory::AddDistrustedCertificateForTest( |
| std::shared_ptr<const ParsedCertificate> cert) { |
| AddCertificate(std::move(cert), CertificateTrust::ForDistrusted()); |
| } |
| |
| void TrustStoreInMemory::AddCertificateWithUnspecifiedTrust( |
| std::shared_ptr<const ParsedCertificate> cert) { |
| AddCertificate(std::move(cert), CertificateTrust::ForUnspecified()); |
| } |
| |
| void TrustStoreInMemory::SyncGetIssuersOf(const ParsedCertificate* cert, |
| ParsedCertificateList* issuers) { |
| auto range = entries_.equal_range(cert->normalized_issuer().AsStringView()); |
| for (auto it = range.first; it != range.second; ++it) |
| issuers->push_back(it->second.cert); |
| } |
| |
| CertificateTrust TrustStoreInMemory::GetTrust( |
| const ParsedCertificate* cert, |
| void* debug_data) { |
| const Entry* entry = GetEntry(cert); |
| return entry ? entry->trust : CertificateTrust::ForUnspecified(); |
| } |
| |
| bool TrustStoreInMemory::Contains(const ParsedCertificate* cert) const { |
| return GetEntry(cert) != nullptr; |
| } |
| |
| TrustStoreInMemory::Entry::Entry() = default; |
| TrustStoreInMemory::Entry::Entry(const Entry& other) = default; |
| TrustStoreInMemory::Entry::~Entry() = default; |
| |
| void TrustStoreInMemory::AddCertificate( |
| std::shared_ptr<const ParsedCertificate> cert, |
| const CertificateTrust& trust) { |
| Entry entry; |
| entry.cert = std::move(cert); |
| entry.trust = trust; |
| |
| // TODO(mattm): should this check for duplicate certificates? |
| entries_.insert( |
| std::make_pair(entry.cert->normalized_subject().AsStringView(), entry)); |
| } |
| |
| const TrustStoreInMemory::Entry* TrustStoreInMemory::GetEntry( |
| const ParsedCertificate* cert) const { |
| auto range = entries_.equal_range(cert->normalized_subject().AsStringView()); |
| for (auto it = range.first; it != range.second; ++it) { |
| if (cert == it->second.cert.get() || |
| cert->der_cert() == it->second.cert->der_cert()) { |
| // NOTE: ambiguity when there are duplicate entries. |
| return &it->second; |
| } |
| } |
| return nullptr; |
| } |
| |
| } // namespace net |