Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef NET_CERT_MULTI_THREADED_CERT_VERIFIER_H_ | 5 #ifndef NET_CERT_MULTI_THREADED_CERT_VERIFIER_H_ |
| 6 #define NET_CERT_MULTI_THREADED_CERT_VERIFIER_H_ | 6 #define NET_CERT_MULTI_THREADED_CERT_VERIFIER_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 64 CRLSet* crl_set, | 64 CRLSet* crl_set, |
| 65 CertVerifyResult* verify_result, | 65 CertVerifyResult* verify_result, |
| 66 const CompletionCallback& callback, | 66 const CompletionCallback& callback, |
| 67 scoped_ptr<Request>* out_req, | 67 scoped_ptr<Request>* out_req, |
| 68 const BoundNetLog& net_log) override; | 68 const BoundNetLog& net_log) override; |
| 69 | 69 |
| 70 bool SupportsOCSPStapling() override; | 70 bool SupportsOCSPStapling() override; |
| 71 | 71 |
| 72 private: | 72 private: |
| 73 struct JobToRequestParamsComparator; | 73 struct JobToRequestParamsComparator; |
| 74 friend class CertVerifierCachePersister; | |
|
Ryan Sleevi
2016/04/16 00:36:15
The design I suggested was so we could explicitly
ramant (doing other things)
2016/04/21 16:41:54
Done.
| |
| 75 friend class CertVerifierCachePersisterTest; | |
| 74 friend class CertVerifierRequest; | 76 friend class CertVerifierRequest; |
| 75 friend class CertVerifierJob; | 77 friend class CertVerifierJob; |
| 76 friend class MultiThreadedCertVerifierTest; | 78 friend class MultiThreadedCertVerifierTest; |
| 77 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, CacheHit); | 79 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, CacheHit); |
| 78 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, DifferentCACerts); | 80 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, DifferentCACerts); |
| 79 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, InflightJoin); | 81 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, InflightJoin); |
| 80 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, MultipleInflightJoin); | 82 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, MultipleInflightJoin); |
| 81 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, CancelRequest); | 83 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, CancelRequest); |
| 82 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, | 84 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, |
| 83 RequestParamsComparators); | 85 RequestParamsComparators); |
| 84 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, | 86 FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, |
| 85 CertTrustAnchorProvider); | 87 CertTrustAnchorProvider); |
| 88 FRIEND_TEST_ALL_PREFIXES(CertVerifierCachePersisterTest, PersistCache); | |
| 89 FRIEND_TEST_ALL_PREFIXES(CertVerifierCachePersisterTest, | |
| 90 PersistCacheExpiredEntry); | |
| 86 | 91 |
| 87 // Input parameters of a certificate verification request. | 92 // Input parameters of a certificate verification request. |
| 88 struct NET_EXPORT_PRIVATE RequestParams { | 93 struct NET_EXPORT_PRIVATE RequestParams { |
| 89 RequestParams(const SHA1HashValue& cert_fingerprint_arg, | 94 RequestParams(const SHA1HashValue& cert_fingerprint_arg, |
| 90 const SHA1HashValue& ca_fingerprint_arg, | 95 const SHA1HashValue& ca_fingerprint_arg, |
| 91 const std::string& hostname_arg, | 96 const std::string& hostname_arg, |
| 92 const std::string& ocsp_response_arg, | 97 const std::string& ocsp_response_arg, |
| 93 int flags_arg, | 98 int flags_arg, |
| 94 const CertificateList& additional_trust_anchors); | 99 const CertificateList& additional_trust_anchors); |
| 95 RequestParams(const RequestParams& other); | 100 RequestParams(const RequestParams& other); |
| 101 RequestParams(); | |
|
Ryan Sleevi
2016/04/16 00:36:15
I'd like to avoid this, because it leaves RequestP
ramant (doing other things)
2016/04/21 16:41:54
Done.
| |
| 96 ~RequestParams(); | 102 ~RequestParams(); |
| 97 | 103 |
| 98 bool operator<(const RequestParams& other) const; | 104 bool operator<(const RequestParams& other) const; |
| 99 | 105 |
| 100 std::string hostname; | 106 std::string hostname; |
| 101 int flags; | 107 int flags; |
| 102 std::vector<SHA1HashValue> hash_values; | 108 std::vector<SHA1HashValue> hash_values; |
| 103 // The time when verification started. | 109 // The time when verification started. |
| 104 // Note: This uses base::Time, rather than base::TimeTicks, to | 110 // Note: This uses base::Time, rather than base::TimeTicks, to |
| 105 // account for system clock changes. | 111 // account for system clock changes. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 116 }; | 122 }; |
| 117 | 123 |
| 118 // Rather than having a single validity point along a monotonically increasing | 124 // Rather than having a single validity point along a monotonically increasing |
| 119 // timeline, certificate verification is based on falling within a range of | 125 // timeline, certificate verification is based on falling within a range of |
| 120 // the certificate's NotBefore and NotAfter and based on what the current | 126 // the certificate's NotBefore and NotAfter and based on what the current |
| 121 // system clock says (which may advance forwards or backwards as users correct | 127 // system clock says (which may advance forwards or backwards as users correct |
| 122 // clock skew). CacheValidityPeriod and CacheExpirationFunctor are helpers to | 128 // clock skew). CacheValidityPeriod and CacheExpirationFunctor are helpers to |
| 123 // ensure that expiration is measured both by the 'general' case (now + cache | 129 // ensure that expiration is measured both by the 'general' case (now + cache |
| 124 // TTL) and by whether or not significant enough clock skew was introduced | 130 // TTL) and by whether or not significant enough clock skew was introduced |
| 125 // since the last verification. | 131 // since the last verification. |
| 126 struct CacheValidityPeriod { | 132 struct NET_EXPORT_PRIVATE CacheValidityPeriod { |
| 127 explicit CacheValidityPeriod(const base::Time& now); | 133 explicit CacheValidityPeriod(const base::Time& now); |
| 128 CacheValidityPeriod(const base::Time& now, const base::Time& expiration); | 134 CacheValidityPeriod(const base::Time& now, const base::Time& expiration); |
| 129 | 135 |
| 130 base::Time verification_time; | 136 base::Time verification_time; |
| 131 base::Time expiration_time; | 137 base::Time expiration_time; |
| 132 }; | 138 }; |
| 133 | 139 |
| 134 struct CacheExpirationFunctor { | 140 struct NET_EXPORT_PRIVATE CacheExpirationFunctor { |
| 135 // Returns true iff |now| is within the validity period of |expiration|. | 141 // Returns true iff |now| is within the validity period of |expiration|. |
| 136 bool operator()(const CacheValidityPeriod& now, | 142 bool operator()(const CacheValidityPeriod& now, |
| 137 const CacheValidityPeriod& expiration) const; | 143 const CacheValidityPeriod& expiration) const; |
| 138 }; | 144 }; |
| 139 | 145 |
| 140 struct JobComparator { | 146 struct JobComparator { |
| 141 bool operator()(const CertVerifierJob* job1, | 147 bool operator()(const CertVerifierJob* job1, |
| 142 const CertVerifierJob* job2) const; | 148 const CertVerifierJob* job2) const; |
| 143 }; | 149 }; |
| 144 | 150 |
| 145 using JobSet = std::set<CertVerifierJob*, JobComparator>; | 151 using JobSet = std::set<CertVerifierJob*, JobComparator>; |
| 146 | 152 |
| 147 typedef ExpiringCache<RequestParams, CachedResult, CacheValidityPeriod, | 153 typedef ExpiringCache<RequestParams, CachedResult, CacheValidityPeriod, |
| 148 CacheExpirationFunctor> CertVerifierCache; | 154 CacheExpirationFunctor> CertVerifierCache; |
| 149 | 155 |
| 156 class NET_EXPORT CertVerifierCacheIterator { | |
|
Ryan Sleevi
2016/04/16 00:36:15
NAMING: This is highly redundant naming; just Iter
ramant (doing other things)
2016/04/21 16:41:54
Done.
| |
| 157 public: | |
| 158 explicit CertVerifierCacheIterator( | |
| 159 const MultiThreadedCertVerifier& verifier); | |
| 160 ~CertVerifierCacheIterator(); | |
| 161 | |
| 162 bool HasNext() const { return iterator_.HasNext(); } | |
| 163 void Advance() { iterator_.Advance(); } | |
| 164 | |
| 165 const std::string& hostname() const { | |
| 166 const RequestParams& key = iterator_.key(); | |
| 167 return key.hostname; | |
| 168 } | |
| 169 int flags() const { | |
| 170 const RequestParams& key = iterator_.key(); | |
| 171 return key.flags; | |
| 172 } | |
| 173 const std::vector<SHA1HashValue>& hash_values() const { | |
| 174 const RequestParams& key = iterator_.key(); | |
| 175 return key.hash_values; | |
| 176 } | |
| 177 const base::Time& start_time() const { | |
| 178 const RequestParams& key = iterator_.key(); | |
| 179 return key.start_time; | |
| 180 } | |
| 181 int error() const { | |
| 182 const CachedResult& value = iterator_.value(); | |
| 183 return value.error; | |
| 184 } | |
| 185 const CertVerifyResult& result() const { | |
| 186 const CachedResult& value = iterator_.value(); | |
| 187 return value.result; | |
| 188 } | |
| 189 const base::Time& verification_time() const { | |
| 190 const CacheValidityPeriod& expiration = iterator_.expiration(); | |
| 191 return expiration.verification_time; | |
| 192 } | |
| 193 const base::Time& expiration_time() const { | |
| 194 const CacheValidityPeriod& expiration = iterator_.expiration(); | |
| 195 return expiration.expiration_time; | |
| 196 } | |
| 197 | |
| 198 private: | |
| 199 CertVerifierCache::Iterator iterator_; | |
| 200 }; | |
| 201 | |
| 150 // Saves |result| into the cache, keyed by |key|. | 202 // Saves |result| into the cache, keyed by |key|. |
| 151 void SaveResultToCache(const RequestParams& key, const CachedResult& result); | 203 void SaveResultToCache(const RequestParams& key, const CachedResult& result); |
| 152 | 204 |
| 153 // CertDatabase::Observer methods: | 205 // CertDatabase::Observer methods: |
| 154 void OnCACertChanged(const X509Certificate* cert) override; | 206 void OnCACertChanged(const X509Certificate* cert) override; |
| 155 | 207 |
| 156 // Returns an inflight job for |key|. If there is no such job then returns | 208 // Returns an inflight job for |key|. If there is no such job then returns |
| 157 // null. | 209 // null. |
| 158 CertVerifierJob* FindJob(const RequestParams& key); | 210 CertVerifierJob* FindJob(const RequestParams& key); |
| 159 | 211 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 181 scoped_refptr<CertVerifyProc> verify_proc_; | 233 scoped_refptr<CertVerifyProc> verify_proc_; |
| 182 | 234 |
| 183 CertTrustAnchorProvider* trust_anchor_provider_; | 235 CertTrustAnchorProvider* trust_anchor_provider_; |
| 184 | 236 |
| 185 DISALLOW_COPY_AND_ASSIGN(MultiThreadedCertVerifier); | 237 DISALLOW_COPY_AND_ASSIGN(MultiThreadedCertVerifier); |
| 186 }; | 238 }; |
| 187 | 239 |
| 188 } // namespace net | 240 } // namespace net |
| 189 | 241 |
| 190 #endif // NET_CERT_MULTI_THREADED_CERT_VERIFIER_H_ | 242 #endif // NET_CERT_MULTI_THREADED_CERT_VERIFIER_H_ |
| OLD | NEW |