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_MOCK_CERT_VERIFIER_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_CERT_MOCK_CERT_VERIFIER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <list> 9*6777b538SAndroid Build Coastguard Worker #include <memory> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/callback_list.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/observer_list.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/scoped_observation.h" 14*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/cert/cert_verifier.h" 16*6777b538SAndroid Build Coastguard Worker #include "net/cert/cert_verify_result.h" 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker namespace net { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker class MockCertVerifier : public CertVerifier { 21*6777b538SAndroid Build Coastguard Worker public: 22*6777b538SAndroid Build Coastguard Worker // Creates a new MockCertVerifier. By default, any call to Verify() will 23*6777b538SAndroid Build Coastguard Worker // result in the cert status being flagged as CERT_STATUS_INVALID and return 24*6777b538SAndroid Build Coastguard Worker // an ERR_CERT_INVALID network error code. This behaviour can be overridden 25*6777b538SAndroid Build Coastguard Worker // by calling set_default_result() to change the default return value for 26*6777b538SAndroid Build Coastguard Worker // Verify() or by calling one of the AddResult*() methods to specifically 27*6777b538SAndroid Build Coastguard Worker // handle a certificate or certificate and host. 28*6777b538SAndroid Build Coastguard Worker MockCertVerifier(); 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker ~MockCertVerifier() override; 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker // CertVerifier implementation 33*6777b538SAndroid Build Coastguard Worker int Verify(const RequestParams& params, 34*6777b538SAndroid Build Coastguard Worker CertVerifyResult* verify_result, 35*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 36*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Request>* out_req, 37*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log) override; SetConfig(const Config & config)38*6777b538SAndroid Build Coastguard Worker void SetConfig(const Config& config) override {} 39*6777b538SAndroid Build Coastguard Worker void AddObserver(Observer* observer) override; 40*6777b538SAndroid Build Coastguard Worker void RemoveObserver(Observer* observer) override; 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker // Sets the default return value for Verify() for certificates/hosts that do 43*6777b538SAndroid Build Coastguard Worker // not have explicit results added via the AddResult*() methods. set_default_result(int default_result)44*6777b538SAndroid Build Coastguard Worker void set_default_result(int default_result) { 45*6777b538SAndroid Build Coastguard Worker default_result_ = default_result; 46*6777b538SAndroid Build Coastguard Worker } 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // Sets whether Verify() returns a result asynchronously. set_async(bool async)49*6777b538SAndroid Build Coastguard Worker void set_async(bool async) { async_ = async; } 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // Adds a rule that will cause any call to Verify() for |cert| to return rv, 52*6777b538SAndroid Build Coastguard Worker // copying |verify_result| into the verified result. 53*6777b538SAndroid Build Coastguard Worker // Note: Only the primary certificate of |cert| is checked. Any intermediate 54*6777b538SAndroid Build Coastguard Worker // certificates will be ignored. 55*6777b538SAndroid Build Coastguard Worker void AddResultForCert(scoped_refptr<X509Certificate> cert, 56*6777b538SAndroid Build Coastguard Worker const CertVerifyResult& verify_result, 57*6777b538SAndroid Build Coastguard Worker int rv); 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker // Same as AddResultForCert(), but further restricts it to only return for 60*6777b538SAndroid Build Coastguard Worker // hostnames that match |host_pattern|. 61*6777b538SAndroid Build Coastguard Worker void AddResultForCertAndHost(scoped_refptr<X509Certificate> cert, 62*6777b538SAndroid Build Coastguard Worker const std::string& host_pattern, 63*6777b538SAndroid Build Coastguard Worker const CertVerifyResult& verify_result, 64*6777b538SAndroid Build Coastguard Worker int rv); 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker // Clear all existing rules. 67*6777b538SAndroid Build Coastguard Worker void ClearRules(); 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker // Notify any registered observers of an OnCertVerifierChanged event. 70*6777b538SAndroid Build Coastguard Worker void SimulateOnCertVerifierChanged(); 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker private: 73*6777b538SAndroid Build Coastguard Worker struct Rule; 74*6777b538SAndroid Build Coastguard Worker using RuleList = std::list<Rule>; 75*6777b538SAndroid Build Coastguard Worker class MockRequest; 76*6777b538SAndroid Build Coastguard Worker friend class MockRequest; 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker int VerifyImpl(const RequestParams& params, CertVerifyResult* verify_result); 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker int default_result_ = ERR_CERT_INVALID; 81*6777b538SAndroid Build Coastguard Worker RuleList rules_; 82*6777b538SAndroid Build Coastguard Worker bool async_ = false; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker base::OnceClosureList request_list_; 85*6777b538SAndroid Build Coastguard Worker base::ObserverList<Observer> observers_; 86*6777b538SAndroid Build Coastguard Worker }; 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker // A MockCertVerifier that also records the RequestParams received for each 89*6777b538SAndroid Build Coastguard Worker // verification attempt. 90*6777b538SAndroid Build Coastguard Worker class ParamRecordingMockCertVerifier : public MockCertVerifier { 91*6777b538SAndroid Build Coastguard Worker public: 92*6777b538SAndroid Build Coastguard Worker ParamRecordingMockCertVerifier(); 93*6777b538SAndroid Build Coastguard Worker ~ParamRecordingMockCertVerifier() override; 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker int Verify(const RequestParams& params, 96*6777b538SAndroid Build Coastguard Worker CertVerifyResult* verify_result, 97*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 98*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Request>* out_req, 99*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log) override; 100*6777b538SAndroid Build Coastguard Worker GetVerifyParams()101*6777b538SAndroid Build Coastguard Worker const std::vector<RequestParams>& GetVerifyParams() const { return params_; } 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker private: 104*6777b538SAndroid Build Coastguard Worker std::vector<RequestParams> params_; 105*6777b538SAndroid Build Coastguard Worker }; 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker class CertVerifierObserverCounter : public CertVerifier::Observer { 108*6777b538SAndroid Build Coastguard Worker public: 109*6777b538SAndroid Build Coastguard Worker explicit CertVerifierObserverCounter(CertVerifier* verifier); 110*6777b538SAndroid Build Coastguard Worker ~CertVerifierObserverCounter() override; 111*6777b538SAndroid Build Coastguard Worker 112*6777b538SAndroid Build Coastguard Worker // CertVerifier::Observer implementation: 113*6777b538SAndroid Build Coastguard Worker void OnCertVerifierChanged() override; 114*6777b538SAndroid Build Coastguard Worker change_count()115*6777b538SAndroid Build Coastguard Worker unsigned change_count() const { return change_count_; } 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker private: 118*6777b538SAndroid Build Coastguard Worker base::ScopedObservation<CertVerifier, CertVerifier::Observer> obs_{this}; 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Worker unsigned change_count_ = 0; 121*6777b538SAndroid Build Coastguard Worker }; 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker } // namespace net 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker #endif // NET_CERT_MOCK_CERT_VERIFIER_H_ 126