xref: /aosp_15_r20/external/cronet/net/cert/cert_verifier.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_CERT_CERT_VERIFIER_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_CERT_CERT_VERIFIER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <memory>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker #include <string_view>
11*6777b538SAndroid Build Coastguard Worker #include <vector>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/observer_list_types.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/base/hash_value.h"
17*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/cert/cert_net_fetcher.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/cert/cert_verify_proc.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/cert/x509_certificate.h"
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker namespace net {
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker class CertVerifyResult;
25*6777b538SAndroid Build Coastguard Worker class CertVerifierWithUpdatableProc;
26*6777b538SAndroid Build Coastguard Worker class NetLogWithSource;
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker // CertVerifier represents a service for verifying certificates.
29*6777b538SAndroid Build Coastguard Worker //
30*6777b538SAndroid Build Coastguard Worker // CertVerifiers can handle multiple requests at a time.
31*6777b538SAndroid Build Coastguard Worker class NET_EXPORT CertVerifier {
32*6777b538SAndroid Build Coastguard Worker  public:
33*6777b538SAndroid Build Coastguard Worker   class NET_EXPORT Observer : public base::CheckedObserver {
34*6777b538SAndroid Build Coastguard Worker    public:
35*6777b538SAndroid Build Coastguard Worker     // Called when the certificate verifier changes internal configuration.
36*6777b538SAndroid Build Coastguard Worker     // Observers can use this method to invalidate caches that incorporate
37*6777b538SAndroid Build Coastguard Worker     // previous trust decisions.
38*6777b538SAndroid Build Coastguard Worker     //
39*6777b538SAndroid Build Coastguard Worker     // This method will not be called on `CertVerifier::SetConfig`. It is
40*6777b538SAndroid Build Coastguard Worker     // assumed that callers will know to clear their caches when calling the
41*6777b538SAndroid Build Coastguard Worker     // function. https://crbug.com/1427326 tracks migrating `SetConfig` to this
42*6777b538SAndroid Build Coastguard Worker     // mechanism.
43*6777b538SAndroid Build Coastguard Worker     virtual void OnCertVerifierChanged() = 0;
44*6777b538SAndroid Build Coastguard Worker   };
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker   struct NET_EXPORT Config {
47*6777b538SAndroid Build Coastguard Worker     Config();
48*6777b538SAndroid Build Coastguard Worker     Config(const Config&);
49*6777b538SAndroid Build Coastguard Worker     Config(Config&&);
50*6777b538SAndroid Build Coastguard Worker     ~Config();
51*6777b538SAndroid Build Coastguard Worker     Config& operator=(const Config&);
52*6777b538SAndroid Build Coastguard Worker     Config& operator=(Config&&);
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker     // Enable online revocation checking via CRLs and OCSP for the certificate
55*6777b538SAndroid Build Coastguard Worker     // chain. Note that revocation checking is soft-fail.
56*6777b538SAndroid Build Coastguard Worker     bool enable_rev_checking = false;
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker     // Enable online revocation checking via CRLs and OCSP for the certificate
59*6777b538SAndroid Build Coastguard Worker     // chain if the constructed chain terminates in a locally-installed,
60*6777b538SAndroid Build Coastguard Worker     // non-public trust anchor. A revocation error, such as a failure to
61*6777b538SAndroid Build Coastguard Worker     // obtain fresh revocation information, is treated as a hard failure.
62*6777b538SAndroid Build Coastguard Worker     bool require_rev_checking_local_anchors = false;
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker     // Enable support for SHA-1 signatures if the constructed chain terminates
65*6777b538SAndroid Build Coastguard Worker     // in a locally-installed, non-public trust anchor.
66*6777b538SAndroid Build Coastguard Worker     bool enable_sha1_local_anchors = false;
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker     // Disable enforcement of the policies described at
69*6777b538SAndroid Build Coastguard Worker     // https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html
70*6777b538SAndroid Build Coastguard Worker     bool disable_symantec_enforcement = false;
71*6777b538SAndroid Build Coastguard Worker   };
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   class Request {
74*6777b538SAndroid Build Coastguard Worker    public:
75*6777b538SAndroid Build Coastguard Worker     Request() = default;
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker     Request(const Request&) = delete;
78*6777b538SAndroid Build Coastguard Worker     Request& operator=(const Request&) = delete;
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker     // Destruction of the Request cancels it.
81*6777b538SAndroid Build Coastguard Worker     virtual ~Request() = default;
82*6777b538SAndroid Build Coastguard Worker   };
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker   enum VerifyFlags {
85*6777b538SAndroid Build Coastguard Worker     // If set, actively overrides the current CertVerifier::Config to disable
86*6777b538SAndroid Build Coastguard Worker     // dependent network fetches. This can be used to avoid triggering
87*6777b538SAndroid Build Coastguard Worker     // re-entrancy in the network stack. For example, fetching a PAC script
88*6777b538SAndroid Build Coastguard Worker     // over HTTPS may cause AIA, OCSP, or CRL fetches to block on retrieving
89*6777b538SAndroid Build Coastguard Worker     // the PAC script, while the PAC script fetch is waiting for those
90*6777b538SAndroid Build Coastguard Worker     // dependent fetches, creating a deadlock. When set, this flag prevents
91*6777b538SAndroid Build Coastguard Worker     // those fetches from being started (best effort).
92*6777b538SAndroid Build Coastguard Worker     // Note that cached information may still be used, if it can be accessed
93*6777b538SAndroid Build Coastguard Worker     // without accessing the network.
94*6777b538SAndroid Build Coastguard Worker     VERIFY_DISABLE_NETWORK_FETCHES = 1 << 0,
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker     VERIFY_FLAGS_LAST = VERIFY_DISABLE_NETWORK_FETCHES
97*6777b538SAndroid Build Coastguard Worker   };
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker   // Parameters to verify |certificate| against the supplied
100*6777b538SAndroid Build Coastguard Worker   // |hostname| as an SSL server.
101*6777b538SAndroid Build Coastguard Worker   //
102*6777b538SAndroid Build Coastguard Worker   // |hostname| should be a canonicalized hostname (in A-Label form) or IP
103*6777b538SAndroid Build Coastguard Worker   // address in string form, following the rules of a URL host portion. In
104*6777b538SAndroid Build Coastguard Worker   // the case of |hostname| being a domain name, it may contain a trailing
105*6777b538SAndroid Build Coastguard Worker   // dot (e.g. "example.com."), as used to signal to DNS not to perform
106*6777b538SAndroid Build Coastguard Worker   // suffix search, and it will safely be ignored. If |hostname| is an IPv6
107*6777b538SAndroid Build Coastguard Worker   // address, it MUST be in URL form - that is, surrounded in square
108*6777b538SAndroid Build Coastguard Worker   // brackets, such as "[::1]".
109*6777b538SAndroid Build Coastguard Worker   //
110*6777b538SAndroid Build Coastguard Worker   // |flags| is a bitwise OR of VerifyFlags.
111*6777b538SAndroid Build Coastguard Worker   //
112*6777b538SAndroid Build Coastguard Worker   // |ocsp_response| is optional, but if non-empty, should contain an OCSP
113*6777b538SAndroid Build Coastguard Worker   // response obtained via OCSP stapling. It may be ignored by the
114*6777b538SAndroid Build Coastguard Worker   // CertVerifier.
115*6777b538SAndroid Build Coastguard Worker   //
116*6777b538SAndroid Build Coastguard Worker   // |sct_list| is optional, but if non-empty, should contain a
117*6777b538SAndroid Build Coastguard Worker   // SignedCertificateTimestampList from the TLS extension as described in
118*6777b538SAndroid Build Coastguard Worker   // RFC6962 section 3.3.1. It may be ignored by the CertVerifier.
119*6777b538SAndroid Build Coastguard Worker   class NET_EXPORT RequestParams {
120*6777b538SAndroid Build Coastguard Worker    public:
121*6777b538SAndroid Build Coastguard Worker     RequestParams();
122*6777b538SAndroid Build Coastguard Worker     RequestParams(scoped_refptr<X509Certificate> certificate,
123*6777b538SAndroid Build Coastguard Worker                   std::string_view hostname,
124*6777b538SAndroid Build Coastguard Worker                   int flags,
125*6777b538SAndroid Build Coastguard Worker                   std::string_view ocsp_response,
126*6777b538SAndroid Build Coastguard Worker                   std::string_view sct_list);
127*6777b538SAndroid Build Coastguard Worker     RequestParams(const RequestParams& other);
128*6777b538SAndroid Build Coastguard Worker     ~RequestParams();
129*6777b538SAndroid Build Coastguard Worker 
certificate()130*6777b538SAndroid Build Coastguard Worker     const scoped_refptr<X509Certificate>& certificate() const {
131*6777b538SAndroid Build Coastguard Worker       return certificate_;
132*6777b538SAndroid Build Coastguard Worker     }
hostname()133*6777b538SAndroid Build Coastguard Worker     const std::string& hostname() const { return hostname_; }
flags()134*6777b538SAndroid Build Coastguard Worker     int flags() const { return flags_; }
ocsp_response()135*6777b538SAndroid Build Coastguard Worker     const std::string& ocsp_response() const { return ocsp_response_; }
sct_list()136*6777b538SAndroid Build Coastguard Worker     const std::string& sct_list() const { return sct_list_; }
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker     bool operator==(const RequestParams& other) const;
139*6777b538SAndroid Build Coastguard Worker     bool operator<(const RequestParams& other) const;
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker    private:
142*6777b538SAndroid Build Coastguard Worker     scoped_refptr<X509Certificate> certificate_;
143*6777b538SAndroid Build Coastguard Worker     std::string hostname_;
144*6777b538SAndroid Build Coastguard Worker     int flags_;
145*6777b538SAndroid Build Coastguard Worker     std::string ocsp_response_;
146*6777b538SAndroid Build Coastguard Worker     std::string sct_list_;
147*6777b538SAndroid Build Coastguard Worker 
148*6777b538SAndroid Build Coastguard Worker     // Used to optimize sorting/indexing comparisons.
149*6777b538SAndroid Build Coastguard Worker     std::string key_;
150*6777b538SAndroid Build Coastguard Worker   };
151*6777b538SAndroid Build Coastguard Worker 
152*6777b538SAndroid Build Coastguard Worker   // When the verifier is destroyed, all certificate verification requests are
153*6777b538SAndroid Build Coastguard Worker   // canceled, and their completion callbacks will not be called.
154*6777b538SAndroid Build Coastguard Worker   virtual ~CertVerifier() = default;
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker   // Verifies the given certificate against the given hostname as an SSL server.
157*6777b538SAndroid Build Coastguard Worker   // Returns OK if successful or an error code upon failure.
158*6777b538SAndroid Build Coastguard Worker   //
159*6777b538SAndroid Build Coastguard Worker   // The |*verify_result| structure, including the |verify_result->cert_status|
160*6777b538SAndroid Build Coastguard Worker   // bitmask and |verify_result->verified_cert|, is always filled out regardless
161*6777b538SAndroid Build Coastguard Worker   // of the return value. If the certificate has multiple errors, the
162*6777b538SAndroid Build Coastguard Worker   // corresponding status flags are set in |verify_result->cert_status|, and the
163*6777b538SAndroid Build Coastguard Worker   // error code for the most serious error is returned.
164*6777b538SAndroid Build Coastguard Worker   //
165*6777b538SAndroid Build Coastguard Worker   // |callback| must not be null. ERR_IO_PENDING is returned if the operation
166*6777b538SAndroid Build Coastguard Worker   // could not be completed synchronously, in which case the result code will
167*6777b538SAndroid Build Coastguard Worker   // be passed to the callback when available.
168*6777b538SAndroid Build Coastguard Worker   //
169*6777b538SAndroid Build Coastguard Worker   // |*out_req| is used to store a request handle in the event of asynchronous
170*6777b538SAndroid Build Coastguard Worker   // completion (when Verify returns ERR_IO_PENDING). Provided that neither
171*6777b538SAndroid Build Coastguard Worker   // the CertVerifier nor the Request have been deleted, |callback| will be
172*6777b538SAndroid Build Coastguard Worker   // invoked once the underlying verification finishes. If either the
173*6777b538SAndroid Build Coastguard Worker   // CertVerifier or the Request are deleted, then |callback| will be Reset()
174*6777b538SAndroid Build Coastguard Worker   // and will not be invoked. It is fine for |out_req| to outlive the
175*6777b538SAndroid Build Coastguard Worker   // CertVerifier, and it is fine to reset |out_req| or delete the
176*6777b538SAndroid Build Coastguard Worker   // CertVerifier during the processing of |callback|.
177*6777b538SAndroid Build Coastguard Worker   //
178*6777b538SAndroid Build Coastguard Worker   // If Verify() completes synchronously then |out_req| *may* be reset to
179*6777b538SAndroid Build Coastguard Worker   // nullptr. However it is not guaranteed that all implementations will reset
180*6777b538SAndroid Build Coastguard Worker   // it in this case.
181*6777b538SAndroid Build Coastguard Worker   virtual int Verify(const RequestParams& params,
182*6777b538SAndroid Build Coastguard Worker                      CertVerifyResult* verify_result,
183*6777b538SAndroid Build Coastguard Worker                      CompletionOnceCallback callback,
184*6777b538SAndroid Build Coastguard Worker                      std::unique_ptr<Request>* out_req,
185*6777b538SAndroid Build Coastguard Worker                      const NetLogWithSource& net_log) = 0;
186*6777b538SAndroid Build Coastguard Worker 
187*6777b538SAndroid Build Coastguard Worker   // Sets the configuration for new certificate verifications to be |config|.
188*6777b538SAndroid Build Coastguard Worker   // Any in-progress verifications (i.e. those with outstanding Request
189*6777b538SAndroid Build Coastguard Worker   // handles) will continue using the old configuration. This may be called
190*6777b538SAndroid Build Coastguard Worker   // throughout the CertVerifier's lifetime in response to configuration
191*6777b538SAndroid Build Coastguard Worker   // changes from embedders.
192*6777b538SAndroid Build Coastguard Worker   // Note: As configuration changes will replace any existing configuration,
193*6777b538SAndroid Build Coastguard Worker   // this should only be called by the logical 'owner' of this CertVerifier.
194*6777b538SAndroid Build Coastguard Worker   // Callers should NOT attempt to change configuration for single calls, and
195*6777b538SAndroid Build Coastguard Worker   // should NOT attempt to change configuration for CertVerifiers they do not
196*6777b538SAndroid Build Coastguard Worker   // explicitly manage.
197*6777b538SAndroid Build Coastguard Worker   virtual void SetConfig(const Config& config) = 0;
198*6777b538SAndroid Build Coastguard Worker 
199*6777b538SAndroid Build Coastguard Worker   // Add an observer to be notified when the CertVerifier has changed.
200*6777b538SAndroid Build Coastguard Worker   // RemoveObserver() must be called before |observer| is destroyed.
201*6777b538SAndroid Build Coastguard Worker   virtual void AddObserver(Observer* observer) = 0;
202*6777b538SAndroid Build Coastguard Worker 
203*6777b538SAndroid Build Coastguard Worker   // Remove an observer added with AddObserver().
204*6777b538SAndroid Build Coastguard Worker   virtual void RemoveObserver(Observer* observer) = 0;
205*6777b538SAndroid Build Coastguard Worker 
206*6777b538SAndroid Build Coastguard Worker   // Creates a CertVerifier implementation that verifies certificates using
207*6777b538SAndroid Build Coastguard Worker   // the preferred underlying cryptographic libraries.  |cert_net_fetcher| may
208*6777b538SAndroid Build Coastguard Worker   // not be used, depending on the platform.
209*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<CertVerifierWithUpdatableProc>
210*6777b538SAndroid Build Coastguard Worker   CreateDefaultWithoutCaching(scoped_refptr<CertNetFetcher> cert_net_fetcher);
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker   // Wraps the result of |CreateDefaultWithoutCaching| in a CachingCertVerifier
213*6777b538SAndroid Build Coastguard Worker   // and a CoalescingCertVerifier.
214*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<CertVerifier> CreateDefault(
215*6777b538SAndroid Build Coastguard Worker       scoped_refptr<CertNetFetcher> cert_net_fetcher);
216*6777b538SAndroid Build Coastguard Worker };
217*6777b538SAndroid Build Coastguard Worker 
218*6777b538SAndroid Build Coastguard Worker // Overloads for comparing two configurations. Note, comparison is shallow -
219*6777b538SAndroid Build Coastguard Worker // that is, two scoped_refptr<CRLSet>s are equal iff they point to the same
220*6777b538SAndroid Build Coastguard Worker // object.
221*6777b538SAndroid Build Coastguard Worker NET_EXPORT bool operator==(const CertVerifier::Config& lhs,
222*6777b538SAndroid Build Coastguard Worker                            const CertVerifier::Config& rhs);
223*6777b538SAndroid Build Coastguard Worker NET_EXPORT bool operator!=(const CertVerifier::Config& lhs,
224*6777b538SAndroid Build Coastguard Worker                            const CertVerifier::Config& rhs);
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker // A CertVerifier that can update its CertVerifyProc while it is running.
227*6777b538SAndroid Build Coastguard Worker class NET_EXPORT CertVerifierWithUpdatableProc : public CertVerifier {
228*6777b538SAndroid Build Coastguard Worker  public:
229*6777b538SAndroid Build Coastguard Worker   // Update the CertVerifyProc with a new set of parameters.
230*6777b538SAndroid Build Coastguard Worker   virtual void UpdateVerifyProcData(
231*6777b538SAndroid Build Coastguard Worker       scoped_refptr<CertNetFetcher> cert_net_fetcher,
232*6777b538SAndroid Build Coastguard Worker       const net::CertVerifyProc::ImplParams& impl_params,
233*6777b538SAndroid Build Coastguard Worker       const net::CertVerifyProc::InstanceParams& instance_params) = 0;
234*6777b538SAndroid Build Coastguard Worker };
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker }  // namespace net
237*6777b538SAndroid Build Coastguard Worker 
238*6777b538SAndroid Build Coastguard Worker #endif  // NET_CERT_CERT_VERIFIER_H_
239