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 int VerifyCert(scoped_refptr<net::X509Certificate> certificate, | |
Ryan Sleevi
2016/06/15 23:31:32
Either pass as raw pointer (X509Certificate*) or s
ramant (doing other things)
2016/06/17 02:45:15
Thanks. Missed it.
Done.
| |
31 const std::string& hostname, | |
32 net::CachingCertVerifier* verifier, | |
33 net::CertVerifyResult* verify_result) { | |
34 net::TestCompletionCallback callback; | |
35 std::unique_ptr<net::CertVerifier::Request> request; | |
36 | |
37 return callback.GetResult(verifier->Verify( | |
38 net::CertVerifier::RequestParams(certificate, hostname, 0, std::string(), | |
39 net::CertificateList()), | |
40 nullptr, verify_result, callback.callback(), &request, | |
41 net::BoundNetLog())); | |
42 } | |
43 | |
44 cronet_pb::CertVerificationCache VerifyAndSerializeCert( | |
45 const std::string& cert_name, | |
46 const std::string& hostname, | |
47 net::CachingCertVerifier* verifier, | |
48 net::CertVerifyResult* verify_result) { | |
49 // Set up server certs. | |
50 scoped_refptr<net::X509Certificate> cert( | |
51 net::ImportCertFromFile(net::GetTestCertsDirectory(), cert_name)); | |
52 EXPECT_TRUE(cert.get()); | |
Ryan Sleevi
2016/06/15 23:31:33
This will crash the test if it's false, so you're
Ryan Sleevi
2016/06/15 23:31:33
STYLE: Don't use .get() for boolean comparisons.
ramant (doing other things)
2016/06/17 02:45:14
Done.
ramant (doing other things)
2016/06/17 02:45:15
Done.
| |
53 | |
54 int error = VerifyCert(cert, hostname, verifier, verify_result); | |
55 EXPECT_TRUE(net::IsCertificateError(error)); | |
Ryan Sleevi
2016/06/15 23:31:33
Ditto about this doing nothing
ramant (doing other things)
2016/06/17 02:45:15
Done.
| |
56 | |
57 cronet_pb::CertVerificationCache cert_cache = | |
58 SerializeCertVerifierCache(*verifier); | |
59 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
60 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
Ryan Sleevi
2016/06/15 23:31:32
Don't DCHECK in tests. That crashes the test.
My
ramant (doing other things)
2016/06/17 02:45:14
Done.
| |
61 return cert_cache; | |
62 } | |
63 | |
64 } // namespace | |
65 | |
66 class CertVerifierCachePersisterTest : public ::testing::Test { | |
67 public: | |
68 CertVerifierCachePersisterTest() | |
69 : verifier_(base::MakeUnique<net::MockCertVerifier>()) {} | |
70 ~CertVerifierCachePersisterTest() override {} | |
71 | |
72 protected: | |
73 net::CachingCertVerifier verifier_; | |
Ryan Sleevi
2016/06/15 23:31:32
This doesn't really need to be a test harness.
ramant (doing other things)
2016/06/17 02:45:15
Done.
| |
74 }; | |
75 | |
76 TEST_F(CertVerifierCachePersisterTest, RestoreEmptyData) { | |
77 // Restoring empty data should fail. | |
78 cronet_pb::CertVerificationCache cert_cache; | |
79 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier_)); | |
80 } | |
81 | |
82 TEST_F(CertVerifierCachePersisterTest, SerializeCache) { | |
83 net::CertVerifyResult verify_result; | |
84 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
85 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
86 } | |
87 | |
88 TEST_F(CertVerifierCachePersisterTest, RestoreExistingEntry) { | |
89 net::CertVerifyResult verify_result; | |
90 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
91 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
92 | |
93 // Restore the cache data for an existing entry shouldn't fail. | |
Ryan Sleevi
2016/06/15 23:31:33
GRAMMAR: Restoring?
GRAMMAR: Avoid double negative
ramant (doing other things)
2016/06/17 02:45:15
Done.
| |
94 EXPECT_TRUE(DeserializeCertVerifierCache(cert_cache, &verifier_)); | |
Ryan Sleevi
2016/06/15 23:31:32
This is unclear to me why this test exists.
ramant (doing other things)
2016/06/17 02:45:14
My intention was to test if cert verifier cache al
| |
95 } | |
96 | |
97 TEST_F(CertVerifierCachePersisterTest, RestoreDataIntoNewVerifier) { | |
98 scoped_refptr<net::X509Certificate> ok_cert( | |
99 net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem")); | |
100 ASSERT_NE(static_cast<net::X509Certificate*>(NULL), ok_cert.get()); | |
Ryan Sleevi
2016/06/15 23:31:32
STYLE: Don't do this.
ASSERT_TRUE(ok_cert);
ramant (doing other things)
2016/06/17 02:45:15
Done.
| |
101 | |
102 int error; | |
103 std::string example_hostname("www.example.com"); | |
104 net::CertVerifyResult verify_result; | |
105 net::TestCompletionCallback callback; | |
106 std::unique_ptr<net::CertVerifier::Request> request; | |
107 | |
108 error = callback.GetResult(verifier_.Verify( | |
109 net::CertVerifier::RequestParams(ok_cert, example_hostname, 0, | |
110 std::string(), net::CertificateList()), | |
111 nullptr, &verify_result, callback.callback(), &request, | |
112 net::BoundNetLog())); | |
113 ASSERT_TRUE(net::IsCertificateError(error)); | |
114 | |
115 cronet_pb::CertVerificationCache cert_cache = | |
116 SerializeCertVerifierCache(verifier_); | |
117 DCHECK_EQ(1, cert_cache.cert_entry_size()); | |
118 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
119 | |
120 // Create a new Verifier and restoring the data into it should succeed. | |
Ryan Sleevi
2016/06/15 23:31:32
Perhaps this comment belongs on line 96 instead
ramant (doing other things)
2016/06/17 02:45:15
Done.
| |
121 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
122 EXPECT_TRUE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
123 | |
124 net::CertVerifyResult verify_result2; | |
125 error = callback.GetResult(verifier2.Verify( | |
126 net::CertVerifier::RequestParams(ok_cert, example_hostname, 0, | |
127 std::string(), net::CertificateList()), | |
128 nullptr, &verify_result2, callback.callback(), &request, | |
129 net::BoundNetLog())); | |
130 // Synchronous completion and verify it is same as serialized data. | |
131 ASSERT_NE(net::ERR_IO_PENDING, error); | |
Ryan Sleevi
2016/06/15 23:31:33
You're calling .GetResult (line 125), so it's impo
ramant (doing other things)
2016/06/17 02:45:15
Done.
| |
132 ASSERT_TRUE(net::IsCertificateError(error)); | |
133 ASSERT_FALSE(request); | |
134 EXPECT_EQ(verify_result2.cert_status, verify_result.cert_status); | |
135 } | |
136 | |
137 TEST_F(CertVerifierCachePersisterTest, RestoreMultipleEntriesIntoNewVerifier) { | |
Ryan Sleevi
2016/06/15 23:31:32
Why isn't this combined into the previous test?
ramant (doing other things)
2016/06/17 02:45:15
Done.
| |
138 scoped_refptr<net::X509Certificate> ok_cert( | |
139 net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem")); | |
140 ASSERT_NE(static_cast<net::X509Certificate*>(NULL), ok_cert.get()); | |
141 | |
142 const scoped_refptr<net::X509Certificate> root_cert = | |
143 net::ImportCertFromFile(net::GetTestCertsDirectory(), "root_ca_cert.pem"); | |
144 ASSERT_TRUE(root_cert.get()); | |
145 | |
146 // Create a certificate that contains both a leaf and an intermediate/root. | |
147 net::X509Certificate::OSCertHandles chain; | |
148 chain.push_back(root_cert->os_cert_handle()); | |
149 const scoped_refptr<net::X509Certificate> combined_cert = | |
150 net::X509Certificate::CreateFromHandle(ok_cert->os_cert_handle(), chain); | |
151 ASSERT_TRUE(combined_cert.get()); | |
152 | |
153 int error; | |
154 net::TestCompletionCallback callback; | |
155 std::unique_ptr<net::CertVerifier::Request> request; | |
156 | |
157 // Verify www.example.com host's certificate. | |
158 std::string example_hostname("www.example.com"); | |
159 net::CertVerifyResult verifyier1_result1; | |
160 error = callback.GetResult(verifier_.Verify( | |
161 net::CertVerifier::RequestParams(ok_cert, example_hostname, 0, | |
162 std::string(), net::CertificateList()), | |
163 nullptr, &verifyier1_result1, callback.callback(), &request, | |
164 net::BoundNetLog())); | |
165 ASSERT_TRUE(net::IsCertificateError(error)); | |
166 | |
167 // Verify www.example2.com host's certificate. | |
168 std::string example2_hostname("www.example2.com"); | |
169 net::CertVerifyResult verifier1_result2; | |
170 error = callback.GetResult(verifier_.Verify( | |
171 net::CertVerifier::RequestParams(combined_cert, example2_hostname, 0, | |
172 std::string(), net::CertificateList()), | |
173 nullptr, &verifier1_result2, callback.callback(), &request, | |
174 net::BoundNetLog())); | |
175 ASSERT_TRUE(net::IsCertificateError(error)); | |
176 | |
177 cronet_pb::CertVerificationCache cert_cache = | |
178 SerializeCertVerifierCache(verifier_); | |
179 DCHECK_EQ(2, cert_cache.cert_entry_size()); | |
180 DCHECK_EQ(2, cert_cache.cache_entry_size()); | |
181 | |
182 // Create a new Verifier and restoring the data into it should succeed. | |
183 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
184 | |
185 // Populate |verifier2|'s cache. | |
186 EXPECT_TRUE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
187 | |
188 // Verify the cert for www.example.com with |verifier2|. | |
189 net::CertVerifyResult verifier2_result1; | |
190 error = callback.GetResult(verifier2.Verify( | |
191 net::CertVerifier::RequestParams(ok_cert, example_hostname, 0, | |
192 std::string(), net::CertificateList()), | |
193 nullptr, &verifier2_result1, callback.callback(), &request, | |
194 net::BoundNetLog())); | |
195 // Synchronous completion and verify it is same as serialized data for | |
196 // www.example.com. | |
197 ASSERT_NE(net::ERR_IO_PENDING, error); | |
198 ASSERT_TRUE(net::IsCertificateError(error)); | |
199 ASSERT_FALSE(request); | |
200 EXPECT_EQ(verifier2_result1.cert_status, verifyier1_result1.cert_status); | |
201 | |
202 // Verify the cert for www.example2.com with |verifier2|. | |
203 net::CertVerifyResult verifier2_result2; | |
204 error = callback.GetResult(verifier2.Verify( | |
205 net::CertVerifier::RequestParams(combined_cert, example2_hostname, 0, | |
206 std::string(), net::CertificateList()), | |
207 nullptr, &verifier2_result2, callback.callback(), &request, | |
208 net::BoundNetLog())); | |
209 // Synchronous completion and verify it is same as serialized data for | |
210 // www.example2.com. | |
211 ASSERT_NE(net::ERR_IO_PENDING, error); | |
212 ASSERT_TRUE(net::IsCertificateError(error)); | |
213 ASSERT_FALSE(request); | |
214 EXPECT_EQ(verifier2_result2.cert_status, verifier1_result2.cert_status); | |
215 } | |
216 | |
217 TEST_F(CertVerifierCachePersisterTest, DeserializeCorruptedCerts) { | |
Ryan Sleevi
2016/06/15 23:31:32
But what's the expected state of |verifier2| here?
ramant (doing other things)
2016/06/17 02:45:14
Changed the code to populate CachingCertVerifier o
| |
218 net::CertVerifyResult verify_result; | |
219 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
220 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
221 | |
222 // Corrupt deserialized certs and verify deserialization failure. | |
223 cert_cache.clear_cert_entry(); | |
224 | |
225 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
226 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
227 } | |
228 | |
229 TEST_F(CertVerifierCachePersisterTest, DeserializeCorruptedCacheEntry) { | |
230 net::CertVerifyResult verify_result; | |
231 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
232 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
233 | |
234 // Corrupt cronet_pb::CertVerificationCacheEntry and verify deserialization | |
235 // failure. | |
236 cert_cache.clear_cache_entry(); | |
237 | |
238 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
239 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
240 } | |
241 | |
242 TEST_F(CertVerifierCachePersisterTest, DeserializeCorruptedRequestParams) { | |
243 net::CertVerifyResult verify_result; | |
244 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
245 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
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 // Corrupt request_params and verify deserialization failure. | |
251 cache_entry->clear_request_params(); | |
252 } | |
253 | |
254 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
255 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
256 } | |
257 | |
258 TEST_F(CertVerifierCachePersisterTest, DeserializeRequestParamsNoCertificate) { | |
259 net::CertVerifyResult verify_result; | |
260 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
261 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
262 | |
263 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
264 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
265 cert_cache.mutable_cache_entry(i); | |
266 cronet_pb::CertVerificationRequestParams* request_params = | |
267 cache_entry->mutable_request_params(); | |
268 // Corrupt request_params's certificate and verify deserialization failure. | |
269 request_params->clear_certificate(); | |
270 } | |
271 | |
272 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
273 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
274 } | |
275 | |
276 TEST_F(CertVerifierCachePersisterTest, DeserializeRequestParamsNoHostname) { | |
277 net::CertVerifyResult verify_result; | |
278 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
279 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
280 | |
281 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
282 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
283 cert_cache.mutable_cache_entry(i); | |
284 cronet_pb::CertVerificationRequestParams* request_params = | |
285 cache_entry->mutable_request_params(); | |
286 // Corrupt request_params's hostname and verify deserialization failure. | |
287 request_params->clear_hostname(); | |
288 } | |
289 | |
290 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
291 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
292 } | |
293 | |
294 TEST_F(CertVerifierCachePersisterTest, DeserializeRequestParamsEmptyHostname) { | |
295 net::CertVerifyResult verify_result; | |
296 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
297 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
298 | |
299 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
300 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
301 cert_cache.mutable_cache_entry(i); | |
302 cronet_pb::CertVerificationRequestParams* request_params = | |
303 cache_entry->mutable_request_params(); | |
304 // Set bogus hostname and verify deserialization failure. | |
305 request_params->set_hostname(""); | |
306 } | |
307 | |
308 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
309 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
310 } | |
311 | |
312 TEST_F(CertVerifierCachePersisterTest, DeserializeRequestParamsNoFlags) { | |
313 net::CertVerifyResult verify_result; | |
314 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
315 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
316 | |
317 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
318 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
319 cert_cache.mutable_cache_entry(i); | |
320 cronet_pb::CertVerificationRequestParams* request_params = | |
321 cache_entry->mutable_request_params(); | |
322 // Corrupt request_params's flags and verify deserialization failure. | |
323 request_params->clear_flags(); | |
324 } | |
325 | |
326 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
327 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
328 } | |
329 | |
330 TEST_F(CertVerifierCachePersisterTest, DeserializeRequestParamsNoOcspResponse) { | |
331 net::CertVerifyResult verify_result; | |
332 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
333 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
334 | |
335 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
336 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
337 cert_cache.mutable_cache_entry(i); | |
338 cronet_pb::CertVerificationRequestParams* request_params = | |
339 cache_entry->mutable_request_params(); | |
340 // Corrupt request_params's flags and verify deserialization failure. | |
341 request_params->clear_ocsp_response(); | |
342 } | |
343 | |
344 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
345 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
346 } | |
347 | |
348 TEST_F(CertVerifierCachePersisterTest, | |
349 DeserializeRequestParamsCertificateNoCertNumbers) { | |
350 net::CertVerifyResult verify_result; | |
351 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
352 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
353 | |
354 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
355 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
356 cert_cache.mutable_cache_entry(i); | |
357 cronet_pb::CertVerificationRequestParams* request_params = | |
358 cache_entry->mutable_request_params(); | |
359 cronet_pb::CertVerificationCertificate* certificate = | |
360 request_params->mutable_certificate(); | |
361 // Corrupt request_params's certificate and verify deserialization failure. | |
362 certificate->clear_cert_numbers(); | |
363 } | |
364 | |
365 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
366 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
367 } | |
368 | |
369 TEST_F(CertVerifierCachePersisterTest, | |
370 DeserializeCorruptedRequestParamsCertNumbers) { | |
Ryan Sleevi
2016/06/15 23:31:33
Do lines 217-370 need to be structured as they are
ramant (doing other things)
2016/06/17 02:45:15
I agree. All the protobuf related tests, I had see
| |
371 net::CertVerifyResult verify_result; | |
372 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
373 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
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 and verify deserialization failure. | |
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 TEST_F(CertVerifierCachePersisterTest, | |
391 DeserializeRequestParamsCertificateNoTrustAnchors) { | |
392 net::CertificateList ca_cert_list = net::CreateCertificateListFromFile( | |
393 net::GetTestCertsDirectory(), "root_ca_cert.pem", | |
394 net::X509Certificate::FORMAT_AUTO); | |
395 ASSERT_EQ(1U, ca_cert_list.size()); | |
396 scoped_refptr<net::X509Certificate> ca_cert(ca_cert_list[0]); | |
397 | |
398 net::CertificateList cert_list = net::CreateCertificateListFromFile( | |
399 net::GetTestCertsDirectory(), "ok_cert.pem", | |
400 net::X509Certificate::FORMAT_AUTO); | |
401 ASSERT_EQ(1U, cert_list.size()); | |
402 scoped_refptr<net::X509Certificate> cert(cert_list[0]); | |
403 | |
404 // Now add the |ca_cert| to the |trust_anchors|, and verification should pass. | |
405 net::CertificateList trust_anchors; | |
406 trust_anchors.push_back(ca_cert); | |
407 | |
408 int error; | |
409 net::CertVerifyResult verify_result; | |
410 net::TestCompletionCallback callback; | |
411 std::unique_ptr<net::CertVerifier::Request> request; | |
412 | |
413 error = callback.GetResult(verifier_.Verify( | |
414 net::CertVerifier::RequestParams(cert, "www.example.com", 0, | |
415 std::string(), trust_anchors), | |
416 nullptr, &verify_result, callback.callback(), &request, | |
417 net::BoundNetLog())); | |
418 EXPECT_TRUE(net::IsCertificateError(error)); | |
419 | |
420 cronet_pb::CertVerificationCache cert_cache = | |
421 SerializeCertVerifierCache(verifier_); | |
422 DCHECK_EQ(2, cert_cache.cert_entry_size()); | |
423 DCHECK_EQ(1, cert_cache.cache_entry_size()); | |
424 | |
425 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
426 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
427 cert_cache.mutable_cache_entry(i); | |
428 cronet_pb::CertVerificationRequestParams* request_params = | |
429 cache_entry->mutable_request_params(); | |
430 for (int j = 0; j < request_params->additional_trust_anchors_size(); ++j) { | |
431 cronet_pb::CertVerificationCertificate* certificate = | |
432 request_params->mutable_additional_trust_anchors(j); | |
433 // Corrupt the certificate number in |additional_trust_anchors| and verify | |
434 // deserialization failure.w | |
435 certificate->clear_cert_numbers(); | |
436 } | |
437 } | |
438 | |
439 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
440 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
441 } | |
442 | |
443 TEST_F(CertVerifierCachePersisterTest, DeserializeCorruptedCachedResult) { | |
444 net::CertVerifyResult verify_result; | |
445 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
446 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
447 | |
448 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
449 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
450 cert_cache.mutable_cache_entry(i); | |
451 // Corrupt the |cached_result| and verify deserialization failure. | |
452 cache_entry->clear_cached_result(); | |
453 } | |
454 | |
455 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
456 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
457 } | |
458 | |
459 TEST_F(CertVerifierCachePersisterTest, DeserializeCachedResultNoError) { | |
460 net::CertVerifyResult verify_result; | |
461 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
462 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
463 | |
464 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
465 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
466 cert_cache.mutable_cache_entry(i); | |
467 cronet_pb::CertVerificationCachedResult* cached_result = | |
468 cache_entry->mutable_cached_result(); | |
469 // Corrupt the |error| and verify deserialization failure. | |
470 cached_result->clear_error(); | |
471 } | |
472 | |
473 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
474 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
475 } | |
476 | |
477 TEST_F(CertVerifierCachePersisterTest, DeserializeCachedResultNoResult) { | |
478 net::CertVerifyResult verify_result; | |
479 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
480 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
481 | |
482 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
483 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
484 cert_cache.mutable_cache_entry(i); | |
485 cronet_pb::CertVerificationCachedResult* cached_result = | |
486 cache_entry->mutable_cached_result(); | |
487 // Corrupt the |cached_result| and verify deserialization failure. | |
488 cached_result->clear_result(); | |
489 } | |
490 | |
491 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
492 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
493 } | |
494 | |
495 TEST_F(CertVerifierCachePersisterTest, DeserializeCachedResultNoCertStatus) { | |
496 net::CertVerifyResult verify_result; | |
497 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
498 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
499 | |
500 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
501 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
502 cert_cache.mutable_cache_entry(i); | |
503 cronet_pb::CertVerificationCachedResult* cached_result = | |
504 cache_entry->mutable_cached_result(); | |
505 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
506 // Corrupt the |cert_status| and verify deserialization failure. | |
507 result->clear_cert_status(); | |
508 } | |
509 | |
510 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
511 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
512 } | |
513 | |
514 TEST_F(CertVerifierCachePersisterTest, DeserializeCachedResultNoVerifiedCert) { | |
515 net::CertVerifyResult verify_result; | |
516 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
517 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
518 | |
519 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
520 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
521 cert_cache.mutable_cache_entry(i); | |
522 cronet_pb::CertVerificationCachedResult* cached_result = | |
523 cache_entry->mutable_cached_result(); | |
524 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
525 // Corrupt the |verified_cert| and verify deserialization failure. | |
526 result->clear_verified_cert(); | |
527 } | |
528 | |
529 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
530 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
531 } | |
532 | |
533 TEST_F(CertVerifierCachePersisterTest, | |
534 DeserializeCachedResultNoVerifiedCertNumber) { | |
535 net::CertVerifyResult verify_result; | |
536 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
537 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
538 | |
539 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
540 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
541 cert_cache.mutable_cache_entry(i); | |
542 cronet_pb::CertVerificationCachedResult* cached_result = | |
543 cache_entry->mutable_cached_result(); | |
544 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
545 result->clear_verified_cert(); | |
546 // Corrupt the verified certificate and verify deserialization failure. | |
547 cronet_pb::CertVerificationCertificate* certificate = | |
Ryan Sleevi
2016/06/15 23:31:32
All of these corrupt tests seem to share the commo
ramant (doing other things)
2016/06/17 02:45:15
Acknowledged.
| |
548 result->mutable_verified_cert(); | |
549 certificate->clear_cert_numbers(); | |
550 } | |
551 | |
552 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
553 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
554 } | |
555 | |
556 TEST_F(CertVerifierCachePersisterTest, | |
557 DeserializeCorruptedCachedResultVerifiedCertNumber) { | |
558 net::CertVerifyResult verify_result; | |
559 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
560 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
561 | |
562 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
563 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
564 cert_cache.mutable_cache_entry(i); | |
565 cronet_pb::CertVerificationCachedResult* cached_result = | |
566 cache_entry->mutable_cached_result(); | |
567 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
568 cronet_pb::CertVerificationCertificate* certificate = | |
569 result->mutable_verified_cert(); | |
570 // Set bogus certificate number and verify deserialization failure. | |
571 certificate->set_cert_numbers(0, 100); | |
572 } | |
573 | |
574 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
575 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
576 } | |
577 | |
578 TEST_F(CertVerifierCachePersisterTest, | |
579 DeserializeCorruptedCachedResultPublicKeyHashes) { | |
580 net::CertVerifyResult verify_result; | |
581 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
582 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
583 | |
584 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
585 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
586 cert_cache.mutable_cache_entry(i); | |
587 cronet_pb::CertVerificationCachedResult* cached_result = | |
588 cache_entry->mutable_cached_result(); | |
589 cronet_pb::CertVerificationResult* result = cached_result->mutable_result(); | |
590 // Set bogus |public_key_hashes| and verify deserialization failure. | |
591 result->add_public_key_hashes(""); | |
592 } | |
593 | |
594 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
595 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
596 } | |
597 | |
598 TEST_F(CertVerifierCachePersisterTest, DeserializeCorruptedVerificationTime) { | |
599 net::CertVerifyResult verify_result; | |
600 cronet_pb::CertVerificationCache cert_cache = VerifyAndSerializeCert( | |
601 "ok_cert.pem", "www.example.com", &verifier_, &verify_result); | |
602 | |
603 for (int i = 0; i < cert_cache.cache_entry_size(); ++i) { | |
604 cronet_pb::CertVerificationCacheEntry* cache_entry = | |
605 cert_cache.mutable_cache_entry(i); | |
606 // Corrupt |verification_time| and verify deserialization failure. | |
607 cache_entry->clear_verification_time(); | |
608 } | |
609 | |
610 net::CachingCertVerifier verifier2(base::MakeUnique<net::MockCertVerifier>()); | |
611 EXPECT_FALSE(DeserializeCertVerifierCache(cert_cache, &verifier2)); | |
612 } | |
613 | |
614 } // namespace cronet | |
OLD | NEW |