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 "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
11 #include "net/base/address_list.h" | 11 #include "net/base/address_list.h" |
12 #include "net/base/io_buffer.h" | 12 #include "net/base/io_buffer.h" |
13 #include "net/base/net_errors.h" | 13 #include "net/base/net_errors.h" |
14 #include "net/base/net_log.h" | 14 #include "net/base/net_log.h" |
15 #include "net/base/net_log_unittest.h" | 15 #include "net/base/net_log_unittest.h" |
16 #include "net/base/test_completion_callback.h" | 16 #include "net/base/test_completion_callback.h" |
17 #include "net/base/test_data_directory.h" | 17 #include "net/base/test_data_directory.h" |
18 #include "net/cert/asn1_util.h" | |
19 #include "net/cert/ct_verifier.h" | |
18 #include "net/cert/mock_cert_verifier.h" | 20 #include "net/cert/mock_cert_verifier.h" |
19 #include "net/cert/test_root_certs.h" | 21 #include "net/cert/test_root_certs.h" |
20 #include "net/dns/host_resolver.h" | 22 #include "net/dns/host_resolver.h" |
21 #include "net/http/transport_security_state.h" | 23 #include "net/http/transport_security_state.h" |
22 #include "net/socket/client_socket_factory.h" | 24 #include "net/socket/client_socket_factory.h" |
23 #include "net/socket/client_socket_handle.h" | 25 #include "net/socket/client_socket_handle.h" |
24 #include "net/socket/socket_test_util.h" | 26 #include "net/socket/socket_test_util.h" |
25 #include "net/socket/tcp_client_socket.h" | 27 #include "net/socket/tcp_client_socket.h" |
26 #include "net/ssl/channel_id_service.h" | 28 #include "net/ssl/channel_id_service.h" |
27 #include "net/ssl/default_channel_id_store.h" | 29 #include "net/ssl/default_channel_id_store.h" |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
649 base::Time delete_end, | 651 base::Time delete_end, |
650 const base::Closure& completion_callback) | 652 const base::Closure& completion_callback) |
651 OVERRIDE {} | 653 OVERRIDE {} |
652 virtual void DeleteAll(const base::Closure& completion_callback) OVERRIDE {} | 654 virtual void DeleteAll(const base::Closure& completion_callback) OVERRIDE {} |
653 virtual void GetAllChannelIDs(const GetChannelIDListCallback& callback) | 655 virtual void GetAllChannelIDs(const GetChannelIDListCallback& callback) |
654 OVERRIDE {} | 656 OVERRIDE {} |
655 virtual int GetChannelIDCount() OVERRIDE { return 0; } | 657 virtual int GetChannelIDCount() OVERRIDE { return 0; } |
656 virtual void SetForceKeepSessionState() OVERRIDE {} | 658 virtual void SetForceKeepSessionState() OVERRIDE {} |
657 }; | 659 }; |
658 | 660 |
661 // A mock CTVerifier that records every call to Verify but doesn't verify | |
662 // anything. | |
663 class MockCTVerifier : public CTVerifier { | |
664 public: | |
665 // A single call to Verify. | |
666 struct Call { | |
667 scoped_refptr<X509Certificate> cert; | |
668 std::string stapled_ocsp_response; | |
669 std::string sct_list_from_tls_extension; | |
670 }; | |
671 | |
672 MockCTVerifier() {} | |
673 const std::vector<Call>& calls() const { return calls_; } | |
674 | |
675 virtual int Verify(X509Certificate* cert, | |
676 const std::string& stapled_ocsp_response, | |
677 const std::string& sct_list_from_tls_extension, | |
678 ct::CTVerifyResult* result, | |
679 const BoundNetLog& net_log) OVERRIDE { | |
680 // Save the call and otherwise do nothing. | |
681 Call call; | |
682 call.cert = cert; | |
683 call.stapled_ocsp_response = stapled_ocsp_response; | |
684 call.sct_list_from_tls_extension = sct_list_from_tls_extension; | |
685 calls_.push_back(call); | |
686 return ERR_CT_NO_SCTS_VERIFIED_OK; | |
687 } | |
688 | |
689 | |
690 private: | |
691 std::vector<Call> calls_; | |
692 | |
693 DISALLOW_COPY_AND_ASSIGN(MockCTVerifier); | |
694 }; | |
695 | |
659 class SSLClientSocketTest : public PlatformTest { | 696 class SSLClientSocketTest : public PlatformTest { |
660 public: | 697 public: |
661 SSLClientSocketTest() | 698 SSLClientSocketTest() |
662 : socket_factory_(ClientSocketFactory::GetDefaultFactory()), | 699 : socket_factory_(ClientSocketFactory::GetDefaultFactory()), |
663 cert_verifier_(new MockCertVerifier), | 700 cert_verifier_(new MockCertVerifier), |
701 ct_verifier_(new MockCTVerifier), | |
664 transport_security_state_(new TransportSecurityState), | 702 transport_security_state_(new TransportSecurityState), |
665 ran_handshake_completion_callback_(false) { | 703 ran_handshake_completion_callback_(false) { |
666 cert_verifier_->set_default_result(OK); | 704 cert_verifier_->set_default_result(OK); |
667 context_.cert_verifier = cert_verifier_.get(); | 705 context_.cert_verifier = cert_verifier_.get(); |
706 context_.cert_transparency_verifier = ct_verifier_.get(); | |
668 context_.transport_security_state = transport_security_state_.get(); | 707 context_.transport_security_state = transport_security_state_.get(); |
669 } | 708 } |
670 | 709 |
671 void RecordCompletedHandshake() { ran_handshake_completion_callback_ = true; } | 710 void RecordCompletedHandshake() { ran_handshake_completion_callback_ = true; } |
672 | 711 |
673 protected: | 712 protected: |
674 // The address of the spawned test server, after calling StartTestServer(). | 713 // The address of the spawned test server, after calling StartTestServer(). |
675 const AddressList& addr() const { return addr_; } | 714 const AddressList& addr() const { return addr_; } |
676 | 715 |
677 // The SpawnedTestServer object, after calling StartTestServer(). | 716 // The SpawnedTestServer object, after calling StartTestServer(). |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
735 LOG(ERROR) << "SSL Socket prematurely connected"; | 774 LOG(ERROR) << "SSL Socket prematurely connected"; |
736 return false; | 775 return false; |
737 } | 776 } |
738 | 777 |
739 *result = callback_.GetResult(sock_->Connect(callback_.callback())); | 778 *result = callback_.GetResult(sock_->Connect(callback_.callback())); |
740 return true; | 779 return true; |
741 } | 780 } |
742 | 781 |
743 ClientSocketFactory* socket_factory_; | 782 ClientSocketFactory* socket_factory_; |
744 scoped_ptr<MockCertVerifier> cert_verifier_; | 783 scoped_ptr<MockCertVerifier> cert_verifier_; |
784 scoped_ptr<MockCTVerifier> ct_verifier_; | |
745 scoped_ptr<TransportSecurityState> transport_security_state_; | 785 scoped_ptr<TransportSecurityState> transport_security_state_; |
746 SSLClientSocketContext context_; | 786 SSLClientSocketContext context_; |
747 scoped_ptr<SSLClientSocket> sock_; | 787 scoped_ptr<SSLClientSocket> sock_; |
748 CapturingNetLog log_; | 788 CapturingNetLog log_; |
749 bool ran_handshake_completion_callback_; | 789 bool ran_handshake_completion_callback_; |
750 | 790 |
751 private: | 791 private: |
752 scoped_ptr<StreamSocket> transport_; | 792 scoped_ptr<StreamSocket> transport_; |
753 scoped_ptr<SpawnedTestServer> test_server_; | 793 scoped_ptr<SpawnedTestServer> test_server_; |
754 TestCompletionCallback callback_; | 794 TestCompletionCallback callback_; |
(...skipping 1749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2504 CapturingNetLog::CapturedEntryList entries; | 2544 CapturingNetLog::CapturedEntryList entries; |
2505 log.GetEntries(&entries); | 2545 log.GetEntries(&entries); |
2506 EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT)); | 2546 EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT)); |
2507 if (rv == ERR_IO_PENDING) | 2547 if (rv == ERR_IO_PENDING) |
2508 rv = callback.WaitForResult(); | 2548 rv = callback.WaitForResult(); |
2509 EXPECT_EQ(OK, rv); | 2549 EXPECT_EQ(OK, rv); |
2510 EXPECT_TRUE(sock->IsConnected()); | 2550 EXPECT_TRUE(sock->IsConnected()); |
2511 log.GetEntries(&entries); | 2551 log.GetEntries(&entries); |
2512 EXPECT_TRUE(LogContainsSSLConnectEndEvent(entries, -1)); | 2552 EXPECT_TRUE(LogContainsSSLConnectEndEvent(entries, -1)); |
2513 | 2553 |
2514 #if !defined(USE_OPENSSL) | 2554 // Check that the SCT extension was extracted in the expected format. |
2515 EXPECT_TRUE(sock->signed_cert_timestamps_received_); | 2555 EXPECT_TRUE(sock->signed_cert_timestamps_received_); |
2516 #else | 2556 ASSERT_EQ(1u, ct_verifier_->calls().size()); |
2517 // Enabling CT for OpenSSL is currently a noop. | 2557 MockCTVerifier::Call call = ct_verifier_->calls()[0]; |
2518 EXPECT_FALSE(sock->signed_cert_timestamps_received_); | 2558 EXPECT_EQ("", call.stapled_ocsp_response); |
Ryan Sleevi
2014/08/28 21:01:02
EXPECT_TRUE(.empty())
davidben
2014/08/28 21:23:25
Done.
| |
2519 #endif | 2559 EXPECT_EQ("test", call.sct_list_from_tls_extension); |
2520 | 2560 |
2521 sock->Disconnect(); | 2561 sock->Disconnect(); |
2522 EXPECT_FALSE(sock->IsConnected()); | 2562 EXPECT_FALSE(sock->IsConnected()); |
2523 } | 2563 } |
2524 | 2564 |
2525 // Test that enabling Signed Certificate Timestamps enables OCSP stapling. | 2565 // Test that enabling Signed Certificate Timestamps enables OCSP stapling. |
2526 TEST_F(SSLClientSocketTest, ConnectSignedCertTimestampsEnabledOCSP) { | 2566 TEST_F(SSLClientSocketTest, ConnectSignedCertTimestampsEnabledOCSP) { |
2527 SpawnedTestServer::SSLOptions ssl_options; | 2567 SpawnedTestServer::SSLOptions ssl_options; |
2528 ssl_options.staple_ocsp_response = true; | 2568 ssl_options.staple_ocsp_response = true; |
2529 // The test server currently only knows how to generate OCSP responses | 2569 // The test server currently only knows how to generate OCSP responses |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2563 CapturingNetLog::CapturedEntryList entries; | 2603 CapturingNetLog::CapturedEntryList entries; |
2564 log.GetEntries(&entries); | 2604 log.GetEntries(&entries); |
2565 EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT)); | 2605 EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT)); |
2566 if (rv == ERR_IO_PENDING) | 2606 if (rv == ERR_IO_PENDING) |
2567 rv = callback.WaitForResult(); | 2607 rv = callback.WaitForResult(); |
2568 EXPECT_EQ(OK, rv); | 2608 EXPECT_EQ(OK, rv); |
2569 EXPECT_TRUE(sock->IsConnected()); | 2609 EXPECT_TRUE(sock->IsConnected()); |
2570 log.GetEntries(&entries); | 2610 log.GetEntries(&entries); |
2571 EXPECT_TRUE(LogContainsSSLConnectEndEvent(entries, -1)); | 2611 EXPECT_TRUE(LogContainsSSLConnectEndEvent(entries, -1)); |
2572 | 2612 |
2573 #if !defined(USE_OPENSSL) | 2613 // Check that the OCSP response was extracted in the expected format. |
2574 EXPECT_TRUE(sock->stapled_ocsp_response_received_); | 2614 EXPECT_TRUE(sock->stapled_ocsp_response_received_); |
2575 #else | 2615 EXPECT_EQ(1u, ct_verifier_->calls().size()); |
2576 // OCSP stapling isn't currently supported in the OpenSSL socket. | 2616 MockCTVerifier::Call call = ct_verifier_->calls()[0]; |
2577 EXPECT_FALSE(sock->stapled_ocsp_response_received_); | 2617 EXPECT_EQ("", call.sct_list_from_tls_extension); |
Ryan Sleevi
2014/08/28 21:01:02
EXPECT_TRUE(.empty())
davidben
2014/08/28 21:23:25
Done.
| |
2578 #endif | 2618 |
2619 // The stapled OCSPResponse is generated each time. It should be the DER | |
2620 // encoding of an OCSPResponse (RFC 2560), so check that it consists of a | |
2621 // SEQUENCE of an ENUMERATED type and an element tagged with [0] EXPLICIT. | |
2622 base::StringPiece ocsp_response(call.stapled_ocsp_response); | |
2623 base::StringPiece sequence, response_status, response_bytes; | |
2624 EXPECT_TRUE(asn1::GetElement(&ocsp_response, asn1::kSEQUENCE, &sequence)); | |
2625 EXPECT_TRUE(ocsp_response.empty()); | |
2626 EXPECT_TRUE(asn1::GetElement(&sequence, asn1::kENUMERATED, &response_status)); | |
2627 EXPECT_TRUE(asn1::GetElement(&sequence, | |
2628 asn1::kContextSpecific | asn1::kConstructed | 0, | |
2629 &response_status)); | |
2630 EXPECT_TRUE(sequence.empty()); | |
2579 | 2631 |
2580 sock->Disconnect(); | 2632 sock->Disconnect(); |
2581 EXPECT_FALSE(sock->IsConnected()); | 2633 EXPECT_FALSE(sock->IsConnected()); |
2582 } | 2634 } |
2583 | 2635 |
2584 TEST_F(SSLClientSocketTest, ConnectSignedCertTimestampsDisabled) { | 2636 TEST_F(SSLClientSocketTest, ConnectSignedCertTimestampsDisabled) { |
2585 SpawnedTestServer::SSLOptions ssl_options; | 2637 SpawnedTestServer::SSLOptions ssl_options; |
2586 ssl_options.signed_cert_timestamps_tls_ext = "test"; | 2638 ssl_options.signed_cert_timestamps_tls_ext = "test"; |
2587 | 2639 |
2588 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, | 2640 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2990 ssl_config.channel_id_enabled = true; | 3042 ssl_config.channel_id_enabled = true; |
2991 | 3043 |
2992 int rv; | 3044 int rv; |
2993 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); | 3045 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); |
2994 | 3046 |
2995 EXPECT_EQ(ERR_UNEXPECTED, rv); | 3047 EXPECT_EQ(ERR_UNEXPECTED, rv); |
2996 EXPECT_FALSE(sock_->IsConnected()); | 3048 EXPECT_FALSE(sock_->IsConnected()); |
2997 } | 3049 } |
2998 | 3050 |
2999 } // namespace net | 3051 } // namespace net |
OLD | NEW |