blob: 09efd721726446a77df2c10a4ee18330024fc936 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/cert/internal/trust_store_in_memory.h"
namespace net {
TrustStoreInMemory::TrustStoreInMemory() = default;
TrustStoreInMemory::~TrustStoreInMemory() = default;
void TrustStoreInMemory::Clear() {
entries_.clear();
}
void TrustStoreInMemory::AddTrustAnchor(scoped_refptr<ParsedCertificate> cert) {
AddCertificate(std::move(cert), CertificateTrust::ForTrustAnchor());
}
void TrustStoreInMemory::AddTrustAnchorWithConstraints(
scoped_refptr<ParsedCertificate> cert) {
AddCertificate(std::move(cert),
CertificateTrust::ForTrustAnchorEnforcingConstraints());
}
void TrustStoreInMemory::AddDistrustedCertificateForTest(
scoped_refptr<ParsedCertificate> cert) {
AddCertificate(std::move(cert), CertificateTrust::ForDistrusted());
}
void TrustStoreInMemory::AddCertificateWithUnspecifiedTrust(
scoped_refptr<ParsedCertificate> cert) {
AddCertificate(std::move(cert), CertificateTrust::ForUnspecified());
}
void TrustStoreInMemory::SyncGetIssuersOf(const ParsedCertificate* cert,
ParsedCertificateList* issuers) {
auto range = entries_.equal_range(cert->normalized_issuer().AsStringPiece());
for (auto it = range.first; it != range.second; ++it)
issuers->push_back(it->second.cert);
}
void TrustStoreInMemory::GetTrust(const scoped_refptr<ParsedCertificate>& cert,
CertificateTrust* trust) const {
auto range = entries_.equal_range(cert->normalized_subject().AsStringPiece());
for (auto it = range.first; it != range.second; ++it) {
if (cert.get() == it->second.cert.get() ||
cert->der_cert() == it->second.cert->der_cert()) {
*trust = it->second.trust;
// NOTE: ambiguity when there are duplicate entries.
return;
}
}
*trust = CertificateTrust::ForUnspecified();
}
bool TrustStoreInMemory::Contains(const ParsedCertificate* cert) const {
for (const auto& it : entries_) {
if (cert->der_cert() == it.second.cert->der_cert())
return true;
}
return false;
}
TrustStoreInMemory::Entry::Entry() = default;
TrustStoreInMemory::Entry::Entry(const Entry& other) = default;
TrustStoreInMemory::Entry::~Entry() = default;
void TrustStoreInMemory::AddCertificate(scoped_refptr<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().AsStringPiece(), entry));
}
} // namespace net