| // 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" |
| |
| BSSL_NAMESPACE_BEGIN |
| |
| 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::AddDistrustedCertificateBySPKI(std::string spki) { |
| distrusted_spkis_.insert(std::move(spki)); |
| } |
| |
| 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(BytesAsStringView(cert->normalized_issuer())); |
| for (auto it = range.first; it != range.second; ++it) { |
| issuers->push_back(it->second.cert); |
| } |
| } |
| |
| CertificateTrust TrustStoreInMemory::GetTrust(const ParsedCertificate *cert) { |
| // Check SPKI distrust first. |
| if (distrusted_spkis_.find(BytesAsStringView(cert->tbs().spki_tlv)) != |
| distrusted_spkis_.end()) { |
| return CertificateTrust::ForDistrusted(); |
| } |
| |
| 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_.emplace(BytesAsStringView(entry.cert->normalized_subject()), entry); |
| } |
| |
| const TrustStoreInMemory::Entry *TrustStoreInMemory::GetEntry( |
| const ParsedCertificate *cert) const { |
| auto range = |
| entries_.equal_range(BytesAsStringView(cert->normalized_subject())); |
| 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; |
| } |
| |
| BSSL_NAMESPACE_END |