Chromium Code Reviews| 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 <errno.h> | 7 #include <errno.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <openssl/bio.h> | 10 #include <openssl/bio.h> |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 78 << filepath.value(); | 78 << filepath.value(); |
| 79 return false; | 79 return false; |
| 80 } | 80 } |
| 81 pkey->reset(result); | 81 pkey->reset(result); |
| 82 return true; | 82 return true; |
| 83 } | 83 } |
| 84 | 84 |
| 85 class SSLClientSocketOpenSSLClientAuthTest : public PlatformTest { | 85 class SSLClientSocketOpenSSLClientAuthTest : public PlatformTest { |
| 86 public: | 86 public: |
| 87 SSLClientSocketOpenSSLClientAuthTest() | 87 SSLClientSocketOpenSSLClientAuthTest() |
| 88 : socket_factory_(ClientSocketFactory::GetDefaultFactory()), | 88 : socket_factory_(net::ClientSocketFactory::GetDefaultFactory()), |
| 89 cert_verifier_(new MockCertVerifier), | 89 cert_verifier_(new net::MockCertVerifier), |
| 90 transport_security_state_(new TransportSecurityState) { | 90 transport_security_state_(new net::TransportSecurityState), |
|
wtc
2014/07/31 23:05:25
Remove the "net::" on these three lines.
mshelley
2014/08/02 23:59:15
Done.
| |
| 91 cert_verifier_->set_default_result(OK); | 91 ran_handshake_completion_callback_(false) { |
| 92 cert_verifier_->set_default_result(net::OK); | |
|
wtc
2014/07/31 23:05:25
Remove "net::".
mshelley
2014/08/02 23:59:15
Done.
| |
| 92 context_.cert_verifier = cert_verifier_.get(); | 93 context_.cert_verifier = cert_verifier_.get(); |
| 93 context_.transport_security_state = transport_security_state_.get(); | 94 context_.transport_security_state = transport_security_state_.get(); |
| 94 key_store_ = OpenSSLClientKeyStore::GetInstance(); | 95 key_store_ = OpenSSLClientKeyStore::GetInstance(); |
| 95 } | 96 } |
| 96 | 97 |
| 97 virtual ~SSLClientSocketOpenSSLClientAuthTest() { | 98 virtual ~SSLClientSocketOpenSSLClientAuthTest() { |
| 98 key_store_->Flush(); | 99 key_store_->Flush(); |
| 99 } | 100 } |
| 100 | 101 |
| 102 void RecordCompletedHandshake() { ran_handshake_completion_callback_ = true; } | |
| 103 | |
| 101 protected: | 104 protected: |
| 102 scoped_ptr<SSLClientSocket> CreateSSLClientSocket( | 105 scoped_ptr<SSLClientSocket> CreateSSLClientSocket( |
| 103 scoped_ptr<StreamSocket> transport_socket, | 106 scoped_ptr<StreamSocket> transport_socket, |
| 104 const HostPortPair& host_and_port, | 107 const HostPortPair& host_and_port, |
| 105 const SSLConfig& ssl_config) { | 108 const SSLConfig& ssl_config) { |
| 106 scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); | 109 scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); |
| 107 connection->SetSocket(transport_socket.Pass()); | 110 connection->SetSocket(transport_socket.Pass()); |
| 108 return socket_factory_->CreateSSLClientSocket(connection.Pass(), | 111 return socket_factory_->CreateSSLClientSocket(connection.Pass(), |
| 109 host_and_port, | 112 host_and_port, |
| 110 ssl_config, | 113 ssl_config, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 155 // |result| will retrieve the ::Connect() result value. | 158 // |result| will retrieve the ::Connect() result value. |
| 156 // Returns true on succes, false otherwise. Success means that the socket | 159 // Returns true on succes, false otherwise. Success means that the socket |
| 157 // could be created and its Connect() was called, not that the connection | 160 // could be created and its Connect() was called, not that the connection |
| 158 // itself was a success. | 161 // itself was a success. |
| 159 bool CreateAndConnectSSLClientSocket(SSLConfig& ssl_config, | 162 bool CreateAndConnectSSLClientSocket(SSLConfig& ssl_config, |
| 160 int* result) { | 163 int* result) { |
| 161 sock_ = CreateSSLClientSocket(transport_.Pass(), | 164 sock_ = CreateSSLClientSocket(transport_.Pass(), |
| 162 test_server_->host_port_pair(), | 165 test_server_->host_port_pair(), |
| 163 ssl_config); | 166 ssl_config); |
| 164 | 167 |
| 168 sock_->SetHandshakeCompletionCallback(base::Bind( | |
| 169 &SSLClientSocketOpenSSLClientAuthTest::RecordCompletedHandshake, | |
| 170 base::Unretained(this))); | |
| 171 | |
| 165 if (sock_->IsConnected()) { | 172 if (sock_->IsConnected()) { |
| 166 LOG(ERROR) << "SSL Socket prematurely connected"; | 173 LOG(ERROR) << "SSL Socket prematurely connected"; |
| 167 return false; | 174 return false; |
| 168 } | 175 } |
| 169 | 176 |
| 170 *result = callback_.GetResult(sock_->Connect(callback_.callback())); | 177 *result = callback_.GetResult(sock_->Connect(callback_.callback())); |
| 171 return true; | 178 return true; |
| 172 } | 179 } |
| 173 | 180 |
| 174 | 181 |
| 175 // Check that the client certificate was sent. | 182 // Check that the client certificate was sent. |
| 176 // Returns true on success. | 183 // Returns true on success. |
| 177 bool CheckSSLClientSocketSentCert() { | 184 bool CheckSSLClientSocketSentCert() { |
| 178 SSLInfo ssl_info; | 185 SSLInfo ssl_info; |
| 179 sock_->GetSSLInfo(&ssl_info); | 186 sock_->GetSSLInfo(&ssl_info); |
| 180 return ssl_info.client_cert_sent; | 187 return ssl_info.client_cert_sent; |
| 181 } | 188 } |
| 182 | 189 |
| 183 ClientSocketFactory* socket_factory_; | 190 ClientSocketFactory* socket_factory_; |
| 184 scoped_ptr<MockCertVerifier> cert_verifier_; | 191 scoped_ptr<MockCertVerifier> cert_verifier_; |
| 185 scoped_ptr<TransportSecurityState> transport_security_state_; | 192 scoped_ptr<TransportSecurityState> transport_security_state_; |
| 186 SSLClientSocketContext context_; | 193 SSLClientSocketContext context_; |
| 187 OpenSSLClientKeyStore* key_store_; | 194 OpenSSLClientKeyStore* key_store_; |
| 188 scoped_ptr<SpawnedTestServer> test_server_; | 195 scoped_ptr<SpawnedTestServer> test_server_; |
| 189 AddressList addr_; | 196 AddressList addr_; |
| 190 TestCompletionCallback callback_; | 197 TestCompletionCallback callback_; |
| 191 CapturingNetLog log_; | 198 CapturingNetLog log_; |
| 192 scoped_ptr<StreamSocket> transport_; | 199 scoped_ptr<StreamSocket> transport_; |
| 193 scoped_ptr<SSLClientSocket> sock_; | 200 scoped_ptr<SSLClientSocket> sock_; |
| 201 bool ran_handshake_completion_callback_; | |
| 194 }; | 202 }; |
| 195 | 203 |
| 196 // Connect to a server requesting client authentication, do not send | 204 // Connect to a server requesting client authentication, do not send |
| 197 // any client certificates. It should refuse the connection. | 205 // any client certificates. It should refuse the connection. |
| 198 TEST_F(SSLClientSocketOpenSSLClientAuthTest, NoCert) { | 206 TEST_F(SSLClientSocketOpenSSLClientAuthTest, NoCert) { |
| 199 SpawnedTestServer::SSLOptions ssl_options; | 207 SpawnedTestServer::SSLOptions ssl_options; |
| 200 ssl_options.request_client_certificate = true; | 208 ssl_options.request_client_certificate = true; |
| 201 | 209 |
| 202 ASSERT_TRUE(ConnectToTestServer(ssl_options)); | 210 ASSERT_TRUE(ConnectToTestServer(ssl_options)); |
| 203 | 211 |
| 204 base::FilePath certs_dir = GetTestCertsDirectory(); | 212 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 205 SSLConfig ssl_config = kDefaultSSLConfig; | 213 SSLConfig ssl_config = kDefaultSSLConfig; |
| 206 | 214 |
| 207 int rv; | 215 int rv; |
| 208 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); | 216 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); |
| 209 | 217 |
| 210 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv); | 218 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv); |
| 211 EXPECT_FALSE(sock_->IsConnected()); | 219 EXPECT_FALSE(sock_->IsConnected()); |
| 220 EXPECT_TRUE(ran_handshake_completion_callback_); | |
| 212 } | 221 } |
| 213 | 222 |
| 214 // Connect to a server requesting client authentication, and send it | 223 // Connect to a server requesting client authentication, and send it |
| 215 // an empty certificate. It should refuse the connection. | 224 // an empty certificate. It should refuse the connection. |
| 216 TEST_F(SSLClientSocketOpenSSLClientAuthTest, SendEmptyCert) { | 225 TEST_F(SSLClientSocketOpenSSLClientAuthTest, SendEmptyCert) { |
| 217 SpawnedTestServer::SSLOptions ssl_options; | 226 SpawnedTestServer::SSLOptions ssl_options; |
| 218 ssl_options.request_client_certificate = true; | 227 ssl_options.request_client_certificate = true; |
| 219 ssl_options.client_authorities.push_back( | 228 ssl_options.client_authorities.push_back( |
| 220 GetTestClientCertsDirectory().AppendASCII("client_1_ca.pem")); | 229 GetTestClientCertsDirectory().AppendASCII("client_1_ca.pem")); |
| 221 | 230 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 259 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); | 268 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); |
| 260 | 269 |
| 261 EXPECT_EQ(OK, rv); | 270 EXPECT_EQ(OK, rv); |
| 262 EXPECT_TRUE(sock_->IsConnected()); | 271 EXPECT_TRUE(sock_->IsConnected()); |
| 263 | 272 |
| 264 EXPECT_TRUE(CheckSSLClientSocketSentCert()); | 273 EXPECT_TRUE(CheckSSLClientSocketSentCert()); |
| 265 | 274 |
| 266 sock_->Disconnect(); | 275 sock_->Disconnect(); |
| 267 EXPECT_FALSE(sock_->IsConnected()); | 276 EXPECT_FALSE(sock_->IsConnected()); |
| 268 } | 277 } |
| 278 | |
| 269 #endif // defined(USE_OPENSSL_CERTS) | 279 #endif // defined(USE_OPENSSL_CERTS) |
| 270 | 280 |
| 271 } // namespace | 281 } // namespace |
| 282 | |
| 272 } // namespace net | 283 } // namespace net |
| OLD | NEW |