Index: net/cert/internal/verify_certificate_chain.h |
diff --git a/net/cert/internal/verify_certificate_chain.h b/net/cert/internal/verify_certificate_chain.h |
index 2b4a7abe0b7a10aebb944e0718e38e0b1fb8c876..ec22a63d89f8d813a215ad97bb38065af0d382e3 100644 |
--- a/net/cert/internal/verify_certificate_chain.h |
+++ b/net/cert/internal/verify_certificate_chain.h |
@@ -7,12 +7,16 @@ |
#include <stdint.h> |
+#include <map> |
#include <memory> |
#include <string> |
+#include <unordered_map> |
#include <vector> |
#include "base/compiler_specific.h" |
+#include "base/memory/ref_counted.h" |
#include "net/base/net_export.h" |
+#include "net/cert/internal/name_constraints.h" |
#include "net/cert/internal/parse_certificate.h" |
#include "net/der/input.h" |
@@ -24,9 +28,16 @@ struct GeneralizedTime; |
class SignaturePolicy; |
-// Represents a trust anchor (i.e. a trusted root certificate). |
-class NET_EXPORT TrustAnchor { |
+// XXX Rename, better comment |
+// Represents a certificate, including top-level parsing and normalized name |
+// values. The certificate is not completely parsed and validated, only the |
+// validation performed by ParseCertificate, ParseTbsCertificate and |
+// NormalizeName is done. |
+class NET_EXPORT CertThing : public base::RefCountedThreadSafe<CertThing> { |
public: |
+ // Map from OID to ParsedExtension. |
+ using ExtensionsMap = std::map<der::Input, ParsedExtension>; |
+ |
// The certificate data for this trust anchor may either be owned internally |
// (INTERNAL_COPY) or owned externally (EXTERNAL_REFERENCE). When it is |
// owned internally the data is held by |cert_data_| |
@@ -35,28 +46,55 @@ class NET_EXPORT TrustAnchor { |
EXTERNAL_REFERENCE, |
}; |
- TrustAnchor(); |
- ~TrustAnchor(); |
- |
- // Creates a TrustAnchor given a DER-encoded certificate. Returns nullptr on |
+ // Creates a CertThing given a DER-encoded certificate. Returns nullptr on |
// failure. Failure will occur if the certificate data cannot be parsed to |
// find a subject. |
// |
// The provided certificate data is either copied, or aliased, depending on |
// the value of |source|. See the comments for DataSource for details. |
- static std::unique_ptr<TrustAnchor> CreateFromCertificateData( |
- const uint8_t* data, |
- size_t length, |
- DataSource source); |
- |
- // Returns true if the trust anchor matches |name|. In other words, returns |
- // true if the certificate's subject matches |name|. |
- bool MatchesName(const der::Input& name) const; |
- |
- // Returns the DER-encoded certificate data for this trust anchor. |
- const der::Input& cert() const { return cert_; } |
+ static scoped_refptr<CertThing> CreateFromCertificateData(const uint8_t* data, |
+ size_t length, |
+ DataSource source); |
+ static scoped_refptr<CertThing> CreateFromCertificateCopy( |
+ const base::StringPiece& data); |
+ |
+ // Returns the DER-encoded certificate data for this cert. |
+ const der::Input& der_cert() const { return cert_; } |
+ |
+ const ParsedCertificate& parsed_cert() const { return parsed_cert_; } |
+ const ParsedTbsCertificate& parsed_tbs() const { return parsed_tbs_; } |
+ |
+ // Returns the DER-encoded normalized subject value (not including outer |
+ // Sequence tag). |
+ const std::string& normalized_subject() const { return normalized_subject_; } |
+ // Returns the DER-encoded normalized issuer value (not including outer |
+ // Sequence tag). |
+ const std::string& normalized_issuer() const { return normalized_issuer_; } |
+ |
+ // Returns true if the certificate had a SubjectAltName extension. |
+ bool has_subject_alt_names() const { return subject_alt_names_ != nullptr; } |
+ // Returns the ParsedExtension struct for the SubjectAltName extension. |
+ // If the cert did not have a SubjectAltName extension, this will be a |
+ // default-initialized ParsedExtension struct. |
+ const ParsedExtension& subject_alt_names_extension() const { |
+ return subject_alt_names_extension_; |
+ } |
+ // Returns the GeneralNames class parsed from SubjectAltName extension, orr |
+ // nullptr if no SubjectAltName extension was present. |
+ const GeneralNames* subject_alt_names() const { |
+ return subject_alt_names_.get(); |
+ } |
+ |
+ // Returns a map of unhandled extensions (excludes the ones above). |
+ const ExtensionsMap& unconsumed_extensions() const { |
+ return unconsumed_extensions_; |
+ } |
private: |
+ friend class base::RefCountedThreadSafe<CertThing>; |
+ CertThing(); |
+ ~CertThing(); |
+ |
// The backing store for the certificate data. This is only applicable when |
// the trust anchor was initialized using DataSource::INTERNAL_COPY. |
std::vector<uint8_t> cert_data_; |
@@ -68,12 +106,27 @@ class NET_EXPORT TrustAnchor { |
// Points to the raw certificate DER. |
der::Input cert_; |
- // Points to the subject TLV for the certificate. |
- der::Input name_; |
+ ParsedCertificate parsed_cert_; |
+ ParsedTbsCertificate parsed_tbs_; |
+ |
+ // Normalized DER-encoded Subject (not including outer Sequence tag). |
+ std::string normalized_subject_; |
+ // Normalized DER-encoded Issuer (not including outer Sequence tag). |
+ std::string normalized_issuer_; |
- DISALLOW_COPY_AND_ASSIGN(TrustAnchor); |
+ // Raw SubjectAltName extension. |
+ ParsedExtension subject_alt_names_extension_; |
+ // Parsed SubjectAltName extension. |
+ std::unique_ptr<GeneralNames> subject_alt_names_; |
+ |
+ // The remaining extensions (excludes the standard ones above). |
+ ExtensionsMap unconsumed_extensions_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CertThing); |
}; |
+using CertVector = std::vector<scoped_refptr<CertThing>>; |
+ |
// A very simple implementation of a TrustStore, which contains a set of |
// trusted certificates. |
class NET_EXPORT TrustStore { |
@@ -84,34 +137,22 @@ class NET_EXPORT TrustStore { |
// Empties the trust store, resetting it to original state. |
void Clear(); |
- // Adds a trusted certificate to the store. The trust store makes a copy of |
- // the provided certificate data. |
- bool AddTrustedCertificate(const uint8_t* data, |
- size_t length) WARN_UNUSED_RESULT; |
- bool AddTrustedCertificate(const base::StringPiece& data) WARN_UNUSED_RESULT; |
+ // Adds a trusted certificate to the store. |
+ void AddTrustedCertificate(scoped_refptr<CertThing> anchor); |
- // This function is the same as AddTrustedCertificate() except the underlying |
- // data is not copied. The caller is responsible for ensuring that the data |
- // pointer remains alive and is not mutated for the lifetime of the |
- // TrustStore. |
- bool AddTrustedCertificateWithoutCopying(const uint8_t* data, |
- size_t length) WARN_UNUSED_RESULT; |
+ // Returns the trust anchors that match |name| in |*matches|, if any. |
+ void FindTrustAnchorsByNormalizedName(const std::string& normalized_name, |
+ CertVector* matches) const; |
- // Returns the trust anchor that matches |name|, or nullptr if there is none. |
- // TODO(eroman): There may be multiple matches. |
- const TrustAnchor* FindTrustAnchorByName(const der::Input& name) const |
- WARN_UNUSED_RESULT; |
- |
- // Returns true if |cert_der| matches a certificate in the TrustStore. |
- bool IsTrustedCertificate(const der::Input& cert_der) const |
- WARN_UNUSED_RESULT; |
+ // Returns true if |cert| matches a certificate in the TrustStore. |
+ bool IsTrustedCertificate(const CertThing* cert) const WARN_UNUSED_RESULT; |
private: |
- bool AddTrustedCertificate(const uint8_t* data, |
- size_t length, |
- TrustAnchor::DataSource source) WARN_UNUSED_RESULT; |
- |
- std::vector<std::unique_ptr<TrustAnchor>> anchors_; |
+ // Multimap from normalized subject -> CertThing. |
+ std::unordered_multimap<base::StringPiece, |
+ scoped_refptr<CertThing>, |
+ base::StringPieceHash> |
+ anchors_; |
DISALLOW_COPY_AND_ASSIGN(TrustStore); |
}; |
@@ -155,6 +196,14 @@ NET_EXPORT bool VerifyCertificateChain(const std::vector<der::Input>& certs_der, |
const der::GeneralizedTime& time) |
WARN_UNUSED_RESULT; |
+// XXX docs. |
+NET_EXPORT bool VerifyCertificateChainAssumingTrustedRoot( |
+ const std::vector<scoped_refptr<CertThing>>& certs, |
+ // The trust store is only used for assertions. |
+ const TrustStore& trust_store, |
+ const SignaturePolicy* signature_policy, |
+ const der::GeneralizedTime& time) WARN_UNUSED_RESULT; |
+ |
} // namespace net |
#endif // NET_CERT_INTERNAL_VERIFY_CERTIFICATE_CHAIN_H_ |