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 825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
836 } | 836 } |
837 | 837 |
838 if (cert_verifier_->SupportsOCSPStapling()) | 838 if (cert_verifier_->SupportsOCSPStapling()) |
839 SSL_enable_ocsp_stapling(ssl_); | 839 SSL_enable_ocsp_stapling(ssl_); |
840 | 840 |
841 // Enable fastradio padding. | 841 // Enable fastradio padding. |
842 SSL_enable_fastradio_padding(ssl_, | 842 SSL_enable_fastradio_padding(ssl_, |
843 ssl_config_.fastradio_padding_enabled && | 843 ssl_config_.fastradio_padding_enabled && |
844 ssl_config_.fastradio_padding_eligible); | 844 ssl_config_.fastradio_padding_eligible); |
845 | 845 |
846 // By default, renegotiations are rejected. After the initial handshake | |
847 // completes, some application protocols may re-enable it. | |
848 SSL_set_reject_peer_renegotiations(ssl_, 1); | |
849 | |
846 return OK; | 850 return OK; |
847 } | 851 } |
848 | 852 |
849 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { | 853 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { |
850 // Since Run may result in Read being called, clear |user_read_callback_| | 854 // Since Run may result in Read being called, clear |user_read_callback_| |
851 // up front. | 855 // up front. |
852 if (rv > 0) | 856 if (rv > 0) |
853 was_ever_used_ = true; | 857 was_ever_used_ = true; |
854 user_read_buf_ = NULL; | 858 user_read_buf_ = NULL; |
855 user_read_buf_len_ = 0; | 859 user_read_buf_len_ = 0; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
903 tracked_objects::ScopedTracker tracking_profile( | 907 tracked_objects::ScopedTracker tracking_profile( |
904 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()")); | 908 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()")); |
905 | 909 |
906 rv = SSL_do_handshake(ssl_); | 910 rv = SSL_do_handshake(ssl_); |
907 } else { | 911 } else { |
908 g_first_run_completed.Get().Set(true); | 912 g_first_run_completed.Get().Set(true); |
909 rv = SSL_do_handshake(ssl_); | 913 rv = SSL_do_handshake(ssl_); |
910 } | 914 } |
911 } | 915 } |
912 | 916 |
913 if (rv == 1) { | 917 if (rv == 1) { |
davidben
2015/05/08 21:34:28
This function's getting slightly unwieldy. I'll re
| |
914 if (ssl_config_.version_fallback && | 918 if (ssl_config_.version_fallback && |
915 ssl_config_.version_max < ssl_config_.version_fallback_min) { | 919 ssl_config_.version_max < ssl_config_.version_fallback_min) { |
916 return ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION; | 920 return ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION; |
917 } | 921 } |
918 | 922 |
919 // SSL handshake is completed. If NPN wasn't negotiated, see if ALPN was. | 923 // SSL handshake is completed. If NPN wasn't negotiated, see if ALPN was. |
920 if (npn_status_ == kNextProtoUnsupported) { | 924 if (npn_status_ == kNextProtoUnsupported) { |
921 const uint8_t* alpn_proto = NULL; | 925 const uint8_t* alpn_proto = NULL; |
922 unsigned alpn_len = 0; | 926 unsigned alpn_len = 0; |
923 SSL_get0_alpn_selected(ssl_, &alpn_proto, &alpn_len); | 927 SSL_get0_alpn_selected(ssl_, &alpn_proto, &alpn_len); |
(...skipping 18 matching lines...) Expand all Loading... | |
942 | 946 |
943 set_stapled_ocsp_response_received(ocsp_response_len != 0); | 947 set_stapled_ocsp_response_received(ocsp_response_len != 0); |
944 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0); | 948 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0); |
945 } | 949 } |
946 | 950 |
947 const uint8_t* sct_list; | 951 const uint8_t* sct_list; |
948 size_t sct_list_len; | 952 size_t sct_list_len; |
949 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len); | 953 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len); |
950 set_signed_cert_timestamps_received(sct_list_len != 0); | 954 set_signed_cert_timestamps_received(sct_list_len != 0); |
951 | 955 |
956 if (IsRenegotiationAllowed()) | |
957 SSL_set_reject_peer_renegotiations(ssl_, 0); | |
958 | |
952 // Verify the certificate. | 959 // Verify the certificate. |
953 UpdateServerCert(); | 960 UpdateServerCert(); |
954 GotoState(STATE_VERIFY_CERT); | 961 GotoState(STATE_VERIFY_CERT); |
955 } else { | 962 } else { |
956 if (client_auth_cert_needed_) | 963 if (client_auth_cert_needed_) |
957 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED; | 964 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED; |
958 | 965 |
959 int ssl_error = SSL_get_error(ssl_, rv); | 966 int ssl_error = SSL_get_error(ssl_, rv); |
960 | 967 |
961 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) { | 968 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) { |
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1879 NOTREACHED(); | 1886 NOTREACHED(); |
1880 } | 1887 } |
1881 | 1888 |
1882 result.append("/"); | 1889 result.append("/"); |
1883 if (ssl_config_.enable_deprecated_cipher_suites) | 1890 if (ssl_config_.enable_deprecated_cipher_suites) |
1884 result.append("deprecated"); | 1891 result.append("deprecated"); |
1885 | 1892 |
1886 return result; | 1893 return result; |
1887 } | 1894 } |
1888 | 1895 |
1896 bool SSLClientSocketOpenSSL::IsRenegotiationAllowed() const { | |
1897 if (npn_status_ == kNextProtoUnsupported) | |
1898 return ssl_config_.renego_allowed_default; | |
1899 | |
1900 NextProto next_proto = NextProtoFromString(npn_proto_); | |
1901 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) { | |
1902 if (next_proto == allowed) | |
1903 return true; | |
1904 } | |
1905 return false; | |
1906 } | |
1907 | |
1889 scoped_refptr<X509Certificate> | 1908 scoped_refptr<X509Certificate> |
1890 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { | 1909 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
1891 return server_cert_; | 1910 return server_cert_; |
1892 } | 1911 } |
1893 | 1912 |
1894 } // namespace net | 1913 } // namespace net |
OLD | NEW |