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 // 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> |
| 11 #include <openssl/err.h> | 11 #include <openssl/err.h> |
| 12 #include <openssl/ssl.h> | 12 #include <openssl/ssl.h> |
| 13 | 13 |
| 14 #include "base/bind.h" | 14 #include "base/bind.h" |
| 15 #include "base/callback_helpers.h" | 15 #include "base/callback_helpers.h" |
| 16 #include "base/memory/singleton.h" | 16 #include "base/memory/singleton.h" |
| 17 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
| 18 #include "base/synchronization/lock.h" | 18 #include "base/synchronization/lock.h" |
| 19 #include "crypto/ec_private_key.h" | 19 #include "crypto/ec_private_key.h" |
| 20 #include "crypto/openssl_util.h" | 20 #include "crypto/openssl_util.h" |
| 21 #include "crypto/scoped_openssl_types.h" | 21 #include "crypto/scoped_openssl_types.h" |
| 22 #include "net/base/net_errors.h" | 22 #include "net/base/net_errors.h" |
| 23 #include "net/cert/cert_verifier.h" | 23 #include "net/cert/cert_verifier.h" |
| 24 #include "net/cert/single_request_cert_verifier.h" | 24 #include "net/cert/single_request_cert_verifier.h" |
| 25 #include "net/cert/x509_certificate_net_log_param.h" | 25 #include "net/cert/x509_certificate_net_log_param.h" |
| 26 #include "net/http/transport_security_state.h" | 26 #include "net/http/transport_security_state.h" |
| 27 #include "net/socket/ssl_error_params.h" | |
| 28 #include "net/socket/ssl_session_cache_openssl.h" | 27 #include "net/socket/ssl_session_cache_openssl.h" |
| 29 #include "net/ssl/openssl_ssl_util.h" | 28 #include "net/ssl/openssl_ssl_util.h" |
| 30 #include "net/ssl/ssl_cert_request_info.h" | 29 #include "net/ssl/ssl_cert_request_info.h" |
| 31 #include "net/ssl/ssl_connection_status_flags.h" | 30 #include "net/ssl/ssl_connection_status_flags.h" |
| 32 #include "net/ssl/ssl_info.h" | 31 #include "net/ssl/ssl_info.h" |
| 33 | 32 |
| 34 #if defined(USE_OPENSSL_CERTS) | 33 #if defined(USE_OPENSSL_CERTS) |
| 35 #include "net/ssl/openssl_client_key_store.h" | 34 #include "net/ssl/openssl_client_key_store.h" |
| 36 #else | 35 #else |
| 37 #include "net/ssl/openssl_platform_key.h" | 36 #include "net/ssl/openssl_platform_key.h" |
| (...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 902 int ssl_error = SSL_get_error(ssl_, rv); | 901 int ssl_error = SSL_get_error(ssl_, rv); |
| 903 | 902 |
| 904 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) { | 903 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) { |
| 905 // The server supports channel ID. Stop to look one up before returning to | 904 // The server supports channel ID. Stop to look one up before returning to |
| 906 // the handshake. | 905 // the handshake. |
| 907 channel_id_xtn_negotiated_ = true; | 906 channel_id_xtn_negotiated_ = true; |
| 908 GotoState(STATE_CHANNEL_ID_LOOKUP); | 907 GotoState(STATE_CHANNEL_ID_LOOKUP); |
| 909 return OK; | 908 return OK; |
| 910 } | 909 } |
| 911 | 910 |
| 912 net_error = MapOpenSSLError(ssl_error, err_tracer); | 911 uint32_t error_code; |
| 912 const char* file; | |
| 913 int line; | |
| 914 net_error = MapOpenSSLErrorWithDetails( | |
| 915 ssl_error, err_tracer, &error_code, &file, &line); | |
|
Ryan Sleevi
2014/08/25 06:24:35
Rather than having to create the three local varia
davidben
2014/08/26 22:13:51
Done.
| |
| 913 | 916 |
| 914 // If not done, stay in this state | 917 // If not done, stay in this state |
| 915 if (net_error == ERR_IO_PENDING) { | 918 if (net_error == ERR_IO_PENDING) { |
| 916 GotoState(STATE_HANDSHAKE); | 919 GotoState(STATE_HANDSHAKE); |
| 917 } else { | 920 } else { |
| 918 LOG(ERROR) << "handshake failed; returned " << rv | 921 LOG(ERROR) << "handshake failed; returned " << rv |
| 919 << ", SSL error code " << ssl_error | 922 << ", SSL error code " << ssl_error |
| 920 << ", net_error " << net_error; | 923 << ", net_error " << net_error; |
| 921 net_log_.AddEvent( | 924 net_log_.AddEvent( |
| 922 NetLog::TYPE_SSL_HANDSHAKE_ERROR, | 925 NetLog::TYPE_SSL_HANDSHAKE_ERROR, |
| 923 CreateNetLogSSLErrorCallback(net_error, ssl_error)); | 926 CreateNetLogOpenSSLErrorCallback( |
| 927 net_error, ssl_error, error_code, file, line)); | |
| 924 } | 928 } |
| 925 } | 929 } |
| 926 return net_error; | 930 return net_error; |
| 927 } | 931 } |
| 928 | 932 |
| 929 int SSLClientSocketOpenSSL::DoChannelIDLookup() { | 933 int SSLClientSocketOpenSSL::DoChannelIDLookup() { |
| 930 GotoState(STATE_CHANNEL_ID_LOOKUP_COMPLETE); | 934 GotoState(STATE_CHANNEL_ID_LOOKUP_COMPLETE); |
| 931 return channel_id_service_->GetOrCreateChannelID( | 935 return channel_id_service_->GetOrCreateChannelID( |
| 932 host_and_port_.host(), | 936 host_and_port_.host(), |
| 933 &channel_id_private_key_, | 937 &channel_id_private_key_, |
| (...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1619 if (handshake_succeeded_ && marked_session_as_good_) | 1623 if (handshake_succeeded_ && marked_session_as_good_) |
| 1620 OnHandshakeCompletion(); | 1624 OnHandshakeCompletion(); |
| 1621 } | 1625 } |
| 1622 | 1626 |
| 1623 scoped_refptr<X509Certificate> | 1627 scoped_refptr<X509Certificate> |
| 1624 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { | 1628 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
| 1625 return server_cert_; | 1629 return server_cert_; |
| 1626 } | 1630 } |
| 1627 | 1631 |
| 1628 } // namespace net | 1632 } // namespace net |
| OLD | NEW |