| 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/bio.h> | 11 #include <openssl/bio.h> |
| 12 #include <openssl/err.h> | 12 #include <openssl/err.h> |
| 13 #include <openssl/ssl.h> | 13 #include <openssl/ssl.h> |
| 14 | 14 |
| 15 #include "base/bind.h" | 15 #include "base/bind.h" |
| 16 #include "base/callback_helpers.h" | 16 #include "base/callback_helpers.h" |
| 17 #include "base/environment.h" | 17 #include "base/environment.h" |
| 18 #include "base/memory/singleton.h" | 18 #include "base/memory/singleton.h" |
| 19 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
| 20 #include "base/strings/string_piece.h" | 20 #include "base/strings/string_piece.h" |
| 21 #include "base/synchronization/lock.h" | 21 #include "base/synchronization/lock.h" |
| 22 #include "crypto/ec_private_key.h" | 22 #include "crypto/ec_private_key.h" |
| 23 #include "crypto/openssl_util.h" | 23 #include "crypto/openssl_util.h" |
| 24 #include "crypto/scoped_openssl_types.h" | 24 #include "crypto/scoped_openssl_types.h" |
| 25 #include "net/base/net_errors.h" | 25 #include "net/base/net_errors.h" |
| 26 #include "net/cert/cert_verifier.h" | 26 #include "net/cert/cert_verifier.h" |
| 27 #include "net/cert/ct_verifier.h" | 27 #include "net/cert/ct_verifier.h" |
| 28 #include "net/cert/single_request_cert_verifier.h" | 28 #include "net/cert/single_request_cert_verifier.h" |
| 29 #include "net/cert/x509_certificate_net_log_param.h" | 29 #include "net/cert/x509_certificate_net_log_param.h" |
| 30 #include "net/cert/x509_util_openssl.h" |
| 30 #include "net/http/transport_security_state.h" | 31 #include "net/http/transport_security_state.h" |
| 31 #include "net/socket/ssl_session_cache_openssl.h" | 32 #include "net/socket/ssl_session_cache_openssl.h" |
| 32 #include "net/ssl/openssl_ssl_util.h" | 33 #include "net/ssl/openssl_ssl_util.h" |
| 33 #include "net/ssl/ssl_cert_request_info.h" | 34 #include "net/ssl/ssl_cert_request_info.h" |
| 34 #include "net/ssl/ssl_connection_status_flags.h" | 35 #include "net/ssl/ssl_connection_status_flags.h" |
| 35 #include "net/ssl/ssl_info.h" | 36 #include "net/ssl/ssl_info.h" |
| 36 | 37 |
| 37 #if defined(OS_WIN) | 38 #if defined(OS_WIN) |
| 38 #include "base/win/windows_version.h" | 39 #include "base/win/windows_version.h" |
| 39 #endif | 40 #endif |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 ~PeerCertificateChain() {} | 245 ~PeerCertificateChain() {} |
| 245 PeerCertificateChain& operator=(const PeerCertificateChain& other); | 246 PeerCertificateChain& operator=(const PeerCertificateChain& other); |
| 246 | 247 |
| 247 // Resets the PeerCertificateChain to the set of certificates in|chain|, | 248 // Resets the PeerCertificateChain to the set of certificates in|chain|, |
| 248 // which may be NULL, indicating to empty the store certificates. | 249 // which may be NULL, indicating to empty the store certificates. |
| 249 // Note: If an error occurs, such as being unable to parse the certificates, | 250 // Note: If an error occurs, such as being unable to parse the certificates, |
| 250 // this will behave as if Reset(NULL) was called. | 251 // this will behave as if Reset(NULL) was called. |
| 251 void Reset(STACK_OF(X509)* chain); | 252 void Reset(STACK_OF(X509)* chain); |
| 252 | 253 |
| 253 // Note that when USE_OPENSSL is defined, OSCertHandle is X509* | 254 // Note that when USE_OPENSSL is defined, OSCertHandle is X509* |
| 254 const scoped_refptr<X509Certificate>& AsOSChain() const { return os_chain_; } | 255 scoped_refptr<X509Certificate> AsOSChain() const; |
| 255 | 256 |
| 256 size_t size() const { | 257 size_t size() const { |
| 257 if (!openssl_chain_.get()) | 258 if (!openssl_chain_.get()) |
| 258 return 0; | 259 return 0; |
| 259 return sk_X509_num(openssl_chain_.get()); | 260 return sk_X509_num(openssl_chain_.get()); |
| 260 } | 261 } |
| 261 | 262 |
| 262 X509* operator[](size_t index) const { | 263 bool empty() const { |
| 264 return size() == 0; |
| 265 } |
| 266 |
| 267 X509* Get(size_t index) const { |
| 263 DCHECK_LT(index, size()); | 268 DCHECK_LT(index, size()); |
| 264 return sk_X509_value(openssl_chain_.get(), index); | 269 return sk_X509_value(openssl_chain_.get(), index); |
| 265 } | 270 } |
| 266 | 271 |
| 267 bool IsValid() { return os_chain_.get() && openssl_chain_.get(); } | |
| 268 | |
| 269 private: | 272 private: |
| 270 ScopedX509Stack openssl_chain_; | 273 ScopedX509Stack openssl_chain_; |
| 271 | |
| 272 scoped_refptr<X509Certificate> os_chain_; | |
| 273 }; | 274 }; |
| 274 | 275 |
| 275 SSLClientSocketOpenSSL::PeerCertificateChain& | 276 SSLClientSocketOpenSSL::PeerCertificateChain& |
| 276 SSLClientSocketOpenSSL::PeerCertificateChain::operator=( | 277 SSLClientSocketOpenSSL::PeerCertificateChain::operator=( |
| 277 const PeerCertificateChain& other) { | 278 const PeerCertificateChain& other) { |
| 278 if (this == &other) | 279 if (this == &other) |
| 279 return *this; | 280 return *this; |
| 280 | 281 |
| 281 // os_chain_ is reference counted by scoped_refptr; | |
| 282 os_chain_ = other.os_chain_; | |
| 283 | |
| 284 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get())); | 282 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get())); |
| 285 | |
| 286 return *this; | 283 return *this; |
| 287 } | 284 } |
| 288 | 285 |
| 289 #if defined(USE_OPENSSL_CERTS) | |
| 290 // When OSCertHandle is typedef'ed to X509, this implementation does a short cut | |
| 291 // to avoid converting back and forth between der and X509 struct. | |
| 292 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( | 286 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( |
| 293 STACK_OF(X509)* chain) { | 287 STACK_OF(X509)* chain) { |
| 294 openssl_chain_.reset(NULL); | 288 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL); |
| 295 os_chain_ = NULL; | 289 } |
| 296 | 290 |
| 297 if (!chain) | 291 scoped_refptr<X509Certificate> |
| 298 return; | 292 SSLClientSocketOpenSSL::PeerCertificateChain::AsOSChain() const { |
| 293 #if defined(USE_OPENSSL_CERTS) |
| 294 // When OSCertHandle is typedef'ed to X509, this implementation does a short |
| 295 // cut to avoid converting back and forth between DER and the X509 struct. |
| 296 X509Certificate::OSCertHandles intermediates; |
| 297 for (size_t i = 1; i < sk_X509_num(openssl_chain_.get()); ++i) { |
| 298 intermediates.push_back(sk_X509_value(openssl_chain_.get(), i)); |
| 299 } |
| 299 | 300 |
| 300 X509Certificate::OSCertHandles intermediates; | 301 return make_scoped_refptr(X509Certificate::CreateFromHandle( |
| 301 for (size_t i = 1; i < sk_X509_num(chain); ++i) | 302 sk_X509_value(openssl_chain_.get(), 0), intermediates)); |
| 302 intermediates.push_back(sk_X509_value(chain, i)); | 303 #else |
| 303 | 304 // DER-encode the chain and convert to a platform certificate handle. |
| 304 os_chain_ = | |
| 305 X509Certificate::CreateFromHandle(sk_X509_value(chain, 0), intermediates); | |
| 306 | |
| 307 openssl_chain_.reset(X509_chain_up_ref(chain)); | |
| 308 } | |
| 309 #else // !defined(USE_OPENSSL_CERTS) | |
| 310 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( | |
| 311 STACK_OF(X509)* chain) { | |
| 312 openssl_chain_.reset(NULL); | |
| 313 os_chain_ = NULL; | |
| 314 | |
| 315 if (!chain) | |
| 316 return; | |
| 317 | |
| 318 openssl_chain_.reset(X509_chain_up_ref(chain)); | |
| 319 | |
| 320 std::vector<base::StringPiece> der_chain; | 305 std::vector<base::StringPiece> der_chain; |
| 321 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { | 306 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { |
| 322 X509* x = sk_X509_value(openssl_chain_.get(), i); | 307 X509* x = sk_X509_value(openssl_chain_.get(), i); |
| 323 | 308 base::StringPiece der; |
| 324 unsigned char* cert_data = NULL; | 309 if (!x509_util::GetDERAndCacheIfNeeded(x, &der)) |
| 325 int cert_data_length = i2d_X509(x, &cert_data); | 310 return NULL; |
| 326 if (cert_data_length && cert_data) | 311 der_chain.push_back(der); |
| 327 der_chain.push_back(base::StringPiece(reinterpret_cast<char*>(cert_data), | |
| 328 cert_data_length)); | |
| 329 } | 312 } |
| 330 | 313 |
| 331 os_chain_ = X509Certificate::CreateFromDERCertChain(der_chain); | 314 return make_scoped_refptr(X509Certificate::CreateFromDERCertChain(der_chain)); |
| 332 | 315 #endif |
| 333 for (size_t i = 0; i < der_chain.size(); ++i) { | |
| 334 OPENSSL_free(const_cast<char*>(der_chain[i].data())); | |
| 335 } | |
| 336 | |
| 337 if (der_chain.size() != | |
| 338 static_cast<size_t>(sk_X509_num(openssl_chain_.get()))) { | |
| 339 openssl_chain_.reset(NULL); | |
| 340 os_chain_ = NULL; | |
| 341 } | |
| 342 } | 316 } |
| 343 #endif // defined(USE_OPENSSL_CERTS) | |
| 344 | 317 |
| 345 // static | 318 // static |
| 346 SSLSessionCacheOpenSSL::Config | 319 SSLSessionCacheOpenSSL::Config |
| 347 SSLClientSocketOpenSSL::SSLContext::kDefaultSessionCacheConfig = { | 320 SSLClientSocketOpenSSL::SSLContext::kDefaultSessionCacheConfig = { |
| 348 &GetSessionCacheKey, // key_func | 321 &GetSessionCacheKey, // key_func |
| 349 1024, // max_entries | 322 1024, // max_entries |
| 350 256, // expiration_check_count | 323 256, // expiration_check_count |
| 351 60 * 60, // timeout_seconds | 324 60 * 60, // timeout_seconds |
| 352 }; | 325 }; |
| 353 | 326 |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const { | 579 bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const { |
| 607 if (transport_.get() && transport_->socket()) | 580 if (transport_.get() && transport_->socket()) |
| 608 return transport_->socket()->UsingTCPFastOpen(); | 581 return transport_->socket()->UsingTCPFastOpen(); |
| 609 | 582 |
| 610 NOTREACHED(); | 583 NOTREACHED(); |
| 611 return false; | 584 return false; |
| 612 } | 585 } |
| 613 | 586 |
| 614 bool SSLClientSocketOpenSSL::GetSSLInfo(SSLInfo* ssl_info) { | 587 bool SSLClientSocketOpenSSL::GetSSLInfo(SSLInfo* ssl_info) { |
| 615 ssl_info->Reset(); | 588 ssl_info->Reset(); |
| 616 if (!server_cert_.get()) | 589 if (server_cert_chain_->empty()) |
| 617 return false; | 590 return false; |
| 618 | 591 |
| 619 ssl_info->cert = server_cert_verify_result_.verified_cert; | 592 ssl_info->cert = server_cert_verify_result_.verified_cert; |
| 620 ssl_info->cert_status = server_cert_verify_result_.cert_status; | 593 ssl_info->cert_status = server_cert_verify_result_.cert_status; |
| 621 ssl_info->is_issued_by_known_root = | 594 ssl_info->is_issued_by_known_root = |
| 622 server_cert_verify_result_.is_issued_by_known_root; | 595 server_cert_verify_result_.is_issued_by_known_root; |
| 623 ssl_info->public_key_hashes = | 596 ssl_info->public_key_hashes = |
| 624 server_cert_verify_result_.public_key_hashes; | 597 server_cert_verify_result_.public_key_hashes; |
| 625 ssl_info->client_cert_sent = | 598 ssl_info->client_cert_sent = |
| 626 ssl_config_.send_client_cert && ssl_config_.client_cert.get(); | 599 ssl_config_.send_client_cert && ssl_config_.client_cert.get(); |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 954 size_t ocsp_response_len; | 927 size_t ocsp_response_len; |
| 955 SSL_get0_ocsp_response(ssl_, &ocsp_response, &ocsp_response_len); | 928 SSL_get0_ocsp_response(ssl_, &ocsp_response, &ocsp_response_len); |
| 956 set_stapled_ocsp_response_received(ocsp_response_len != 0); | 929 set_stapled_ocsp_response_received(ocsp_response_len != 0); |
| 957 | 930 |
| 958 uint8_t* sct_list; | 931 uint8_t* sct_list; |
| 959 size_t sct_list_len; | 932 size_t sct_list_len; |
| 960 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len); | 933 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len); |
| 961 set_signed_cert_timestamps_received(sct_list_len != 0); | 934 set_signed_cert_timestamps_received(sct_list_len != 0); |
| 962 | 935 |
| 963 // Verify the certificate. | 936 // Verify the certificate. |
| 964 const bool got_cert = !!UpdateServerCert(); | 937 UpdateServerCert(); |
| 965 DCHECK(got_cert); | |
| 966 net_log_.AddEvent( | |
| 967 NetLog::TYPE_SSL_CERTIFICATES_RECEIVED, | |
| 968 base::Bind(&NetLogX509CertificateCallback, | |
| 969 base::Unretained(server_cert_.get()))); | |
| 970 GotoState(STATE_VERIFY_CERT); | 938 GotoState(STATE_VERIFY_CERT); |
| 971 } else { | 939 } else { |
| 972 int ssl_error = SSL_get_error(ssl_, rv); | 940 int ssl_error = SSL_get_error(ssl_, rv); |
| 973 | 941 |
| 974 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) { | 942 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) { |
| 975 // The server supports channel ID. Stop to look one up before returning to | 943 // The server supports channel ID. Stop to look one up before returning to |
| 976 // the handshake. | 944 // the handshake. |
| 977 channel_id_xtn_negotiated_ = true; | 945 channel_id_xtn_negotiated_ = true; |
| 978 GotoState(STATE_CHANNEL_ID_LOOKUP); | 946 GotoState(STATE_CHANNEL_ID_LOOKUP); |
| 979 return OK; | 947 return OK; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1042 return MapOpenSSLError(err, err_tracer); | 1010 return MapOpenSSLError(err, err_tracer); |
| 1043 } | 1011 } |
| 1044 | 1012 |
| 1045 // Return to the handshake. | 1013 // Return to the handshake. |
| 1046 set_channel_id_sent(true); | 1014 set_channel_id_sent(true); |
| 1047 GotoState(STATE_HANDSHAKE); | 1015 GotoState(STATE_HANDSHAKE); |
| 1048 return OK; | 1016 return OK; |
| 1049 } | 1017 } |
| 1050 | 1018 |
| 1051 int SSLClientSocketOpenSSL::DoVerifyCert(int result) { | 1019 int SSLClientSocketOpenSSL::DoVerifyCert(int result) { |
| 1052 DCHECK(server_cert_.get()); | 1020 DCHECK(!server_cert_chain_->empty()); |
| 1053 DCHECK(start_cert_verification_time_.is_null()); | 1021 DCHECK(start_cert_verification_time_.is_null()); |
| 1022 |
| 1054 GotoState(STATE_VERIFY_CERT_COMPLETE); | 1023 GotoState(STATE_VERIFY_CERT_COMPLETE); |
| 1055 | 1024 |
| 1025 // If the certificate is bad and has been previously accepted, use |
| 1026 // the previous status and bypass the error. |
| 1027 base::StringPiece der_cert; |
| 1028 if (!x509_util::GetDERAndCacheIfNeeded(server_cert_chain_->Get(0), |
| 1029 &der_cert)) { |
| 1030 NOTREACHED(); |
| 1031 return ERR_CERT_INVALID; |
| 1032 } |
| 1056 CertStatus cert_status; | 1033 CertStatus cert_status; |
| 1057 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) { | 1034 if (ssl_config_.IsAllowedBadCert(der_cert, &cert_status)) { |
| 1058 VLOG(1) << "Received an expected bad cert with status: " << cert_status; | 1035 VLOG(1) << "Received an expected bad cert with status: " << cert_status; |
| 1059 server_cert_verify_result_.Reset(); | 1036 server_cert_verify_result_.Reset(); |
| 1060 server_cert_verify_result_.cert_status = cert_status; | 1037 server_cert_verify_result_.cert_status = cert_status; |
| 1061 server_cert_verify_result_.verified_cert = server_cert_; | 1038 server_cert_verify_result_.verified_cert = server_cert_; |
| 1062 return OK; | 1039 return OK; |
| 1063 } | 1040 } |
| 1064 | 1041 |
| 1042 // When running in a sandbox, it may not be possible to create an |
| 1043 // X509Certificate*, as that may depend on OS functionality blocked |
| 1044 // in the sandbox. |
| 1045 if (!server_cert_.get()) { |
| 1046 server_cert_verify_result_.Reset(); |
| 1047 server_cert_verify_result_.cert_status = CERT_STATUS_INVALID; |
| 1048 return ERR_CERT_INVALID; |
| 1049 } |
| 1050 |
| 1065 start_cert_verification_time_ = base::TimeTicks::Now(); | 1051 start_cert_verification_time_ = base::TimeTicks::Now(); |
| 1066 | 1052 |
| 1067 int flags = 0; | 1053 int flags = 0; |
| 1068 if (ssl_config_.rev_checking_enabled) | 1054 if (ssl_config_.rev_checking_enabled) |
| 1069 flags |= CertVerifier::VERIFY_REV_CHECKING_ENABLED; | 1055 flags |= CertVerifier::VERIFY_REV_CHECKING_ENABLED; |
| 1070 if (ssl_config_.verify_ev_cert) | 1056 if (ssl_config_.verify_ev_cert) |
| 1071 flags |= CertVerifier::VERIFY_EV_CERT; | 1057 flags |= CertVerifier::VERIFY_EV_CERT; |
| 1072 if (ssl_config_.cert_io_enabled) | 1058 if (ssl_config_.cert_io_enabled) |
| 1073 flags |= CertVerifier::VERIFY_CERT_IO_ENABLED; | 1059 flags |= CertVerifier::VERIFY_CERT_IO_ENABLED; |
| 1074 if (ssl_config_.rev_checking_required_local_anchors) | 1060 if (ssl_config_.rev_checking_required_local_anchors) |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1140 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { | 1126 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { |
| 1141 if (rv < OK) | 1127 if (rv < OK) |
| 1142 OnHandshakeCompletion(); | 1128 OnHandshakeCompletion(); |
| 1143 if (!user_connect_callback_.is_null()) { | 1129 if (!user_connect_callback_.is_null()) { |
| 1144 CompletionCallback c = user_connect_callback_; | 1130 CompletionCallback c = user_connect_callback_; |
| 1145 user_connect_callback_.Reset(); | 1131 user_connect_callback_.Reset(); |
| 1146 c.Run(rv > OK ? OK : rv); | 1132 c.Run(rv > OK ? OK : rv); |
| 1147 } | 1133 } |
| 1148 } | 1134 } |
| 1149 | 1135 |
| 1150 X509Certificate* SSLClientSocketOpenSSL::UpdateServerCert() { | 1136 void SSLClientSocketOpenSSL::UpdateServerCert() { |
| 1151 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_)); | 1137 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_)); |
| 1152 server_cert_ = server_cert_chain_->AsOSChain(); | 1138 server_cert_ = server_cert_chain_->AsOSChain(); |
| 1153 | 1139 |
| 1154 if (!server_cert_chain_->IsValid()) | 1140 if (server_cert_.get()) { |
| 1155 DVLOG(1) << "UpdateServerCert received invalid certificate chain from peer"; | 1141 net_log_.AddEvent( |
| 1156 | 1142 NetLog::TYPE_SSL_CERTIFICATES_RECEIVED, |
| 1157 return server_cert_.get(); | 1143 base::Bind(&NetLogX509CertificateCallback, |
| 1144 base::Unretained(server_cert_.get()))); |
| 1145 } |
| 1158 } | 1146 } |
| 1159 | 1147 |
| 1160 void SSLClientSocketOpenSSL::VerifyCT() { | 1148 void SSLClientSocketOpenSSL::VerifyCT() { |
| 1161 if (!cert_transparency_verifier_) | 1149 if (!cert_transparency_verifier_) |
| 1162 return; | 1150 return; |
| 1163 | 1151 |
| 1164 uint8_t* ocsp_response_raw; | 1152 uint8_t* ocsp_response_raw; |
| 1165 size_t ocsp_response_len; | 1153 size_t ocsp_response_len; |
| 1166 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len); | 1154 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len); |
| 1167 std::string ocsp_response; | 1155 std::string ocsp_response; |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1612 return 1; | 1600 return 1; |
| 1613 } | 1601 } |
| 1614 | 1602 |
| 1615 int SSLClientSocketOpenSSL::CertVerifyCallback(X509_STORE_CTX* store_ctx) { | 1603 int SSLClientSocketOpenSSL::CertVerifyCallback(X509_STORE_CTX* store_ctx) { |
| 1616 if (!completed_connect_) { | 1604 if (!completed_connect_) { |
| 1617 // If the first handshake hasn't completed then we accept any certificates | 1605 // If the first handshake hasn't completed then we accept any certificates |
| 1618 // because we verify after the handshake. | 1606 // because we verify after the handshake. |
| 1619 return 1; | 1607 return 1; |
| 1620 } | 1608 } |
| 1621 | 1609 |
| 1622 CHECK(server_cert_.get()); | 1610 // Disallow the server certificate to change in a renegotiation. |
| 1611 if (server_cert_chain_->empty()) { |
| 1612 LOG(ERROR) << "Received invalid certificate chain between handshakes"; |
| 1613 return 0; |
| 1614 } |
| 1615 base::StringPiece old_der, new_der; |
| 1616 if (store_ctx->cert == NULL || |
| 1617 !x509_util::GetDERAndCacheIfNeeded(server_cert_chain_->Get(0), |
| 1618 &old_der) || |
| 1619 !x509_util::GetDERAndCacheIfNeeded(store_ctx->cert, &new_der)) { |
| 1620 LOG(ERROR) << "Failed to encode certificates"; |
| 1621 return 0; |
| 1622 } |
| 1623 if (old_der != new_der) { |
| 1624 LOG(ERROR) << "Server certificate changed between handshakes"; |
| 1625 return 0; |
| 1626 } |
| 1623 | 1627 |
| 1624 PeerCertificateChain chain(store_ctx->untrusted); | 1628 return 1; |
| 1625 if (chain.IsValid() && server_cert_->Equals(chain.AsOSChain().get())) | |
| 1626 return 1; | |
| 1627 | |
| 1628 if (!chain.IsValid()) | |
| 1629 LOG(ERROR) << "Received invalid certificate chain between handshakes"; | |
| 1630 else | |
| 1631 LOG(ERROR) << "Server certificate changed between handshakes"; | |
| 1632 return 0; | |
| 1633 } | 1629 } |
| 1634 | 1630 |
| 1635 // SelectNextProtoCallback is called by OpenSSL during the handshake. If the | 1631 // SelectNextProtoCallback is called by OpenSSL during the handshake. If the |
| 1636 // server supports NPN, selects a protocol from the list that the server | 1632 // server supports NPN, selects a protocol from the list that the server |
| 1637 // provides. According to third_party/openssl/openssl/ssl/ssl_lib.c, the | 1633 // provides. According to third_party/openssl/openssl/ssl/ssl_lib.c, the |
| 1638 // callback can assume that |in| is syntactically valid. | 1634 // callback can assume that |in| is syntactically valid. |
| 1639 int SSLClientSocketOpenSSL::SelectNextProtoCallback(unsigned char** out, | 1635 int SSLClientSocketOpenSSL::SelectNextProtoCallback(unsigned char** out, |
| 1640 unsigned char* outlen, | 1636 unsigned char* outlen, |
| 1641 const unsigned char* in, | 1637 const unsigned char* in, |
| 1642 unsigned int inlen) { | 1638 unsigned int inlen) { |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1773 ct::SCT_STATUS_LOG_UNKNOWN)); | 1769 ct::SCT_STATUS_LOG_UNKNOWN)); |
| 1774 } | 1770 } |
| 1775 } | 1771 } |
| 1776 | 1772 |
| 1777 scoped_refptr<X509Certificate> | 1773 scoped_refptr<X509Certificate> |
| 1778 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { | 1774 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
| 1779 return server_cert_; | 1775 return server_cert_; |
| 1780 } | 1776 } |
| 1781 | 1777 |
| 1782 } // namespace net | 1778 } // namespace net |
| OLD | NEW |