Index: net/cert/internal/parsed_certificate.h |
diff --git a/net/cert/internal/parsed_certificate.h b/net/cert/internal/parsed_certificate.h |
index a4c6c3b52577e4031087f39817ec8c3600d7d97e..fec9b6283eae4ebe254276bf2ecd6fe2ed85b75f 100644 |
--- a/net/cert/internal/parsed_certificate.h |
+++ b/net/cert/internal/parsed_certificate.h |
@@ -20,6 +20,7 @@ struct GeneralNames; |
class NameConstraints; |
class ParsedCertificate; |
class SignatureAlgorithm; |
+class CertErrors; |
using ParsedCertificateList = std::vector<scoped_refptr<ParsedCertificate>>; |
@@ -36,40 +37,67 @@ class NET_EXPORT ParsedCertificate |
// 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( |
+ // The provided certificate data is copied, so |data| needn't remain valid |
+ // after this call. |
+ // |
+ // On either success or failure, if |errors| is non-null it may have error |
+ // information added to it. |
+ static scoped_refptr<ParsedCertificate> Create( |
const uint8_t* data, |
size_t length, |
- DataSource source, |
- const ParseCertificateOptions& options); |
+ const ParseCertificateOptions& options, |
+ CertErrors* errors); |
- // 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. |
+ // Overload that takes a StringPiece. |
+ static scoped_refptr<ParsedCertificate> Create( |
+ const base::StringPiece& data, |
+ const ParseCertificateOptions& options, |
+ CertErrors* errors); |
+ |
+ // Creates a ParsedCertificate by copying the provided |data|, and appends it |
+ // to |chain|. Returns true if the certificate was successfully parsed and |
+ // added. If false is return, |chain| is unmodified. |
+ // |
+ // On either success or failure, if |errors| is non-null it may have error |
+ // information added to it. |
static bool CreateAndAddToVector( |
const uint8_t* data, |
size_t length, |
- DataSource source, |
const ParseCertificateOptions& options, |
- std::vector<scoped_refptr<net::ParsedCertificate>>* chain); |
+ std::vector<scoped_refptr<net::ParsedCertificate>>* chain, |
+ CertErrors* errors); |
- // Creates a ParsedCertificate, copying the data from |data|. |
- static scoped_refptr<ParsedCertificate> CreateFromCertificateCopy( |
+ // Overload that takes a StringPiece. |
+ static bool CreateAndAddToVector( |
const base::StringPiece& data, |
- const ParseCertificateOptions& options); |
+ const ParseCertificateOptions& options, |
+ std::vector<scoped_refptr<net::ParsedCertificate>>* chain, |
+ CertErrors* errors); |
+ |
+ // Like Create() this builds a ParsedCertificate given a DER-encoded |
+ // Certificate and returns nullptr on failure. |
+ // |
+ // However a copy of |data| is NOT made. |
+ // |
+ // This is a dangerous way to create as ParsedCertificate and should only be |
+ // used with care when saving a copy is really worth it, or the data is known |
+ // to come from static storage (and hence remain valid for entire life of |
+ // process). |
+ // |
+ // ParsedCertificate is reference counted, so it is easy to extend the life |
+ // and and end up with a ParsedCertificate referencing feed memory. |
+ // |
+ // On either success or failure, if |errors| is non-null it may have error |
+ // information added to it. |
+ static scoped_refptr<ParsedCertificate> CreateWithoutCopyingUnsafe( |
+ const uint8_t* data, |
+ size_t length, |
+ const ParseCertificateOptions& options, |
+ CertErrors* errors); |
// Returns the DER-encoded certificate data for this cert. |
const der::Input& der_cert() const { return cert_; } |
@@ -180,10 +208,25 @@ class NET_EXPORT ParsedCertificate |
} |
private: |
+ // 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, |
+ }; |
+ |
friend class base::RefCountedThreadSafe<ParsedCertificate>; |
ParsedCertificate(); |
~ParsedCertificate(); |
+ static scoped_refptr<ParsedCertificate> CreateInternal( |
+ const uint8_t* data, |
+ size_t length, |
+ DataSource source, |
+ const ParseCertificateOptions& options, |
+ CertErrors* errors); |
+ |
// 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_; |