| 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)); |
| 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 EXPECT_CALL(ct_policy_enforcer_, DoesConformToCTEVPolicy(_, _, _, _)) |
| 347 .WillRepeatedly( |
| 348 Return(ct::EVPolicyCompliance::EV_POLICY_NOT_ENOUGH_SCTS)); |
| 335 | 349 |
| 336 ProofVerifierChromium proof_verifier(&dummy_verifier, &policy_enforcer, | 350 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, |
| 337 &transport_security_state_, | 351 &transport_security_state_, |
| 338 ct_verifier_.get()); | 352 ct_verifier_.get()); |
| 339 | 353 |
| 340 std::unique_ptr<DummyProofVerifierCallback> callback( | 354 std::unique_ptr<DummyProofVerifierCallback> callback( |
| 341 new DummyProofVerifierCallback); | 355 new DummyProofVerifierCallback); |
| 342 QuicAsyncStatus status = proof_verifier.VerifyProof( | 356 QuicAsyncStatus status = proof_verifier.VerifyProof( |
| 343 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", | 357 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", |
| 344 GetTestSignature(), verify_context_.get(), &error_details_, &details_, | 358 GetTestSignature(), verify_context_.get(), &error_details_, &details_, |
| 345 callback.get()); | 359 callback.get()); |
| 346 ASSERT_EQ(QUIC_SUCCESS, status); | 360 ASSERT_EQ(QUIC_SUCCESS, status); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 CertVerifyResult dummy_result; | 416 CertVerifyResult dummy_result; |
| 403 dummy_result.verified_cert = test_cert; | 417 dummy_result.verified_cert = test_cert; |
| 404 dummy_result.is_issued_by_known_root = true; | 418 dummy_result.is_issued_by_known_root = true; |
| 405 dummy_result.public_key_hashes = MakeHashValueVector(0x01); | 419 dummy_result.public_key_hashes = MakeHashValueVector(0x01); |
| 406 dummy_result.cert_status = 0; | 420 dummy_result.cert_status = 0; |
| 407 | 421 |
| 408 MockCertVerifier dummy_verifier; | 422 MockCertVerifier dummy_verifier; |
| 409 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); | 423 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); |
| 410 | 424 |
| 411 HashValueVector pin_hashes = MakeHashValueVector(0x02); | 425 HashValueVector pin_hashes = MakeHashValueVector(0x02); |
| 412 TransportSecurityState transport_security_state; | 426 transport_security_state_.AddHPKP( |
| 413 transport_security_state.AddHPKP( | |
| 414 kTestHostname, base::Time::Now() + base::TimeDelta::FromSeconds(10000), | 427 kTestHostname, base::Time::Now() + base::TimeDelta::FromSeconds(10000), |
| 415 true, pin_hashes, GURL()); | 428 true, pin_hashes, GURL()); |
| 416 | 429 |
| 417 MockCTPolicyEnforcer policy_enforcer(true /*is_ev*/); | 430 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, |
| 418 ProofVerifierChromium proof_verifier(&dummy_verifier, &policy_enforcer, | 431 &transport_security_state_, |
| 419 &transport_security_state, | |
| 420 ct_verifier_.get()); | 432 ct_verifier_.get()); |
| 421 | 433 |
| 422 std::unique_ptr<DummyProofVerifierCallback> callback( | 434 std::unique_ptr<DummyProofVerifierCallback> callback( |
| 423 new DummyProofVerifierCallback); | 435 new DummyProofVerifierCallback); |
| 424 QuicAsyncStatus status = proof_verifier.VerifyProof( | 436 QuicAsyncStatus status = proof_verifier.VerifyProof( |
| 425 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", | 437 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", |
| 426 GetTestSignature(), verify_context_.get(), &error_details_, &details_, | 438 GetTestSignature(), verify_context_.get(), &error_details_, &details_, |
| 427 callback.get()); | 439 callback.get()); |
| 428 ASSERT_EQ(QUIC_FAILURE, status); | 440 ASSERT_EQ(QUIC_FAILURE, status); |
| 429 | 441 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 445 CertVerifyResult dummy_result; | 457 CertVerifyResult dummy_result; |
| 446 dummy_result.verified_cert = test_cert; | 458 dummy_result.verified_cert = test_cert; |
| 447 dummy_result.is_issued_by_known_root = false; | 459 dummy_result.is_issued_by_known_root = false; |
| 448 dummy_result.public_key_hashes = MakeHashValueVector(0x01); | 460 dummy_result.public_key_hashes = MakeHashValueVector(0x01); |
| 449 dummy_result.cert_status = 0; | 461 dummy_result.cert_status = 0; |
| 450 | 462 |
| 451 MockCertVerifier dummy_verifier; | 463 MockCertVerifier dummy_verifier; |
| 452 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); | 464 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); |
| 453 | 465 |
| 454 HashValueVector expected_hashes = MakeHashValueVector(0x02); | 466 HashValueVector expected_hashes = MakeHashValueVector(0x02); |
| 455 TransportSecurityState transport_security_state_fail; | 467 transport_security_state_.AddHPKP( |
| 456 transport_security_state_fail.AddHPKP( | |
| 457 kTestHostname, base::Time::Now() + base::TimeDelta::FromSeconds(10000), | 468 kTestHostname, base::Time::Now() + base::TimeDelta::FromSeconds(10000), |
| 458 true, expected_hashes, GURL()); | 469 true, expected_hashes, GURL()); |
| 459 | 470 |
| 460 MockCTPolicyEnforcer policy_enforcer(true /*is_ev*/); | 471 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, |
| 461 ProofVerifierChromium proof_verifier(&dummy_verifier, &policy_enforcer, | 472 &transport_security_state_, |
| 462 &transport_security_state_fail, | |
| 463 ct_verifier_.get()); | 473 ct_verifier_.get()); |
| 464 | 474 |
| 465 std::unique_ptr<DummyProofVerifierCallback> callback( | 475 std::unique_ptr<DummyProofVerifierCallback> callback( |
| 466 new DummyProofVerifierCallback); | 476 new DummyProofVerifierCallback); |
| 467 QuicAsyncStatus status = proof_verifier.VerifyProof( | 477 QuicAsyncStatus status = proof_verifier.VerifyProof( |
| 468 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", | 478 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", |
| 469 GetTestSignature(), verify_context_.get(), &error_details_, &details_, | 479 GetTestSignature(), verify_context_.get(), &error_details_, &details_, |
| 470 callback.get()); | 480 callback.get()); |
| 471 ASSERT_EQ(QUIC_SUCCESS, status); | 481 ASSERT_EQ(QUIC_SUCCESS, status); |
| 472 | 482 |
| 473 ASSERT_TRUE(details_.get()); | 483 ASSERT_TRUE(details_.get()); |
| 474 ProofVerifyDetailsChromium* verify_details = | 484 ProofVerifyDetailsChromium* verify_details = |
| 475 static_cast<ProofVerifyDetailsChromium*>(details_.get()); | 485 static_cast<ProofVerifyDetailsChromium*>(details_.get()); |
| 476 EXPECT_TRUE(verify_details->pkp_bypassed); | 486 EXPECT_TRUE(verify_details->pkp_bypassed); |
| 477 } | 487 } |
| 478 | 488 |
| 489 // Test that when CT is required (in this case, by the delegate), the |
| 490 // absence of CT information is a socket error. |
| 491 TEST_F(ProofVerifierChromiumTest, CTIsRequired) { |
| 492 scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate(); |
| 493 ASSERT_TRUE(test_cert); |
| 494 |
| 495 CertVerifyResult dummy_result; |
| 496 dummy_result.verified_cert = test_cert; |
| 497 dummy_result.is_issued_by_known_root = true; |
| 498 dummy_result.public_key_hashes = MakeHashValueVector(0x01); |
| 499 dummy_result.cert_status = 0; |
| 500 |
| 501 MockCertVerifier dummy_verifier; |
| 502 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); |
| 503 |
| 504 // Set up CT. |
| 505 MockRequireCTDelegate require_ct_delegate; |
| 506 transport_security_state_.SetRequireCTDelegate(&require_ct_delegate); |
| 507 EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(_)) |
| 508 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: |
| 509 CTRequirementLevel::NOT_REQUIRED)); |
| 510 EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(kTestHostname)) |
| 511 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: |
| 512 CTRequirementLevel::REQUIRED)); |
| 513 EXPECT_CALL(ct_policy_enforcer_, DoesConformToCertPolicy(_, _, _)) |
| 514 .WillRepeatedly( |
| 515 Return(ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS)); |
| 516 |
| 517 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, |
| 518 &transport_security_state_, |
| 519 ct_verifier_.get()); |
| 520 |
| 521 std::unique_ptr<DummyProofVerifierCallback> callback( |
| 522 new DummyProofVerifierCallback); |
| 523 QuicAsyncStatus status = proof_verifier.VerifyProof( |
| 524 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", |
| 525 GetTestSignature(), verify_context_.get(), &error_details_, &details_, |
| 526 callback.get()); |
| 527 ASSERT_EQ(QUIC_FAILURE, status); |
| 528 |
| 529 ASSERT_TRUE(details_.get()); |
| 530 ProofVerifyDetailsChromium* verify_details = |
| 531 static_cast<ProofVerifyDetailsChromium*>(details_.get()); |
| 532 EXPECT_TRUE(verify_details->cert_verify_result.cert_status & |
| 533 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED); |
| 534 } |
| 535 |
| 536 // Test that CT is considered even when HPKP fails. |
| 537 TEST_F(ProofVerifierChromiumTest, PKPAndCTBothTested) { |
| 538 scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate(); |
| 539 ASSERT_TRUE(test_cert); |
| 540 |
| 541 CertVerifyResult dummy_result; |
| 542 dummy_result.verified_cert = test_cert; |
| 543 dummy_result.is_issued_by_known_root = true; |
| 544 dummy_result.public_key_hashes = MakeHashValueVector(0x01); |
| 545 dummy_result.cert_status = 0; |
| 546 |
| 547 MockCertVerifier dummy_verifier; |
| 548 dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, OK); |
| 549 |
| 550 // Set up HPKP. |
| 551 HashValueVector pin_hashes = MakeHashValueVector(0x02); |
| 552 transport_security_state_.AddHPKP( |
| 553 kTestHostname, base::Time::Now() + base::TimeDelta::FromSeconds(10000), |
| 554 true, pin_hashes, GURL()); |
| 555 |
| 556 // Set up CT. |
| 557 MockRequireCTDelegate require_ct_delegate; |
| 558 transport_security_state_.SetRequireCTDelegate(&require_ct_delegate); |
| 559 EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(_)) |
| 560 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: |
| 561 CTRequirementLevel::NOT_REQUIRED)); |
| 562 EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(kTestHostname)) |
| 563 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: |
| 564 CTRequirementLevel::REQUIRED)); |
| 565 EXPECT_CALL(ct_policy_enforcer_, DoesConformToCertPolicy(_, _, _)) |
| 566 .WillRepeatedly( |
| 567 Return(ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS)); |
| 568 |
| 569 ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, |
| 570 &transport_security_state_, |
| 571 ct_verifier_.get()); |
| 572 |
| 573 std::unique_ptr<DummyProofVerifierCallback> callback( |
| 574 new DummyProofVerifierCallback); |
| 575 QuicAsyncStatus status = proof_verifier.VerifyProof( |
| 576 kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_25, "", certs_, "", |
| 577 GetTestSignature(), verify_context_.get(), &error_details_, &details_, |
| 578 callback.get()); |
| 579 ASSERT_EQ(QUIC_FAILURE, status); |
| 580 |
| 581 ASSERT_TRUE(details_.get()); |
| 582 ProofVerifyDetailsChromium* verify_details = |
| 583 static_cast<ProofVerifyDetailsChromium*>(details_.get()); |
| 584 EXPECT_TRUE(verify_details->cert_verify_result.cert_status & |
| 585 CERT_STATUS_PINNED_KEY_MISSING); |
| 586 EXPECT_TRUE(verify_details->cert_verify_result.cert_status & |
| 587 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED); |
| 588 } |
| 589 |
| 479 } // namespace test | 590 } // namespace test |
| 480 } // namespace net | 591 } // namespace net |
| OLD | NEW |