| 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 // OpenSSL binding for SSLClientSocket. The class layout and general principle | 5 // OpenSSL binding for SSLClientSocket. The class layout and general principle |
| 6 // of operation is derived from SSLClientSocketNSS. | 6 // of operation is derived from SSLClientSocketNSS. |
| 7 | 7 |
| 8 #include "net/socket/ssl_client_socket_openssl.h" | 8 #include "net/socket/ssl_client_socket_openssl.h" |
| 9 | 9 |
| 10 #include <errno.h> | 10 #include <errno.h> |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 }; | 195 }; |
| 196 | 196 |
| 197 base::LazyInstance<PlatformKeyTaskRunner>::Leaky g_platform_key_task_runner = | 197 base::LazyInstance<PlatformKeyTaskRunner>::Leaky g_platform_key_task_runner = |
| 198 LAZY_INSTANCE_INITIALIZER; | 198 LAZY_INSTANCE_INITIALIZER; |
| 199 #endif // !USE_OPENSSL_CERTS | 199 #endif // !USE_OPENSSL_CERTS |
| 200 | 200 |
| 201 } // namespace | 201 } // namespace |
| 202 | 202 |
| 203 class SSLClientSocketOpenSSL::SSLContext { | 203 class SSLClientSocketOpenSSL::SSLContext { |
| 204 public: | 204 public: |
| 205 static SSLContext* GetInstance() { return Singleton<SSLContext>::get(); } | 205 static SSLContext* GetInstance() { |
| 206 return base::Singleton<SSLContext>::get(); |
| 207 } |
| 206 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } | 208 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } |
| 207 SSLClientSessionCacheOpenSSL* session_cache() { return &session_cache_; } | 209 SSLClientSessionCacheOpenSSL* session_cache() { return &session_cache_; } |
| 208 | 210 |
| 209 SSLClientSocketOpenSSL* GetClientSocketFromSSL(const SSL* ssl) { | 211 SSLClientSocketOpenSSL* GetClientSocketFromSSL(const SSL* ssl) { |
| 210 DCHECK(ssl); | 212 DCHECK(ssl); |
| 211 SSLClientSocketOpenSSL* socket = static_cast<SSLClientSocketOpenSSL*>( | 213 SSLClientSocketOpenSSL* socket = static_cast<SSLClientSocketOpenSSL*>( |
| 212 SSL_get_ex_data(ssl, ssl_socket_data_index_)); | 214 SSL_get_ex_data(ssl, ssl_socket_data_index_)); |
| 213 DCHECK(socket); | 215 DCHECK(socket); |
| 214 return socket; | 216 return socket; |
| 215 } | 217 } |
| 216 | 218 |
| 217 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketOpenSSL* socket) { | 219 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketOpenSSL* socket) { |
| 218 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0; | 220 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0; |
| 219 } | 221 } |
| 220 | 222 |
| 221 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod; | 223 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod; |
| 222 | 224 |
| 223 private: | 225 private: |
| 224 friend struct DefaultSingletonTraits<SSLContext>; | 226 friend struct base::DefaultSingletonTraits<SSLContext>; |
| 225 | 227 |
| 226 SSLContext() : session_cache_(SSLClientSessionCacheOpenSSL::Config()) { | 228 SSLContext() : session_cache_(SSLClientSessionCacheOpenSSL::Config()) { |
| 227 crypto::EnsureOpenSSLInit(); | 229 crypto::EnsureOpenSSLInit(); |
| 228 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0); | 230 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0); |
| 229 DCHECK_NE(ssl_socket_data_index_, -1); | 231 DCHECK_NE(ssl_socket_data_index_, -1); |
| 230 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method())); | 232 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method())); |
| 231 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL); | 233 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL); |
| 232 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL); | 234 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL); |
| 233 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL); | 235 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL); |
| 234 // This stops |SSL_shutdown| from generating the close_notify message, which | 236 // This stops |SSL_shutdown| from generating the close_notify message, which |
| (...skipping 1908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2143 OnHandshakeIOComplete(signature_result_); | 2145 OnHandshakeIOComplete(signature_result_); |
| 2144 return; | 2146 return; |
| 2145 } | 2147 } |
| 2146 | 2148 |
| 2147 // During a renegotiation, either Read or Write calls may be blocked on an | 2149 // During a renegotiation, either Read or Write calls may be blocked on an |
| 2148 // asynchronous private key operation. | 2150 // asynchronous private key operation. |
| 2149 PumpReadWriteEvents(); | 2151 PumpReadWriteEvents(); |
| 2150 } | 2152 } |
| 2151 | 2153 |
| 2152 } // namespace net | 2154 } // namespace net |
| OLD | NEW |