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)); | |
Ryan Sleevi
2016/06/21 20:31:03
BUG/SURPRISE: What part of the contract of VerifyC
ramant (doing other things)
2016/06/22 03:51:36
I am not an expert in this area. Was copying other
| |
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 verifier1_result1; | |
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, &verifier1_result1, callback.callback(), &request, | |
100 net::BoundNetLog())); | |
101 ASSERT_TRUE(net::IsCertificateError(error)); | |
Ryan Sleevi
2016/06/21 20:31:02
Same comments apply throughout for the checks here
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
102 | |
103 // Verify www2.example.com host's certificate. | |
104 std::string example2_hostname("www2.example.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. | |
Ryan Sleevi
2016/06/21 20:31:03
I highlighted before, but these comments (130-131)
ramant (doing other things)
2016/06/22 03:51:36
Done.
| |
132 ASSERT_TRUE(net::IsCertificateError(error)); | |
133 ASSERT_FALSE(request); | |
134 EXPECT_EQ(verifier2_result1.cert_status, verifier1_result1.cert_status); | |
Ryan Sleevi
2016/06/21 20:31:03
Document why you're checking here.
For example, w
ramant (doing other things)
2016/06/22 03:51:37
Added operator== to CertVerifyResult and used it h
| |
135 | |
136 // Verify the cert for www2.example.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, | |
Ryan Sleevi
2016/06/21 20:31:03
Why don't you use the VerifyCert helper here? What
ramant (doing other things)
2016/06/22 03:51:37
www2.example.com has certificate chain. VerifyCert
| |
142 net::BoundNetLog())); | |
143 // Synchronous completion and verify it is same as serialized data for | |
144 // www2.example.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 // A corrupted cert_entry in the serialized data should fail to be deserialized. | |
151 // Should not deserialize a corrupted cert_entry. | |
Ryan Sleevi
2016/06/21 20:31:04
You updated this description, but failed to update
ramant (doing other things)
2016/06/22 03:51:36
Done.
| |
152 TEST(CertVerifierCachePersisterTest, DeserializeCorruptedCerts) { | |
153 net::CertVerifyResult verify_result; | |
154 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
155 ASSERT_NO_FATAL_FAILURE( | |
156 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
157 cronet_pb::CertVerificationCache cert_cache = | |
158 SerializeCertVerifierCache(verifier); | |
159 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
160 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
161 | |
162 cert_cache.clear_cert_entry(); | |
163 | |
164 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
165 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
166 } | |
167 | |
168 // Corrupted |cache_entry| in the serialized data, should fail when | |
169 // deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:36
Done.
| |
170 TEST(CertVerifierCachePersisterTest, DeserializeCorruptedCacheEntry) { | |
171 net::CertVerifyResult verify_result; | |
172 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
173 ASSERT_NO_FATAL_FAILURE( | |
174 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
175 cronet_pb::CertVerificationCache cert_cache = | |
176 SerializeCertVerifierCache(verifier); | |
177 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
178 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
179 | |
180 // Corrupt |cache_entry|. | |
181 cert_cache.clear_cache_entry(); | |
182 | |
183 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
184 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
185 } | |
186 | |
187 // Corrupted |request_params| in the serialized data, should fail when | |
188 // deserialized. | |
Ryan Sleevi
2016/06/21 20:31:02
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
189 TEST(CertVerifierCachePersisterTest, DeserializeCorruptedRequestParams) { | |
190 net::CertVerifyResult verify_result; | |
191 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
192 ASSERT_NO_FATAL_FAILURE( | |
193 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
194 cronet_pb::CertVerificationCache cert_cache = | |
195 SerializeCertVerifierCache(verifier); | |
196 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
197 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
198 | |
199 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
200 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
201 cert_cache.mutable_cache_entry(i); | |
202 // Corrupt |request_params|. | |
203 cache_entry->clear_request_params(); | |
204 } | |
205 | |
206 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
207 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
208 } | |
209 | |
210 // Corrupted |certificate| in |request_params| in the serialized data, should | |
211 // fail when deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:36
Done.
| |
212 TEST(CertVerifierCachePersisterTest, DeserializeRequestParamsNoCertificate) { | |
213 net::CertVerifyResult verify_result; | |
214 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
215 ASSERT_NO_FATAL_FAILURE( | |
216 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
217 cronet_pb::CertVerificationCache cert_cache = | |
218 SerializeCertVerifierCache(verifier); | |
219 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
220 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
221 | |
222 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
223 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
224 cert_cache.mutable_cache_entry(i); | |
225 cronet_pb::CertVerificationRequestParams* request_params = | |
226 cache_entry->mutable_request_params(); | |
227 // Corrupt certificate. | |
228 request_params->clear_certificate(); | |
229 } | |
230 | |
231 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
232 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
233 } | |
234 | |
235 // Corrupted |hostname| in |request_params| in the serialized data, should fail | |
236 // when deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
237 TEST(CertVerifierCachePersisterTest, DeserializeRequestParamsNoHostname) { | |
238 net::CertVerifyResult verify_result; | |
239 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
240 ASSERT_NO_FATAL_FAILURE( | |
241 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
242 cronet_pb::CertVerificationCache cert_cache = | |
243 SerializeCertVerifierCache(verifier); | |
244 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
245 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
246 | |
247 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
248 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
249 cert_cache.mutable_cache_entry(i); | |
250 cronet_pb::CertVerificationRequestParams* request_params = | |
251 cache_entry->mutable_request_params(); | |
252 // Corrupt hostname. | |
253 request_params->clear_hostname(); | |
254 } | |
255 | |
256 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
257 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
258 } | |
259 | |
260 // Invalid |hostname| in |request_params| in the serialized data, should fail | |
261 // when deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
262 TEST(CertVerifierCachePersisterTest, DeserializeRequestParamsEmptyHostname) { | |
263 net::CertVerifyResult verify_result; | |
264 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
265 ASSERT_NO_FATAL_FAILURE( | |
266 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
267 cronet_pb::CertVerificationCache cert_cache = | |
268 SerializeCertVerifierCache(verifier); | |
269 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
270 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
271 | |
272 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
273 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
274 cert_cache.mutable_cache_entry(i); | |
275 cronet_pb::CertVerificationRequestParams* request_params = | |
276 cache_entry->mutable_request_params(); | |
277 // Set bogus hostname. | |
278 request_params->set_hostname(""); | |
279 } | |
280 | |
281 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
282 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
283 } | |
284 | |
285 // Corrupted |flags| in |request_params| in the serialized data, should fail | |
286 // when deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
287 TEST(CertVerifierCachePersisterTest, DeserializeRequestParamsNoFlags) { | |
288 net::CertVerifyResult verify_result; | |
289 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
290 ASSERT_NO_FATAL_FAILURE( | |
291 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
292 cronet_pb::CertVerificationCache cert_cache = | |
293 SerializeCertVerifierCache(verifier); | |
294 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
295 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
296 | |
297 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
298 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
299 cert_cache.mutable_cache_entry(i); | |
300 cronet_pb::CertVerificationRequestParams* request_params = | |
301 cache_entry->mutable_request_params(); | |
302 // Corrupt flags. | |
303 request_params->clear_flags(); | |
304 } | |
305 | |
306 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
307 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
308 } | |
309 | |
310 // Corrupted |ocsp_response| in |request_params| in the serialized data, should | |
311 // fail when deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:36
Done.
| |
312 TEST(CertVerifierCachePersisterTest, DeserializeRequestParamsNoOcspResponse) { | |
313 net::CertVerifyResult verify_result; | |
314 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
315 ASSERT_NO_FATAL_FAILURE( | |
316 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
317 cronet_pb::CertVerificationCache cert_cache = | |
318 SerializeCertVerifierCache(verifier); | |
319 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
320 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
321 | |
322 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
323 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
324 cert_cache.mutable_cache_entry(i); | |
325 cronet_pb::CertVerificationRequestParams* request_params = | |
326 cache_entry->mutable_request_params(); | |
327 // Corrupt |ocsp_response|. | |
328 request_params->clear_ocsp_response(); | |
329 } | |
330 | |
331 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
332 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
333 } | |
334 | |
335 // Empty certificate number in |request_params| in the serialized data, should | |
336 // fail when deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:36
Done.
| |
337 TEST(CertVerifierCachePersisterTest, | |
338 DeserializeRequestParamsCertificateNoCertNumbers) { | |
339 net::CertVerifyResult verify_result; | |
340 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
341 ASSERT_NO_FATAL_FAILURE( | |
342 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
343 cronet_pb::CertVerificationCache cert_cache = | |
344 SerializeCertVerifierCache(verifier); | |
345 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
346 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
347 | |
348 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
349 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
350 cert_cache.mutable_cache_entry(i); | |
351 cronet_pb::CertVerificationRequestParams* request_params = | |
352 cache_entry->mutable_request_params(); | |
353 cronet_pb::CertVerificationCertificate* certificate = | |
354 request_params->mutable_certificate(); | |
355 // Corrupt certificate number. | |
356 certificate->clear_cert_numbers(); | |
357 } | |
358 | |
359 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
360 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
361 } | |
362 | |
363 // Invalid certificate number in |request_params| in the serialized data, should | |
364 // fail when deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
365 TEST(CertVerifierCachePersisterTest, | |
366 DeserializeCorruptedRequestParamsCertNumbers) { | |
367 net::CertVerifyResult verify_result; | |
368 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
369 ASSERT_NO_FATAL_FAILURE( | |
370 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
371 cronet_pb::CertVerificationCache cert_cache = | |
372 SerializeCertVerifierCache(verifier); | |
373 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
374 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
375 | |
376 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
377 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
378 cert_cache.mutable_cache_entry(i); | |
379 cronet_pb::CertVerificationRequestParams* request_params = | |
380 cache_entry->mutable_request_params(); | |
381 cronet_pb::CertVerificationCertificate* certificate = | |
382 request_params->mutable_certificate(); | |
383 // Set bogus certificate number. | |
384 certificate->set_cert_numbers(0, 100); | |
385 } | |
386 | |
387 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
388 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
389 } | |
390 | |
391 // Corrupted certificate number in |additional_trust_anchors| of | |
392 // |request_params| in the serialized data, should fail when deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
393 TEST(CertVerifierCachePersisterTest, | |
394 DeserializeRequestParamsCertificateNoTrustAnchors) { | |
395 net::CertificateList ca_cert_list = net::CreateCertificateListFromFile( | |
396 net::GetTestCertsDirectory(), "root_ca_cert.pem", | |
397 net::X509Certificate::FORMAT_AUTO); | |
398 ASSERT_EQ(1U, ca_cert_list.size()); | |
399 scoped_refptr<net::X509Certificate> ca_cert(ca_cert_list[0]); | |
400 | |
401 net::CertificateList cert_list = net::CreateCertificateListFromFile( | |
402 net::GetTestCertsDirectory(), "ok_cert.pem", | |
403 net::X509Certificate::FORMAT_AUTO); | |
404 ASSERT_EQ(1U, cert_list.size()); | |
405 scoped_refptr<net::X509Certificate> cert(cert_list[0]); | |
406 | |
407 // Now add the |ca_cert| to the |trust_anchors|, and verification should pass. | |
408 net::CertificateList trust_anchors; | |
409 trust_anchors.push_back(ca_cert); | |
410 | |
411 int error; | |
412 net::CertVerifyResult verify_result; | |
413 net::TestCompletionCallback callback; | |
414 std::unique_ptr<net::CertVerifier::Request> request; | |
415 | |
416 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
417 error = callback.GetResult(verifier.Verify( | |
418 net::CertVerifier::RequestParams(cert, "www.example.com", 0, | |
419 std::string(), trust_anchors), | |
420 nullptr, &verify_result, callback.callback(), &request, | |
421 net::BoundNetLog())); | |
422 EXPECT_TRUE(net::IsCertificateError(error)); | |
Ryan Sleevi
2016/06/21 20:31:03
Why don't you use the VerifyCert() helper like you
ramant (doing other things)
2016/06/22 03:51:37
In this test, we are verifying with trust_anchors.
| |
423 | |
424 cronet_pb::CertVerificationCache cert_cache = | |
425 SerializeCertVerifierCache(verifier); | |
426 DCHECK_EQ(2, cert_cache.cert_entry_size()); | |
427 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
428 | |
429 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
430 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
431 cert_cache.mutable_cache_entry(i); | |
432 cronet_pb::CertVerificationRequestParams* request_params = | |
433 cache_entry->mutable_request_params(); | |
434 for (int j = 0; j < request_params->additional_trust_anchors_size(); ++j) { | |
435 cronet_pb::CertVerificationCertificate* certificate = | |
436 request_params->mutable_additional_trust_anchors(j); | |
437 // Corrupt the certificate number in |additional_trust_anchors|. | |
438 certificate->clear_cert_numbers(); | |
439 } | |
440 } | |
441 | |
442 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
443 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
444 } | |
445 | |
446 // Corrupted |cached_result| in the serialized data, should fail when | |
447 // deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:36
Done.
| |
448 TEST(CertVerifierCachePersisterTest, DeserializeCorruptedCachedResult) { | |
449 net::CertVerifyResult verify_result; | |
450 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
451 ASSERT_NO_FATAL_FAILURE( | |
452 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
453 cronet_pb::CertVerificationCache cert_cache = | |
454 SerializeCertVerifierCache(verifier); | |
455 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
456 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
457 | |
458 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
459 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
460 cert_cache.mutable_cache_entry(i); | |
461 // Corrupt the |cached_result|. | |
462 cache_entry->clear_cached_result(); | |
463 } | |
464 | |
465 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
466 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
467 } | |
468 | |
469 // Corrupted |error| in the serialized data, should fail when deserialized. | |
470 TEST(CertVerifierCachePersisterTest, DeserializeCachedResultNoError) { | |
471 net::CertVerifyResult verify_result; | |
472 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
473 ASSERT_NO_FATAL_FAILURE( | |
474 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
475 cronet_pb::CertVerificationCache cert_cache = | |
476 SerializeCertVerifierCache(verifier); | |
477 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
478 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
479 | |
480 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
481 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
482 cert_cache.mutable_cache_entry(i); | |
483 cronet_pb::CertVerificationCachedResult* cached_result = | |
484 cache_entry->mutable_cached_result(); | |
485 // Corrupt |error|. | |
486 cached_result->clear_error(); | |
487 } | |
488 | |
489 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
490 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
491 } | |
492 | |
493 // Corrupted |result| (CertVerifyResult) in the serialized data, should fail | |
494 // when deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
495 TEST(CertVerifierCachePersisterTest, DeserializeCachedResultNoResult) { | |
496 net::CertVerifyResult verify_result; | |
497 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
498 ASSERT_NO_FATAL_FAILURE( | |
499 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
500 cronet_pb::CertVerificationCache cert_cache = | |
501 SerializeCertVerifierCache(verifier); | |
502 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
503 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
504 | |
505 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
506 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
507 cert_cache.mutable_cache_entry(i); | |
508 cronet_pb::CertVerificationCachedResult* cached_result = | |
509 cache_entry->mutable_cached_result(); | |
510 // Corrupt the |result|. | |
511 cached_result->clear_result(); | |
512 } | |
513 | |
514 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
515 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
516 } | |
517 | |
518 // Corrupted |cert_status| in the serialized data, should fail when | |
519 // deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
520 TEST(CertVerifierCachePersisterTest, DeserializeCachedResultNoCertStatus) { | |
521 net::CertVerifyResult verify_result; | |
522 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
523 ASSERT_NO_FATAL_FAILURE( | |
524 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
525 cronet_pb::CertVerificationCache cert_cache = | |
526 SerializeCertVerifierCache(verifier); | |
527 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
528 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
529 | |
530 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
531 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
532 cert_cache.mutable_cache_entry(i); | |
533 cronet_pb::CertVerificationCachedResult* cached_result = | |
534 cache_entry->mutable_cached_result(); | |
535 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
536 // Corrupt the |cert_status|. | |
537 result->clear_cert_status(); | |
538 } | |
539 | |
540 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
541 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
542 } | |
543 | |
544 // Corrupted |verification_time| in the serialized data, should fail when | |
545 // deserialized. | |
Ryan Sleevi
2016/06/21 20:31:02
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
546 TEST(CertVerifierCachePersisterTest, DeserializeCachedResultNoVerifiedCert) { | |
547 net::CertVerifyResult verify_result; | |
548 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
549 ASSERT_NO_FATAL_FAILURE( | |
550 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
551 cronet_pb::CertVerificationCache cert_cache = | |
552 SerializeCertVerifierCache(verifier); | |
553 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
554 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
555 | |
556 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
557 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
558 cert_cache.mutable_cache_entry(i); | |
559 cronet_pb::CertVerificationCachedResult* cached_result = | |
560 cache_entry->mutable_cached_result(); | |
561 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
562 // Corrupt the |verified_cert|. | |
563 result->clear_verified_cert(); | |
564 } | |
565 | |
566 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
567 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
568 } | |
569 | |
570 // Corrupted |verified_cert| in the serialized data, should fail when | |
571 // deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
572 TEST(CertVerifierCachePersisterTest, | |
573 DeserializeCachedResultNoVerifiedCertNumber) { | |
574 net::CertVerifyResult verify_result; | |
575 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
576 ASSERT_NO_FATAL_FAILURE( | |
577 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
578 cronet_pb::CertVerificationCache cert_cache = | |
579 SerializeCertVerifierCache(verifier); | |
580 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
581 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
582 | |
583 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
584 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
585 cert_cache.mutable_cache_entry(i); | |
586 cronet_pb::CertVerificationCachedResult* cached_result = | |
587 cache_entry->mutable_cached_result(); | |
588 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
589 result->clear_verified_cert(); | |
590 // Corrupt the verified cert's certificate number. | |
591 cronet_pb::CertVerificationCertificate* certificate = | |
592 result->mutable_verified_cert(); | |
593 certificate->clear_cert_numbers(); | |
594 } | |
595 | |
596 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
597 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
598 } | |
599 | |
600 // Invalid certificate number of |verified_cert| in the serialized data, | |
601 // should fail when deserialized. | |
Ryan Sleevi
2016/06/21 20:31:04
HERE1
ramant (doing other things)
2016/06/22 03:51:36
Done.
| |
602 TEST(CertVerifierCachePersisterTest, | |
603 DeserializeCorruptedCachedResultVerifiedCertNumber) { | |
604 net::CertVerifyResult verify_result; | |
605 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
606 ASSERT_NO_FATAL_FAILURE( | |
607 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
608 cronet_pb::CertVerificationCache cert_cache = | |
609 SerializeCertVerifierCache(verifier); | |
610 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
611 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
612 | |
613 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
614 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
615 cert_cache.mutable_cache_entry(i); | |
616 cronet_pb::CertVerificationCachedResult* cached_result = | |
617 cache_entry->mutable_cached_result(); | |
618 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
619 cronet_pb::CertVerificationCertificate* certificate = | |
620 result->mutable_verified_cert(); | |
621 // Set bogus certificate number for |verified_cert|. | |
622 certificate->set_cert_numbers(0, 100); | |
623 } | |
624 | |
625 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
626 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
627 } | |
628 | |
629 // Corrupted |public_key_hashes| in the serialized data, should fail when | |
630 // deserialized. | |
Ryan Sleevi
2016/06/21 20:31:03
HERE1
ramant (doing other things)
2016/06/22 03:51:37
Done.
| |
631 TEST(CertVerifierCachePersisterTest, | |
632 DeserializeCorruptedCachedResultPublicKeyHashes) { | |
633 net::CertVerifyResult verify_result; | |
634 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
635 ASSERT_NO_FATAL_FAILURE( | |
636 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
637 cronet_pb::CertVerificationCache cert_cache = | |
638 SerializeCertVerifierCache(verifier); | |
639 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
640 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
641 | |
642 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
643 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
644 cert_cache.mutable_cache_entry(i); | |
645 cronet_pb::CertVerificationCachedResult* cached_result = | |
646 cache_entry->mutable_cached_result(); | |
647 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
648 // Set bogus |public_key_hashes|. | |
649 result->add_public_key_hashes(""); | |
650 } | |
651 | |
652 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
653 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
654 } | |
655 | |
656 // Corrupted |verification_time| in the serialized data, should fail when | |
657 // deserialized. | |
Ryan Sleevi
2016/06/21 20:31:02
HERE1
ramant (doing other things)
2016/06/22 03:51:36
Done.
| |
658 TEST(CertVerifierCachePersisterTest, DeserializeCorruptedVerificationTime) { | |
659 net::CertVerifyResult verify_result; | |
660 net::CachingCertVerifier verifier(base::MakeUnique<net::MockCertVerifier>()); | |
661 ASSERT_NO_FATAL_FAILURE( | |
662 VerifyCert("ok_cert.pem", "www.example.com", &verifier, &verify_result)); | |
663 cronet_pb::CertVerificationCache cert_cache = | |
664 SerializeCertVerifierCache(verifier); | |
665 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
666 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
667 | |
668 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
669 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
670 cert_cache.mutable_cache_entry(i); | |
671 // Corrupt |verification_time|. | |
672 cache_entry->clear_verification_time(); | |
673 } | |
674 | |
675 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
676 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
677 } | |
678 | |
679 } // namespace cronet | |
OLD | NEW |