Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/crypto/proof_verifier_chromium.h" | 5 #include "net/quic/crypto/proof_verifier_chromium.h" |
| 6 | 6 |
| 7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
| 8 #include "net/base/net_errors.h" | 8 #include "net/base/net_errors.h" |
| 9 #include "net/cert/cert_status_flags.h" | 9 #include "net/cert/cert_status_flags.h" |
| 10 #include "net/cert/cert_verifier.h" | 10 #include "net/cert/cert_verifier.h" |
| 11 #include "net/cert/ct_log_verifier.h" | 11 #include "net/cert/ct_log_verifier.h" |
| 12 #include "net/cert/ct_policy_enforcer.h" | 12 #include "net/cert/ct_policy_enforcer.h" |
| 13 #include "net/cert/ct_policy_status.h" | 13 #include "net/cert/ct_policy_status.h" |
| 14 #include "net/cert/ct_serialization.h" | 14 #include "net/cert/ct_serialization.h" |
| 15 #include "net/cert/mock_cert_verifier.h" | 15 #include "net/cert/mock_cert_verifier.h" |
| 16 #include "net/cert/multi_log_ct_verifier.h" | 16 #include "net/cert/multi_log_ct_verifier.h" |
| 17 #include "net/http/transport_security_state.h" | 17 #include "net/http/transport_security_state.h" |
| 18 #include "net/quic/crypto/proof_verifier.h" | 18 #include "net/quic/crypto/proof_verifier.h" |
| 19 #include "net/test/cert_test_util.h" | 19 #include "net/test/cert_test_util.h" |
| 20 #include "net/test/ct_test_util.h" | 20 #include "net/test/ct_test_util.h" |
| 21 #include "net/test/test_data_directory.h" | 21 #include "net/test/test_data_directory.h" |
| 22 #include "testing/gmock/include/gmock/gmock.h" | |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 23 | 24 |
| 25 using ::testing::_; | |
| 26 using ::testing::Return; | |
| 27 | |
| 24 namespace net { | 28 namespace net { |
| 25 namespace test { | 29 namespace test { |
| 26 | 30 |
| 27 namespace { | 31 namespace { |
| 28 | 32 |
| 29 // CertVerifier that will fail the test if it is ever called. | 33 // CertVerifier that will fail the test if it is ever called. |
| 30 class FailsTestCertVerifier : public CertVerifier { | 34 class FailsTestCertVerifier : public CertVerifier { |
| 31 public: | 35 public: |
| 32 FailsTestCertVerifier() {} | 36 FailsTestCertVerifier() {} |
| 33 ~FailsTestCertVerifier() override {} | 37 ~FailsTestCertVerifier() override {} |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 54 X509Certificate* cert, | 58 X509Certificate* cert, |
| 55 const ct::EVCertsWhitelist* ev_whitelist, | 59 const ct::EVCertsWhitelist* ev_whitelist, |
| 56 const ct::SCTList& verified_scts, | 60 const ct::SCTList& verified_scts, |
| 57 const BoundNetLog& net_log) override { | 61 const BoundNetLog& net_log) override { |
| 58 ADD_FAILURE() << "CTPolicyEnforcer::DoesConformToCTEVPolicy() should " | 62 ADD_FAILURE() << "CTPolicyEnforcer::DoesConformToCTEVPolicy() should " |
| 59 << "not be called"; | 63 << "not be called"; |
| 60 return ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY; | 64 return ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY; |
| 61 } | 65 } |
| 62 }; | 66 }; |
| 63 | 67 |
| 64 // CTPolicyEnforcer that can simulate whether or not a given certificate | 68 // A mock CTPolicyEnforcer that returns a custom verification result. |
| 65 // conforms to the CT/EV policy. | |
| 66 class MockCTPolicyEnforcer : public CTPolicyEnforcer { | 69 class MockCTPolicyEnforcer : public CTPolicyEnforcer { |
| 67 public: | 70 public: |
| 68 explicit MockCTPolicyEnforcer(bool is_ev) : is_ev_(is_ev) {} | 71 MOCK_METHOD3(DoesConformToCertPolicy, |
| 69 ~MockCTPolicyEnforcer() override {} | 72 ct::CertPolicyCompliance(X509Certificate* cert, |
| 73 const ct::SCTList&, | |
| 74 const BoundNetLog&)); | |
| 75 MOCK_METHOD4(DoesConformToCTEVPolicy, | |
| 76 ct::EVPolicyCompliance(X509Certificate* cert, | |
| 77 const ct::EVCertsWhitelist*, | |
| 78 const ct::SCTList&, | |
| 79 const BoundNetLog&)); | |
| 80 }; | |
| 70 | 81 |
| 71 ct::EVPolicyCompliance DoesConformToCTEVPolicy( | 82 class MockRequireCTDelegate : public TransportSecurityState::RequireCTDelegate { |
| 72 X509Certificate* cert, | 83 public: |
| 73 const ct::EVCertsWhitelist* ev_whitelist, | 84 MOCK_METHOD1(IsCTRequiredForHost, |
| 74 const ct::SCTList& verified_scts, | 85 CTRequirementLevel(const std::string& host)); |
| 75 const BoundNetLog& net_log) override { | |
| 76 return is_ev_ ? ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS | |
| 77 : ct::EVPolicyCompliance::EV_POLICY_NOT_ENOUGH_SCTS; | |
| 78 } | |
| 79 | |
| 80 private: | |
| 81 bool is_ev_; | |
| 82 }; | 86 }; |
| 83 | 87 |
| 84 class DummyProofVerifierCallback : public ProofVerifierCallback { | 88 class DummyProofVerifierCallback : public ProofVerifierCallback { |
| 85 public: | 89 public: |
| 86 DummyProofVerifierCallback() {} | 90 DummyProofVerifierCallback() {} |
| 87 ~DummyProofVerifierCallback() override {} | 91 ~DummyProofVerifierCallback() override {} |
| 88 | 92 |
| 89 void Run(bool ok, | 93 void Run(bool ok, |
| 90 const std::string& error_details, | 94 const std::string& error_details, |
| 91 std::unique_ptr<ProofVerifyDetails>* details) override { | 95 std::unique_ptr<ProofVerifyDetails>* details) override { |
| 92 // Do nothing | 96 // Do nothing |
| 93 } | 97 } |
| 94 }; | 98 }; |
| 95 | 99 |
| 96 const char kTestHostname[] = "test.example.com"; | 100 const char kTestHostname[] = "test.example.com"; |
| 97 const uint16_t kTestPort = 8443; | 101 const uint16_t kTestPort = 8443; |
| 98 const char kTestConfig[] = "server config bytes"; | 102 const char kTestConfig[] = "server config bytes"; |
| 99 const char kLogDescription[] = "somelog"; | 103 const char kLogDescription[] = "somelog"; |
| 100 | 104 |
| 101 } // namespace | 105 } // namespace |
| 102 | 106 |
| 103 class ProofVerifierChromiumTest : public ::testing::Test { | 107 class ProofVerifierChromiumTest : public ::testing::Test { |
| 104 public: | 108 public: |
| 105 ProofVerifierChromiumTest() | 109 ProofVerifierChromiumTest() |
| 106 : ct_policy_enforcer_(false /*is_ev*/), | 110 : verify_context_(new ProofVerifyContextChromium(0 /*cert_verify_flags*/, |
| 107 verify_context_(new ProofVerifyContextChromium(0 /*cert_verify_flags*/, | |
| 108 BoundNetLog())) {} | 111 BoundNetLog())) {} |
| 109 | 112 |
| 110 void SetUp() override { | 113 void SetUp() override { |
| 114 EXPECT_CALL(ct_policy_enforcer_, DoesConformToCertPolicy(_, _, _)) | |
| 115 .WillRepeatedly( | |
| 116 Return(ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS)); | |
| 117 EXPECT_CALL(ct_policy_enforcer_, DoesConformToCTEVPolicy(_, _, _, _)) | |
| 118 .WillRepeatedly( | |
| 119 Return(ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY)); | |
| 120 | |
| 111 scoped_refptr<const CTLogVerifier> log(CTLogVerifier::Create( | 121 scoped_refptr<const CTLogVerifier> log(CTLogVerifier::Create( |
| 112 ct::GetTestPublicKey(), kLogDescription, "https://test.example.com")); | 122 ct::GetTestPublicKey(), kLogDescription, "https://test.example.com")); |
| 113 ASSERT_TRUE(log); | 123 ASSERT_TRUE(log); |
| 114 log_verifiers_.push_back(log); | 124 log_verifiers_.push_back(log); |
| 115 | 125 |
| 116 ct_verifier_.reset(new MultiLogCTVerifier()); | 126 ct_verifier_.reset(new MultiLogCTVerifier()); |
| 117 ct_verifier_->AddLogs(log_verifiers_); | 127 ct_verifier_->AddLogs(log_verifiers_); |
| 118 | 128 |
| 119 ASSERT_NO_FATAL_FAILURE(GetTestCertificates(&certs_)); | 129 ASSERT_NO_FATAL_FAILURE(GetTestCertificates(&certs_)); |
| 120 } | 130 } |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 290 scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate(); | 300 scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate(); |
| 291 ASSERT_TRUE(test_cert); | 301 ASSERT_TRUE(test_cert); |
| 292 | 302 |
| 293 CertVerifyResult dummy_result; | 303 CertVerifyResult dummy_result; |
| 294 dummy_result.verified_cert = test_cert; | 304 dummy_result.verified_cert = test_cert; |
| 295 dummy_result.cert_status = CERT_STATUS_IS_EV; | 305 dummy_result.cert_status = CERT_STATUS_IS_EV; |
| 296 | 306 |
| 297 MockCertVerifier dummy_verifier; | 307 MockCertVerifier dummy_verifier; |
| 298 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); | 308 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); |
| 299 | 309 |
| 300 MockCTPolicyEnforcer policy_enforcer(true /*is_ev*/); | 310 EXPECT_CALL(ct_policy_enforcer_, DoesConformToCTEVPolicy(_, _, _, _)) |
| 311 .WillRepeatedly( | |
| 312 Return(ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS)); | |
|
davidben
2016/06/23 19:51:43
Just to confirm, clobbering the EXPECT_CALL in Set
Ryan Sleevi
2016/06/23 21:38:31
Yup. https://github.com/google/googletest/blob/mas
| |
| 301 | 313 |
| 302 ProofVerifierChromium proof_verifier(&dummy_verifier, &policy_enforcer, | 314 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, |
| 303 &transport_security_state_, | 315 &transport_security_state_, |
| 304 ct_verifier_.get()); | 316 ct_verifier_.get()); |
| 305 | 317 |
| 306 std::unique_ptr<DummyProofVerifierCallback> callback( | 318 std::unique_ptr<DummyProofVerifierCallback> callback( |
| 307 new DummyProofVerifierCallback); | 319 new DummyProofVerifierCallback); |
| 308 QuicAsyncStatus status = proof_verifier.VerifyProof( | 320 QuicAsyncStatus status = proof_verifier.VerifyProof( |
| 309 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", | 321 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", |
| 310 GetTestSignature(), verify_context_.get(), &error_details_, &details_, | 322 GetTestSignature(), verify_context_.get(), &error_details_, &details_, |
| 311 callback.get()); | 323 callback.get()); |
| 312 ASSERT_EQ(QUIC_SUCCESS, status); | 324 ASSERT_EQ(QUIC_SUCCESS, status); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 324 scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate(); | 336 scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate(); |
| 325 ASSERT_TRUE(test_cert); | 337 ASSERT_TRUE(test_cert); |
| 326 | 338 |
| 327 CertVerifyResult dummy_result; | 339 CertVerifyResult dummy_result; |
| 328 dummy_result.verified_cert = test_cert; | 340 dummy_result.verified_cert = test_cert; |
| 329 dummy_result.cert_status = CERT_STATUS_IS_EV; | 341 dummy_result.cert_status = CERT_STATUS_IS_EV; |
| 330 | 342 |
| 331 MockCertVerifier dummy_verifier; | 343 MockCertVerifier dummy_verifier; |
| 332 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); | 344 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); |
| 333 | 345 |
| 334 MockCTPolicyEnforcer policy_enforcer(false /*is_ev*/); | 346 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, |
| 335 | |
| 336 ProofVerifierChromium proof_verifier(&dummy_verifier, &policy_enforcer, | |
| 337 &transport_security_state_, | 347 &transport_security_state_, |
| 338 ct_verifier_.get()); | 348 ct_verifier_.get()); |
| 339 | 349 |
| 340 std::unique_ptr<DummyProofVerifierCallback> callback( | 350 std::unique_ptr<DummyProofVerifierCallback> callback( |
| 341 new DummyProofVerifierCallback); | 351 new DummyProofVerifierCallback); |
| 342 QuicAsyncStatus status = proof_verifier.VerifyProof( | 352 QuicAsyncStatus status = proof_verifier.VerifyProof( |
| 343 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", | 353 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", |
| 344 GetTestSignature(), verify_context_.get(), &error_details_, &details_, | 354 GetTestSignature(), verify_context_.get(), &error_details_, &details_, |
| 345 callback.get()); | 355 callback.get()); |
| 346 ASSERT_EQ(QUIC_SUCCESS, status); | 356 ASSERT_EQ(QUIC_SUCCESS, status); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 402 CertVerifyResult dummy_result; | 412 CertVerifyResult dummy_result; |
| 403 dummy_result.verified_cert = test_cert; | 413 dummy_result.verified_cert = test_cert; |
| 404 dummy_result.is_issued_by_known_root = true; | 414 dummy_result.is_issued_by_known_root = true; |
| 405 dummy_result.public_key_hashes = MakeHashValueVector(0x01); | 415 dummy_result.public_key_hashes = MakeHashValueVector(0x01); |
| 406 dummy_result.cert_status = 0; | 416 dummy_result.cert_status = 0; |
| 407 | 417 |
| 408 MockCertVerifier dummy_verifier; | 418 MockCertVerifier dummy_verifier; |
| 409 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); | 419 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); |
| 410 | 420 |
| 411 HashValueVector pin_hashes = MakeHashValueVector(0x02); | 421 HashValueVector pin_hashes = MakeHashValueVector(0x02); |
| 412 TransportSecurityState transport_security_state; | 422 transport_security_state_.AddHPKP( |
| 413 transport_security_state.AddHPKP( | |
| 414 kTestHostname, base::Time::Now() + base::TimeDelta::FromSeconds(10000), | 423 kTestHostname, base::Time::Now() + base::TimeDelta::FromSeconds(10000), |
| 415 true, pin_hashes, GURL()); | 424 true, pin_hashes, GURL()); |
| 416 | 425 |
| 417 MockCTPolicyEnforcer policy_enforcer(true /*is_ev*/); | 426 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, |
| 418 ProofVerifierChromium proof_verifier(&dummy_verifier, &policy_enforcer, | 427 &transport_security_state_, |
| 419 &transport_security_state, | |
| 420 ct_verifier_.get()); | 428 ct_verifier_.get()); |
| 421 | 429 |
| 422 std::unique_ptr<DummyProofVerifierCallback> callback( | 430 std::unique_ptr<DummyProofVerifierCallback> callback( |
| 423 new DummyProofVerifierCallback); | 431 new DummyProofVerifierCallback); |
| 424 QuicAsyncStatus status = proof_verifier.VerifyProof( | 432 QuicAsyncStatus status = proof_verifier.VerifyProof( |
| 425 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", | 433 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", |
| 426 GetTestSignature(), verify_context_.get(), &error_details_, &details_, | 434 GetTestSignature(), verify_context_.get(), &error_details_, &details_, |
| 427 callback.get()); | 435 callback.get()); |
| 428 ASSERT_EQ(QUIC_FAILURE, status); | 436 ASSERT_EQ(QUIC_FAILURE, status); |
| 429 | 437 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 445 CertVerifyResult dummy_result; | 453 CertVerifyResult dummy_result; |
| 446 dummy_result.verified_cert = test_cert; | 454 dummy_result.verified_cert = test_cert; |
| 447 dummy_result.is_issued_by_known_root = false; | 455 dummy_result.is_issued_by_known_root = false; |
| 448 dummy_result.public_key_hashes = MakeHashValueVector(0x01); | 456 dummy_result.public_key_hashes = MakeHashValueVector(0x01); |
| 449 dummy_result.cert_status = 0; | 457 dummy_result.cert_status = 0; |
| 450 | 458 |
| 451 MockCertVerifier dummy_verifier; | 459 MockCertVerifier dummy_verifier; |
| 452 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); | 460 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); |
| 453 | 461 |
| 454 HashValueVector expected_hashes = MakeHashValueVector(0x02); | 462 HashValueVector expected_hashes = MakeHashValueVector(0x02); |
| 455 TransportSecurityState transport_security_state_fail; | 463 transport_security_state_.AddHPKP( |
| 456 transport_security_state_fail.AddHPKP( | |
| 457 kTestHostname, base::Time::Now() + base::TimeDelta::FromSeconds(10000), | 464 kTestHostname, base::Time::Now() + base::TimeDelta::FromSeconds(10000), |
| 458 true, expected_hashes, GURL()); | 465 true, expected_hashes, GURL()); |
| 459 | 466 |
| 460 MockCTPolicyEnforcer policy_enforcer(true /*is_ev*/); | 467 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, |
| 461 ProofVerifierChromium proof_verifier(&dummy_verifier, &policy_enforcer, | 468 &transport_security_state_, |
| 462 &transport_security_state_fail, | |
| 463 ct_verifier_.get()); | 469 ct_verifier_.get()); |
| 464 | 470 |
| 465 std::unique_ptr<DummyProofVerifierCallback> callback( | 471 std::unique_ptr<DummyProofVerifierCallback> callback( |
| 466 new DummyProofVerifierCallback); | 472 new DummyProofVerifierCallback); |
| 467 QuicAsyncStatus status = proof_verifier.VerifyProof( | 473 QuicAsyncStatus status = proof_verifier.VerifyProof( |
| 468 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", | 474 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", |
| 469 GetTestSignature(), verify_context_.get(), &error_details_, &details_, | 475 GetTestSignature(), verify_context_.get(), &error_details_, &details_, |
| 470 callback.get()); | 476 callback.get()); |
| 471 ASSERT_EQ(QUIC_SUCCESS, status); | 477 ASSERT_EQ(QUIC_SUCCESS, status); |
| 472 | 478 |
| 473 ASSERT_TRUE(details_.get()); | 479 ASSERT_TRUE(details_.get()); |
| 474 ProofVerifyDetailsChromium* verify_details = | 480 ProofVerifyDetailsChromium* verify_details = |
| 475 static_cast<ProofVerifyDetailsChromium*>(details_.get()); | 481 static_cast<ProofVerifyDetailsChromium*>(details_.get()); |
| 476 EXPECT_TRUE(verify_details->pkp_bypassed); | 482 EXPECT_TRUE(verify_details->pkp_bypassed); |
| 477 } | 483 } |
| 478 | 484 |
| 485 // Test that when CT is required (in this case, by the delegate), the | |
| 486 // absence of CT information is a socket error. | |
| 487 TEST_F(ProofVerifierChromiumTest, CTIsRequired) { | |
| 488 scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate(); | |
| 489 ASSERT_TRUE(test_cert); | |
| 490 | |
| 491 CertVerifyResult dummy_result; | |
| 492 dummy_result.verified_cert = test_cert; | |
| 493 dummy_result.is_issued_by_known_root = true; | |
| 494 dummy_result.public_key_hashes = MakeHashValueVector(0x01); | |
| 495 dummy_result.cert_status = 0; | |
| 496 | |
| 497 MockCertVerifier dummy_verifier; | |
| 498 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); | |
| 499 | |
| 500 // Set up CT. | |
| 501 MockRequireCTDelegate require_ct_delegate; | |
| 502 transport_security_state_.SetRequireCTDelegate(&require_ct_delegate); | |
| 503 EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(_)) | |
| 504 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: | |
| 505 CTRequirementLevel::NOT_REQUIRED)); | |
|
davidben
2016/06/23 19:51:43
Does this line do anything?
Ryan Sleevi
2016/06/23 21:38:31
Objectively, no. It just means that if the hostnam
| |
| 506 EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(kTestHostname)) | |
| 507 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: | |
| 508 CTRequirementLevel::REQUIRED)); | |
| 509 EXPECT_CALL(ct_policy_enforcer_, DoesConformToCertPolicy(_, _, _)) | |
| 510 .WillRepeatedly( | |
| 511 Return(ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS)); | |
| 512 | |
| 513 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, | |
| 514 &transport_security_state_, | |
| 515 ct_verifier_.get()); | |
| 516 | |
| 517 std::unique_ptr<DummyProofVerifierCallback> callback( | |
| 518 new DummyProofVerifierCallback); | |
| 519 QuicAsyncStatus status = proof_verifier.VerifyProof( | |
| 520 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", | |
| 521 GetTestSignature(), verify_context_.get(), &error_details_, &details_, | |
| 522 callback.get()); | |
| 523 ASSERT_EQ(QUIC_FAILURE, status); | |
| 524 | |
| 525 ASSERT_TRUE(details_.get()); | |
| 526 ProofVerifyDetailsChromium* verify_details = | |
| 527 static_cast<ProofVerifyDetailsChromium*>(details_.get()); | |
| 528 EXPECT_TRUE(verify_details->cert_verify_result.cert_status & | |
| 529 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED); | |
| 530 } | |
| 531 | |
| 532 // Test that CT is considered even when HPKP fails. | |
| 533 TEST_F(ProofVerifierChromiumTest, PKPAndCTBothTested) { | |
| 534 scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate(); | |
| 535 ASSERT_TRUE(test_cert); | |
| 536 | |
| 537 CertVerifyResult dummy_result; | |
| 538 dummy_result.verified_cert = test_cert; | |
| 539 dummy_result.is_issued_by_known_root = true; | |
| 540 dummy_result.public_key_hashes = MakeHashValueVector(0x01); | |
| 541 dummy_result.cert_status = 0; | |
| 542 | |
| 543 MockCertVerifier dummy_verifier; | |
| 544 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); | |
| 545 | |
| 546 // Set up HPKP. | |
| 547 HashValueVector pin_hashes = MakeHashValueVector(0x02); | |
| 548 transport_security_state_.AddHPKP( | |
| 549 kTestHostname, base::Time::Now() + base::TimeDelta::FromSeconds(10000), | |
| 550 true, pin_hashes, GURL()); | |
| 551 | |
| 552 // Set up CT. | |
| 553 MockRequireCTDelegate require_ct_delegate; | |
| 554 transport_security_state_.SetRequireCTDelegate(&require_ct_delegate); | |
| 555 EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(_)) | |
| 556 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: | |
| 557 CTRequirementLevel::NOT_REQUIRED)); | |
| 558 EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(kTestHostname)) | |
| 559 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: | |
| 560 CTRequirementLevel::REQUIRED)); | |
| 561 EXPECT_CALL(ct_policy_enforcer_, DoesConformToCertPolicy(_, _, _)) | |
| 562 .WillRepeatedly( | |
| 563 Return(ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS)); | |
| 564 | |
| 565 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, | |
| 566 &transport_security_state_, | |
| 567 ct_verifier_.get()); | |
| 568 | |
| 569 std::unique_ptr<DummyProofVerifierCallback> callback( | |
| 570 new DummyProofVerifierCallback); | |
| 571 QuicAsyncStatus status = proof_verifier.VerifyProof( | |
| 572 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", | |
| 573 GetTestSignature(), verify_context_.get(), &error_details_, &details_, | |
| 574 callback.get()); | |
| 575 ASSERT_EQ(QUIC_FAILURE, status); | |
| 576 | |
| 577 ASSERT_TRUE(details_.get()); | |
| 578 ProofVerifyDetailsChromium* verify_details = | |
| 579 static_cast<ProofVerifyDetailsChromium*>(details_.get()); | |
| 580 EXPECT_TRUE(verify_details->cert_verify_result.cert_status & | |
| 581 CERT_STATUS_PINNED_KEY_MISSING); | |
| 582 EXPECT_TRUE(verify_details->cert_verify_result.cert_status & | |
| 583 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED); | |
| 584 } | |
| 585 | |
| 479 } // namespace test | 586 } // namespace test |
| 480 } // namespace net | 587 } // namespace net |
| OLD | NEW |