// 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. #ifndef BSSL_PKI_TRUST_STORE_IN_MEMORY_H_ #define BSSL_PKI_TRUST_STORE_IN_MEMORY_H_ #include #include #include #include "trust_store.h" namespace bssl { // A very simple implementation of a TrustStore, which contains a set of // certificates and their trustedness. class OPENSSL_EXPORT TrustStoreInMemory : public TrustStore { public: TrustStoreInMemory(); TrustStoreInMemory(const TrustStoreInMemory &) = delete; TrustStoreInMemory &operator=(const TrustStoreInMemory &) = delete; ~TrustStoreInMemory() override; // Returns whether the TrustStore is in the initial empty state. bool IsEmpty() const; // Empties the trust store, resetting it to original state. void Clear(); // Adds a certificate with the specified trust settings. Both trusted and // distrusted certificates require a full DER match. void AddCertificate(std::shared_ptr cert, const CertificateTrust &trust); // Adds a certificate as a trust anchor (only the SPKI and subject will be // used during verification). void AddTrustAnchor(std::shared_ptr cert); // Adds a certificate as a trust anchor which will have expiration enforced. // See VerifyCertificateChain for details. void AddTrustAnchorWithExpiration( std::shared_ptr cert); // Adds a certificate as a trust anchor and extracts anchor constraints from // the certificate. See VerifyCertificateChain for details. void AddTrustAnchorWithConstraints( std::shared_ptr cert); // TODO(eroman): This is marked "ForTest" as the current implementation // requires an exact match on the certificate DER (a wider match by say // issuer/serial is probably what we would want for a real implementation). void AddDistrustedCertificateForTest( std::shared_ptr cert); // Distrusts the provided SPKI. This will override any other trust (e.g. if a // certificate is passed into AddTrustAnchor() and the certificate's SPKI is // passed into AddDistrustedCertificateBySPKI(), GetTrust() will return // CertificateTrust::ForDistrusted()). void AddDistrustedCertificateBySPKI(std::string spki); // Adds a certificate to the store, that is neither trusted nor untrusted. void AddCertificateWithUnspecifiedTrust( std::shared_ptr cert); // TrustStore implementation: void SyncGetIssuersOf(const ParsedCertificate *cert, ParsedCertificateList *issuers) override; CertificateTrust GetTrust(const ParsedCertificate *cert) override; // Returns true if the trust store contains the given ParsedCertificate // (matches by DER). bool Contains(const ParsedCertificate *cert) const; private: struct Entry { Entry(); Entry(const Entry &other); ~Entry(); std::shared_ptr cert; CertificateTrust trust; }; // Multimap from normalized subject -> Entry. std::unordered_multimap entries_; // Set of distrusted SPKIs. std::set> distrusted_spkis_; // Returns the `Entry` matching `cert`, or `nullptr` if not in the trust // store. const Entry *GetEntry(const ParsedCertificate *cert) const; }; } // namespace bssl #endif // BSSL_PKI_TRUST_STORE_IN_MEMORY_H_