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 <openssl/err.h> | 10 #include <openssl/err.h> |
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 } | 660 } |
661 | 661 |
662 int SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { | 662 int SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { |
663 return transport_->socket()->SetReceiveBufferSize(size); | 663 return transport_->socket()->SetReceiveBufferSize(size); |
664 } | 664 } |
665 | 665 |
666 int SSLClientSocketOpenSSL::SetSendBufferSize(int32 size) { | 666 int SSLClientSocketOpenSSL::SetSendBufferSize(int32 size) { |
667 return transport_->socket()->SetSendBufferSize(size); | 667 return transport_->socket()->SetSendBufferSize(size); |
668 } | 668 } |
669 | 669 |
| 670 // static |
| 671 void SSLClientSocketOpenSSL::OnSessionFinishedCallback(const SSL* ssl, |
| 672 int result, |
| 673 int unused) { |
| 674 if (result == SSL_CB_HANDSHAKE_DONE) |
| 675 SSLContext::GetInstance()->session_cache()->CheckIfSessionFinished(ssl); |
| 676 } |
| 677 |
670 int SSLClientSocketOpenSSL::Init() { | 678 int SSLClientSocketOpenSSL::Init() { |
671 DCHECK(!ssl_); | 679 DCHECK(!ssl_); |
672 DCHECK(!transport_bio_); | 680 DCHECK(!transport_bio_); |
673 | 681 |
674 SSLContext* context = SSLContext::GetInstance(); | 682 SSLContext* context = SSLContext::GetInstance(); |
675 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 683 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
676 | 684 |
677 ssl_ = SSL_new(context->ssl_ctx()); | 685 ssl_ = SSL_new(context->ssl_ctx()); |
678 if (!ssl_ || !context->SetClientSocketForSSL(ssl_, this)) | 686 if (!ssl_ || !context->SetClientSocketForSSL(ssl_, this)) |
679 return ERR_UNEXPECTED; | 687 return ERR_UNEXPECTED; |
680 | 688 |
681 if (!SSL_set_tlsext_host_name(ssl_, host_and_port_.host().c_str())) | 689 if (!SSL_set_tlsext_host_name(ssl_, host_and_port_.host().c_str())) |
682 return ERR_UNEXPECTED; | 690 return ERR_UNEXPECTED; |
683 | 691 |
| 692 // Set an OpenSSL callback to monitor this SSL*'s connection. |
| 693 SSL_set_info_callback(ssl_, &OnSessionFinishedCallback); |
| 694 |
684 trying_cached_session_ = context->session_cache()->SetSSLSessionWithKey( | 695 trying_cached_session_ = context->session_cache()->SetSSLSessionWithKey( |
685 ssl_, GetSessionCacheKey()); | 696 ssl_, GetSessionCacheKey()); |
686 | 697 |
687 BIO* ssl_bio = NULL; | 698 BIO* ssl_bio = NULL; |
688 // 0 => use default buffer sizes. | 699 // 0 => use default buffer sizes. |
689 if (!BIO_new_bio_pair(&ssl_bio, 0, &transport_bio_, 0)) | 700 if (!BIO_new_bio_pair(&ssl_bio, 0, &transport_bio_, 0)) |
690 return ERR_UNEXPECTED; | 701 return ERR_UNEXPECTED; |
691 DCHECK(ssl_bio); | 702 DCHECK(ssl_bio); |
692 DCHECK(transport_bio_); | 703 DCHECK(transport_bio_); |
693 | 704 |
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1469 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; | 1480 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; |
1470 return SSL_TLSEXT_ERR_OK; | 1481 return SSL_TLSEXT_ERR_OK; |
1471 } | 1482 } |
1472 | 1483 |
1473 scoped_refptr<X509Certificate> | 1484 scoped_refptr<X509Certificate> |
1474 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { | 1485 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
1475 return server_cert_; | 1486 return server_cert_; |
1476 } | 1487 } |
1477 | 1488 |
1478 } // namespace net | 1489 } // namespace net |
OLD | NEW |