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

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

Issue 1052743003: Move RC4 behind a fallback. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: agl comment Created 5 years, 8 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_openssl.cc ('k') | net/ssl/ssl_config.h » ('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 "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
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.
2206 const uint16 kCiphersToDisable[] = { 2205 const uint16 kCiphersToDisable[] = {
2207 0x0005, // TLS_RSA_WITH_RC4_128_SHA 2206 0x002f, // TLS_RSA_WITH_AES_128_CBC_SHA
2208 0xc011, // TLS_ECDHE_RSA_WITH_RC4_128_SHA 2207 0x0033, // TLS_DHE_RSA_WITH_AES_128_CBC_SHA
2208 0xc013, // TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
2209 }; 2209 };
2210 2210
2211 SpawnedTestServer::SSLOptions ssl_options; 2211 SpawnedTestServer::SSLOptions ssl_options;
2212 // Enable only RC4 on the test server. 2212 // Enable only AES_128_CBC on the test server.
2213 ssl_options.bulk_ciphers = SpawnedTestServer::SSLOptions::BULK_CIPHER_RC4; 2213 ssl_options.bulk_ciphers = SpawnedTestServer::SSLOptions::BULK_CIPHER_AES128;
2214 SpawnedTestServer test_server( 2214 SpawnedTestServer test_server(
2215 SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath()); 2215 SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath());
2216 ASSERT_TRUE(test_server.Start()); 2216 ASSERT_TRUE(test_server.Start());
2217 2217
2218 AddressList addr; 2218 AddressList addr;
2219 ASSERT_TRUE(test_server.GetAddressList(&addr)); 2219 ASSERT_TRUE(test_server.GetAddressList(&addr));
2220 2220
2221 TestCompletionCallback callback; 2221 TestCompletionCallback callback;
2222 CapturingNetLog log; 2222 CapturingNetLog log;
2223 scoped_ptr<StreamSocket> transport( 2223 scoped_ptr<StreamSocket> transport(
(...skipping 10 matching lines...) Expand all
2234 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket( 2234 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
2235 transport.Pass(), test_server.host_port_pair(), ssl_config)); 2235 transport.Pass(), test_server.host_port_pair(), ssl_config));
2236 2236
2237 EXPECT_FALSE(sock->IsConnected()); 2237 EXPECT_FALSE(sock->IsConnected());
2238 2238
2239 rv = sock->Connect(callback.callback()); 2239 rv = sock->Connect(callback.callback());
2240 CapturingNetLog::CapturedEntryList entries; 2240 CapturingNetLog::CapturedEntryList entries;
2241 log.GetEntries(&entries); 2241 log.GetEntries(&entries);
2242 EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT)); 2242 EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT));
2243 2243
2244 // NSS has special handling that maps a handshake_failure alert received
2245 // immediately after a client_hello to be a mismatched cipher suite error,
2246 // leading to ERR_SSL_VERSION_OR_CIPHER_MISMATCH. When using OpenSSL or
2247 // Secure Transport (OS X), the handshake_failure is bubbled up without any
2248 // interpretation, leading to ERR_SSL_PROTOCOL_ERROR. Either way, a failure
2249 // indicates that no cipher suite was negotiated with the test server.
2250 if (rv == ERR_IO_PENDING) 2244 if (rv == ERR_IO_PENDING)
2251 rv = callback.WaitForResult(); 2245 rv = callback.WaitForResult();
2252 EXPECT_TRUE(rv == ERR_SSL_VERSION_OR_CIPHER_MISMATCH || 2246 EXPECT_EQ(ERR_SSL_VERSION_OR_CIPHER_MISMATCH, rv);
2253 rv == ERR_SSL_PROTOCOL_ERROR); 2247 // The exact ordering depends no whether an extra read is issued. Just check
2254 // The exact ordering differs between SSLClientSocketNSS (which issues an 2248 // the error is somewhere in the log.
2255 // extra read) and SSLClientSocketMac (which does not). Just make sure the
2256 // error appears somewhere in the log.
2257 log.GetEntries(&entries); 2249 log.GetEntries(&entries);
2258 ExpectLogContainsSomewhere( 2250 ExpectLogContainsSomewhere(
2259 entries, 0, NetLog::TYPE_SSL_HANDSHAKE_ERROR, NetLog::PHASE_NONE); 2251 entries, 0, NetLog::TYPE_SSL_HANDSHAKE_ERROR, NetLog::PHASE_NONE);
2260 2252
2261 // We cannot test sock->IsConnected(), as the NSS implementation disconnects 2253 // We cannot test sock->IsConnected(), as the NSS implementation disconnects
2262 // the socket when it encounters an error, whereas other implementations 2254 // the socket when it encounters an error, whereas other implementations
2263 // leave it connected. 2255 // leave it connected.
2264 // Because this an error that the test server is mutually aware of, as opposed 2256 // Because this an error that the test server is mutually aware of, as opposed
2265 // to being an error such as a certificate name mismatch, which is 2257 // to being an error such as a certificate name mismatch, which is
2266 // client-only, the exact index of the SSL connect end depends on how 2258 // client-only, the exact index of the SSL connect end depends on how
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after
2870 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback()))); 2862 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
2871 sock = CreateSSLClientSocket( 2863 sock = CreateSSLClientSocket(
2872 transport.Pass(), test_server()->host_port_pair(), fallback_ssl_config); 2864 transport.Pass(), test_server()->host_port_pair(), fallback_ssl_config);
2873 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback()))); 2865 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
2874 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info)); 2866 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
2875 EXPECT_EQ(SSLInfo::HANDSHAKE_RESUME, ssl_info.handshake_type); 2867 EXPECT_EQ(SSLInfo::HANDSHAKE_RESUME, ssl_info.handshake_type);
2876 EXPECT_EQ(SSL_CONNECTION_VERSION_TLS1, 2868 EXPECT_EQ(SSL_CONNECTION_VERSION_TLS1,
2877 SSLConnectionStatusToVersion(ssl_info.connection_status)); 2869 SSLConnectionStatusToVersion(ssl_info.connection_status));
2878 } 2870 }
2879 2871
2872 // Test that RC4 is only enabled if enable_deprecated_cipher_suites is set.
2873 TEST_F(SSLClientSocketTest, DeprecatedRC4) {
2874 SpawnedTestServer::SSLOptions ssl_options;
2875 ssl_options.bulk_ciphers = SpawnedTestServer::SSLOptions::BULK_CIPHER_RC4;
2876 ASSERT_TRUE(StartTestServer(ssl_options));
2877
2878 // Normal handshakes with RC4 do not work.
2879 SSLConfig ssl_config;
2880 TestCompletionCallback callback;
2881 scoped_ptr<StreamSocket> transport(
2882 new TCPClientSocket(addr(), &log_, NetLog::Source()));
2883 ASSERT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
2884 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
2885 transport.Pass(), test_server()->host_port_pair(), ssl_config));
2886 ASSERT_EQ(ERR_SSL_VERSION_OR_CIPHER_MISMATCH,
2887 callback.GetResult(sock->Connect(callback.callback())));
2888
2889 // Enabling deprecated ciphers works fine.
2890 ssl_config.enable_deprecated_cipher_suites = true;
2891 transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
2892 ASSERT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
2893 sock = CreateSSLClientSocket(transport.Pass(),
2894 test_server()->host_port_pair(), ssl_config);
2895 ASSERT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
2896 }
2897
2898 // Tests that enabling deprecated ciphers shards the session cache.
2899 TEST_F(SSLClientSocketTest, DeprecatedShardSessionCache) {
2900 SpawnedTestServer::SSLOptions ssl_options;
2901 ASSERT_TRUE(StartTestServer(ssl_options));
2902
2903 // Prepare a normal and deprecated SSL config.
2904 SSLConfig ssl_config;
2905 SSLConfig deprecated_ssl_config;
2906 deprecated_ssl_config.enable_deprecated_cipher_suites = true;
2907
2908 // Connect with deprecated ciphers enabled to warm the session cache cache.
2909 TestCompletionCallback callback;
2910 scoped_ptr<StreamSocket> transport(
2911 new TCPClientSocket(addr(), &log_, NetLog::Source()));
2912 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
2913 scoped_ptr<SSLClientSocket> sock(
2914 CreateSSLClientSocket(transport.Pass(), test_server()->host_port_pair(),
2915 deprecated_ssl_config));
2916 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
2917 SSLInfo ssl_info;
2918 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
2919 EXPECT_EQ(SSLInfo::HANDSHAKE_FULL, ssl_info.handshake_type);
2920
2921 // Test that re-connecting with deprecated ciphers enabled still resumes.
2922 transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
2923 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
2924 sock = CreateSSLClientSocket(
2925 transport.Pass(), test_server()->host_port_pair(), deprecated_ssl_config);
2926 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
2927 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
2928 EXPECT_EQ(SSLInfo::HANDSHAKE_RESUME, ssl_info.handshake_type);
2929
2930 // However, a normal connection needs a full handshake.
2931 transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
2932 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
2933 sock = CreateSSLClientSocket(transport.Pass(),
2934 test_server()->host_port_pair(), ssl_config);
2935 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
2936 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
2937 EXPECT_EQ(SSLInfo::HANDSHAKE_FULL, ssl_info.handshake_type);
2938
2939 // Clear the session cache for the inverse test.
2940 SSLClientSocket::ClearSessionCache();
2941
2942 // Now make a normal connection to prime the session cache.
2943 transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
2944 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
2945 sock = CreateSSLClientSocket(transport.Pass(),
2946 test_server()->host_port_pair(), ssl_config);
2947 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
2948 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
2949 EXPECT_EQ(SSLInfo::HANDSHAKE_FULL, ssl_info.handshake_type);
2950
2951 // A normal connection should be able to resume.
2952 transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
2953 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
2954 sock = CreateSSLClientSocket(transport.Pass(),
2955 test_server()->host_port_pair(), ssl_config);
2956 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
2957 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
2958 EXPECT_EQ(SSLInfo::HANDSHAKE_RESUME, ssl_info.handshake_type);
2959
2960 // However, enabling deprecated ciphers connects fresh.
2961 transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
2962 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
2963 sock = CreateSSLClientSocket(
2964 transport.Pass(), test_server()->host_port_pair(), deprecated_ssl_config);
2965 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
2966 EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
2967 EXPECT_EQ(SSLInfo::HANDSHAKE_FULL, ssl_info.handshake_type);
2968 }
2969
2880 TEST_F(SSLClientSocketFalseStartTest, FalseStartEnabled) { 2970 TEST_F(SSLClientSocketFalseStartTest, FalseStartEnabled) {
2881 if (!SupportsAESGCM()) { 2971 if (!SupportsAESGCM()) {
2882 LOG(WARNING) << "Skipping test because AES-GCM is not supported."; 2972 LOG(WARNING) << "Skipping test because AES-GCM is not supported.";
2883 return; 2973 return;
2884 } 2974 }
2885 2975
2886 // False Start requires NPN/ALPN, ECDHE, and an AEAD. 2976 // False Start requires NPN/ALPN, ECDHE, and an AEAD.
2887 SpawnedTestServer::SSLOptions server_options; 2977 SpawnedTestServer::SSLOptions server_options;
2888 server_options.key_exchanges = 2978 server_options.key_exchanges =
2889 SpawnedTestServer::SSLOptions::KEY_EXCHANGE_ECDHE_RSA; 2979 SpawnedTestServer::SSLOptions::KEY_EXCHANGE_ECDHE_RSA;
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
3119 ssl_config.channel_id_enabled = true; 3209 ssl_config.channel_id_enabled = true;
3120 3210
3121 int rv; 3211 int rv;
3122 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); 3212 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv));
3123 3213
3124 EXPECT_EQ(ERR_UNEXPECTED, rv); 3214 EXPECT_EQ(ERR_UNEXPECTED, rv);
3125 EXPECT_FALSE(sock_->IsConnected()); 3215 EXPECT_FALSE(sock_->IsConnected());
3126 } 3216 }
3127 3217
3128 } // namespace net 3218 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_openssl.cc ('k') | net/ssl/ssl_config.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698