| // 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 <set> |
| #include <unordered_map> |
| |
| #include <openssl/base.h> |
| |
| #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<const ParsedCertificate> 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<const ParsedCertificate> cert); |
| |
| // Adds a certificate as a trust anchor which will have expiration enforced. |
| // See VerifyCertificateChain for details. |
| void AddTrustAnchorWithExpiration( |
| std::shared_ptr<const ParsedCertificate> cert); |
| |
| // Adds a certificate as a trust anchor and extracts anchor constraints from |
| // the certificate. See VerifyCertificateChain for details. |
| void AddTrustAnchorWithConstraints( |
| std::shared_ptr<const ParsedCertificate> 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<const ParsedCertificate> 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<const ParsedCertificate> 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<const ParsedCertificate> cert; |
| CertificateTrust trust; |
| }; |
| |
| // Multimap from normalized subject -> Entry. |
| std::unordered_multimap<std::string_view, Entry> entries_; |
| |
| // Set of distrusted SPKIs. |
| std::set<std::string, std::less<>> 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_ |