Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Side by Side Diff: net/quic/crypto/proof_test.cc

Issue 1780983002: Provide valid port on HPKP reports for QUIC connections (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix missed tests Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/files/file_path.h" 5 #include "base/files/file_path.h"
6 #include "net/base/ip_endpoint.h" 6 #include "net/base/ip_endpoint.h"
7 #include "net/base/net_errors.h" 7 #include "net/base/net_errors.h"
8 #include "net/base/test_completion_callback.h" 8 #include "net/base/test_completion_callback.h"
9 #include "net/base/test_data_directory.h" 9 #include "net/base/test_data_directory.h"
10 #include "net/cert/cert_status_flags.h" 10 #include "net/cert/cert_status_flags.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 private: 49 private:
50 TestCompletionCallback* const comp_callback_; 50 TestCompletionCallback* const comp_callback_;
51 bool* const ok_; 51 bool* const ok_;
52 string* const error_details_; 52 string* const error_details_;
53 }; 53 };
54 54
55 // RunVerification runs |verifier->VerifyProof| and asserts that the result 55 // RunVerification runs |verifier->VerifyProof| and asserts that the result
56 // matches |expected_ok|. 56 // matches |expected_ok|.
57 void RunVerification(ProofVerifier* verifier, 57 void RunVerification(ProofVerifier* verifier,
58 const string& hostname, 58 const string& hostname,
59 const uint16_t port,
59 const string& server_config, 60 const string& server_config,
60 const vector<string>& certs, 61 const vector<string>& certs,
61 const string& proof, 62 const string& proof,
62 bool expected_ok) { 63 bool expected_ok) {
63 scoped_ptr<ProofVerifyDetails> details; 64 scoped_ptr<ProofVerifyDetails> details;
64 TestCompletionCallback comp_callback; 65 TestCompletionCallback comp_callback;
65 bool ok; 66 bool ok;
66 string error_details; 67 string error_details;
67 scoped_ptr<ProofVerifyContext> verify_context( 68 scoped_ptr<ProofVerifyContext> verify_context(
68 CryptoTestUtils::ProofVerifyContextForTesting()); 69 CryptoTestUtils::ProofVerifyContextForTesting());
69 TestProofVerifierCallback* callback = 70 TestProofVerifierCallback* callback =
70 new TestProofVerifierCallback(&comp_callback, &ok, &error_details); 71 new TestProofVerifierCallback(&comp_callback, &ok, &error_details);
71 72
72 QuicAsyncStatus status = verifier->VerifyProof( 73 QuicAsyncStatus status = verifier->VerifyProof(
73 hostname, server_config, certs, "", proof, verify_context.get(), 74 hostname, port, server_config, certs, "", proof, verify_context.get(),
74 &error_details, &details, callback); 75 &error_details, &details, callback);
75 76
76 switch (status) { 77 switch (status) {
77 case QUIC_FAILURE: 78 case QUIC_FAILURE:
78 delete callback; 79 delete callback;
79 ASSERT_FALSE(expected_ok); 80 ASSERT_FALSE(expected_ok);
80 ASSERT_NE("", error_details); 81 ASSERT_NE("", error_details);
81 return; 82 return;
82 case QUIC_SUCCESS: 83 case QUIC_SUCCESS:
83 delete callback; 84 delete callback;
(...skipping 23 matching lines...) Expand all
107 } // namespace 108 } // namespace
108 109
109 // TODO(rtenneti): Enable testing of ProofVerifier. See http://crbug.com/514468. 110 // TODO(rtenneti): Enable testing of ProofVerifier. See http://crbug.com/514468.
110 TEST(ProofTest, DISABLED_Verify) { 111 TEST(ProofTest, DISABLED_Verify) {
111 scoped_ptr<ProofSource> source(CryptoTestUtils::ProofSourceForTesting()); 112 scoped_ptr<ProofSource> source(CryptoTestUtils::ProofSourceForTesting());
112 scoped_ptr<ProofVerifier> verifier( 113 scoped_ptr<ProofVerifier> verifier(
113 CryptoTestUtils::ProofVerifierForTesting()); 114 CryptoTestUtils::ProofVerifierForTesting());
114 115
115 const string server_config = "server config bytes"; 116 const string server_config = "server config bytes";
116 const string hostname = "test.example.com"; 117 const string hostname = "test.example.com";
118 const uint16_t port = 8443;
117 scoped_refptr<ProofSource::Chain> chain; 119 scoped_refptr<ProofSource::Chain> chain;
118 scoped_refptr<ProofSource::Chain> first_chain; 120 scoped_refptr<ProofSource::Chain> first_chain;
119 string error_details, signature, first_signature, first_cert_sct, cert_sct; 121 string error_details, signature, first_signature, first_cert_sct, cert_sct;
120 IPAddress server_ip; 122 IPAddress server_ip;
121 123
122 ASSERT_TRUE(source->GetProof(server_ip, hostname, server_config, 124 ASSERT_TRUE(source->GetProof(server_ip, hostname, server_config,
123 false /* no ECDSA */, &first_chain, 125 false /* no ECDSA */, &first_chain,
124 &first_signature, &first_cert_sct)); 126 &first_signature, &first_cert_sct));
125 ASSERT_TRUE(source->GetProof(server_ip, hostname, server_config, 127 ASSERT_TRUE(source->GetProof(server_ip, hostname, server_config,
126 false /* no ECDSA */, &chain, &signature, 128 false /* no ECDSA */, &chain, &signature,
127 &cert_sct)); 129 &cert_sct));
128 130
129 // Check that the proof source is caching correctly: 131 // Check that the proof source is caching correctly:
130 ASSERT_EQ(first_chain->certs, chain->certs); 132 ASSERT_EQ(first_chain->certs, chain->certs);
131 ASSERT_EQ(signature, first_signature); 133 ASSERT_EQ(signature, first_signature);
132 ASSERT_EQ(first_cert_sct, cert_sct); 134 ASSERT_EQ(first_cert_sct, cert_sct);
133 135
134 RunVerification(verifier.get(), hostname, server_config, chain->certs, 136 RunVerification(verifier.get(), hostname, port, server_config, chain->certs,
135 signature, true); 137 signature, true);
136 138
137 RunVerification(verifier.get(), "foo.com", server_config, chain->certs, 139 RunVerification(verifier.get(), "foo.com", port, server_config, chain->certs,
138 signature, false); 140 signature, false);
139 141
140 RunVerification(verifier.get(), server_config.substr(1, string::npos), 142 RunVerification(verifier.get(), server_config.substr(1, string::npos), port,
141 server_config, chain->certs, signature, false); 143 server_config, chain->certs, signature, false);
142 144
143 const string corrupt_signature = "1" + signature; 145 const string corrupt_signature = "1" + signature;
144 RunVerification(verifier.get(), hostname, server_config, chain->certs, 146 RunVerification(verifier.get(), hostname, port, server_config, chain->certs,
145 corrupt_signature, false); 147 corrupt_signature, false);
146 148
147 vector<string> wrong_certs; 149 vector<string> wrong_certs;
148 for (size_t i = 1; i < chain->certs.size(); i++) { 150 for (size_t i = 1; i < chain->certs.size(); i++) {
149 wrong_certs.push_back(chain->certs[i]); 151 wrong_certs.push_back(chain->certs[i]);
150 } 152 }
151 RunVerification(verifier.get(), "foo.com", server_config, wrong_certs, 153 RunVerification(verifier.get(), "foo.com", port, server_config, wrong_certs,
152 corrupt_signature, false); 154 corrupt_signature, false);
153 } 155 }
154 156
155 TEST(ProofTest, UseAfterFree) { 157 TEST(ProofTest, UseAfterFree) {
156 ProofSource* source = CryptoTestUtils::ProofSourceForTesting(); 158 ProofSource* source = CryptoTestUtils::ProofSourceForTesting();
157 159
158 const string server_config = "server config bytes"; 160 const string server_config = "server config bytes";
159 const string hostname = "test.example.com"; 161 const string hostname = "test.example.com";
160 scoped_refptr<ProofSource::Chain> chain; 162 scoped_refptr<ProofSource::Chain> chain;
161 string error_details, signature, cert_sct; 163 string error_details, signature, cert_sct;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 0xdc, 0xc5, 0x56, 0x84, 0x8a, 0x31, 0x31, 0x23, 0x61, 0x94, 0x7e, 0x01, 254 0xdc, 0xc5, 0x56, 0x84, 0x8a, 0x31, 0x31, 0x23, 0x61, 0x94, 0x7e, 0x01,
253 0x22, 0x49, 0xf3, 0xcb, 0x0e, 0x31, 0x03, 0x04, 0x1b, 0x14, 0x43, 0x7c, 255 0x22, 0x49, 0xf3, 0xcb, 0x0e, 0x31, 0x03, 0x04, 0x1b, 0x14, 0x43, 0x7c,
254 0xad, 0x42, 0xe5, 0x55, 256 0xad, 0x42, 0xe5, 0x55,
255 }; 257 };
256 258
257 scoped_ptr<ProofVerifier> verifier( 259 scoped_ptr<ProofVerifier> verifier(
258 CryptoTestUtils::RealProofVerifierForTesting()); 260 CryptoTestUtils::RealProofVerifierForTesting());
259 261
260 const string server_config = "server config bytes"; 262 const string server_config = "server config bytes";
261 const string hostname = "test.example.com"; 263 const string hostname = "test.example.com";
264 const uint16_t port = 8443;
262 265
263 vector<string> certs(2); 266 vector<string> certs(2);
264 certs[0] = LoadTestCert("test.example.com.crt"); 267 certs[0] = LoadTestCert("test.example.com.crt");
265 certs[1] = LoadTestCert("intermediate.crt"); 268 certs[1] = LoadTestCert("intermediate.crt");
266 269
267 // Signatures are nondeterministic, so we test multiple signatures on the 270 // Signatures are nondeterministic, so we test multiple signatures on the
268 // same server_config. 271 // same server_config.
269 vector<string> signatures(3); 272 vector<string> signatures(3);
270 signatures[0].assign(reinterpret_cast<const char*>(signature_data_0), 273 signatures[0].assign(reinterpret_cast<const char*>(signature_data_0),
271 sizeof(signature_data_0)); 274 sizeof(signature_data_0));
272 signatures[1].assign(reinterpret_cast<const char*>(signature_data_1), 275 signatures[1].assign(reinterpret_cast<const char*>(signature_data_1),
273 sizeof(signature_data_1)); 276 sizeof(signature_data_1));
274 signatures[2].assign(reinterpret_cast<const char*>(signature_data_2), 277 signatures[2].assign(reinterpret_cast<const char*>(signature_data_2),
275 sizeof(signature_data_2)); 278 sizeof(signature_data_2));
276 279
277 for (size_t i = 0; i < signatures.size(); i++) { 280 for (size_t i = 0; i < signatures.size(); i++) {
278 const string& signature = signatures[i]; 281 const string& signature = signatures[i];
279 282
280 RunVerification(verifier.get(), hostname, server_config, certs, signature, 283 RunVerification(verifier.get(), hostname, port, server_config, certs,
281 true); 284 signature, true);
282 RunVerification(verifier.get(), "foo.com", server_config, certs, signature, 285 RunVerification(verifier.get(), "foo.com", port, server_config, certs,
283 false); 286 signature, false);
284 RunVerification(verifier.get(), hostname, 287 RunVerification(verifier.get(), hostname, port,
285 server_config.substr(1, string::npos), certs, signature, 288 server_config.substr(1, string::npos), certs, signature,
286 false); 289 false);
287 290
288 const string corrupt_signature = "1" + signature; 291 const string corrupt_signature = "1" + signature;
289 RunVerification(verifier.get(), hostname, server_config, certs, 292 RunVerification(verifier.get(), hostname, port, server_config, certs,
290 corrupt_signature, false); 293 corrupt_signature, false);
291 294
292 vector<string> wrong_certs; 295 vector<string> wrong_certs;
293 for (size_t i = 1; i < certs.size(); i++) { 296 for (size_t i = 1; i < certs.size(); i++) {
294 wrong_certs.push_back(certs[i]); 297 wrong_certs.push_back(certs[i]);
295 } 298 }
296 RunVerification(verifier.get(), hostname, server_config, wrong_certs, 299 RunVerification(verifier.get(), hostname, port, server_config, wrong_certs,
297 signature, false); 300 signature, false);
298 } 301 }
299 } 302 }
300 303
301 // A known answer test that allows us to test ProofVerifier without a working 304 // A known answer test that allows us to test ProofVerifier without a working
302 // ProofSource. 305 // ProofSource.
303 TEST(ProofTest, VerifyECDSAKnownAnswerTest) { 306 TEST(ProofTest, VerifyECDSAKnownAnswerTest) {
304 // Disable this test on platforms that do not support ECDSA certificates. 307 // Disable this test on platforms that do not support ECDSA certificates.
305 #if defined(OS_WIN) 308 #if defined(OS_WIN)
306 if (base::win::GetVersion() < base::win::VERSION_VISTA) 309 if (base::win::GetVersion() < base::win::VERSION_VISTA)
(...skipping 26 matching lines...) Expand all
333 0x02, 0x21, 0x00, 0xc6, 0x20, 0xd4, 0x28, 0xf9, 0x70, 0xb5, 0xb4, 0xff, 336 0x02, 0x21, 0x00, 0xc6, 0x20, 0xd4, 0x28, 0xf9, 0x70, 0xb5, 0xb4, 0xff,
334 0x4a, 0x35, 0xba, 0xa0, 0xf2, 0x8e, 0x00, 0xf7, 0xcb, 0x43, 0xaf, 0x2d, 337 0x4a, 0x35, 0xba, 0xa0, 0xf2, 0x8e, 0x00, 0xf7, 0xcb, 0x43, 0xaf, 0x2d,
335 0x1f, 0xce, 0x92, 0x05, 0xca, 0x29, 0xfe, 0xd2, 0x8f, 0xd9, 0x31, 338 0x1f, 0xce, 0x92, 0x05, 0xca, 0x29, 0xfe, 0xd2, 0x8f, 0xd9, 0x31,
336 }; 339 };
337 340
338 scoped_ptr<ProofVerifier> verifier( 341 scoped_ptr<ProofVerifier> verifier(
339 CryptoTestUtils::RealProofVerifierForTesting()); 342 CryptoTestUtils::RealProofVerifierForTesting());
340 343
341 const string server_config = "server config bytes"; 344 const string server_config = "server config bytes";
342 const string hostname = "test.example.com"; 345 const string hostname = "test.example.com";
346 const uint16_t port = 8443;
343 347
344 vector<string> certs(2); 348 vector<string> certs(2);
345 certs[0] = LoadTestCert("test_ecc.example.com.crt"); 349 certs[0] = LoadTestCert("test_ecc.example.com.crt");
346 certs[1] = LoadTestCert("intermediate.crt"); 350 certs[1] = LoadTestCert("intermediate.crt");
347 351
348 // Signatures are nondeterministic, so we test multiple signatures on the 352 // Signatures are nondeterministic, so we test multiple signatures on the
349 // same server_config. 353 // same server_config.
350 vector<string> signatures(3); 354 vector<string> signatures(3);
351 signatures[0].assign(reinterpret_cast<const char*>(signature_data_0), 355 signatures[0].assign(reinterpret_cast<const char*>(signature_data_0),
352 sizeof(signature_data_0)); 356 sizeof(signature_data_0));
353 signatures[1].assign(reinterpret_cast<const char*>(signature_data_1), 357 signatures[1].assign(reinterpret_cast<const char*>(signature_data_1),
354 sizeof(signature_data_1)); 358 sizeof(signature_data_1));
355 signatures[2].assign(reinterpret_cast<const char*>(signature_data_2), 359 signatures[2].assign(reinterpret_cast<const char*>(signature_data_2),
356 sizeof(signature_data_2)); 360 sizeof(signature_data_2));
357 361
358 for (size_t i = 0; i < signatures.size(); i++) { 362 for (size_t i = 0; i < signatures.size(); i++) {
359 const string& signature = signatures[i]; 363 const string& signature = signatures[i];
360 364
361 RunVerification(verifier.get(), hostname, server_config, certs, signature, 365 RunVerification(verifier.get(), hostname, port, server_config, certs,
362 true); 366 signature, true);
363 RunVerification(verifier.get(), "foo.com", server_config, certs, signature, 367 RunVerification(verifier.get(), "foo.com", port, server_config, certs,
364 false); 368 signature, false);
365 RunVerification(verifier.get(), hostname, 369 RunVerification(verifier.get(), hostname, port,
366 server_config.substr(1, string::npos), certs, signature, 370 server_config.substr(1, string::npos), certs, signature,
367 false); 371 false);
368 372
369 // An ECDSA signature is DER-encoded. Corrupt the last byte so that the 373 // An ECDSA signature is DER-encoded. Corrupt the last byte so that the
370 // signature can still be DER-decoded correctly. 374 // signature can still be DER-decoded correctly.
371 string corrupt_signature = signature; 375 string corrupt_signature = signature;
372 corrupt_signature[corrupt_signature.size() - 1] += 1; 376 corrupt_signature[corrupt_signature.size() - 1] += 1;
373 RunVerification(verifier.get(), hostname, server_config, certs, 377 RunVerification(verifier.get(), hostname, port, server_config, certs,
374 corrupt_signature, false); 378 corrupt_signature, false);
375 379
376 // Prepending a "1" makes the DER invalid. 380 // Prepending a "1" makes the DER invalid.
377 const string bad_der_signature1 = "1" + signature; 381 const string bad_der_signature1 = "1" + signature;
378 RunVerification(verifier.get(), hostname, server_config, certs, 382 RunVerification(verifier.get(), hostname, port, server_config, certs,
379 bad_der_signature1, false); 383 bad_der_signature1, false);
380 384
381 vector<string> wrong_certs; 385 vector<string> wrong_certs;
382 for (size_t i = 1; i < certs.size(); i++) { 386 for (size_t i = 1; i < certs.size(); i++) {
383 wrong_certs.push_back(certs[i]); 387 wrong_certs.push_back(certs[i]);
384 } 388 }
385 RunVerification(verifier.get(), hostname, server_config, wrong_certs, 389 RunVerification(verifier.get(), hostname, port, server_config, wrong_certs,
386 signature, false); 390 signature, false);
387 } 391 }
388 } 392 }
389 393
390 } // namespace test 394 } // namespace test
391 } // namespace net 395 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698