Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/socket/ssl_client_socket.h" | 5 #include "net/socket/ssl_client_socket.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 701 ct::CertPolicyCompliance(X509Certificate* cert, | 701 ct::CertPolicyCompliance(X509Certificate* cert, |
| 702 const ct::SCTList&, | 702 const ct::SCTList&, |
| 703 const BoundNetLog&)); | 703 const BoundNetLog&)); |
| 704 MOCK_METHOD4(DoesConformToCTEVPolicy, | 704 MOCK_METHOD4(DoesConformToCTEVPolicy, |
| 705 ct::EVPolicyCompliance(X509Certificate* cert, | 705 ct::EVPolicyCompliance(X509Certificate* cert, |
| 706 const ct::EVCertsWhitelist*, | 706 const ct::EVCertsWhitelist*, |
| 707 const ct::SCTList&, | 707 const ct::SCTList&, |
| 708 const BoundNetLog&)); | 708 const BoundNetLog&)); |
| 709 }; | 709 }; |
| 710 | 710 |
| 711 class MockRequireCTDelegate : public TransportSecurityState::RequireCTDelegate { | |
| 712 public: | |
| 713 MOCK_METHOD1(IsCTRequiredForHost, | |
| 714 CTRequirementLevel(const std::string& host)); | |
| 715 }; | |
| 716 | |
| 711 class SSLClientSocketTest : public PlatformTest { | 717 class SSLClientSocketTest : public PlatformTest { |
| 712 public: | 718 public: |
| 713 SSLClientSocketTest() | 719 SSLClientSocketTest() |
| 714 : socket_factory_(ClientSocketFactory::GetDefaultFactory()), | 720 : socket_factory_(ClientSocketFactory::GetDefaultFactory()), |
| 715 cert_verifier_(new MockCertVerifier), | 721 cert_verifier_(new MockCertVerifier), |
| 716 transport_security_state_(new TransportSecurityState), | 722 transport_security_state_(new TransportSecurityState), |
| 717 ct_verifier_(new MockCTVerifier), | 723 ct_verifier_(new MockCTVerifier), |
| 718 ct_policy_enforcer_(new MockCTPolicyEnforcer) { | 724 ct_policy_enforcer_(new MockCTPolicyEnforcer) { |
| 719 cert_verifier_->set_default_result(OK); | 725 cert_verifier_->set_default_result(OK); |
| 720 context_.cert_verifier = cert_verifier_.get(); | 726 context_.cert_verifier = cert_verifier_.get(); |
| (...skipping 2625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3346 SSLInfo ssl_info; | 3352 SSLInfo ssl_info; |
| 3347 ASSERT_TRUE(sock_->GetSSLInfo(&ssl_info)); | 3353 ASSERT_TRUE(sock_->GetSSLInfo(&ssl_info)); |
| 3348 | 3354 |
| 3349 EXPECT_EQ(ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN, rv); | 3355 EXPECT_EQ(ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN, rv); |
| 3350 EXPECT_TRUE(ssl_info.cert_status & CERT_STATUS_PINNED_KEY_MISSING); | 3356 EXPECT_TRUE(ssl_info.cert_status & CERT_STATUS_PINNED_KEY_MISSING); |
| 3351 EXPECT_TRUE(sock_->IsConnected()); | 3357 EXPECT_TRUE(sock_->IsConnected()); |
| 3352 | 3358 |
| 3353 EXPECT_FALSE(ssl_info.pkp_bypassed); | 3359 EXPECT_FALSE(ssl_info.pkp_bypassed); |
| 3354 } | 3360 } |
| 3355 | 3361 |
| 3362 // Test that when CT is required (in this case, by the delegate), the | |
| 3363 // absence of CT information is a socket error. | |
| 3364 TEST_F(SSLClientSocketTest, CTIsRequired) { | |
| 3365 SpawnedTestServer::SSLOptions ssl_options; | |
| 3366 ASSERT_TRUE(StartTestServer(ssl_options)); | |
| 3367 scoped_refptr<X509Certificate> server_cert = | |
| 3368 spawned_test_server()->GetCertificate(); | |
| 3369 | |
| 3370 // Certificate is trusted and chains to a public root. | |
| 3371 CertVerifyResult verify_result; | |
| 3372 verify_result.is_issued_by_known_root = true; | |
| 3373 verify_result.verified_cert = server_cert; | |
| 3374 verify_result.public_key_hashes = MakeHashValueVector(0); | |
| 3375 cert_verifier_->AddResultForCert(server_cert.get(), verify_result, OK); | |
| 3376 | |
| 3377 // Set up CT | |
| 3378 MockRequireCTDelegate require_ct_delegate; | |
| 3379 transport_security_state_->SetRequireCTDelegate(&require_ct_delegate); | |
| 3380 EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(_)) | |
| 3381 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: | |
| 3382 CTRequirementLevel::NOT_REQUIRED)); | |
|
davidben
2016/06/23 19:51:43
Is this line needed?
Ryan Sleevi
2016/06/23 21:38:31
Same comment as from other; sets up a default expe
| |
| 3383 EXPECT_CALL( | |
| 3384 require_ct_delegate, | |
| 3385 IsCTRequiredForHost(spawned_test_server()->host_port_pair().host())) | |
| 3386 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: | |
| 3387 CTRequirementLevel::REQUIRED)); | |
| 3388 EXPECT_CALL(*ct_policy_enforcer_, | |
| 3389 DoesConformToCertPolicy(server_cert.get(), _, _)) | |
| 3390 .WillRepeatedly( | |
| 3391 Return(ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS)); | |
| 3392 | |
| 3393 SSLConfig ssl_config; | |
| 3394 int rv; | |
| 3395 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); | |
| 3396 SSLInfo ssl_info; | |
| 3397 ASSERT_TRUE(sock_->GetSSLInfo(&ssl_info)); | |
| 3398 | |
| 3399 EXPECT_EQ(ERR_CERTIFICATE_TRANSPARENCY_REQUIRED, rv); | |
| 3400 EXPECT_TRUE(ssl_info.cert_status & | |
| 3401 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED); | |
| 3402 EXPECT_TRUE(sock_->IsConnected()); | |
| 3403 } | |
| 3404 | |
| 3405 // When both HPKP and CT are required for a host, and both fail, the more | |
| 3406 // serious error is that the HPKP pin validation failed. | |
| 3407 TEST_F(SSLClientSocketTest, PKPMoreImportantThanCT) { | |
| 3408 SpawnedTestServer::SSLOptions ssl_options; | |
| 3409 ASSERT_TRUE(StartTestServer(ssl_options)); | |
| 3410 scoped_refptr<X509Certificate> server_cert = | |
| 3411 spawned_test_server()->GetCertificate(); | |
| 3412 | |
| 3413 // Certificate is trusted, but chains to a public root that doesn't match the | |
| 3414 // pin hashes. | |
| 3415 CertVerifyResult verify_result; | |
| 3416 verify_result.is_issued_by_known_root = true; | |
| 3417 verify_result.verified_cert = server_cert; | |
| 3418 verify_result.public_key_hashes = MakeHashValueVector(0); | |
| 3419 cert_verifier_->AddResultForCert(server_cert.get(), verify_result, OK); | |
| 3420 | |
| 3421 // Set up HPKP. | |
| 3422 HashValueVector expected_hashes = MakeHashValueVector(1); | |
| 3423 context_.transport_security_state->AddHPKP( | |
| 3424 spawned_test_server()->host_port_pair().host(), | |
| 3425 base::Time::Now() + base::TimeDelta::FromSeconds(10000), true, | |
| 3426 expected_hashes, GURL()); | |
| 3427 | |
| 3428 // Set up CT. | |
| 3429 MockRequireCTDelegate require_ct_delegate; | |
| 3430 transport_security_state_->SetRequireCTDelegate(&require_ct_delegate); | |
| 3431 EXPECT_CALL(require_ct_delegate, IsCTRequiredForHost(_)) | |
| 3432 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: | |
| 3433 CTRequirementLevel::NOT_REQUIRED)); | |
|
davidben
2016/06/23 19:51:43
Ditto.
| |
| 3434 EXPECT_CALL( | |
| 3435 require_ct_delegate, | |
| 3436 IsCTRequiredForHost(spawned_test_server()->host_port_pair().host())) | |
| 3437 .WillRepeatedly(Return(TransportSecurityState::RequireCTDelegate:: | |
| 3438 CTRequirementLevel::REQUIRED)); | |
| 3439 EXPECT_CALL(*ct_policy_enforcer_, | |
| 3440 DoesConformToCertPolicy(server_cert.get(), _, _)) | |
| 3441 .WillRepeatedly( | |
| 3442 Return(ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS)); | |
| 3443 | |
| 3444 SSLConfig ssl_config; | |
| 3445 int rv; | |
| 3446 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); | |
| 3447 SSLInfo ssl_info; | |
| 3448 ASSERT_TRUE(sock_->GetSSLInfo(&ssl_info)); | |
| 3449 | |
| 3450 EXPECT_EQ(ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN, rv); | |
| 3451 EXPECT_TRUE(ssl_info.cert_status & CERT_STATUS_PINNED_KEY_MISSING); | |
| 3452 EXPECT_TRUE(ssl_info.cert_status & | |
| 3453 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED); | |
| 3454 EXPECT_TRUE(sock_->IsConnected()); | |
| 3455 } | |
| 3456 | |
| 3356 } // namespace net | 3457 } // namespace net |
| OLD | NEW |