OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/cronet/cert/cert_verifier_cache_persister.h" | |
6 | |
7 #include <memory> | |
8 #include <string> | |
9 | |
10 #include "base/android/path_utils.h" | |
11 #include "base/files/file_path.h" | |
12 #include "base/memory/ptr_util.h" | |
13 #include "base/memory/ref_counted.h" | |
14 #include "net/base/net_errors.h" | |
15 #include "net/base/test_completion_callback.h" | |
16 #include "net/base/test_data_directory.h" | |
17 #include "net/cert/caching_cert_verifier.h" | |
18 #include "net/cert/cert_verifier.h" | |
19 #include "net/cert/cert_verify_result.h" | |
20 #include "net/cert/mock_cert_verifier.h" | |
21 #include "net/cert/x509_certificate.h" | |
22 #include "net/log/net_log.h" | |
23 #include "net/test/cert_test_util.h" | |
24 #include "testing/gtest/include/gtest/gtest.h" | |
25 | |
26 namespace cronet { | |
27 | |
28 namespace { | |
29 | |
30 void VerifyCert(const std::string& cert_name, | |
31 const std::string& hostname, | |
32 net::CachingCertVerifier* verifier, | |
33 net::CertVerifyResult* verify_result) { | |
34 // Set up server certs. | |
35 scoped_refptr<net::X509Certificate> cert( | |
36 net::ImportCertFromFile(net::GetTestCertsDirectory(), cert_name)); | |
37 ASSERT_TRUE(cert); | |
38 | |
39 net::TestCompletionCallback callback; | |
40 std::unique_ptr<net::CertVerifier::Request> request; | |
41 | |
42 int error = callback.GetResult(verifier->Verify( | |
43 net::CertVerifier::RequestParams(cert.get(), hostname, 0, std::string(), | |
44 net::CertificateList()), | |
45 nullptr, verify_result, callback.callback(), &request, | |
46 net::BoundNetLog())); | |
47 | |
48 ASSERT_TRUE(net::IsCertificateError(error)); | |
49 } | |
50 | |
51 } // namespace | |
52 | |
53 TEST(CertVerifierCachePersisterTest, RestoreEmptyData) { | |
54 // Restoring empty data should fail. | |
55 cronet_pb::CertVerificationCache cert_cache; | |
56 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
57 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier)); | |
58 } | |
59 | |
60 TEST(CertVerifierCachePersisterTest, SerializeCache) { | |
61 net::CertVerifyResult verify_result; | |
62 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
63 ASSERT_NO_FATAL_FAILURE( | |
64 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
65 cronet_pb::CertVerificationCache cert_cache = | |
66 SerializeCertVerifierCache(verifier); | |
67 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
68 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
69 } | |
70 | |
71 // Create a new Verifier and restoring the data into it should succeed. | |
72 TEST(CertVerifierCachePersisterTest, RestoreMultipleEntriesIntoNewVerifier) { | |
73 scoped_refptr<net::X509Certificate> ok_cert( | |
74 net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem")); | |
75 ASSERT_TRUE(ok_cert); | |
76 | |
77 const scoped_refptr<net::X509Certificate> root_cert = | |
78 net::ImportCertFromFile(net::GetTestCertsDirectory(), "root_ca_cert.pem"); | |
79 ASSERT_TRUE(root_cert); | |
80 | |
81 // Create a certificate that contains both a leaf and an intermediate/root. | |
82 net::X509Certificate::OSCertHandles chain; | |
83 chain.push_back(root_cert->os_cert_handle()); | |
84 const scoped_refptr<net::X509Certificate> combined_cert = | |
85 net::X509Certificate::CreateFromHandle(ok_cert->os_cert_handle(), chain); | |
86 ASSERT_TRUE(combined_cert); | |
87 | |
88 int error; | |
89 net::TestCompletionCallback callback; | |
90 std::unique_ptr<net::CertVerifier::Request> request; | |
91 | |
92 // Verify www.example.com host's certificate. | |
93 std::string example_hostname("www.example.com"); | |
94 net::CertVerifyResult verifyier1_result1; | |
Ryan Sleevi
2016/06/21 01:22:10
spelling: verifier1_result
ramant (doing other things)
2016/06/21 16:52:02
Done.
| |
95 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
96 error = callback.GetResult(verifier.Verify( | |
97 net::CertVerifier::RequestParams(ok_cert, example_hostname, 0, | |
98 std::string(), net::CertificateList()), | |
99 nullptr, &verifyier1_result1, callback.callback(), &request, | |
100 net::BoundNetLog())); | |
101 ASSERT_TRUE(net::IsCertificateError(error)); | |
102 | |
103 // Verify www.example2.com host's certificate. | |
Ryan Sleevi
2016/06/21 01:22:10
example.com is a special (reserved) name, but exam
ramant (doing other things)
2016/06/21 16:52:02
Done.
| |
104 std::string example2_hostname("www.example2.com"); | |
105 net::CertVerifyResult verifier1_result2; | |
106 error = callback.GetResult(verifier.Verify( | |
107 net::CertVerifier::RequestParams(combined_cert, example2_hostname, 0, | |
108 std::string(), net::CertificateList()), | |
109 nullptr, &verifier1_result2, callback.callback(), &request, | |
110 net::BoundNetLog())); | |
111 ASSERT_TRUE(net::IsCertificateError(error)); | |
112 | |
113 cronet_pb::CertVerificationCache cert_cache = | |
114 SerializeCertVerifierCache(verifier); | |
115 DCHECK_EQ(2, cert_cache.cert_entry_size()); | |
116 DCHECK_EQ(2, cert_cache.cache_entry_size()); | |
117 | |
118 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
119 | |
120 // Populate |verifier2|'s cache. | |
121 EXPECT_TRUE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
122 | |
123 // Verify the cert for www.example.com with |verifier2|. | |
124 net::CertVerifyResult verifier2_result1; | |
125 error = callback.GetResult(verifier2.Verify( | |
126 net::CertVerifier::RequestParams(ok_cert, example_hostname, 0, | |
127 std::string(), net::CertificateList()), | |
128 nullptr, &verifier2_result1, callback.callback(), &request, | |
129 net::BoundNetLog())); | |
130 // Synchronous completion and verify it is same as serialized data for | |
131 // www.example.com. | |
132 ASSERT_TRUE(net::IsCertificateError(error)); | |
133 ASSERT_FALSE(request); | |
134 EXPECT_EQ(verifier2_result1.cert_status, verifyier1_result1.cert_status); | |
135 | |
136 // Verify the cert for www.example2.com with |verifier2|. | |
137 net::CertVerifyResult verifier2_result2; | |
138 error = callback.GetResult(verifier2.Verify( | |
139 net::CertVerifier::RequestParams(combined_cert, example2_hostname, 0, | |
140 std::string(), net::CertificateList()), | |
141 nullptr, &verifier2_result2, callback.callback(), &request, | |
142 net::BoundNetLog())); | |
143 // Synchronous completion and verify it is same as serialized data for | |
144 // www.example2.com. | |
145 ASSERT_TRUE(net::IsCertificateError(error)); | |
146 ASSERT_FALSE(request); | |
147 EXPECT_EQ(verifier2_result2.cert_status, verifier1_result2.cert_status); | |
148 } | |
149 | |
150 // Corrupted |cert_entry| in the serialized data, should fail when deserialized. | |
Ryan Sleevi
2016/06/21 01:22:10
Grammar: This is not a properly constructed senten
ramant (doing other things)
2016/06/21 16:52:02
Done.
| |
151 TEST(CertVerifierCachePersisterTest, DeserializeCorruptedCerts) { | |
152 net::CertVerifyResult verify_result; | |
153 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
154 ASSERT_NO_FATAL_FAILURE( | |
155 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
156 cronet_pb::CertVerificationCache cert_cache = | |
157 SerializeCertVerifierCache(verifier); | |
158 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
159 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
160 | |
161 cert_cache.clear_cert_entry(); | |
162 | |
163 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
164 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
165 } | |
166 | |
167 // Corrupted |cache_entry| in the serialized data, should fail when | |
168 // deserialized. | |
169 TEST(CertVerifierCachePersisterTest, DeserializeCorruptedCacheEntry) { | |
170 net::CertVerifyResult verify_result; | |
171 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
172 ASSERT_NO_FATAL_FAILURE( | |
173 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
174 cronet_pb::CertVerificationCache cert_cache = | |
175 SerializeCertVerifierCache(verifier); | |
176 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
177 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
178 | |
179 // Corrupt |cache_entry|. | |
180 cert_cache.clear_cache_entry(); | |
181 | |
182 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
183 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
184 } | |
185 | |
186 // Corrupted |request_params| in the serialized data, should fail when | |
187 // deserialized. | |
188 TEST(CertVerifierCachePersisterTest, DeserializeCorruptedRequestParams) { | |
189 net::CertVerifyResult verify_result; | |
190 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
191 ASSERT_NO_FATAL_FAILURE( | |
192 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
193 cronet_pb::CertVerificationCache cert_cache = | |
194 SerializeCertVerifierCache(verifier); | |
195 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
196 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
197 | |
198 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
199 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
200 cert_cache.mutable_cache_entry(i); | |
201 // Corrupt |request_params|. | |
202 cache_entry->clear_request_params(); | |
203 } | |
204 | |
205 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
206 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
207 } | |
208 | |
209 // Corrupted |certificate| in |request_params| in the serialized data, should | |
210 // fail when deserialized. | |
211 TEST(CertVerifierCachePersisterTest, DeserializeRequestParamsNoCertificate) { | |
212 net::CertVerifyResult verify_result; | |
213 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
214 ASSERT_NO_FATAL_FAILURE( | |
215 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
216 cronet_pb::CertVerificationCache cert_cache = | |
217 SerializeCertVerifierCache(verifier); | |
218 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
219 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
220 | |
221 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
222 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
223 cert_cache.mutable_cache_entry(i); | |
224 cronet_pb::CertVerificationRequestParams* request_params = | |
225 cache_entry->mutable_request_params(); | |
226 // Corrupt certificate. | |
227 request_params->clear_certificate(); | |
228 } | |
229 | |
230 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
231 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
232 } | |
233 | |
234 // Corrupted |hostname| in |request_params| in the serialized data, should fail | |
235 // when deserialized. | |
236 TEST(CertVerifierCachePersisterTest, DeserializeRequestParamsNoHostname) { | |
237 net::CertVerifyResult verify_result; | |
238 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
239 ASSERT_NO_FATAL_FAILURE( | |
240 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
241 cronet_pb::CertVerificationCache cert_cache = | |
242 SerializeCertVerifierCache(verifier); | |
243 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
244 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
245 | |
246 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
247 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
248 cert_cache.mutable_cache_entry(i); | |
249 cronet_pb::CertVerificationRequestParams* request_params = | |
250 cache_entry->mutable_request_params(); | |
251 // Corrupt hostname. | |
252 request_params->clear_hostname(); | |
253 } | |
254 | |
255 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
256 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
257 } | |
258 | |
259 // Invalid |hostname| in |request_params| in the serialized data, should fail | |
260 // when deserialized. | |
261 TEST(CertVerifierCachePersisterTest, DeserializeRequestParamsEmptyHostname) { | |
262 net::CertVerifyResult verify_result; | |
263 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
264 ASSERT_NO_FATAL_FAILURE( | |
265 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
266 cronet_pb::CertVerificationCache cert_cache = | |
267 SerializeCertVerifierCache(verifier); | |
268 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
269 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
270 | |
271 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
272 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
273 cert_cache.mutable_cache_entry(i); | |
274 cronet_pb::CertVerificationRequestParams* request_params = | |
275 cache_entry->mutable_request_params(); | |
276 // Set bogus hostname. | |
277 request_params->set_hostname(""); | |
Ryan Sleevi
2016/06/21 01:22:10
How is this different than NoHostname?
ramant (doing other things)
2016/06/21 16:52:02
One checks request_params.has_hostname() and the o
| |
278 } | |
279 | |
280 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
281 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
282 } | |
283 | |
284 // Corrupted |flags| in |request_params| in the serialized data, should fail | |
285 // when deserialized. | |
286 TEST(CertVerifierCachePersisterTest, DeserializeRequestParamsNoFlags) { | |
287 net::CertVerifyResult verify_result; | |
288 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
289 ASSERT_NO_FATAL_FAILURE( | |
290 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
291 cronet_pb::CertVerificationCache cert_cache = | |
292 SerializeCertVerifierCache(verifier); | |
293 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
294 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
295 | |
296 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
297 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
298 cert_cache.mutable_cache_entry(i); | |
299 cronet_pb::CertVerificationRequestParams* request_params = | |
300 cache_entry->mutable_request_params(); | |
301 // Corrupt flags. | |
302 request_params->clear_flags(); | |
303 } | |
304 | |
305 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
306 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
307 } | |
308 | |
309 // Corrupted |ocsp_response| in |request_params| in the serialized data, should | |
310 // fail when deserialized. | |
311 TEST(CertVerifierCachePersisterTest, DeserializeRequestParamsNoOcspResponse) { | |
312 net::CertVerifyResult verify_result; | |
313 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
314 ASSERT_NO_FATAL_FAILURE( | |
315 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
316 cronet_pb::CertVerificationCache cert_cache = | |
317 SerializeCertVerifierCache(verifier); | |
318 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
319 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
320 | |
321 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
322 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
323 cert_cache.mutable_cache_entry(i); | |
324 cronet_pb::CertVerificationRequestParams* request_params = | |
325 cache_entry->mutable_request_params(); | |
326 // Corrupt |ocsp_response|. | |
327 request_params->clear_ocsp_response(); | |
328 } | |
329 | |
330 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
331 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
332 } | |
333 | |
334 // Empty certificate number in |request_params| in the serialized data, should | |
335 // fail when deserialized. | |
336 TEST(CertVerifierCachePersisterTest, | |
337 DeserializeRequestParamsCertificateNoCertNumbers) { | |
338 net::CertVerifyResult verify_result; | |
339 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
340 ASSERT_NO_FATAL_FAILURE( | |
341 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
342 cronet_pb::CertVerificationCache cert_cache = | |
343 SerializeCertVerifierCache(verifier); | |
344 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
345 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
346 | |
347 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
348 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
349 cert_cache.mutable_cache_entry(i); | |
350 cronet_pb::CertVerificationRequestParams* request_params = | |
351 cache_entry->mutable_request_params(); | |
352 cronet_pb::CertVerificationCertificate* certificate = | |
353 request_params->mutable_certificate(); | |
354 // Corrupt certificate number. | |
355 certificate->clear_cert_numbers(); | |
356 } | |
357 | |
358 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
359 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
360 } | |
361 | |
362 // Invalid certificate number in |request_params| in the serialized data, should | |
363 // fail when deserialized. | |
364 TEST(CertVerifierCachePersisterTest, | |
365 DeserializeCorruptedRequestParamsCertNumbers) { | |
366 net::CertVerifyResult verify_result; | |
367 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
368 ASSERT_NO_FATAL_FAILURE( | |
369 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
370 cronet_pb::CertVerificationCache cert_cache = | |
371 SerializeCertVerifierCache(verifier); | |
372 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
373 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
374 | |
375 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
376 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
377 cert_cache.mutable_cache_entry(i); | |
378 cronet_pb::CertVerificationRequestParams* request_params = | |
379 cache_entry->mutable_request_params(); | |
380 cronet_pb::CertVerificationCertificate* certificate = | |
381 request_params->mutable_certificate(); | |
382 // Set bogus certificate number. | |
383 certificate->set_cert_numbers(0, 100); | |
384 } | |
385 | |
386 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
387 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
388 } | |
389 | |
390 // Corrupted certificate number in |additional_trust_anchors| of | |
391 // |request_params| in the serialized data, should fail when deserialized. | |
392 TEST(CertVerifierCachePersisterTest, | |
393 DeserializeRequestParamsCertificateNoTrustAnchors) { | |
394 net::CertificateList ca_cert_list = net::CreateCertificateListFromFile( | |
395 net::GetTestCertsDirectory(), "root_ca_cert.pem", | |
396 net::X509Certificate::FORMAT_AUTO); | |
397 ASSERT_EQ(1U, ca_cert_list.size()); | |
398 scoped_refptr<net::X509Certificate> ca_cert(ca_cert_list[0]); | |
399 | |
400 net::CertificateList cert_list = net::CreateCertificateListFromFile( | |
401 net::GetTestCertsDirectory(), "ok_cert.pem", | |
402 net::X509Certificate::FORMAT_AUTO); | |
403 ASSERT_EQ(1U, cert_list.size()); | |
404 scoped_refptr<net::X509Certificate> cert(cert_list[0]); | |
405 | |
406 // Now add the |ca_cert| to the |trust_anchors|, and verification should pass. | |
407 net::CertificateList trust_anchors; | |
408 trust_anchors.push_back(ca_cert); | |
409 | |
410 int error; | |
411 net::CertVerifyResult verify_result; | |
412 net::TestCompletionCallback callback; | |
413 std::unique_ptr<net::CertVerifier::Request> request; | |
414 | |
415 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
416 error = callback.GetResult(verifier.Verify( | |
417 net::CertVerifier::RequestParams(cert, "www.example.com", 0, | |
418 std::string(), trust_anchors), | |
419 nullptr, &verify_result, callback.callback(), &request, | |
420 net::BoundNetLog())); | |
421 EXPECT_TRUE(net::IsCertificateError(error)); | |
422 | |
423 cronet_pb::CertVerificationCache cert_cache = | |
424 SerializeCertVerifierCache(verifier); | |
425 DCHECK_EQ(2, cert_cache.cert_entry_size()); | |
426 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
427 | |
428 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
429 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
430 cert_cache.mutable_cache_entry(i); | |
431 cronet_pb::CertVerificationRequestParams* request_params = | |
432 cache_entry->mutable_request_params(); | |
433 for (int j = 0; j < request_params->additional_trust_anchors_size(); ++j) { | |
434 cronet_pb::CertVerificationCertificate* certificate = | |
435 request_params->mutable_additional_trust_anchors(j); | |
436 // Corrupt the certificate number in |additional_trust_anchors|. | |
437 certificate->clear_cert_numbers(); | |
438 } | |
439 } | |
440 | |
441 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
442 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
443 } | |
444 | |
445 // Corrupted |cached_result| in the serialized data, should fail when | |
446 // deserialized. | |
447 TEST(CertVerifierCachePersisterTest, DeserializeCorruptedCachedResult) { | |
448 net::CertVerifyResult verify_result; | |
449 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
450 ASSERT_NO_FATAL_FAILURE( | |
451 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
452 cronet_pb::CertVerificationCache cert_cache = | |
453 SerializeCertVerifierCache(verifier); | |
454 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
455 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
456 | |
457 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
458 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
459 cert_cache.mutable_cache_entry(i); | |
460 // Corrupt the |cached_result|. | |
461 cache_entry->clear_cached_result(); | |
462 } | |
463 | |
464 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
465 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
466 } | |
467 | |
468 // Corrupted |error| in the serialized data, should fail when deserialized. | |
469 TEST(CertVerifierCachePersisterTest, DeserializeCachedResultNoError) { | |
470 net::CertVerifyResult verify_result; | |
471 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
472 ASSERT_NO_FATAL_FAILURE( | |
473 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
474 cronet_pb::CertVerificationCache cert_cache = | |
475 SerializeCertVerifierCache(verifier); | |
476 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
477 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
478 | |
479 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
480 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
481 cert_cache.mutable_cache_entry(i); | |
482 cronet_pb::CertVerificationCachedResult* cached_result = | |
483 cache_entry->mutable_cached_result(); | |
484 // Corrupt |error|. | |
485 cached_result->clear_error(); | |
486 } | |
487 | |
488 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
489 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
490 } | |
491 | |
492 // Corrupted |result| (CertVerifyResult) in the serialized data, should fail | |
493 // when deserialized. | |
494 TEST(CertVerifierCachePersisterTest, DeserializeCachedResultNoResult) { | |
495 net::CertVerifyResult verify_result; | |
496 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
497 ASSERT_NO_FATAL_FAILURE( | |
498 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
499 cronet_pb::CertVerificationCache cert_cache = | |
500 SerializeCertVerifierCache(verifier); | |
501 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
502 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
503 | |
504 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
505 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
506 cert_cache.mutable_cache_entry(i); | |
507 cronet_pb::CertVerificationCachedResult* cached_result = | |
508 cache_entry->mutable_cached_result(); | |
509 // Corrupt the |result|. | |
510 cached_result->clear_result(); | |
511 } | |
512 | |
513 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
514 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
515 } | |
516 | |
517 // Corrupted |cert_status| in the serialized data, should fail when | |
518 // deserialized. | |
519 TEST(CertVerifierCachePersisterTest, DeserializeCachedResultNoCertStatus) { | |
520 net::CertVerifyResult verify_result; | |
521 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
522 ASSERT_NO_FATAL_FAILURE( | |
523 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
524 cronet_pb::CertVerificationCache cert_cache = | |
525 SerializeCertVerifierCache(verifier); | |
526 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
527 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
528 | |
529 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
530 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
531 cert_cache.mutable_cache_entry(i); | |
532 cronet_pb::CertVerificationCachedResult* cached_result = | |
533 cache_entry->mutable_cached_result(); | |
534 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
535 // Corrupt the |cert_status|. | |
536 result->clear_cert_status(); | |
537 } | |
538 | |
539 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
540 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
541 } | |
542 | |
543 // Corrupted |verification_time| in the serialized data, should fail when | |
544 // deserialized. | |
545 TEST(CertVerifierCachePersisterTest, DeserializeCachedResultNoVerifiedCert) { | |
546 net::CertVerifyResult verify_result; | |
547 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
548 ASSERT_NO_FATAL_FAILURE( | |
549 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
550 cronet_pb::CertVerificationCache cert_cache = | |
551 SerializeCertVerifierCache(verifier); | |
552 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
553 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
554 | |
555 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
556 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
557 cert_cache.mutable_cache_entry(i); | |
558 cronet_pb::CertVerificationCachedResult* cached_result = | |
559 cache_entry->mutable_cached_result(); | |
560 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
561 // Corrupt the |verified_cert|. | |
562 result->clear_verified_cert(); | |
563 } | |
564 | |
565 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
566 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
567 } | |
568 | |
569 // Corrupted |verified_cert| in the serialized data, should fail when | |
570 // deserialized. | |
571 TEST(CertVerifierCachePersisterTest, | |
572 DeserializeCachedResultNoVerifiedCertNumber) { | |
573 net::CertVerifyResult verify_result; | |
574 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
575 ASSERT_NO_FATAL_FAILURE( | |
576 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
577 cronet_pb::CertVerificationCache cert_cache = | |
578 SerializeCertVerifierCache(verifier); | |
579 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
580 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
581 | |
582 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
583 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
584 cert_cache.mutable_cache_entry(i); | |
585 cronet_pb::CertVerificationCachedResult* cached_result = | |
586 cache_entry->mutable_cached_result(); | |
587 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
588 result->clear_verified_cert(); | |
589 // Corrupt the verified cert's certificate number. | |
590 cronet_pb::CertVerificationCertificate* certificate = | |
591 result->mutable_verified_cert(); | |
592 certificate->clear_cert_numbers(); | |
593 } | |
594 | |
595 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
596 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
597 } | |
598 | |
599 // Invalid certificate number of |verified_cert| in the serialized data, | |
600 // should fail when deserialized. | |
601 TEST(CertVerifierCachePersisterTest, | |
602 DeserializeCorruptedCachedResultVerifiedCertNumber) { | |
603 net::CertVerifyResult verify_result; | |
604 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
605 ASSERT_NO_FATAL_FAILURE( | |
606 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
607 cronet_pb::CertVerificationCache cert_cache = | |
608 SerializeCertVerifierCache(verifier); | |
609 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
610 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
611 | |
612 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
613 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
614 cert_cache.mutable_cache_entry(i); | |
615 cronet_pb::CertVerificationCachedResult* cached_result = | |
616 cache_entry->mutable_cached_result(); | |
617 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
618 cronet_pb::CertVerificationCertificate* certificate = | |
619 result->mutable_verified_cert(); | |
620 // Set bogus certificate number for |verified_cert|. | |
621 certificate->set_cert_numbers(0, 100); | |
622 } | |
623 | |
624 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
625 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
626 } | |
627 | |
628 // Corrupted |public_key_hashes| in the serialized data, should fail when | |
629 // deserialized. | |
630 TEST(CertVerifierCachePersisterTest, | |
631 DeserializeCorruptedCachedResultPublicKeyHashes) { | |
632 net::CertVerifyResult verify_result; | |
633 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
634 ASSERT_NO_FATAL_FAILURE( | |
635 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
636 cronet_pb::CertVerificationCache cert_cache = | |
637 SerializeCertVerifierCache(verifier); | |
638 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
639 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
640 | |
641 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
642 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
643 cert_cache.mutable_cache_entry(i); | |
644 cronet_pb::CertVerificationCachedResult* cached_result = | |
645 cache_entry->mutable_cached_result(); | |
646 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
647 // Set bogus |public_key_hashes|. | |
648 result->add_public_key_hashes(""); | |
649 } | |
650 | |
651 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
652 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
653 } | |
654 | |
655 // Corrupted |verification_time| in the serialized data, should fail when | |
656 // deserialized. | |
657 TEST(CertVerifierCachePersisterTest, DeserializeCorruptedVerificationTime) { | |
658 net::CertVerifyResult verify_result; | |
659 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
660 ASSERT_NO_FATAL_FAILURE( | |
661 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
662 cronet_pb::CertVerificationCache cert_cache = | |
663 SerializeCertVerifierCache(verifier); | |
664 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
665 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
666 | |
667 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
668 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
669 cert_cache.mutable_cache_entry(i); | |
670 // Corrupt |verification_time|. | |
671 cache_entry->clear_verification_time(); | |
672 } | |
673 | |
674 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
675 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
676 } | |
677 | |
678 } // namespace cronet | |
OLD | NEW |