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

Side by Side Diff: net/socket/ssl_client_socket_unittest.cc

Issue 2076363002: Introduce the ability to require CT for specific hosts (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@require_ct_enforcer
Patch Set: Android is weird Created 4 years, 6 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
« no previous file with comments | « net/socket/ssl_client_socket_impl.cc ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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));
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));
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
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_impl.cc ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698