| Index: net/socket/ssl_client_socket_openssl.cc
|
| diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc
|
| index 4d108fc92782f156390dcded83b4be3eaaba2ad9..49f9d98b674d37b592daefc95966c0db0f923923 100644
|
| --- a/net/socket/ssl_client_socket_openssl.cc
|
| +++ b/net/socket/ssl_client_socket_openssl.cc
|
| @@ -348,7 +348,7 @@ SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
|
| transport_read_error_(OK),
|
| transport_write_error_(OK),
|
| server_cert_chain_(new PeerCertificateChain(NULL)),
|
| - completed_handshake_(false),
|
| + completed_connect_(false),
|
| was_ever_used_(false),
|
| client_auth_cert_needed_(false),
|
| cert_verifier_(context.cert_verifier),
|
| @@ -363,7 +363,7 @@ SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
|
| next_handshake_state_(STATE_NONE),
|
| npn_status_(kNextProtoUnsupported),
|
| channel_id_xtn_negotiated_(false),
|
| - ran_handshake_finished_callback_(false),
|
| + handshake_succeeded_(false),
|
| marked_session_as_good_(false),
|
| net_log_(transport_->socket()->NetLog()) {
|
| }
|
| @@ -493,7 +493,7 @@ void SSLClientSocketOpenSSL::Disconnect() {
|
| transport_write_error_ = OK;
|
|
|
| server_cert_verify_result_.Reset();
|
| - completed_handshake_ = false;
|
| + completed_connect_ = false;
|
|
|
| cert_authorities_.clear();
|
| cert_key_types_.clear();
|
| @@ -508,7 +508,7 @@ void SSLClientSocketOpenSSL::Disconnect() {
|
|
|
| bool SSLClientSocketOpenSSL::IsConnected() const {
|
| // If the handshake has not yet completed.
|
| - if (!completed_handshake_)
|
| + if (!completed_connect_)
|
| return false;
|
| // If an asynchronous operation is still pending.
|
| if (user_read_buf_.get() || user_write_buf_.get())
|
| @@ -519,7 +519,7 @@ bool SSLClientSocketOpenSSL::IsConnected() const {
|
|
|
| bool SSLClientSocketOpenSSL::IsConnectedAndIdle() const {
|
| // If the handshake has not yet completed.
|
| - if (!completed_handshake_)
|
| + if (!completed_connect_)
|
| return false;
|
| // If an asynchronous operation is still pending.
|
| if (user_read_buf_.get() || user_write_buf_.get())
|
| @@ -679,18 +679,6 @@ int SSLClientSocketOpenSSL::SetSendBufferSize(int32 size) {
|
| return transport_->socket()->SetSendBufferSize(size);
|
| }
|
|
|
| -// static
|
| -void SSLClientSocketOpenSSL::InfoCallback(const SSL* ssl,
|
| - int result,
|
| - int /*unused*/) {
|
| - SSLClientSocketOpenSSL* ssl_socket =
|
| - SSLContext::GetInstance()->GetClientSocketFromSSL(ssl);
|
| - if (result == SSL_CB_HANDSHAKE_DONE) {
|
| - ssl_socket->ran_handshake_finished_callback_ = true;
|
| - ssl_socket->CheckIfHandshakeFinished();
|
| - }
|
| -}
|
| -
|
| int SSLClientSocketOpenSSL::Init() {
|
| DCHECK(!ssl_);
|
| DCHECK(!transport_bio_);
|
| @@ -719,7 +707,7 @@ int SSLClientSocketOpenSSL::Init() {
|
| DCHECK(transport_bio_);
|
|
|
| // Install a callback on OpenSSL's end to plumb transport errors through.
|
| - BIO_set_callback(ssl_bio, &SSLClientSocketOpenSSL::BIOCallback);
|
| + BIO_set_callback(ssl_bio, BIOCallback);
|
| BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this));
|
|
|
| SSL_set_bio(ssl_, ssl_bio, ssl_bio);
|
| @@ -1046,7 +1034,7 @@ int SSLClientSocketOpenSSL::DoVerifyCertComplete(int result) {
|
| << " (" << result << ")";
|
| }
|
|
|
| - completed_handshake_ = true;
|
| + completed_connect_ = true;
|
| // Exit DoHandshakeLoop and return the result to the caller to Connect.
|
| DCHECK_EQ(STATE_NONE, next_handshake_state_);
|
| return result;
|
| @@ -1486,7 +1474,7 @@ int SSLClientSocketOpenSSL::ClientCertRequestCallback(SSL* ssl,
|
| }
|
|
|
| int SSLClientSocketOpenSSL::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
|
| - if (!completed_handshake_) {
|
| + if (!completed_connect_) {
|
| // If the first handshake hasn't completed then we accept any certificates
|
| // because we verify after the handshake.
|
| return 1;
|
| @@ -1586,19 +1574,6 @@ long SSLClientSocketOpenSSL::MaybeReplayTransportError(
|
| return retvalue;
|
| }
|
|
|
| -// Determines if the session for |ssl_| is in the cache, and calls the
|
| -// handshake completion callback if that is the case.
|
| -//
|
| -// CheckIfHandshakeFinished is called twice per connection: once after
|
| -// MarkSSLSessionAsGood, when the certificate has been verified, and
|
| -// once via an OpenSSL callback when the handshake has completed. On the
|
| -// second call, when the certificate has been verified and the handshake
|
| -// has completed, the connection's handshake completion callback is run.
|
| -void SSLClientSocketOpenSSL::CheckIfHandshakeFinished() {
|
| - if (ran_handshake_finished_callback_ && marked_session_as_good_)
|
| - OnHandshakeCompletion();
|
| -}
|
| -
|
| // static
|
| long SSLClientSocketOpenSSL::BIOCallback(
|
| BIO *bio,
|
| @@ -1612,6 +1587,32 @@ long SSLClientSocketOpenSSL::BIOCallback(
|
| bio, cmd, argp, argi, argl, retvalue);
|
| }
|
|
|
| +// static
|
| +void SSLClientSocketOpenSSL::InfoCallback(const SSL* ssl,
|
| + int type,
|
| + int /*val*/) {
|
| + if (type == SSL_CB_HANDSHAKE_DONE) {
|
| + SSLClientSocketOpenSSL* ssl_socket =
|
| + SSLContext::GetInstance()->GetClientSocketFromSSL(ssl);
|
| + ssl_socket->handshake_succeeded_ = true;
|
| + ssl_socket->CheckIfHandshakeFinished();
|
| + }
|
| +}
|
| +
|
| +// Determines if both the handshake and certificate verification have completed
|
| +// successfully, and calls the handshake completion callback if that is the
|
| +// case.
|
| +//
|
| +// CheckIfHandshakeFinished is called twice per connection: once after
|
| +// MarkSSLSessionAsGood, when the certificate has been verified, and
|
| +// once via an OpenSSL callback when the handshake has completed. On the
|
| +// second call, when the certificate has been verified and the handshake
|
| +// has completed, the connection's handshake completion callback is run.
|
| +void SSLClientSocketOpenSSL::CheckIfHandshakeFinished() {
|
| + if (handshake_succeeded_ && marked_session_as_good_)
|
| + OnHandshakeCompletion();
|
| +}
|
| +
|
| scoped_refptr<X509Certificate>
|
| SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const {
|
| return server_cert_;
|
|
|