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> |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 93 ((compression & SSL_CONNECTION_COMPRESSION_MASK) << | 93 ((compression & SSL_CONNECTION_COMPRESSION_MASK) << |
| 94 SSL_CONNECTION_COMPRESSION_SHIFT) | | 94 SSL_CONNECTION_COMPRESSION_SHIFT) | |
| 95 ((version & SSL_CONNECTION_VERSION_MASK) << | 95 ((version & SSL_CONNECTION_VERSION_MASK) << |
| 96 SSL_CONNECTION_VERSION_SHIFT); | 96 SSL_CONNECTION_VERSION_SHIFT); |
| 97 } | 97 } |
| 98 | 98 |
| 99 // Returns the net SSL version number (see ssl_connection_status_flags.h) for | 99 // Returns the net SSL version number (see ssl_connection_status_flags.h) for |
| 100 // this SSL connection. | 100 // this SSL connection. |
| 101 int GetNetSSLVersion(SSL* ssl) { | 101 int GetNetSSLVersion(SSL* ssl) { |
| 102 switch (SSL_version(ssl)) { | 102 switch (SSL_version(ssl)) { |
| 103 case SSL2_VERSION: | |
| 104 return SSL_CONNECTION_VERSION_SSL2; | |
| 105 case SSL3_VERSION: | |
| 106 return SSL_CONNECTION_VERSION_SSL3; | |
| 107 case TLS1_VERSION: | 103 case TLS1_VERSION: |
| 108 return SSL_CONNECTION_VERSION_TLS1; | 104 return SSL_CONNECTION_VERSION_TLS1; |
| 109 case TLS1_1_VERSION: | 105 case TLS1_1_VERSION: |
| 110 return SSL_CONNECTION_VERSION_TLS1_1; | 106 return SSL_CONNECTION_VERSION_TLS1_1; |
| 111 case TLS1_2_VERSION: | 107 case TLS1_2_VERSION: |
| 112 return SSL_CONNECTION_VERSION_TLS1_2; | 108 return SSL_CONNECTION_VERSION_TLS1_2; |
| 113 default: | 109 default: |
| 110 NOTREACHED(); | |
| 114 return SSL_CONNECTION_VERSION_UNKNOWN; | 111 return SSL_CONNECTION_VERSION_UNKNOWN; |
| 115 } | 112 } |
| 116 } | 113 } |
| 117 | 114 |
| 118 ScopedX509 OSCertHandleToOpenSSL( | 115 ScopedX509 OSCertHandleToOpenSSL( |
| 119 X509Certificate::OSCertHandle os_handle) { | 116 X509Certificate::OSCertHandle os_handle) { |
| 120 #if defined(USE_OPENSSL_CERTS) | 117 #if defined(USE_OPENSSL_CERTS) |
| 121 return ScopedX509(X509Certificate::DupOSCertHandle(os_handle)); | 118 return ScopedX509(X509Certificate::DupOSCertHandle(os_handle)); |
| 122 #else // !defined(USE_OPENSSL_CERTS) | 119 #else // !defined(USE_OPENSSL_CERTS) |
| 123 std::string der_encoded; | 120 std::string der_encoded; |
| (...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 706 return ERR_UNEXPECTED; | 703 return ERR_UNEXPECTED; |
| 707 DCHECK(ssl_bio); | 704 DCHECK(ssl_bio); |
| 708 DCHECK(transport_bio_); | 705 DCHECK(transport_bio_); |
| 709 | 706 |
| 710 // Install a callback on OpenSSL's end to plumb transport errors through. | 707 // Install a callback on OpenSSL's end to plumb transport errors through. |
| 711 BIO_set_callback(ssl_bio, &SSLClientSocketOpenSSL::BIOCallback); | 708 BIO_set_callback(ssl_bio, &SSLClientSocketOpenSSL::BIOCallback); |
| 712 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this)); | 709 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this)); |
| 713 | 710 |
| 714 SSL_set_bio(ssl_, ssl_bio, ssl_bio); | 711 SSL_set_bio(ssl_, ssl_bio, ssl_bio); |
| 715 | 712 |
| 713 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min); | |
| 714 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max); | |
| 715 SSL_set_min_version(ssl_, ssl_config_.version_min); | |
| 716 SSL_set_max_version(ssl_, ssl_config_.version_max); | |
|
davidben
2015/05/13 20:46:19
This is a newer API we added but I apparently neve
| |
| 717 | |
| 716 // OpenSSL defaults some options to on, others to off. To avoid ambiguity, | 718 // OpenSSL defaults some options to on, others to off. To avoid ambiguity, |
| 717 // set everything we care about to an absolute value. | 719 // set everything we care about to an absolute value. |
| 718 SslSetClearMask options; | 720 SslSetClearMask options; |
| 719 options.ConfigureFlag(SSL_OP_NO_SSLv2, true); | |
| 720 bool ssl3_enabled = (ssl_config_.version_min == SSL_PROTOCOL_VERSION_SSL3); | |
| 721 options.ConfigureFlag(SSL_OP_NO_SSLv3, !ssl3_enabled); | |
| 722 bool tls1_enabled = (ssl_config_.version_min <= SSL_PROTOCOL_VERSION_TLS1 && | |
| 723 ssl_config_.version_max >= SSL_PROTOCOL_VERSION_TLS1); | |
| 724 options.ConfigureFlag(SSL_OP_NO_TLSv1, !tls1_enabled); | |
| 725 bool tls1_1_enabled = | |
| 726 (ssl_config_.version_min <= SSL_PROTOCOL_VERSION_TLS1_1 && | |
| 727 ssl_config_.version_max >= SSL_PROTOCOL_VERSION_TLS1_1); | |
| 728 options.ConfigureFlag(SSL_OP_NO_TLSv1_1, !tls1_1_enabled); | |
| 729 bool tls1_2_enabled = | |
| 730 (ssl_config_.version_min <= SSL_PROTOCOL_VERSION_TLS1_2 && | |
| 731 ssl_config_.version_max >= SSL_PROTOCOL_VERSION_TLS1_2); | |
| 732 options.ConfigureFlag(SSL_OP_NO_TLSv1_2, !tls1_2_enabled); | |
| 733 | |
| 734 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true); | 721 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true); |
| 735 | 722 |
| 736 // TODO(joth): Set this conditionally, see http://crbug.com/55410 | 723 // TODO(joth): Set this conditionally, see http://crbug.com/55410 |
| 737 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true); | 724 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true); |
| 738 | 725 |
| 739 SSL_set_options(ssl_, options.set_mask); | 726 SSL_set_options(ssl_, options.set_mask); |
| 740 SSL_clear_options(ssl_, options.clear_mask); | 727 SSL_clear_options(ssl_, options.clear_mask); |
| 741 | 728 |
| 742 // Same as above, this time for the SSL mode. | 729 // Same as above, this time for the SSL mode. |
| 743 SslSetClearMask mode; | 730 SslSetClearMask mode; |
| (...skipping 1129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1873 | 1860 |
| 1874 std::string SSLClientSocketOpenSSL::GetSessionCacheKey() const { | 1861 std::string SSLClientSocketOpenSSL::GetSessionCacheKey() const { |
| 1875 std::string result = host_and_port_.ToString(); | 1862 std::string result = host_and_port_.ToString(); |
| 1876 result.append("/"); | 1863 result.append("/"); |
| 1877 result.append(ssl_session_cache_shard_); | 1864 result.append(ssl_session_cache_shard_); |
| 1878 | 1865 |
| 1879 // Shard the session cache based on maximum protocol version. This causes | 1866 // Shard the session cache based on maximum protocol version. This causes |
| 1880 // fallback connections to use a separate session cache. | 1867 // fallback connections to use a separate session cache. |
| 1881 result.append("/"); | 1868 result.append("/"); |
| 1882 switch (ssl_config_.version_max) { | 1869 switch (ssl_config_.version_max) { |
| 1883 case SSL_PROTOCOL_VERSION_SSL3: | |
| 1884 result.append("ssl3"); | |
| 1885 break; | |
| 1886 case SSL_PROTOCOL_VERSION_TLS1: | 1870 case SSL_PROTOCOL_VERSION_TLS1: |
| 1887 result.append("tls1"); | 1871 result.append("tls1"); |
| 1888 break; | 1872 break; |
| 1889 case SSL_PROTOCOL_VERSION_TLS1_1: | 1873 case SSL_PROTOCOL_VERSION_TLS1_1: |
| 1890 result.append("tls1.1"); | 1874 result.append("tls1.1"); |
| 1891 break; | 1875 break; |
| 1892 case SSL_PROTOCOL_VERSION_TLS1_2: | 1876 case SSL_PROTOCOL_VERSION_TLS1_2: |
| 1893 result.append("tls1.2"); | 1877 result.append("tls1.2"); |
| 1894 break; | 1878 break; |
| 1895 default: | 1879 default: |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 1914 } | 1898 } |
| 1915 return false; | 1899 return false; |
| 1916 } | 1900 } |
| 1917 | 1901 |
| 1918 scoped_refptr<X509Certificate> | 1902 scoped_refptr<X509Certificate> |
| 1919 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { | 1903 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
| 1920 return server_cert_; | 1904 return server_cert_; |
| 1921 } | 1905 } |
| 1922 | 1906 |
| 1923 } // namespace net | 1907 } // namespace net |
| OLD | NEW |