| Index: net/socket/ssl_client_socket_unittest.cc
|
| diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
|
| index 38519c55572eb165fe48aad01a8d581522f68130..8dcf5b8a8eddfcac10e957ace8b61d9732c52331 100644
|
| --- a/net/socket/ssl_client_socket_unittest.cc
|
| +++ b/net/socket/ssl_client_socket_unittest.cc
|
| @@ -2199,18 +2199,18 @@ TEST_F(SSLClientSocketTest, PrematureApplicationData) {
|
| }
|
|
|
| TEST_F(SSLClientSocketTest, CipherSuiteDisables) {
|
| - // Rather than exhaustively disabling every RC4 ciphersuite defined at
|
| - // http://www.iana.org/assignments/tls-parameters/tls-parameters.xml,
|
| - // only disabling those cipher suites that the test server actually
|
| - // implements.
|
| + // Rather than exhaustively disabling every AES_128_CBC ciphersuite defined at
|
| + // http://www.iana.org/assignments/tls-parameters/tls-parameters.xml, only
|
| + // disabling those cipher suites that the test server actually implements.
|
| const uint16 kCiphersToDisable[] = {
|
| - 0x0005, // TLS_RSA_WITH_RC4_128_SHA
|
| - 0xc011, // TLS_ECDHE_RSA_WITH_RC4_128_SHA
|
| + 0x002f, // TLS_RSA_WITH_AES_128_CBC_SHA
|
| + 0x0033, // TLS_DHE_RSA_WITH_AES_128_CBC_SHA
|
| + 0xc013, // TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
|
| };
|
|
|
| SpawnedTestServer::SSLOptions ssl_options;
|
| - // Enable only RC4 on the test server.
|
| - ssl_options.bulk_ciphers = SpawnedTestServer::SSLOptions::BULK_CIPHER_RC4;
|
| + // Enable only AES_128_CBC on the test server.
|
| + ssl_options.bulk_ciphers = SpawnedTestServer::SSLOptions::BULK_CIPHER_AES128;
|
| SpawnedTestServer test_server(
|
| SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath());
|
| ASSERT_TRUE(test_server.Start());
|
| @@ -2241,19 +2241,11 @@ TEST_F(SSLClientSocketTest, CipherSuiteDisables) {
|
| log.GetEntries(&entries);
|
| EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT));
|
|
|
| - // NSS has special handling that maps a handshake_failure alert received
|
| - // immediately after a client_hello to be a mismatched cipher suite error,
|
| - // leading to ERR_SSL_VERSION_OR_CIPHER_MISMATCH. When using OpenSSL or
|
| - // Secure Transport (OS X), the handshake_failure is bubbled up without any
|
| - // interpretation, leading to ERR_SSL_PROTOCOL_ERROR. Either way, a failure
|
| - // indicates that no cipher suite was negotiated with the test server.
|
| if (rv == ERR_IO_PENDING)
|
| rv = callback.WaitForResult();
|
| - EXPECT_TRUE(rv == ERR_SSL_VERSION_OR_CIPHER_MISMATCH ||
|
| - rv == ERR_SSL_PROTOCOL_ERROR);
|
| - // The exact ordering differs between SSLClientSocketNSS (which issues an
|
| - // extra read) and SSLClientSocketMac (which does not). Just make sure the
|
| - // error appears somewhere in the log.
|
| + EXPECT_EQ(ERR_SSL_VERSION_OR_CIPHER_MISMATCH, rv);
|
| + // The exact ordering depends no whether an extra read is issued. Just check
|
| + // the error is somewhere in the log.
|
| log.GetEntries(&entries);
|
| ExpectLogContainsSomewhere(
|
| entries, 0, NetLog::TYPE_SSL_HANDSHAKE_ERROR, NetLog::PHASE_NONE);
|
| @@ -2877,6 +2869,104 @@ TEST_F(SSLClientSocketTest, FallbackShardSessionCache) {
|
| SSLConnectionStatusToVersion(ssl_info.connection_status));
|
| }
|
|
|
| +// Test that RC4 is only enabled if enable_deprecated_cipher_suites is set.
|
| +TEST_F(SSLClientSocketTest, DeprecatedRC4) {
|
| + SpawnedTestServer::SSLOptions ssl_options;
|
| + ssl_options.bulk_ciphers = SpawnedTestServer::SSLOptions::BULK_CIPHER_RC4;
|
| + ASSERT_TRUE(StartTestServer(ssl_options));
|
| +
|
| + // Normal handshakes with RC4 do not work.
|
| + SSLConfig ssl_config;
|
| + TestCompletionCallback callback;
|
| + scoped_ptr<StreamSocket> transport(
|
| + new TCPClientSocket(addr(), &log_, NetLog::Source()));
|
| + ASSERT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
|
| + scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
|
| + transport.Pass(), test_server()->host_port_pair(), ssl_config));
|
| + ASSERT_EQ(ERR_SSL_VERSION_OR_CIPHER_MISMATCH,
|
| + callback.GetResult(sock->Connect(callback.callback())));
|
| +
|
| + // Enabling deprecated ciphers works fine.
|
| + ssl_config.enable_deprecated_cipher_suites = true;
|
| + transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
|
| + ASSERT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
|
| + sock = CreateSSLClientSocket(transport.Pass(),
|
| + test_server()->host_port_pair(), ssl_config);
|
| + ASSERT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
|
| +}
|
| +
|
| +// Tests that enabling deprecated ciphers shards the session cache.
|
| +TEST_F(SSLClientSocketTest, DeprecatedShardSessionCache) {
|
| + SpawnedTestServer::SSLOptions ssl_options;
|
| + ASSERT_TRUE(StartTestServer(ssl_options));
|
| +
|
| + // Prepare a normal and deprecated SSL config.
|
| + SSLConfig ssl_config;
|
| + SSLConfig deprecated_ssl_config;
|
| + deprecated_ssl_config.enable_deprecated_cipher_suites = true;
|
| +
|
| + // Connect with deprecated ciphers enabled to warm the session cache cache.
|
| + TestCompletionCallback callback;
|
| + scoped_ptr<StreamSocket> transport(
|
| + new TCPClientSocket(addr(), &log_, NetLog::Source()));
|
| + EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
|
| + scoped_ptr<SSLClientSocket> sock(
|
| + CreateSSLClientSocket(transport.Pass(), test_server()->host_port_pair(),
|
| + deprecated_ssl_config));
|
| + EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
|
| + SSLInfo ssl_info;
|
| + EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
|
| + EXPECT_EQ(SSLInfo::HANDSHAKE_FULL, ssl_info.handshake_type);
|
| +
|
| + // Test that re-connecting with deprecated ciphers enabled still resumes.
|
| + transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
|
| + EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
|
| + sock = CreateSSLClientSocket(
|
| + transport.Pass(), test_server()->host_port_pair(), deprecated_ssl_config);
|
| + EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
|
| + EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
|
| + EXPECT_EQ(SSLInfo::HANDSHAKE_RESUME, ssl_info.handshake_type);
|
| +
|
| + // However, a normal connection needs a full handshake.
|
| + transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
|
| + EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
|
| + sock = CreateSSLClientSocket(transport.Pass(),
|
| + test_server()->host_port_pair(), ssl_config);
|
| + EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
|
| + EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
|
| + EXPECT_EQ(SSLInfo::HANDSHAKE_FULL, ssl_info.handshake_type);
|
| +
|
| + // Clear the session cache for the inverse test.
|
| + SSLClientSocket::ClearSessionCache();
|
| +
|
| + // Now make a normal connection to prime the session cache.
|
| + transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
|
| + EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
|
| + sock = CreateSSLClientSocket(transport.Pass(),
|
| + test_server()->host_port_pair(), ssl_config);
|
| + EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
|
| + EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
|
| + EXPECT_EQ(SSLInfo::HANDSHAKE_FULL, ssl_info.handshake_type);
|
| +
|
| + // A normal connection should be able to resume.
|
| + transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
|
| + EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
|
| + sock = CreateSSLClientSocket(transport.Pass(),
|
| + test_server()->host_port_pair(), ssl_config);
|
| + EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
|
| + EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
|
| + EXPECT_EQ(SSLInfo::HANDSHAKE_RESUME, ssl_info.handshake_type);
|
| +
|
| + // However, enabling deprecated ciphers connects fresh.
|
| + transport.reset(new TCPClientSocket(addr(), &log_, NetLog::Source()));
|
| + EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
|
| + sock = CreateSSLClientSocket(
|
| + transport.Pass(), test_server()->host_port_pair(), deprecated_ssl_config);
|
| + EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
|
| + EXPECT_TRUE(sock->GetSSLInfo(&ssl_info));
|
| + EXPECT_EQ(SSLInfo::HANDSHAKE_FULL, ssl_info.handshake_type);
|
| +}
|
| +
|
| TEST_F(SSLClientSocketFalseStartTest, FalseStartEnabled) {
|
| if (!SupportsAESGCM()) {
|
| LOG(WARNING) << "Skipping test because AES-GCM is not supported.";
|
|
|