| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
| 6 | 6 |
| 7 #include <math.h> // ceil | 7 #include <math.h> // ceil |
| 8 #include <stdarg.h> | 8 #include <stdarg.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 #include "net/socket/socket_test_util.h" | 71 #include "net/socket/socket_test_util.h" |
| 72 #include "net/socket/ssl_client_socket.h" | 72 #include "net/socket/ssl_client_socket.h" |
| 73 #include "net/spdy/spdy_framer.h" | 73 #include "net/spdy/spdy_framer.h" |
| 74 #include "net/spdy/spdy_session.h" | 74 #include "net/spdy/spdy_session.h" |
| 75 #include "net/spdy/spdy_session_pool.h" | 75 #include "net/spdy/spdy_session_pool.h" |
| 76 #include "net/spdy/spdy_test_util_common.h" | 76 #include "net/spdy/spdy_test_util_common.h" |
| 77 #include "net/ssl/ssl_cert_request_info.h" | 77 #include "net/ssl/ssl_cert_request_info.h" |
| 78 #include "net/ssl/ssl_config_service.h" | 78 #include "net/ssl/ssl_config_service.h" |
| 79 #include "net/ssl/ssl_config_service_defaults.h" | 79 #include "net/ssl/ssl_config_service_defaults.h" |
| 80 #include "net/ssl/ssl_info.h" | 80 #include "net/ssl/ssl_info.h" |
| 81 #include "net/ssl/ssl_private_key.h" |
| 81 #include "net/test/cert_test_util.h" | 82 #include "net/test/cert_test_util.h" |
| 82 #include "net/websockets/websocket_handshake_stream_base.h" | 83 #include "net/websockets/websocket_handshake_stream_base.h" |
| 83 #include "testing/gtest/include/gtest/gtest.h" | 84 #include "testing/gtest/include/gtest/gtest.h" |
| 84 #include "testing/platform_test.h" | 85 #include "testing/platform_test.h" |
| 85 #include "url/gurl.h" | 86 #include "url/gurl.h" |
| 86 | 87 |
| 87 using base::ASCIIToUTF16; | 88 using base::ASCIIToUTF16; |
| 88 | 89 |
| 89 //----------------------------------------------------------------------------- | 90 //----------------------------------------------------------------------------- |
| 90 | 91 |
| (...skipping 12045 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12136 | 12137 |
| 12137 // Complete the SSL handshake, which should abort due to requiring a | 12138 // Complete the SSL handshake, which should abort due to requiring a |
| 12138 // client certificate. | 12139 // client certificate. |
| 12139 rv = callback.WaitForResult(); | 12140 rv = callback.WaitForResult(); |
| 12140 ASSERT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv); | 12141 ASSERT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv); |
| 12141 | 12142 |
| 12142 // Indicate that no certificate should be supplied. From the perspective | 12143 // Indicate that no certificate should be supplied. From the perspective |
| 12143 // of SSLClientCertCache, NULL is just as meaningful as a real | 12144 // of SSLClientCertCache, NULL is just as meaningful as a real |
| 12144 // certificate, so this is the same as supply a | 12145 // certificate, so this is the same as supply a |
| 12145 // legitimate-but-unacceptable certificate. | 12146 // legitimate-but-unacceptable certificate. |
| 12146 rv = trans->RestartWithCertificate(NULL, callback.callback()); | 12147 rv = trans->RestartWithCertificate(NULL, NULL, callback.callback()); |
| 12147 ASSERT_EQ(ERR_IO_PENDING, rv); | 12148 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 12148 | 12149 |
| 12149 // Ensure the certificate was added to the client auth cache before | 12150 // Ensure the certificate was added to the client auth cache before |
| 12150 // allowing the connection to continue restarting. | 12151 // allowing the connection to continue restarting. |
| 12151 scoped_refptr<X509Certificate> client_cert; | 12152 scoped_refptr<X509Certificate> client_cert; |
| 12153 scoped_refptr<SSLPrivateKey> client_private_key; |
| 12152 ASSERT_TRUE(session->ssl_client_auth_cache()->Lookup( | 12154 ASSERT_TRUE(session->ssl_client_auth_cache()->Lookup( |
| 12153 HostPortPair("www.example.com", 443), &client_cert)); | 12155 HostPortPair("www.example.com", 443), &client_cert, &client_private_key)); |
| 12154 ASSERT_EQ(NULL, client_cert.get()); | 12156 ASSERT_EQ(NULL, client_cert.get()); |
| 12155 | 12157 |
| 12156 // Restart the handshake. This will consume ssl_data2, which fails, and | 12158 // Restart the handshake. This will consume ssl_data2, which fails, and |
| 12157 // then consume ssl_data3 and ssl_data4, both of which should also fail. | 12159 // then consume ssl_data3 and ssl_data4, both of which should also fail. |
| 12158 // The result code is checked against what ssl_data4 should return. | 12160 // The result code is checked against what ssl_data4 should return. |
| 12159 rv = callback.WaitForResult(); | 12161 rv = callback.WaitForResult(); |
| 12160 ASSERT_EQ(ERR_SSL_PROTOCOL_ERROR, rv); | 12162 ASSERT_EQ(ERR_SSL_PROTOCOL_ERROR, rv); |
| 12161 | 12163 |
| 12162 // Ensure that the client certificate is removed from the cache on a | 12164 // Ensure that the client certificate is removed from the cache on a |
| 12163 // handshake failure. | 12165 // handshake failure. |
| 12164 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( | 12166 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( |
| 12165 HostPortPair("www.example.com", 443), &client_cert)); | 12167 HostPortPair("www.example.com", 443), &client_cert, &client_private_key)); |
| 12166 } | 12168 } |
| 12167 | 12169 |
| 12168 // Ensure that a client certificate is removed from the SSL client auth | 12170 // Ensure that a client certificate is removed from the SSL client auth |
| 12169 // cache when: | 12171 // cache when: |
| 12170 // 1) No proxy is involved. | 12172 // 1) No proxy is involved. |
| 12171 // 2) TLS False Start is enabled. | 12173 // 2) TLS False Start is enabled. |
| 12172 // 3) The initial TLS handshake requests a client certificate. | 12174 // 3) The initial TLS handshake requests a client certificate. |
| 12173 // 4) The client supplies an invalid/unacceptable certificate. | 12175 // 4) The client supplies an invalid/unacceptable certificate. |
| 12174 TEST_P(HttpNetworkTransactionTest, | 12176 TEST_P(HttpNetworkTransactionTest, |
| 12175 ClientAuthCertCache_Direct_FalseStart) { | 12177 ClientAuthCertCache_Direct_FalseStart) { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12253 | 12255 |
| 12254 // Complete the SSL handshake, which should abort due to requiring a | 12256 // Complete the SSL handshake, which should abort due to requiring a |
| 12255 // client certificate. | 12257 // client certificate. |
| 12256 rv = callback.WaitForResult(); | 12258 rv = callback.WaitForResult(); |
| 12257 ASSERT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv); | 12259 ASSERT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv); |
| 12258 | 12260 |
| 12259 // Indicate that no certificate should be supplied. From the perspective | 12261 // Indicate that no certificate should be supplied. From the perspective |
| 12260 // of SSLClientCertCache, NULL is just as meaningful as a real | 12262 // of SSLClientCertCache, NULL is just as meaningful as a real |
| 12261 // certificate, so this is the same as supply a | 12263 // certificate, so this is the same as supply a |
| 12262 // legitimate-but-unacceptable certificate. | 12264 // legitimate-but-unacceptable certificate. |
| 12263 rv = trans->RestartWithCertificate(NULL, callback.callback()); | 12265 rv = trans->RestartWithCertificate(NULL, NULL, callback.callback()); |
| 12264 ASSERT_EQ(ERR_IO_PENDING, rv); | 12266 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 12265 | 12267 |
| 12266 // Ensure the certificate was added to the client auth cache before | 12268 // Ensure the certificate was added to the client auth cache before |
| 12267 // allowing the connection to continue restarting. | 12269 // allowing the connection to continue restarting. |
| 12268 scoped_refptr<X509Certificate> client_cert; | 12270 scoped_refptr<X509Certificate> client_cert; |
| 12271 scoped_refptr<SSLPrivateKey> client_private_key; |
| 12269 ASSERT_TRUE(session->ssl_client_auth_cache()->Lookup( | 12272 ASSERT_TRUE(session->ssl_client_auth_cache()->Lookup( |
| 12270 HostPortPair("www.example.com", 443), &client_cert)); | 12273 HostPortPair("www.example.com", 443), &client_cert, &client_private_key)); |
| 12271 ASSERT_EQ(NULL, client_cert.get()); | 12274 ASSERT_EQ(NULL, client_cert.get()); |
| 12272 | 12275 |
| 12273 // Restart the handshake. This will consume ssl_data2, which fails, and | 12276 // Restart the handshake. This will consume ssl_data2, which fails, and |
| 12274 // then consume ssl_data3 and ssl_data4, both of which should also fail. | 12277 // then consume ssl_data3 and ssl_data4, both of which should also fail. |
| 12275 // The result code is checked against what ssl_data4 should return. | 12278 // The result code is checked against what ssl_data4 should return. |
| 12276 rv = callback.WaitForResult(); | 12279 rv = callback.WaitForResult(); |
| 12277 ASSERT_EQ(ERR_SSL_PROTOCOL_ERROR, rv); | 12280 ASSERT_EQ(ERR_SSL_PROTOCOL_ERROR, rv); |
| 12278 | 12281 |
| 12279 // Ensure that the client certificate is removed from the cache on a | 12282 // Ensure that the client certificate is removed from the cache on a |
| 12280 // handshake failure. | 12283 // handshake failure. |
| 12281 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( | 12284 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( |
| 12282 HostPortPair("www.example.com", 443), &client_cert)); | 12285 HostPortPair("www.example.com", 443), &client_cert, &client_private_key)); |
| 12283 } | 12286 } |
| 12284 | 12287 |
| 12285 // Ensure that a client certificate is removed from the SSL client auth | 12288 // Ensure that a client certificate is removed from the SSL client auth |
| 12286 // cache when: | 12289 // cache when: |
| 12287 // 1) An HTTPS proxy is involved. | 12290 // 1) An HTTPS proxy is involved. |
| 12288 // 3) The HTTPS proxy requests a client certificate. | 12291 // 3) The HTTPS proxy requests a client certificate. |
| 12289 // 4) The client supplies an invalid/unacceptable certificate for the | 12292 // 4) The client supplies an invalid/unacceptable certificate for the |
| 12290 // proxy. | 12293 // proxy. |
| 12291 // The test is repeated twice, first for connecting to an HTTPS endpoint, | 12294 // The test is repeated twice, first for connecting to an HTTPS endpoint, |
| 12292 // then for connecting to an HTTP endpoint. | 12295 // then for connecting to an HTTP endpoint. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12345 | 12348 |
| 12346 // Complete the SSL handshake, which should abort due to requiring a | 12349 // Complete the SSL handshake, which should abort due to requiring a |
| 12347 // client certificate. | 12350 // client certificate. |
| 12348 rv = callback.WaitForResult(); | 12351 rv = callback.WaitForResult(); |
| 12349 ASSERT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv); | 12352 ASSERT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv); |
| 12350 | 12353 |
| 12351 // Indicate that no certificate should be supplied. From the perspective | 12354 // Indicate that no certificate should be supplied. From the perspective |
| 12352 // of SSLClientCertCache, NULL is just as meaningful as a real | 12355 // of SSLClientCertCache, NULL is just as meaningful as a real |
| 12353 // certificate, so this is the same as supply a | 12356 // certificate, so this is the same as supply a |
| 12354 // legitimate-but-unacceptable certificate. | 12357 // legitimate-but-unacceptable certificate. |
| 12355 rv = trans->RestartWithCertificate(NULL, callback.callback()); | 12358 rv = trans->RestartWithCertificate(NULL, NULL, callback.callback()); |
| 12356 ASSERT_EQ(ERR_IO_PENDING, rv); | 12359 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 12357 | 12360 |
| 12358 // Ensure the certificate was added to the client auth cache before | 12361 // Ensure the certificate was added to the client auth cache before |
| 12359 // allowing the connection to continue restarting. | 12362 // allowing the connection to continue restarting. |
| 12360 scoped_refptr<X509Certificate> client_cert; | 12363 scoped_refptr<X509Certificate> client_cert; |
| 12364 scoped_refptr<SSLPrivateKey> client_private_key; |
| 12361 ASSERT_TRUE(session->ssl_client_auth_cache()->Lookup( | 12365 ASSERT_TRUE(session->ssl_client_auth_cache()->Lookup( |
| 12362 HostPortPair("proxy", 70), &client_cert)); | 12366 HostPortPair("proxy", 70), &client_cert, &client_private_key)); |
| 12363 ASSERT_EQ(NULL, client_cert.get()); | 12367 ASSERT_EQ(NULL, client_cert.get()); |
| 12364 // Ensure the certificate was NOT cached for the endpoint. This only | 12368 // Ensure the certificate was NOT cached for the endpoint. This only |
| 12365 // applies to HTTPS requests, but is fine to check for HTTP requests. | 12369 // applies to HTTPS requests, but is fine to check for HTTP requests. |
| 12366 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( | 12370 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( |
| 12367 HostPortPair("www.example.com", 443), &client_cert)); | 12371 HostPortPair("www.example.com", 443), &client_cert, |
| 12372 &client_private_key)); |
| 12368 | 12373 |
| 12369 // Restart the handshake. This will consume ssl_data2, which fails, and | 12374 // Restart the handshake. This will consume ssl_data2, which fails, and |
| 12370 // then consume ssl_data3, which should also fail. The result code is | 12375 // then consume ssl_data3, which should also fail. The result code is |
| 12371 // checked against what ssl_data3 should return. | 12376 // checked against what ssl_data3 should return. |
| 12372 rv = callback.WaitForResult(); | 12377 rv = callback.WaitForResult(); |
| 12373 ASSERT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); | 12378 ASSERT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); |
| 12374 | 12379 |
| 12375 // Now that the new handshake has failed, ensure that the client | 12380 // Now that the new handshake has failed, ensure that the client |
| 12376 // certificate was removed from the client auth cache. | 12381 // certificate was removed from the client auth cache. |
| 12377 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( | 12382 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( |
| 12378 HostPortPair("proxy", 70), &client_cert)); | 12383 HostPortPair("proxy", 70), &client_cert, &client_private_key)); |
| 12379 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( | 12384 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup( |
| 12380 HostPortPair("www.example.com", 443), &client_cert)); | 12385 HostPortPair("www.example.com", 443), &client_cert, |
| 12386 &client_private_key)); |
| 12381 } | 12387 } |
| 12382 } | 12388 } |
| 12383 | 12389 |
| 12384 TEST_P(HttpNetworkTransactionTest, UseIPConnectionPooling) { | 12390 TEST_P(HttpNetworkTransactionTest, UseIPConnectionPooling) { |
| 12385 session_deps_.use_alternative_services = true; | 12391 session_deps_.use_alternative_services = true; |
| 12386 session_deps_.next_protos = SpdyNextProtos(); | 12392 session_deps_.next_protos = SpdyNextProtos(); |
| 12387 | 12393 |
| 12388 // Set up a special HttpNetworkSession with a MockCachingHostResolver. | 12394 // Set up a special HttpNetworkSession with a MockCachingHostResolver. |
| 12389 session_deps_.host_resolver.reset(new MockCachingHostResolver()); | 12395 session_deps_.host_resolver.reset(new MockCachingHostResolver()); |
| 12390 scoped_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 12396 scoped_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| (...skipping 2976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15367 std::string response_data; | 15373 std::string response_data; |
| 15368 EXPECT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 15374 EXPECT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 15369 | 15375 |
| 15370 EXPECT_EQ(CountWriteBytes(data_writes, arraysize(data_writes)), | 15376 EXPECT_EQ(CountWriteBytes(data_writes, arraysize(data_writes)), |
| 15371 trans->GetTotalSentBytes()); | 15377 trans->GetTotalSentBytes()); |
| 15372 EXPECT_EQ(CountReadBytes(data_reads, arraysize(data_reads)), | 15378 EXPECT_EQ(CountReadBytes(data_reads, arraysize(data_reads)), |
| 15373 trans->GetTotalReceivedBytes()); | 15379 trans->GetTotalReceivedBytes()); |
| 15374 } | 15380 } |
| 15375 | 15381 |
| 15376 } // namespace net | 15382 } // namespace net |
| OLD | NEW |