| Index: net/cert/internal/parsed_certificate.h
|
| diff --git a/net/cert/internal/parsed_certificate.h b/net/cert/internal/parsed_certificate.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7c9ae3cba75508c4957b7dbb7128bb0514a0059f
|
| --- /dev/null
|
| +++ b/net/cert/internal/parsed_certificate.h
|
| @@ -0,0 +1,213 @@
|
| +// 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.
|
| +
|
| +#ifndef NET_CERT_INTERNAL_PARSED_CERTIFICATE_H_
|
| +#define NET_CERT_INTERNAL_PARSED_CERTIFICATE_H_
|
| +
|
| +#include <map>
|
| +#include <memory>
|
| +#include <vector>
|
| +
|
| +#include "base/memory/ref_counted.h"
|
| +#include "net/base/net_export.h"
|
| +#include "net/cert/internal/parse_certificate.h"
|
| +#include "net/der/input.h"
|
| +
|
| +namespace net {
|
| +
|
| +struct GeneralNames;
|
| +class NameConstraints;
|
| +class SignatureAlgorithm;
|
| +
|
| +// Represents an X.509 certificate, including Certificate, TBSCertificate, and
|
| +// standard extensions.
|
| +// Creating a ParsedCertificate does not completely parse and validate the
|
| +// certificate data. Presence of a member in this class implies the DER was
|
| +// parsed successfully to that level, but does not imply the contents of that
|
| +// member are valid, unless otherwise specified. See the documentation for each
|
| +// member or the documentation of the type it returns.
|
| +class NET_EXPORT ParsedCertificate
|
| + : public base::RefCountedThreadSafe<ParsedCertificate> {
|
| + public:
|
| + // Map from OID to ParsedExtension.
|
| + using ExtensionsMap = std::map<der::Input, ParsedExtension>;
|
| +
|
| + // The certificate data for may either be owned internally (INTERNAL_COPY) or
|
| + // owned externally (EXTERNAL_REFERENCE). When it is owned internally the data
|
| + // is held by |cert_data_|
|
| + enum class DataSource {
|
| + INTERNAL_COPY,
|
| + EXTERNAL_REFERENCE,
|
| + };
|
| +
|
| + // Creates a ParsedCertificate given a DER-encoded Certificate. Returns
|
| + // nullptr on failure. Failure will occur if the standard certificate fields
|
| + // and supported extensions cannot be parsed.
|
| + //
|
| + // The provided certificate data is either copied, or aliased, depending on
|
| + // the value of |source|. See the comments for DataSource for details.
|
| + static scoped_refptr<ParsedCertificate> CreateFromCertificateData(
|
| + const uint8_t* data,
|
| + size_t length,
|
| + DataSource source);
|
| +
|
| + // Creates a ParsedCertificate and appends it to |chain|. Returns true if the
|
| + // certificate was successfully parsed and added. If false is return, |chain|
|
| + // is unmodified.
|
| + static bool CreateAndAddToVector(
|
| + const uint8_t* data,
|
| + size_t length,
|
| + DataSource source,
|
| + std::vector<scoped_refptr<net::ParsedCertificate>>* chain);
|
| +
|
| + // Creates a ParsedCertificate, copying the data from |data|.
|
| + static scoped_refptr<ParsedCertificate> CreateFromCertificateCopy(
|
| + const base::StringPiece& data);
|
| +
|
| + // Returns the DER-encoded certificate data for this cert.
|
| + const der::Input& der_cert() const { return cert_; }
|
| +
|
| + // Accessors for raw fields of the Certificate.
|
| + const der::Input& tbs_certificate_tlv() const { return tbs_certificate_tlv_; }
|
| +
|
| + const der::Input& signature_algorithm_tlv() const {
|
| + return signature_algorithm_tlv_;
|
| + }
|
| +
|
| + const der::BitString& signature_value() const { return signature_value_; }
|
| +
|
| + // Accessor for struct containing raw fields of the TbsCertificate.
|
| + const ParsedTbsCertificate& tbs() const { return tbs_; }
|
| +
|
| + // Returns true if the signatureAlgorithm of the Certificate is supported and
|
| + // valid.
|
| + bool has_valid_supported_signature_algorithm() const {
|
| + return signature_algorithm_ != nullptr;
|
| + }
|
| +
|
| + // Returns the signatureAlgorithm of the Certificate (not the tbsCertificate).
|
| + // Must not be called if has_valid_supported_signature_algorithm() is false.
|
| + const SignatureAlgorithm& signature_algorithm() const {
|
| + DCHECK(signature_algorithm_);
|
| + return *signature_algorithm_;
|
| + }
|
| +
|
| + // Returns the DER-encoded normalized subject value (not including outer
|
| + // Sequence tag). This is gauranteed to be valid DER, though the contents of
|
| + // unhandled string types are treated as raw bytes.
|
| + der::Input normalized_subject() const {
|
| + return der::Input(&normalized_subject_);
|
| + }
|
| + // Returns the DER-encoded normalized issuer value (not including outer
|
| + // Sequence tag). This is gauranteed to be valid DER, though the contents of
|
| + // unhandled string types are treated as raw bytes.
|
| + der::Input normalized_issuer() const {
|
| + return der::Input(&normalized_issuer_);
|
| + }
|
| +
|
| + // Returns true if the certificate has a BasicConstraints extension.
|
| + bool has_basic_constraints() const { return has_basic_constraints_; }
|
| +
|
| + // Returns the ParsedBasicConstraints struct. Caller must check
|
| + // has_basic_constraints() before accessing this.
|
| + const ParsedBasicConstraints& basic_constraints() const {
|
| + DCHECK(has_basic_constraints_);
|
| + return basic_constraints_;
|
| + }
|
| +
|
| + // Returns true if the certificate has a KeyUsage extension.
|
| + bool has_key_usage() const { return has_key_usage_; }
|
| +
|
| + // Returns the KeyUsage BitString. Caller must check
|
| + // has_key_usage() before accessing this.
|
| + const der::BitString& key_usage() const {
|
| + DCHECK(has_key_usage_);
|
| + return key_usage_;
|
| + }
|
| +
|
| + // Returns true if the certificate has 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, or
|
| + // nullptr if no SubjectAltName extension was present.
|
| + const GeneralNames* subject_alt_names() const {
|
| + return subject_alt_names_.get();
|
| + }
|
| +
|
| + // Returns true if the certificate has a NameConstraints extension.
|
| + bool has_name_constraints() const { return name_constraints_ != nullptr; }
|
| +
|
| + // Returns the parsed NameConstraints extension. Must not be called if
|
| + // has_name_constraints() is false.
|
| + const NameConstraints& name_constraints() const {
|
| + DCHECK(name_constraints_);
|
| + return *name_constraints_;
|
| + }
|
| +
|
| + // Returns a map of unhandled extensions (excludes the ones above).
|
| + const ExtensionsMap& unparsed_extensions() const {
|
| + return unparsed_extensions_;
|
| + }
|
| +
|
| + private:
|
| + friend class base::RefCountedThreadSafe<ParsedCertificate>;
|
| + ParsedCertificate();
|
| + ~ParsedCertificate();
|
| +
|
| + // The backing store for the certificate data. This is only applicable when
|
| + // the ParsedCertificate was initialized using DataSource::INTERNAL_COPY.
|
| + std::vector<uint8_t> cert_data_;
|
| +
|
| + // Note that the backing data for |cert_| (and its may come either from
|
| + // |cert_data_| or some external buffer (depending on how the
|
| + // ParsedCertificate was created).
|
| +
|
| + // Points to the raw certificate DER.
|
| + der::Input cert_;
|
| +
|
| + der::Input tbs_certificate_tlv_;
|
| + der::Input signature_algorithm_tlv_;
|
| + der::BitString signature_value_;
|
| + ParsedTbsCertificate tbs_;
|
| +
|
| + // The signatureAlgorithm from the Certificate.
|
| + std::unique_ptr<SignatureAlgorithm> signature_algorithm_;
|
| +
|
| + // 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_;
|
| +
|
| + // BasicConstraints extension.
|
| + bool has_basic_constraints_ = false;
|
| + ParsedBasicConstraints basic_constraints_;
|
| +
|
| + // KeyUsage extension.
|
| + bool has_key_usage_ = false;
|
| + der::BitString key_usage_;
|
| +
|
| + // Raw SubjectAltName extension.
|
| + ParsedExtension subject_alt_names_extension_;
|
| + // Parsed SubjectAltName extension.
|
| + std::unique_ptr<GeneralNames> subject_alt_names_;
|
| +
|
| + // NameConstraints extension.
|
| + std::unique_ptr<NameConstraints> name_constraints_;
|
| +
|
| + // The remaining extensions (excludes the standard ones above).
|
| + ExtensionsMap unparsed_extensions_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ParsedCertificate);
|
| +};
|
| +
|
| +} // namespace net
|
| +
|
| +#endif // NET_CERT_INTERNAL_PARSED_CERTIFICATE_H_
|
|
|