| // Copyright (c) 2012 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_CERT_VERIFIER_H_ |
| #define NET_CERT_CERT_VERIFIER_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "net/base/completion_once_callback.h" |
| #include "net/base/hash_value.h" |
| #include "net/base/net_export.h" |
| #include "net/cert/x509_certificate.h" |
| |
| namespace net { |
| |
| class CertVerifyResult; |
| class CRLSet; |
| class NetLogWithSource; |
| |
| // CertVerifier represents a service for verifying certificates. |
| // |
| // CertVerifiers can handle multiple requests at a time. |
| class NET_EXPORT CertVerifier { |
| public: |
| struct NET_EXPORT Config { |
| Config(); |
| Config(const Config&); |
| Config(Config&&); |
| ~Config(); |
| Config& operator=(const Config&); |
| Config& operator=(Config&&); |
| |
| // Enable online revocation checking via CRLs and OCSP for the certificate |
| // chain. Note that revocation checking is soft-fail. |
| bool enable_rev_checking = false; |
| |
| // Enable online revocation checking via CRLs and OCSP for the certificate |
| // chain if the constructed chain terminates in a locally-installed, |
| // non-public trust anchor. A revocation error, such as a failure to |
| // obtain fresh revocation information, is treated as a hard failure. |
| bool require_rev_checking_local_anchors = false; |
| |
| // Enable support for SHA-1 signatures if the constructed chain terminates |
| // in a locally-installed, non-public trust anchor. |
| bool enable_sha1_local_anchors = false; |
| |
| // Disable enforcement of the policies described at |
| // https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html |
| bool disable_symantec_enforcement = false; |
| |
| // Provides an optional CRLSet structure that can be used to avoid |
| // revocation checks over the network. CRLSets can be used to add |
| // additional certificates to be blacklisted beyond the internal blacklist, |
| // whether leaves or intermediates. |
| scoped_refptr<CRLSet> crl_set; |
| |
| // Additional trust anchors to consider during path validation. Ordinarily, |
| // implementations of CertVerifier use trust anchors from the configured |
| // system store. This is implementation-specific plumbing for passing |
| // additional anchors through. |
| CertificateList additional_trust_anchors; |
| }; |
| |
| class Request { |
| public: |
| Request() {} |
| |
| // Destruction of the Request cancels it. |
| virtual ~Request() {} |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(Request); |
| }; |
| |
| enum VerifyFlags { |
| // If set, actively overrides the current CertVerifier::Config to disable |
| // dependent network fetches. This can be used to avoid triggering |
| // re-entrancy in the network stack. For example, fetching a PAC script |
| // over HTTPS may cause AIA, OCSP, or CRL fetches to block on retrieving |
| // the PAC script, while the PAC script fetch is waiting for those |
| // dependent fetches, creating a deadlock. When set, this flag prevents |
| // those fetches from being started (best effort). |
| // Note that cached information may still be used, if it can be accessed |
| // without accessing the network. |
| VERIFY_DISABLE_NETWORK_FETCHES = 1 << 0, |
| }; |
| |
| // Parameters to verify |certificate| against the supplied |
| // |hostname| as an SSL server. |
| // |
| // |hostname| should be a canonicalized hostname (in A-Label form) or IP |
| // address in string form, following the rules of a URL host portion. In |
| // the case of |hostname| being a domain name, it may contain a trailing |
| // dot (e.g. "example.com."), as used to signal to DNS not to perform |
| // suffix search, and it will safely be ignored. If |hostname| is an IPv6 |
| // address, it MUST be in URL form - that is, surrounded in square |
| // brackets, such as "[::1]". |
| // |
| // |flags| is a bitwise OR of VerifyFlags. |
| // |
| // |ocsp_response| is optional, but if non-empty, should contain an OCSP |
| // response obtained via OCSP stapling. It may be ignored by the |
| // CertVerifier. |
| class NET_EXPORT RequestParams { |
| public: |
| RequestParams(scoped_refptr<X509Certificate> certificate, |
| const std::string& hostname, |
| int flags, |
| const std::string& ocsp_response); |
| RequestParams(const RequestParams& other); |
| ~RequestParams(); |
| |
| const scoped_refptr<X509Certificate>& certificate() const { |
| return certificate_; |
| } |
| const std::string& hostname() const { return hostname_; } |
| int flags() const { return flags_; } |
| const std::string& ocsp_response() const { return ocsp_response_; } |
| |
| bool operator==(const RequestParams& other) const; |
| bool operator<(const RequestParams& other) const; |
| |
| private: |
| scoped_refptr<X509Certificate> certificate_; |
| std::string hostname_; |
| int flags_; |
| std::string ocsp_response_; |
| |
| // Used to optimize sorting/indexing comparisons. |
| std::string key_; |
| }; |
| |
| // When the verifier is destroyed, all certificate verification requests are |
| // canceled, and their completion callbacks will not be called. |
| virtual ~CertVerifier() {} |
| |
| // Verifies the given certificate against the given hostname as an SSL server. |
| // Returns OK if successful or an error code upon failure. |
| // |
| // The |*verify_result| structure, including the |verify_result->cert_status| |
| // bitmask, is always filled out regardless of the return value. If the |
| // certificate has multiple errors, the corresponding status flags are set in |
| // |verify_result->cert_status|, and the error code for the most serious |
| // error is returned. |
| // |
| // |callback| must not be null. ERR_IO_PENDING is returned if the operation |
| // could not be completed synchronously, in which case the result code will |
| // be passed to the callback when available. |
| // |
| // On asynchronous completion (when Verify returns ERR_IO_PENDING) |out_req| |
| // will be reset with a pointer to the request. Freeing this pointer before |
| // the request has completed will cancel it. |
| // |
| // If Verify() completes synchronously then |out_req| *may* be reset to |
| // nullptr. However it is not guaranteed that all implementations will reset |
| // it in this case. |
| virtual int Verify(const RequestParams& params, |
| CertVerifyResult* verify_result, |
| CompletionOnceCallback callback, |
| std::unique_ptr<Request>* out_req, |
| const NetLogWithSource& net_log) = 0; |
| |
| // Sets the configuration for new certificate verifications to be |config|. |
| // Any in-progress verifications (i.e. those with outstanding Request |
| // handles) will continue using the old configuration. This may be called |
| // throughout the CertVerifier's lifetime in response to configuration |
| // changes from embedders. |
| // Note: As configuration changes will replace any existing configuration, |
| // this should only be called by the logical 'owner' of this CertVerifier. |
| // Callers should NOT attempt to change configuration for single calls, and |
| // should NOT attempt to change configuration for CertVerifiers they do not |
| // explicitly manage. |
| virtual void SetConfig(const Config& config) = 0; |
| |
| // Creates a CertVerifier implementation that verifies certificates using |
| // the preferred underlying cryptographic libraries, using the specified |
| // configuration. |
| static std::unique_ptr<CertVerifier> CreateDefault(); |
| |
| #if defined(STARBOARD) && defined(ENABLE_IGNORE_CERTIFICATE_ERRORS) |
| // Used to disable certificate verification errors for testing/development |
| // purpose. |
| virtual void set_ignore_certificate_errors(bool ignore_certificate_errors) { |
| NOTREACHED(); |
| } |
| #endif |
| }; |
| |
| // Overloads for comparing two configurations. Note, comparison is shallow - |
| // that is, two scoped_refptr<CRLSet>s are equal iff they point to the same |
| // object. |
| NET_EXPORT bool operator==(const CertVerifier::Config& lhs, |
| const CertVerifier::Config& rhs); |
| NET_EXPORT bool operator!=(const CertVerifier::Config& lhs, |
| const CertVerifier::Config& rhs); |
| |
| } // namespace net |
| |
| #endif // NET_CERT_CERT_VERIFIER_H_ |