1 // Copyright 2012 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_CERT_MULTI_THREADED_CERT_VERIFIER_H_ 6 #define NET_CERT_MULTI_THREADED_CERT_VERIFIER_H_ 7 8 #include <stddef.h> 9 #include <stdint.h> 10 11 #include <map> 12 #include <memory> 13 14 #include "base/containers/linked_list.h" 15 #include "base/memory/scoped_refptr.h" 16 #include "base/observer_list.h" 17 #include "base/threading/thread_checker.h" 18 #include "net/base/net_export.h" 19 #include "net/cert/cert_verifier.h" 20 21 namespace net { 22 23 class CertVerifyProc; 24 class CertNetFetcher; 25 class CertVerifyProcFactory; 26 27 // MultiThreadedCertVerifier is a CertVerifier implementation that runs 28 // synchronous CertVerifier implementations on worker threads. 29 class NET_EXPORT_PRIVATE MultiThreadedCertVerifier 30 : public CertVerifierWithUpdatableProc { 31 public: 32 explicit MultiThreadedCertVerifier( 33 scoped_refptr<CertVerifyProc> verify_proc, 34 scoped_refptr<CertVerifyProcFactory> verify_proc_factory); 35 36 MultiThreadedCertVerifier(const MultiThreadedCertVerifier&) = delete; 37 MultiThreadedCertVerifier& operator=(const MultiThreadedCertVerifier&) = 38 delete; 39 40 // When the verifier is destroyed, all certificate verifications requests are 41 // canceled, and their completion callbacks will not be called. 42 ~MultiThreadedCertVerifier() override; 43 44 // CertVerifier implementation 45 int Verify(const RequestParams& params, 46 CertVerifyResult* verify_result, 47 CompletionOnceCallback callback, 48 std::unique_ptr<Request>* out_req, 49 const NetLogWithSource& net_log) override; 50 void SetConfig(const CertVerifier::Config& config) override; 51 void AddObserver(Observer* observer) override; 52 void RemoveObserver(Observer* observer) override; 53 void UpdateVerifyProcData( 54 scoped_refptr<CertNetFetcher> cert_net_fetcher, 55 const net::CertVerifyProc::ImplParams& impl_params, 56 const net::CertVerifyProc::InstanceParams& instance_params) override; 57 58 private: 59 class InternalRequest; 60 61 // Notify the |observers_| of an OnCertVerifierChanged event. 62 void NotifyCertVerifierChanged(); 63 64 base::ObserverList<Observer> observers_; 65 Config config_; 66 scoped_refptr<CertVerifyProc> verify_proc_; 67 scoped_refptr<CertVerifyProcFactory> verify_proc_factory_; 68 69 // Holds a list of CertVerifier::Requests that have not yet completed or been 70 // deleted. It is used to ensure that when the MultiThreadedCertVerifier is 71 // deleted, we eagerly reset all of the callbacks provided to Verify(), and 72 // don't call them later, as required by the CertVerifier contract. 73 base::LinkedList<InternalRequest> request_list_; 74 75 THREAD_CHECKER(thread_checker_); 76 }; 77 78 } // namespace net 79 80 #endif // NET_CERT_MULTI_THREADED_CERT_VERIFIER_H_ 81