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 #include "net/cert/multi_threaded_cert_verifier.h" | 5 #include "net/cert/multi_threaded_cert_verifier.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/leak_annotations.h" | 8 #include "base/debug/leak_annotations.h" |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 | 34 |
35 class MockCertVerifyProc : public CertVerifyProc { | 35 class MockCertVerifyProc : public CertVerifyProc { |
36 public: | 36 public: |
37 MockCertVerifyProc() {} | 37 MockCertVerifyProc() {} |
38 | 38 |
39 private: | 39 private: |
40 ~MockCertVerifyProc() override {} | 40 ~MockCertVerifyProc() override {} |
41 | 41 |
42 // CertVerifyProc implementation | 42 // CertVerifyProc implementation |
43 bool SupportsAdditionalTrustAnchors() const override { return false; } | 43 bool SupportsAdditionalTrustAnchors() const override { return false; } |
| 44 bool SupportsOCSPStapling() const override { return false; } |
44 | 45 |
45 int VerifyInternal(X509Certificate* cert, | 46 int VerifyInternal(X509Certificate* cert, |
46 const std::string& hostname, | 47 const std::string& hostname, |
| 48 const std::string& ocsp_response, |
47 int flags, | 49 int flags, |
48 CRLSet* crl_set, | 50 CRLSet* crl_set, |
49 const CertificateList& additional_trust_anchors, | 51 const CertificateList& additional_trust_anchors, |
50 CertVerifyResult* verify_result) override { | 52 CertVerifyResult* verify_result) override { |
51 verify_result->Reset(); | 53 verify_result->Reset(); |
52 verify_result->verified_cert = cert; | 54 verify_result->verified_cert = cert; |
53 verify_result->cert_status = CERT_STATUS_COMMON_NAME_INVALID; | 55 verify_result->cert_status = CERT_STATUS_COMMON_NAME_INVALID; |
54 return ERR_CERT_COMMON_NAME_INVALID; | 56 return ERR_CERT_COMMON_NAME_INVALID; |
55 } | 57 } |
56 }; | 58 }; |
(...skipping 21 matching lines...) Expand all Loading... |
78 base::FilePath certs_dir = GetTestCertsDirectory(); | 80 base::FilePath certs_dir = GetTestCertsDirectory(); |
79 scoped_refptr<X509Certificate> test_cert( | 81 scoped_refptr<X509Certificate> test_cert( |
80 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 82 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
81 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 83 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
82 | 84 |
83 int error; | 85 int error; |
84 CertVerifyResult verify_result; | 86 CertVerifyResult verify_result; |
85 TestCompletionCallback callback; | 87 TestCompletionCallback callback; |
86 CertVerifier::RequestHandle request_handle; | 88 CertVerifier::RequestHandle request_handle; |
87 | 89 |
88 error = verifier_.Verify(test_cert.get(), | 90 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
89 "www.example.com", | 91 NULL, &verify_result, callback.callback(), |
90 0, | 92 &request_handle, BoundNetLog()); |
91 NULL, | |
92 &verify_result, | |
93 callback.callback(), | |
94 &request_handle, | |
95 BoundNetLog()); | |
96 ASSERT_EQ(ERR_IO_PENDING, error); | 93 ASSERT_EQ(ERR_IO_PENDING, error); |
97 EXPECT_TRUE(request_handle); | 94 EXPECT_TRUE(request_handle); |
98 error = callback.WaitForResult(); | 95 error = callback.WaitForResult(); |
99 ASSERT_TRUE(IsCertificateError(error)); | 96 ASSERT_TRUE(IsCertificateError(error)); |
100 ASSERT_EQ(1u, verifier_.requests()); | 97 ASSERT_EQ(1u, verifier_.requests()); |
101 ASSERT_EQ(0u, verifier_.cache_hits()); | 98 ASSERT_EQ(0u, verifier_.cache_hits()); |
102 ASSERT_EQ(0u, verifier_.inflight_joins()); | 99 ASSERT_EQ(0u, verifier_.inflight_joins()); |
103 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 100 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
104 | 101 |
105 error = verifier_.Verify(test_cert.get(), | 102 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
106 "www.example.com", | 103 NULL, &verify_result, callback.callback(), |
107 0, | 104 &request_handle, BoundNetLog()); |
108 NULL, | |
109 &verify_result, | |
110 callback.callback(), | |
111 &request_handle, | |
112 BoundNetLog()); | |
113 // Synchronous completion. | 105 // Synchronous completion. |
114 ASSERT_NE(ERR_IO_PENDING, error); | 106 ASSERT_NE(ERR_IO_PENDING, error); |
115 ASSERT_TRUE(IsCertificateError(error)); | 107 ASSERT_TRUE(IsCertificateError(error)); |
116 ASSERT_TRUE(request_handle == NULL); | 108 ASSERT_TRUE(request_handle == NULL); |
117 ASSERT_EQ(2u, verifier_.requests()); | 109 ASSERT_EQ(2u, verifier_.requests()); |
118 ASSERT_EQ(1u, verifier_.cache_hits()); | 110 ASSERT_EQ(1u, verifier_.cache_hits()); |
119 ASSERT_EQ(0u, verifier_.inflight_joins()); | 111 ASSERT_EQ(0u, verifier_.inflight_joins()); |
120 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 112 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
121 } | 113 } |
122 | 114 |
(...skipping 25 matching lines...) Expand all Loading... |
148 intermediates.push_back(intermediate_cert2->os_cert_handle()); | 140 intermediates.push_back(intermediate_cert2->os_cert_handle()); |
149 scoped_refptr<X509Certificate> cert_chain2 = | 141 scoped_refptr<X509Certificate> cert_chain2 = |
150 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), | 142 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), |
151 intermediates); | 143 intermediates); |
152 | 144 |
153 int error; | 145 int error; |
154 CertVerifyResult verify_result; | 146 CertVerifyResult verify_result; |
155 TestCompletionCallback callback; | 147 TestCompletionCallback callback; |
156 CertVerifier::RequestHandle request_handle; | 148 CertVerifier::RequestHandle request_handle; |
157 | 149 |
158 error = verifier_.Verify(cert_chain1.get(), | 150 error = verifier_.Verify(cert_chain1.get(), "www.example.com", std::string(), |
159 "www.example.com", | 151 0, NULL, &verify_result, callback.callback(), |
160 0, | 152 &request_handle, BoundNetLog()); |
161 NULL, | |
162 &verify_result, | |
163 callback.callback(), | |
164 &request_handle, | |
165 BoundNetLog()); | |
166 ASSERT_EQ(ERR_IO_PENDING, error); | 153 ASSERT_EQ(ERR_IO_PENDING, error); |
167 EXPECT_TRUE(request_handle); | 154 EXPECT_TRUE(request_handle); |
168 error = callback.WaitForResult(); | 155 error = callback.WaitForResult(); |
169 ASSERT_TRUE(IsCertificateError(error)); | 156 ASSERT_TRUE(IsCertificateError(error)); |
170 ASSERT_EQ(1u, verifier_.requests()); | 157 ASSERT_EQ(1u, verifier_.requests()); |
171 ASSERT_EQ(0u, verifier_.cache_hits()); | 158 ASSERT_EQ(0u, verifier_.cache_hits()); |
172 ASSERT_EQ(0u, verifier_.inflight_joins()); | 159 ASSERT_EQ(0u, verifier_.inflight_joins()); |
173 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 160 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
174 | 161 |
175 error = verifier_.Verify(cert_chain2.get(), | 162 error = verifier_.Verify(cert_chain2.get(), "www.example.com", std::string(), |
176 "www.example.com", | 163 0, NULL, &verify_result, callback.callback(), |
177 0, | 164 &request_handle, BoundNetLog()); |
178 NULL, | |
179 &verify_result, | |
180 callback.callback(), | |
181 &request_handle, | |
182 BoundNetLog()); | |
183 ASSERT_EQ(ERR_IO_PENDING, error); | 165 ASSERT_EQ(ERR_IO_PENDING, error); |
184 EXPECT_TRUE(request_handle); | 166 EXPECT_TRUE(request_handle); |
185 error = callback.WaitForResult(); | 167 error = callback.WaitForResult(); |
186 ASSERT_TRUE(IsCertificateError(error)); | 168 ASSERT_TRUE(IsCertificateError(error)); |
187 ASSERT_EQ(2u, verifier_.requests()); | 169 ASSERT_EQ(2u, verifier_.requests()); |
188 ASSERT_EQ(0u, verifier_.cache_hits()); | 170 ASSERT_EQ(0u, verifier_.cache_hits()); |
189 ASSERT_EQ(0u, verifier_.inflight_joins()); | 171 ASSERT_EQ(0u, verifier_.inflight_joins()); |
190 ASSERT_EQ(2u, verifier_.GetCacheSize()); | 172 ASSERT_EQ(2u, verifier_.GetCacheSize()); |
191 } | 173 } |
192 | 174 |
193 // Tests an inflight join. | 175 // Tests an inflight join. |
194 TEST_F(MultiThreadedCertVerifierTest, InflightJoin) { | 176 TEST_F(MultiThreadedCertVerifierTest, InflightJoin) { |
195 base::FilePath certs_dir = GetTestCertsDirectory(); | 177 base::FilePath certs_dir = GetTestCertsDirectory(); |
196 scoped_refptr<X509Certificate> test_cert( | 178 scoped_refptr<X509Certificate> test_cert( |
197 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 179 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
198 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 180 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
199 | 181 |
200 int error; | 182 int error; |
201 CertVerifyResult verify_result; | 183 CertVerifyResult verify_result; |
202 TestCompletionCallback callback; | 184 TestCompletionCallback callback; |
203 CertVerifier::RequestHandle request_handle; | 185 CertVerifier::RequestHandle request_handle; |
204 CertVerifyResult verify_result2; | 186 CertVerifyResult verify_result2; |
205 TestCompletionCallback callback2; | 187 TestCompletionCallback callback2; |
206 CertVerifier::RequestHandle request_handle2; | 188 CertVerifier::RequestHandle request_handle2; |
207 | 189 |
208 error = verifier_.Verify(test_cert.get(), | 190 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
209 "www.example.com", | 191 NULL, &verify_result, callback.callback(), |
210 0, | 192 &request_handle, BoundNetLog()); |
211 NULL, | |
212 &verify_result, | |
213 callback.callback(), | |
214 &request_handle, | |
215 BoundNetLog()); | |
216 ASSERT_EQ(ERR_IO_PENDING, error); | 193 ASSERT_EQ(ERR_IO_PENDING, error); |
217 EXPECT_TRUE(request_handle); | 194 EXPECT_TRUE(request_handle); |
218 error = verifier_.Verify(test_cert.get(), | 195 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
219 "www.example.com", | 196 NULL, &verify_result2, callback2.callback(), |
220 0, | 197 &request_handle2, BoundNetLog()); |
221 NULL, | |
222 &verify_result2, | |
223 callback2.callback(), | |
224 &request_handle2, | |
225 BoundNetLog()); | |
226 EXPECT_EQ(ERR_IO_PENDING, error); | 198 EXPECT_EQ(ERR_IO_PENDING, error); |
227 EXPECT_TRUE(request_handle2 != NULL); | 199 EXPECT_TRUE(request_handle2 != NULL); |
228 error = callback.WaitForResult(); | 200 error = callback.WaitForResult(); |
229 EXPECT_TRUE(IsCertificateError(error)); | 201 EXPECT_TRUE(IsCertificateError(error)); |
230 error = callback2.WaitForResult(); | 202 error = callback2.WaitForResult(); |
231 ASSERT_TRUE(IsCertificateError(error)); | 203 ASSERT_TRUE(IsCertificateError(error)); |
232 ASSERT_EQ(2u, verifier_.requests()); | 204 ASSERT_EQ(2u, verifier_.requests()); |
233 ASSERT_EQ(0u, verifier_.cache_hits()); | 205 ASSERT_EQ(0u, verifier_.cache_hits()); |
234 ASSERT_EQ(1u, verifier_.inflight_joins()); | 206 ASSERT_EQ(1u, verifier_.inflight_joins()); |
235 } | 207 } |
236 | 208 |
237 // Tests that the callback of a canceled request is never made. | 209 // Tests that the callback of a canceled request is never made. |
238 TEST_F(MultiThreadedCertVerifierTest, CancelRequest) { | 210 TEST_F(MultiThreadedCertVerifierTest, CancelRequest) { |
239 base::FilePath certs_dir = GetTestCertsDirectory(); | 211 base::FilePath certs_dir = GetTestCertsDirectory(); |
240 scoped_refptr<X509Certificate> test_cert( | 212 scoped_refptr<X509Certificate> test_cert( |
241 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 213 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
242 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 214 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
243 | 215 |
244 int error; | 216 int error; |
245 CertVerifyResult verify_result; | 217 CertVerifyResult verify_result; |
246 CertVerifier::RequestHandle request_handle; | 218 CertVerifier::RequestHandle request_handle; |
247 | 219 |
248 error = verifier_.Verify(test_cert.get(), | 220 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
249 "www.example.com", | 221 NULL, &verify_result, base::Bind(&FailTest), |
250 0, | 222 &request_handle, BoundNetLog()); |
251 NULL, | |
252 &verify_result, | |
253 base::Bind(&FailTest), | |
254 &request_handle, | |
255 BoundNetLog()); | |
256 ASSERT_EQ(ERR_IO_PENDING, error); | 223 ASSERT_EQ(ERR_IO_PENDING, error); |
257 ASSERT_TRUE(request_handle != NULL); | 224 ASSERT_TRUE(request_handle != NULL); |
258 verifier_.CancelRequest(request_handle); | 225 verifier_.CancelRequest(request_handle); |
259 | 226 |
260 // Issue a few more requests to the worker pool and wait for their | 227 // Issue a few more requests to the worker pool and wait for their |
261 // completion, so that the task of the canceled request (which runs on a | 228 // completion, so that the task of the canceled request (which runs on a |
262 // worker thread) is likely to complete by the end of this test. | 229 // worker thread) is likely to complete by the end of this test. |
263 TestCompletionCallback callback; | 230 TestCompletionCallback callback; |
264 for (int i = 0; i < 5; ++i) { | 231 for (int i = 0; i < 5; ++i) { |
265 error = verifier_.Verify(test_cert.get(), | 232 error = verifier_.Verify(test_cert.get(), "www2.example.com", std::string(), |
266 "www2.example.com", | 233 0, NULL, &verify_result, callback.callback(), |
267 0, | 234 &request_handle, BoundNetLog()); |
268 NULL, | |
269 &verify_result, | |
270 callback.callback(), | |
271 &request_handle, | |
272 BoundNetLog()); | |
273 ASSERT_EQ(ERR_IO_PENDING, error); | 235 ASSERT_EQ(ERR_IO_PENDING, error); |
274 EXPECT_TRUE(request_handle); | 236 EXPECT_TRUE(request_handle); |
275 error = callback.WaitForResult(); | 237 error = callback.WaitForResult(); |
276 verifier_.ClearCache(); | 238 verifier_.ClearCache(); |
277 } | 239 } |
278 } | 240 } |
279 | 241 |
280 // Tests that a canceled request is not leaked. | 242 // Tests that a canceled request is not leaked. |
281 TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) { | 243 TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) { |
282 base::FilePath certs_dir = GetTestCertsDirectory(); | 244 base::FilePath certs_dir = GetTestCertsDirectory(); |
283 scoped_refptr<X509Certificate> test_cert( | 245 scoped_refptr<X509Certificate> test_cert( |
284 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 246 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
285 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 247 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
286 | 248 |
287 int error; | 249 int error; |
288 CertVerifyResult verify_result; | 250 CertVerifyResult verify_result; |
289 TestCompletionCallback callback; | 251 TestCompletionCallback callback; |
290 CertVerifier::RequestHandle request_handle; | 252 CertVerifier::RequestHandle request_handle; |
291 | 253 |
292 { | 254 { |
293 // Because shutdown intentionally doesn't join worker threads, a | 255 // Because shutdown intentionally doesn't join worker threads, a |
294 // CertVerifyWorker may be leaked if the main thread shuts down before the | 256 // CertVerifyWorker may be leaked if the main thread shuts down before the |
295 // worker thread. | 257 // worker thread. |
296 ANNOTATE_SCOPED_MEMORY_LEAK; | 258 ANNOTATE_SCOPED_MEMORY_LEAK; |
297 error = verifier_.Verify(test_cert.get(), "www.example.com", 0, NULL, | 259 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), |
298 &verify_result, callback.callback(), | 260 0, NULL, &verify_result, callback.callback(), |
299 &request_handle, BoundNetLog()); | 261 &request_handle, BoundNetLog()); |
300 } | 262 } |
301 ASSERT_EQ(ERR_IO_PENDING, error); | 263 ASSERT_EQ(ERR_IO_PENDING, error); |
302 EXPECT_TRUE(request_handle); | 264 EXPECT_TRUE(request_handle); |
303 verifier_.CancelRequest(request_handle); | 265 verifier_.CancelRequest(request_handle); |
304 // Destroy |verifier| by going out of scope. | 266 // Destroy |verifier| by going out of scope. |
305 } | 267 } |
306 | 268 |
307 TEST_F(MultiThreadedCertVerifierTest, RequestParamsComparators) { | 269 TEST_F(MultiThreadedCertVerifierTest, RequestParamsComparators) { |
308 SHA1HashValue a_key; | 270 SHA1HashValue a_key; |
(...skipping 11 matching lines...) Expand all Loading... |
320 // Keys to test | 282 // Keys to test |
321 MultiThreadedCertVerifier::RequestParams key1; | 283 MultiThreadedCertVerifier::RequestParams key1; |
322 MultiThreadedCertVerifier::RequestParams key2; | 284 MultiThreadedCertVerifier::RequestParams key2; |
323 | 285 |
324 // Expectation: | 286 // Expectation: |
325 // -1 means key1 is less than key2 | 287 // -1 means key1 is less than key2 |
326 // 0 means key1 equals key2 | 288 // 0 means key1 equals key2 |
327 // 1 means key1 is greater than key2 | 289 // 1 means key1 is greater than key2 |
328 int expected_result; | 290 int expected_result; |
329 } tests[] = { | 291 } tests[] = { |
330 { // Test for basic equivalence. | 292 { |
331 MultiThreadedCertVerifier::RequestParams(a_key, a_key, "www.example.test", | 293 // Test for basic equivalence. |
332 0, test_list), | 294 MultiThreadedCertVerifier::RequestParams( |
333 MultiThreadedCertVerifier::RequestParams(a_key, a_key, "www.example.test", | 295 a_key, a_key, "www.example.test", std::string(), 0, test_list), |
334 0, test_list), | 296 MultiThreadedCertVerifier::RequestParams( |
335 0, | 297 a_key, a_key, "www.example.test", std::string(), 0, test_list), |
336 }, | 298 0, |
337 { // Test that different certificates but with the same CA and for | 299 }, |
| 300 { |
| 301 // Test that different certificates but with the same CA and for |
338 // the same host are different validation keys. | 302 // the same host are different validation keys. |
339 MultiThreadedCertVerifier::RequestParams(a_key, a_key, "www.example.test", | 303 MultiThreadedCertVerifier::RequestParams( |
340 0, test_list), | 304 a_key, a_key, "www.example.test", std::string(), 0, test_list), |
341 MultiThreadedCertVerifier::RequestParams(z_key, a_key, "www.example.test", | 305 MultiThreadedCertVerifier::RequestParams( |
342 0, test_list), | 306 z_key, a_key, "www.example.test", std::string(), 0, test_list), |
343 -1, | 307 -1, |
344 }, | 308 }, |
345 { // Test that the same EE certificate for the same host, but with | 309 { |
| 310 // Test that the same EE certificate for the same host, but with |
346 // different chains are different validation keys. | 311 // different chains are different validation keys. |
347 MultiThreadedCertVerifier::RequestParams(a_key, z_key, "www.example.test", | 312 MultiThreadedCertVerifier::RequestParams( |
348 0, test_list), | 313 a_key, z_key, "www.example.test", std::string(), 0, test_list), |
349 MultiThreadedCertVerifier::RequestParams(a_key, a_key, "www.example.test", | 314 MultiThreadedCertVerifier::RequestParams( |
350 0, test_list), | 315 a_key, a_key, "www.example.test", std::string(), 0, test_list), |
351 1, | 316 1, |
352 }, | 317 }, |
353 { // The same certificate, with the same chain, but for different | 318 { |
| 319 // The same certificate, with the same chain, but for different |
354 // hosts are different validation keys. | 320 // hosts are different validation keys. |
355 MultiThreadedCertVerifier::RequestParams(a_key, a_key, | 321 MultiThreadedCertVerifier::RequestParams( |
356 "www1.example.test", 0, | 322 a_key, a_key, "www1.example.test", std::string(), 0, test_list), |
357 test_list), | 323 MultiThreadedCertVerifier::RequestParams( |
358 MultiThreadedCertVerifier::RequestParams(a_key, a_key, | 324 a_key, a_key, "www2.example.test", std::string(), 0, test_list), |
359 "www2.example.test", 0, | 325 -1, |
360 test_list), | 326 }, |
361 -1, | 327 { |
362 }, | 328 // The same certificate, chain, and host, but with different flags |
363 { // The same certificate, chain, and host, but with different flags | |
364 // are different validation keys. | 329 // are different validation keys. |
365 MultiThreadedCertVerifier::RequestParams(a_key, a_key, "www.example.test", | 330 MultiThreadedCertVerifier::RequestParams( |
366 CertVerifier::VERIFY_EV_CERT, | 331 a_key, a_key, "www.example.test", std::string(), |
367 test_list), | 332 CertVerifier::VERIFY_EV_CERT, test_list), |
368 MultiThreadedCertVerifier::RequestParams(a_key, a_key, "www.example.test", | 333 MultiThreadedCertVerifier::RequestParams( |
369 0, test_list), | 334 a_key, a_key, "www.example.test", std::string(), 0, test_list), |
370 1, | 335 1, |
371 }, | 336 }, |
372 { // Different additional_trust_anchors. | 337 { |
373 MultiThreadedCertVerifier::RequestParams(a_key, a_key, "www.example.test", | 338 // Different additional_trust_anchors. |
374 0, empty_list), | 339 MultiThreadedCertVerifier::RequestParams( |
375 MultiThreadedCertVerifier::RequestParams(a_key, a_key, "www.example.test", | 340 a_key, a_key, "www.example.test", std::string(), 0, empty_list), |
376 0, test_list), | 341 MultiThreadedCertVerifier::RequestParams( |
377 -1, | 342 a_key, a_key, "www.example.test", std::string(), 0, test_list), |
378 }, | 343 -1, |
| 344 }, |
| 345 { |
| 346 // Different OCSP responses. |
| 347 MultiThreadedCertVerifier::RequestParams( |
| 348 a_key, a_key, "www.example.test", "ocsp response", 0, test_list), |
| 349 MultiThreadedCertVerifier::RequestParams( |
| 350 a_key, a_key, "www.example.test", std::string(), 0, test_list), |
| 351 -1, |
| 352 }, |
379 }; | 353 }; |
380 for (size_t i = 0; i < arraysize(tests); ++i) { | 354 for (size_t i = 0; i < arraysize(tests); ++i) { |
381 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]", i)); | 355 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]", i)); |
382 | 356 |
383 const MultiThreadedCertVerifier::RequestParams& key1 = tests[i].key1; | 357 const MultiThreadedCertVerifier::RequestParams& key1 = tests[i].key1; |
384 const MultiThreadedCertVerifier::RequestParams& key2 = tests[i].key2; | 358 const MultiThreadedCertVerifier::RequestParams& key2 = tests[i].key2; |
385 | 359 |
386 switch (tests[i].expected_result) { | 360 switch (tests[i].expected_result) { |
387 case -1: | 361 case -1: |
388 EXPECT_TRUE(key1 < key2); | 362 EXPECT_TRUE(key1 < key2); |
(...skipping 26 matching lines...) Expand all Loading... |
415 cert_list.push_back(test_cert); | 389 cert_list.push_back(test_cert); |
416 | 390 |
417 // Check that Verify() asks the |trust_provider| for the current list of | 391 // Check that Verify() asks the |trust_provider| for the current list of |
418 // additional trust anchors. | 392 // additional trust anchors. |
419 int error; | 393 int error; |
420 CertVerifyResult verify_result; | 394 CertVerifyResult verify_result; |
421 TestCompletionCallback callback; | 395 TestCompletionCallback callback; |
422 CertVerifier::RequestHandle request_handle; | 396 CertVerifier::RequestHandle request_handle; |
423 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) | 397 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) |
424 .WillOnce(ReturnRef(empty_cert_list)); | 398 .WillOnce(ReturnRef(empty_cert_list)); |
425 error = verifier_.Verify(test_cert.get(), | 399 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
426 "www.example.com", | 400 NULL, &verify_result, callback.callback(), |
427 0, | 401 &request_handle, BoundNetLog()); |
428 NULL, | |
429 &verify_result, | |
430 callback.callback(), | |
431 &request_handle, | |
432 BoundNetLog()); | |
433 Mock::VerifyAndClearExpectations(&trust_provider); | 402 Mock::VerifyAndClearExpectations(&trust_provider); |
434 ASSERT_EQ(ERR_IO_PENDING, error); | 403 ASSERT_EQ(ERR_IO_PENDING, error); |
435 EXPECT_TRUE(request_handle); | 404 EXPECT_TRUE(request_handle); |
436 error = callback.WaitForResult(); | 405 error = callback.WaitForResult(); |
437 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 406 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
438 ASSERT_EQ(1u, verifier_.requests()); | 407 ASSERT_EQ(1u, verifier_.requests()); |
439 ASSERT_EQ(0u, verifier_.cache_hits()); | 408 ASSERT_EQ(0u, verifier_.cache_hits()); |
440 | 409 |
441 // The next Verify() uses the cached result. | 410 // The next Verify() uses the cached result. |
442 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) | 411 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) |
443 .WillOnce(ReturnRef(empty_cert_list)); | 412 .WillOnce(ReturnRef(empty_cert_list)); |
444 error = verifier_.Verify(test_cert.get(), | 413 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
445 "www.example.com", | 414 NULL, &verify_result, callback.callback(), |
446 0, | 415 &request_handle, BoundNetLog()); |
447 NULL, | |
448 &verify_result, | |
449 callback.callback(), | |
450 &request_handle, | |
451 BoundNetLog()); | |
452 Mock::VerifyAndClearExpectations(&trust_provider); | 416 Mock::VerifyAndClearExpectations(&trust_provider); |
453 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 417 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
454 EXPECT_FALSE(request_handle); | 418 EXPECT_FALSE(request_handle); |
455 ASSERT_EQ(2u, verifier_.requests()); | 419 ASSERT_EQ(2u, verifier_.requests()); |
456 ASSERT_EQ(1u, verifier_.cache_hits()); | 420 ASSERT_EQ(1u, verifier_.cache_hits()); |
457 | 421 |
458 // Another Verify() for the same certificate but with a different list of | 422 // Another Verify() for the same certificate but with a different list of |
459 // trust anchors will not reuse the cache. | 423 // trust anchors will not reuse the cache. |
460 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) | 424 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) |
461 .WillOnce(ReturnRef(cert_list)); | 425 .WillOnce(ReturnRef(cert_list)); |
462 error = verifier_.Verify(test_cert.get(), | 426 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
463 "www.example.com", | 427 NULL, &verify_result, callback.callback(), |
464 0, | 428 &request_handle, BoundNetLog()); |
465 NULL, | |
466 &verify_result, | |
467 callback.callback(), | |
468 &request_handle, | |
469 BoundNetLog()); | |
470 Mock::VerifyAndClearExpectations(&trust_provider); | 429 Mock::VerifyAndClearExpectations(&trust_provider); |
471 ASSERT_EQ(ERR_IO_PENDING, error); | 430 ASSERT_EQ(ERR_IO_PENDING, error); |
472 EXPECT_TRUE(request_handle); | 431 EXPECT_TRUE(request_handle); |
473 error = callback.WaitForResult(); | 432 error = callback.WaitForResult(); |
474 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 433 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
475 ASSERT_EQ(3u, verifier_.requests()); | 434 ASSERT_EQ(3u, verifier_.requests()); |
476 ASSERT_EQ(1u, verifier_.cache_hits()); | 435 ASSERT_EQ(1u, verifier_.cache_hits()); |
477 } | 436 } |
478 | 437 |
479 } // namespace net | 438 } // namespace net |
OLD | NEW |