| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <openssl/ssl.h> | 10 #include <openssl/ssl.h> |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 SessionMap session_map_; | 274 SessionMap session_map_; |
| 275 | 275 |
| 276 // Protects access to both the above maps. | 276 // Protects access to both the above maps. |
| 277 Lock lock_; | 277 Lock lock_; |
| 278 | 278 |
| 279 DISALLOW_COPY_AND_ASSIGN(SSLSessionCache); | 279 DISALLOW_COPY_AND_ASSIGN(SSLSessionCache); |
| 280 }; | 280 }; |
| 281 | 281 |
| 282 class SSLContext { | 282 class SSLContext { |
| 283 public: | 283 public: |
| 284 static SSLContext* Get() { return Singleton<SSLContext>::get(); } | 284 static SSLContext* GetInstance() { return Singleton<SSLContext>::get(); } |
| 285 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } | 285 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } |
| 286 SSLSessionCache* session_cache() { return &session_cache_; } | 286 SSLSessionCache* session_cache() { return &session_cache_; } |
| 287 | 287 |
| 288 SSLClientSocketOpenSSL* GetClientSocketFromSSL(SSL* ssl) { | 288 SSLClientSocketOpenSSL* GetClientSocketFromSSL(SSL* ssl) { |
| 289 DCHECK(ssl); | 289 DCHECK(ssl); |
| 290 SSLClientSocketOpenSSL* socket = static_cast<SSLClientSocketOpenSSL*>( | 290 SSLClientSocketOpenSSL* socket = static_cast<SSLClientSocketOpenSSL*>( |
| 291 SSL_get_ex_data(ssl, ssl_socket_data_index_)); | 291 SSL_get_ex_data(ssl, ssl_socket_data_index_)); |
| 292 DCHECK(socket); | 292 DCHECK(socket); |
| 293 return socket; | 293 return socket; |
| 294 } | 294 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 315 #if defined(OPENSSL_NPN_NEGOTIATED) | 315 #if defined(OPENSSL_NPN_NEGOTIATED) |
| 316 // TODO(kristianm): Only select this if ssl_config_.next_proto is not empty. | 316 // TODO(kristianm): Only select this if ssl_config_.next_proto is not empty. |
| 317 // It would be better if the callback were not a global setting, | 317 // It would be better if the callback were not a global setting, |
| 318 // but that is an OpenSSL issue. | 318 // but that is an OpenSSL issue. |
| 319 SSL_CTX_set_next_proto_select_cb(ssl_ctx_.get(), SelectNextProtoCallback, | 319 SSL_CTX_set_next_proto_select_cb(ssl_ctx_.get(), SelectNextProtoCallback, |
| 320 NULL); | 320 NULL); |
| 321 #endif | 321 #endif |
| 322 } | 322 } |
| 323 | 323 |
| 324 static int NewSessionCallbackStatic(SSL* ssl, SSL_SESSION* session) { | 324 static int NewSessionCallbackStatic(SSL* ssl, SSL_SESSION* session) { |
| 325 return Get()->NewSessionCallback(ssl, session); | 325 return GetInstance()->NewSessionCallback(ssl, session); |
| 326 } | 326 } |
| 327 | 327 |
| 328 int NewSessionCallback(SSL* ssl, SSL_SESSION* session) { | 328 int NewSessionCallback(SSL* ssl, SSL_SESSION* session) { |
| 329 SSLClientSocketOpenSSL* socket = GetClientSocketFromSSL(ssl); | 329 SSLClientSocketOpenSSL* socket = GetClientSocketFromSSL(ssl); |
| 330 session_cache_.OnSessionAdded(socket->host_and_port(), session); | 330 session_cache_.OnSessionAdded(socket->host_and_port(), session); |
| 331 return 1; // 1 => We took ownership of |session|. | 331 return 1; // 1 => We took ownership of |session|. |
| 332 } | 332 } |
| 333 | 333 |
| 334 static void RemoveSessionCallbackStatic(SSL_CTX* ctx, SSL_SESSION* session) { | 334 static void RemoveSessionCallbackStatic(SSL_CTX* ctx, SSL_SESSION* session) { |
| 335 return Get()->RemoveSessionCallback(ctx, session); | 335 return GetInstance()->RemoveSessionCallback(ctx, session); |
| 336 } | 336 } |
| 337 | 337 |
| 338 void RemoveSessionCallback(SSL_CTX* ctx, SSL_SESSION* session) { | 338 void RemoveSessionCallback(SSL_CTX* ctx, SSL_SESSION* session) { |
| 339 DCHECK(ctx == ssl_ctx()); | 339 DCHECK(ctx == ssl_ctx()); |
| 340 session_cache_.OnSessionRemoved(session); | 340 session_cache_.OnSessionRemoved(session); |
| 341 } | 341 } |
| 342 | 342 |
| 343 static int ClientCertCallback(SSL* ssl, X509** x509, EVP_PKEY** pkey) { | 343 static int ClientCertCallback(SSL* ssl, X509** x509, EVP_PKEY** pkey) { |
| 344 SSLClientSocketOpenSSL* socket = Get()->GetClientSocketFromSSL(ssl); | 344 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
| 345 CHECK(socket); | 345 CHECK(socket); |
| 346 return socket->ClientCertRequestCallback(ssl, x509, pkey); | 346 return socket->ClientCertRequestCallback(ssl, x509, pkey); |
| 347 } | 347 } |
| 348 | 348 |
| 349 static int SelectNextProtoCallback(SSL* ssl, | 349 static int SelectNextProtoCallback(SSL* ssl, |
| 350 unsigned char** out, unsigned char* outlen, | 350 unsigned char** out, unsigned char* outlen, |
| 351 const unsigned char* in, | 351 const unsigned char* in, |
| 352 unsigned int inlen, void* arg) { | 352 unsigned int inlen, void* arg) { |
| 353 SSLClientSocketOpenSSL* socket = Get()->GetClientSocketFromSSL(ssl); | 353 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
| 354 return socket->SelectNextProtoCallback(out, outlen, in, inlen); | 354 return socket->SelectNextProtoCallback(out, outlen, in, inlen); |
| 355 } | 355 } |
| 356 | 356 |
| 357 // This is the index used with SSL_get_ex_data to retrieve the owner | 357 // This is the index used with SSL_get_ex_data to retrieve the owner |
| 358 // SSLClientSocketOpenSSL object from an SSL instance. | 358 // SSLClientSocketOpenSSL object from an SSL instance. |
| 359 int ssl_socket_data_index_; | 359 int ssl_socket_data_index_; |
| 360 | 360 |
| 361 base::ScopedOpenSSL<SSL_CTX, SSL_CTX_free> ssl_ctx_; | 361 base::ScopedOpenSSL<SSL_CTX, SSL_CTX_free> ssl_ctx_; |
| 362 SSLSessionCache session_cache_; | 362 SSLSessionCache session_cache_; |
| 363 }; | 363 }; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 } | 405 } |
| 406 | 406 |
| 407 SSLClientSocketOpenSSL::~SSLClientSocketOpenSSL() { | 407 SSLClientSocketOpenSSL::~SSLClientSocketOpenSSL() { |
| 408 Disconnect(); | 408 Disconnect(); |
| 409 } | 409 } |
| 410 | 410 |
| 411 bool SSLClientSocketOpenSSL::Init() { | 411 bool SSLClientSocketOpenSSL::Init() { |
| 412 DCHECK(!ssl_); | 412 DCHECK(!ssl_); |
| 413 DCHECK(!transport_bio_); | 413 DCHECK(!transport_bio_); |
| 414 | 414 |
| 415 SSLContext* context = SSLContext::Get(); | 415 SSLContext* context = SSLContext::GetInstance(); |
| 416 base::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 416 base::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
| 417 | 417 |
| 418 ssl_ = SSL_new(context->ssl_ctx()); | 418 ssl_ = SSL_new(context->ssl_ctx()); |
| 419 if (!ssl_ || !context->SetClientSocketForSSL(ssl_, this)) | 419 if (!ssl_ || !context->SetClientSocketForSSL(ssl_, this)) |
| 420 return false; | 420 return false; |
| 421 | 421 |
| 422 if (!SSL_set_tlsext_host_name(ssl_, host_and_port_.host().c_str())) | 422 if (!SSL_set_tlsext_host_name(ssl_, host_and_port_.host().c_str())) |
| 423 return false; | 423 return false; |
| 424 | 424 |
| 425 trying_cached_session_ = | 425 trying_cached_session_ = |
| (...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1181 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_); | 1181 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_); |
| 1182 | 1182 |
| 1183 if (rv >= 0) | 1183 if (rv >= 0) |
| 1184 return rv; | 1184 return rv; |
| 1185 | 1185 |
| 1186 int err = SSL_get_error(ssl_, rv); | 1186 int err = SSL_get_error(ssl_, rv); |
| 1187 return MapOpenSSLError(err, err_tracer); | 1187 return MapOpenSSLError(err, err_tracer); |
| 1188 } | 1188 } |
| 1189 | 1189 |
| 1190 } // namespace net | 1190 } // namespace net |
| OLD | NEW |