| 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 <memory> | 5 #include <memory> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/deferred_sequenced_task_runner.h" | 9 #include "base/deferred_sequenced_task_runner.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include "testing/gmock/include/gmock/gmock.h" | 30 #include "testing/gmock/include/gmock/gmock.h" |
| 31 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
| 32 | 32 |
| 33 using net::test::IsError; | 33 using net::test::IsError; |
| 34 using net::test::IsOk; | 34 using net::test::IsOk; |
| 35 | 35 |
| 36 namespace net { | 36 namespace net { |
| 37 | 37 |
| 38 namespace { | 38 namespace { |
| 39 | 39 |
| 40 class TLS10SSLConfigService : public SSLConfigService { | |
| 41 public: | |
| 42 TLS10SSLConfigService() { | |
| 43 ssl_config_.version_min = SSL_PROTOCOL_VERSION_TLS1; | |
| 44 ssl_config_.version_max = SSL_PROTOCOL_VERSION_TLS1; | |
| 45 } | |
| 46 | |
| 47 void GetSSLConfig(SSLConfig* config) override { *config = ssl_config_; } | |
| 48 | |
| 49 private: | |
| 50 ~TLS10SSLConfigService() override {} | |
| 51 | |
| 52 SSLConfig ssl_config_; | |
| 53 }; | |
| 54 | |
| 55 class TLS12SSLConfigService : public SSLConfigService { | |
| 56 public: | |
| 57 TLS12SSLConfigService() { | |
| 58 ssl_config_.version_min = SSL_PROTOCOL_VERSION_TLS1; | |
| 59 ssl_config_.version_max = SSL_PROTOCOL_VERSION_TLS1_2; | |
| 60 } | |
| 61 | |
| 62 void GetSSLConfig(SSLConfig* config) override { *config = ssl_config_; } | |
| 63 | |
| 64 private: | |
| 65 ~TLS12SSLConfigService() override {} | |
| 66 | |
| 67 SSLConfig ssl_config_; | |
| 68 }; | |
| 69 | |
| 70 class TokenBindingSSLConfigService : public SSLConfigService { | 40 class TokenBindingSSLConfigService : public SSLConfigService { |
| 71 public: | 41 public: |
| 72 TokenBindingSSLConfigService() { | 42 TokenBindingSSLConfigService() { |
| 73 ssl_config_.token_binding_params.push_back(TB_PARAM_ECDSAP256); | 43 ssl_config_.token_binding_params.push_back(TB_PARAM_ECDSAP256); |
| 74 } | 44 } |
| 75 | 45 |
| 76 void GetSSLConfig(SSLConfig* config) override { *config = ssl_config_; } | 46 void GetSSLConfig(SSLConfig* config) override { *config = ssl_config_; } |
| 77 | 47 |
| 78 private: | 48 private: |
| 79 ~TokenBindingSSLConfigService() override {} | 49 ~TokenBindingSSLConfigService() override {} |
| 80 | 50 |
| 81 SSLConfig ssl_config_; | 51 SSLConfig ssl_config_; |
| 82 }; | 52 }; |
| 83 | 53 |
| 84 } // namespace | 54 } // namespace |
| 85 | 55 |
| 86 class HttpNetworkTransactionSSLTest : public testing::Test { | 56 class HttpNetworkTransactionSSLTest : public testing::Test { |
| 87 protected: | 57 protected: |
| 88 void SetUp() override { | 58 void SetUp() override { |
| 89 ssl_config_service_ = new TLS10SSLConfigService; | 59 ssl_config_service_ = new TokenBindingSSLConfigService; |
| 90 session_params_.ssl_config_service = ssl_config_service_.get(); | 60 session_params_.ssl_config_service = ssl_config_service_.get(); |
| 91 | 61 |
| 92 auth_handler_factory_.reset(new HttpAuthHandlerMock::Factory()); | 62 auth_handler_factory_.reset(new HttpAuthHandlerMock::Factory()); |
| 93 session_params_.http_auth_handler_factory = auth_handler_factory_.get(); | 63 session_params_.http_auth_handler_factory = auth_handler_factory_.get(); |
| 94 | 64 |
| 95 proxy_service_ = ProxyService::CreateDirect(); | 65 proxy_service_ = ProxyService::CreateDirect(); |
| 96 session_params_.proxy_service = proxy_service_.get(); | 66 session_params_.proxy_service = proxy_service_.get(); |
| 97 | 67 |
| 98 session_params_.client_socket_factory = &mock_socket_factory_; | 68 session_params_.client_socket_factory = &mock_socket_factory_; |
| 99 session_params_.host_resolver = &mock_resolver_; | 69 session_params_.host_resolver = &mock_resolver_; |
| 100 session_params_.http_server_properties = &http_server_properties_; | 70 session_params_.http_server_properties = &http_server_properties_; |
| 101 session_params_.cert_verifier = &cert_verifier_; | 71 session_params_.cert_verifier = &cert_verifier_; |
| 102 session_params_.transport_security_state = &transport_security_state_; | 72 session_params_.transport_security_state = &transport_security_state_; |
| 103 session_params_.cert_transparency_verifier = &ct_verifier_; | 73 session_params_.cert_transparency_verifier = &ct_verifier_; |
| 104 session_params_.ct_policy_enforcer = &ct_policy_enforcer_; | 74 session_params_.ct_policy_enforcer = &ct_policy_enforcer_; |
| 105 } | 75 } |
| 106 | 76 |
| 107 HttpRequestInfo* GetRequestInfo(const std::string& url) { | 77 HttpRequestInfo* GetRequestInfo(const std::string& url) { |
| 108 HttpRequestInfo* request_info = new HttpRequestInfo; | 78 HttpRequestInfo* request_info = new HttpRequestInfo; |
| 109 request_info->url = GURL(url); | 79 request_info->url = GURL(url); |
| 110 request_info->method = "GET"; | 80 request_info->method = "GET"; |
| 111 request_info_vector_.push_back(base::WrapUnique(request_info)); | 81 request_info_vector_.push_back(base::WrapUnique(request_info)); |
| 112 return request_info; | 82 return request_info; |
| 113 } | 83 } |
| 114 | 84 |
| 115 SSLConfig& GetServerSSLConfig(HttpNetworkTransaction* trans) { | |
| 116 return trans->server_ssl_config_; | |
| 117 } | |
| 118 | |
| 119 scoped_refptr<SSLConfigService> ssl_config_service_; | 85 scoped_refptr<SSLConfigService> ssl_config_service_; |
| 120 std::unique_ptr<HttpAuthHandlerMock::Factory> auth_handler_factory_; | 86 std::unique_ptr<HttpAuthHandlerMock::Factory> auth_handler_factory_; |
| 121 std::unique_ptr<ProxyService> proxy_service_; | 87 std::unique_ptr<ProxyService> proxy_service_; |
| 122 | 88 |
| 123 MockClientSocketFactory mock_socket_factory_; | 89 MockClientSocketFactory mock_socket_factory_; |
| 124 MockHostResolver mock_resolver_; | 90 MockHostResolver mock_resolver_; |
| 125 HttpServerPropertiesImpl http_server_properties_; | 91 HttpServerPropertiesImpl http_server_properties_; |
| 126 MockCertVerifier cert_verifier_; | 92 MockCertVerifier cert_verifier_; |
| 127 TransportSecurityState transport_security_state_; | 93 TransportSecurityState transport_security_state_; |
| 128 MultiLogCTVerifier ct_verifier_; | 94 MultiLogCTVerifier ct_verifier_; |
| 129 CTPolicyEnforcer ct_policy_enforcer_; | 95 CTPolicyEnforcer ct_policy_enforcer_; |
| 130 HttpNetworkSession::Params session_params_; | 96 HttpNetworkSession::Params session_params_; |
| 131 std::vector<std::unique_ptr<HttpRequestInfo>> request_info_vector_; | 97 std::vector<std::unique_ptr<HttpRequestInfo>> request_info_vector_; |
| 132 }; | 98 }; |
| 133 | 99 |
| 134 #if !defined(OS_IOS) | 100 #if !defined(OS_IOS) |
| 135 TEST_F(HttpNetworkTransactionSSLTest, TokenBinding) { | 101 TEST_F(HttpNetworkTransactionSSLTest, TokenBinding) { |
| 136 ssl_config_service_ = new TokenBindingSSLConfigService; | |
| 137 session_params_.ssl_config_service = ssl_config_service_.get(); | |
| 138 ChannelIDService channel_id_service(new DefaultChannelIDStore(NULL), | 102 ChannelIDService channel_id_service(new DefaultChannelIDStore(NULL), |
| 139 base::ThreadTaskRunnerHandle::Get()); | 103 base::ThreadTaskRunnerHandle::Get()); |
| 140 session_params_.channel_id_service = &channel_id_service; | 104 session_params_.channel_id_service = &channel_id_service; |
| 141 | 105 |
| 142 SSLSocketDataProvider ssl_data(ASYNC, OK); | 106 SSLSocketDataProvider ssl_data(ASYNC, OK); |
| 143 ssl_data.token_binding_negotiated = true; | 107 ssl_data.token_binding_negotiated = true; |
| 144 ssl_data.token_binding_key_param = TB_PARAM_ECDSAP256; | 108 ssl_data.token_binding_key_param = TB_PARAM_ECDSAP256; |
| 145 mock_socket_factory_.AddSSLSocketDataProvider(&ssl_data); | 109 mock_socket_factory_.AddSSLSocketDataProvider(&ssl_data); |
| 146 MockRead mock_reads[] = {MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 110 MockRead mock_reads[] = {MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 147 MockRead(SYNCHRONOUS, OK)}; | 111 MockRead(SYNCHRONOUS, OK)}; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 178 HttpRequestHeaders headers2; | 142 HttpRequestHeaders headers2; |
| 179 ASSERT_TRUE(trans2.GetFullRequestHeaders(&headers2)); | 143 ASSERT_TRUE(trans2.GetFullRequestHeaders(&headers2)); |
| 180 std::string token_binding_header2; | 144 std::string token_binding_header2; |
| 181 EXPECT_TRUE(headers2.GetHeader(HttpRequestHeaders::kTokenBinding, | 145 EXPECT_TRUE(headers2.GetHeader(HttpRequestHeaders::kTokenBinding, |
| 182 &token_binding_header2)); | 146 &token_binding_header2)); |
| 183 | 147 |
| 184 EXPECT_EQ(token_binding_header1, token_binding_header2); | 148 EXPECT_EQ(token_binding_header1, token_binding_header2); |
| 185 } | 149 } |
| 186 | 150 |
| 187 TEST_F(HttpNetworkTransactionSSLTest, NoTokenBindingOverHttp) { | 151 TEST_F(HttpNetworkTransactionSSLTest, NoTokenBindingOverHttp) { |
| 188 ssl_config_service_ = new TokenBindingSSLConfigService; | |
| 189 session_params_.ssl_config_service = ssl_config_service_.get(); | |
| 190 ChannelIDService channel_id_service(new DefaultChannelIDStore(NULL), | 152 ChannelIDService channel_id_service(new DefaultChannelIDStore(NULL), |
| 191 base::ThreadTaskRunnerHandle::Get()); | 153 base::ThreadTaskRunnerHandle::Get()); |
| 192 session_params_.channel_id_service = &channel_id_service; | 154 session_params_.channel_id_service = &channel_id_service; |
| 193 | 155 |
| 194 SSLSocketDataProvider ssl_data(ASYNC, OK); | 156 SSLSocketDataProvider ssl_data(ASYNC, OK); |
| 195 ssl_data.token_binding_negotiated = true; | 157 ssl_data.token_binding_negotiated = true; |
| 196 ssl_data.token_binding_key_param = TB_PARAM_ECDSAP256; | 158 ssl_data.token_binding_key_param = TB_PARAM_ECDSAP256; |
| 197 mock_socket_factory_.AddSSLSocketDataProvider(&ssl_data); | 159 mock_socket_factory_.AddSSLSocketDataProvider(&ssl_data); |
| 198 MockRead mock_reads[] = {MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 160 MockRead mock_reads[] = {MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 199 MockRead(SYNCHRONOUS, OK)}; | 161 MockRead(SYNCHRONOUS, OK)}; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 211 | 173 |
| 212 HttpRequestHeaders headers; | 174 HttpRequestHeaders headers; |
| 213 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); | 175 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); |
| 214 std::string token_binding_header; | 176 std::string token_binding_header; |
| 215 EXPECT_FALSE(headers.GetHeader(HttpRequestHeaders::kTokenBinding, | 177 EXPECT_FALSE(headers.GetHeader(HttpRequestHeaders::kTokenBinding, |
| 216 &token_binding_header)); | 178 &token_binding_header)); |
| 217 } | 179 } |
| 218 | 180 |
| 219 // Regression test for https://crbug.com/667683. | 181 // Regression test for https://crbug.com/667683. |
| 220 TEST_F(HttpNetworkTransactionSSLTest, TokenBindingAsync) { | 182 TEST_F(HttpNetworkTransactionSSLTest, TokenBindingAsync) { |
| 221 ssl_config_service_ = new TokenBindingSSLConfigService; | |
| 222 session_params_.ssl_config_service = ssl_config_service_.get(); | |
| 223 | |
| 224 // Create a separate thread for ChannelIDService | 183 // Create a separate thread for ChannelIDService |
| 225 // so that asynchronous Channel ID creation can be delayed. | 184 // so that asynchronous Channel ID creation can be delayed. |
| 226 base::Thread channel_id_thread("ThreadForChannelIDService"); | 185 base::Thread channel_id_thread("ThreadForChannelIDService"); |
| 227 channel_id_thread.Start(); | 186 channel_id_thread.Start(); |
| 228 scoped_refptr<base::DeferredSequencedTaskRunner> channel_id_runner = | 187 scoped_refptr<base::DeferredSequencedTaskRunner> channel_id_runner = |
| 229 new base::DeferredSequencedTaskRunner(channel_id_thread.task_runner()); | 188 new base::DeferredSequencedTaskRunner(channel_id_thread.task_runner()); |
| 230 ChannelIDService channel_id_service(new DefaultChannelIDStore(nullptr), | 189 ChannelIDService channel_id_service(new DefaultChannelIDStore(nullptr), |
| 231 channel_id_runner); | 190 channel_id_runner); |
| 232 session_params_.channel_id_service = &channel_id_service; | 191 session_params_.channel_id_service = &channel_id_service; |
| 233 | 192 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 258 // When ChannelIdService calls back to HttpNetworkSession, | 217 // When ChannelIdService calls back to HttpNetworkSession, |
| 259 // SpdyHttpStream should not crash. | 218 // SpdyHttpStream should not crash. |
| 260 channel_id_runner->Start(); | 219 channel_id_runner->Start(); |
| 261 | 220 |
| 262 rv = callback.WaitForResult(); | 221 rv = callback.WaitForResult(); |
| 263 EXPECT_THAT(rv, IsError(ERR_CONNECTION_CLOSED)); | 222 EXPECT_THAT(rv, IsError(ERR_CONNECTION_CLOSED)); |
| 264 } | 223 } |
| 265 #endif // !defined(OS_IOS) | 224 #endif // !defined(OS_IOS) |
| 266 | 225 |
| 267 } // namespace net | 226 } // namespace net |
| OLD | NEW |