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" |
(...skipping 2181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2192 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket( | 2192 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket( |
2193 transport.Pass(), test_server.host_port_pair(), SSLConfig())); | 2193 transport.Pass(), test_server.host_port_pair(), SSLConfig())); |
2194 | 2194 |
2195 rv = sock->Connect(callback.callback()); | 2195 rv = sock->Connect(callback.callback()); |
2196 if (rv == ERR_IO_PENDING) | 2196 if (rv == ERR_IO_PENDING) |
2197 rv = callback.WaitForResult(); | 2197 rv = callback.WaitForResult(); |
2198 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, rv); | 2198 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, rv); |
2199 } | 2199 } |
2200 | 2200 |
2201 TEST_F(SSLClientSocketTest, CipherSuiteDisables) { | 2201 TEST_F(SSLClientSocketTest, CipherSuiteDisables) { |
2202 // Rather than exhaustively disabling every RC4 ciphersuite defined at | 2202 // Rather than exhaustively disabling every AES_128_CBC ciphersuite defined at |
2203 // http://www.iana.org/assignments/tls-parameters/tls-parameters.xml, | 2203 // http://www.iana.org/assignments/tls-parameters/tls-parameters.xml, only |
2204 // only disabling those cipher suites that the test server actually | 2204 // disabling those cipher suites that the test server actually implements. |
2205 // implements. | 2205 const uint16 kCiphersToDisable[] = { |
2206 const uint16 kCiphersToDisable[] = {0x0005, // TLS_RSA_WITH_RC4_128_SHA | 2206 0x002f, // TLS_RSA_WITH_AES_128_CBC_SHA |
2207 0x0033, // TLS_DHE_RSA_WITH_AES_128_CBC_SHA | |
2207 }; | 2208 }; |
2208 | 2209 |
2209 SpawnedTestServer::SSLOptions ssl_options; | 2210 SpawnedTestServer::SSLOptions ssl_options; |
2210 // Enable only RC4 on the test server. | 2211 // Enable only RC4 on the test server. |
2211 ssl_options.bulk_ciphers = SpawnedTestServer::SSLOptions::BULK_CIPHER_RC4; | 2212 ssl_options.bulk_ciphers = SpawnedTestServer::SSLOptions::BULK_CIPHER_AES128; |
2212 SpawnedTestServer test_server( | 2213 SpawnedTestServer test_server( |
2213 SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath()); | 2214 SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath()); |
2214 ASSERT_TRUE(test_server.Start()); | 2215 ASSERT_TRUE(test_server.Start()); |
2215 | 2216 |
2216 AddressList addr; | 2217 AddressList addr; |
2217 ASSERT_TRUE(test_server.GetAddressList(&addr)); | 2218 ASSERT_TRUE(test_server.GetAddressList(&addr)); |
2218 | 2219 |
2219 TestCompletionCallback callback; | 2220 TestCompletionCallback callback; |
2220 CapturingNetLog log; | 2221 CapturingNetLog log; |
2221 scoped_ptr<StreamSocket> transport( | 2222 scoped_ptr<StreamSocket> transport( |
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2868 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback()))); | 2869 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback()))); |
2869 sock = CreateSSLClientSocket( | 2870 sock = CreateSSLClientSocket( |
2870 transport.Pass(), test_server()->host_port_pair(), fallback_ssl_config); | 2871 transport.Pass(), test_server()->host_port_pair(), fallback_ssl_config); |
2871 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback()))); | 2872 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback()))); |
2872 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info)); | 2873 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info)); |
2873 EXPECT_EQ(SSLInfo::HANDSHAKE_RESUME, ssl_info.handshake_type); | 2874 EXPECT_EQ(SSLInfo::HANDSHAKE_RESUME, ssl_info.handshake_type); |
2874 EXPECT_EQ(SSL_CONNECTION_VERSION_TLS1, | 2875 EXPECT_EQ(SSL_CONNECTION_VERSION_TLS1, |
2875 SSLConnectionStatusToVersion(ssl_info.connection_status)); | 2876 SSLConnectionStatusToVersion(ssl_info.connection_status)); |
2876 } | 2877 } |
2877 | 2878 |
2879 // Test that RC4 is only enabled if enable_deprecated_cipher_suites is set. | |
2880 TEST_F(SSLClientSocketTest, DeprecatedRC4) { | |
2881 SpawnedTestServer::SSLOptions ssl_options; | |
2882 ssl_options.bulk_ciphers = SpawnedTestServer::SSLOptions::BULK_CIPHER_RC4; | |
2883 ASSERT_TRUE(StartTestServer(ssl_options)); | |
2884 | |
2885 // Normal handshakes with RC4 do not work. | |
2886 SSLConfig ssl_config; | |
2887 TestCompletionCallback callback; | |
2888 scoped_ptr<StreamSocket> transport( | |
2889 new TCPClientSocket(addr(), &log_, NetLog::Source())); | |
2890 ASSERT_EQ(OK, callback.GetResult(transport->Connect(callback.callback()))); | |
2891 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket( | |
2892 transport.Pass(), test_server()->host_port_pair(), ssl_config)); | |
2893 ASSERT_EQ(ERR_SSL_VERSION_OR_CIPHER_MISMATCH, | |
2894 callback.GetResult(sock->Connect(callback.callback()))); | |
2895 | |
2896 // Enabling deprecated ciphers works fine. | |
2897 ssl_config.enable_deprecated_cipher_suites = true; | |
2898 transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source())); | |
2899 ASSERT_EQ(OK, callback.GetResult(transport->Connect(callback.callback()))); | |
2900 sock = CreateSSLClientSocket(transport.Pass(), | |
2901 test_server()->host_port_pair(), ssl_config); | |
2902 ASSERT_EQ(OK, callback.GetResult(sock->Connect(callback.callback()))); | |
2903 } | |
2904 | |
2905 // Tests that enabling deprecated ciphers shards the session cache. | |
2906 TEST_F(SSLClientSocketTest, DeprecatedShardSessionCache) { | |
2907 SpawnedTestServer::SSLOptions ssl_options; | |
2908 ASSERT_TRUE(StartTestServer(ssl_options)); | |
2909 | |
2910 // Prepare a normal and deprecated SSL config. | |
2911 SSLConfig ssl_config; | |
2912 SSLConfig deprecated_ssl_config; | |
2913 deprecated_ssl_config.enable_deprecated_cipher_suites = true; | |
2914 | |
2915 // Connect with deprecated ciphers enabled to warm the session cache cache. | |
2916 TestCompletionCallback callback; | |
2917 scoped_ptr<StreamSocket> transport( | |
2918 new TCPClientSocket(addr(), &log_, NetLog::Source())); | |
2919 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback()))); | |
2920 scoped_ptr<SSLClientSocket> sock( | |
2921 CreateSSLClientSocket(transport.Pass(), test_server()->host_port_pair(), | |
2922 deprecated_ssl_config)); | |
2923 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback()))); | |
2924 SSLInfo ssl_info; | |
2925 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info)); | |
2926 EXPECT_EQ(SSLInfo::HANDSHAKE_FULL, ssl_info.handshake_type); | |
2927 | |
2928 // Test that re-connecting with deprecated ciphers enabled still resumes. | |
2929 transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source())); | |
2930 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback()))); | |
2931 sock = CreateSSLClientSocket( | |
2932 transport.Pass(), test_server()->host_port_pair(), deprecated_ssl_config); | |
2933 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback()))); | |
2934 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info)); | |
2935 EXPECT_EQ(SSLInfo::HANDSHAKE_RESUME, ssl_info.handshake_type); | |
2936 | |
2937 // However, a normal connection needs a full handshake. | |
Ryan Sleevi
2015/04/02 06:32:06
But does a normal connection prime a deprecated ca
davidben
2015/04/03 19:58:26
Done. (Though I can't imagine an implementation th
| |
2938 transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source())); | |
2939 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback()))); | |
2940 sock = CreateSSLClientSocket(transport.Pass(), | |
2941 test_server()->host_port_pair(), ssl_config); | |
2942 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback()))); | |
2943 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info)); | |
2944 EXPECT_EQ(SSLInfo::HANDSHAKE_FULL, ssl_info.handshake_type); | |
2945 } | |
2946 | |
2878 TEST_F(SSLClientSocketFalseStartTest, FalseStartEnabled) { | 2947 TEST_F(SSLClientSocketFalseStartTest, FalseStartEnabled) { |
2879 if (!SupportsAESGCM()) { | 2948 if (!SupportsAESGCM()) { |
2880 LOG(WARNING) << "Skipping test because AES-GCM is not supported."; | 2949 LOG(WARNING) << "Skipping test because AES-GCM is not supported."; |
2881 return; | 2950 return; |
2882 } | 2951 } |
2883 | 2952 |
2884 // False Start requires NPN/ALPN, perfect forward secrecy, and an AEAD. | 2953 // False Start requires NPN/ALPN, perfect forward secrecy, and an AEAD. |
2885 SpawnedTestServer::SSLOptions server_options; | 2954 SpawnedTestServer::SSLOptions server_options; |
2886 server_options.key_exchanges = | 2955 server_options.key_exchanges = |
2887 SpawnedTestServer::SSLOptions::KEY_EXCHANGE_DHE_RSA; | 2956 SpawnedTestServer::SSLOptions::KEY_EXCHANGE_DHE_RSA; |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3099 ssl_config.channel_id_enabled = true; | 3168 ssl_config.channel_id_enabled = true; |
3100 | 3169 |
3101 int rv; | 3170 int rv; |
3102 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); | 3171 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); |
3103 | 3172 |
3104 EXPECT_EQ(ERR_UNEXPECTED, rv); | 3173 EXPECT_EQ(ERR_UNEXPECTED, rv); |
3105 EXPECT_FALSE(sock_->IsConnected()); | 3174 EXPECT_FALSE(sock_->IsConnected()); |
3106 } | 3175 } |
3107 | 3176 |
3108 } // namespace net | 3177 } // namespace net |
OLD | NEW |