Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(231)

Side by Side Diff: net/socket/ssl_client_socket_impl.cc

Issue 2093873002: Unwind fallback metrics and SSLFailureState. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include "net/socket/ssl_client_socket_impl.h" 5 #include "net/socket/ssl_client_socket_impl.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <openssl/bio.h> 8 #include <openssl/bio.h>
9 #include <openssl/bytestring.h> 9 #include <openssl/bytestring.h>
10 #include <openssl/err.h> 10 #include <openssl/err.h>
(...skipping 30 matching lines...) Expand all
41 #include "net/cert/ct_policy_status.h" 41 #include "net/cert/ct_policy_status.h"
42 #include "net/cert/ct_verifier.h" 42 #include "net/cert/ct_verifier.h"
43 #include "net/cert/x509_certificate_net_log_param.h" 43 #include "net/cert/x509_certificate_net_log_param.h"
44 #include "net/cert/x509_util_openssl.h" 44 #include "net/cert/x509_util_openssl.h"
45 #include "net/http/transport_security_state.h" 45 #include "net/http/transport_security_state.h"
46 #include "net/ssl/scoped_openssl_types.h" 46 #include "net/ssl/scoped_openssl_types.h"
47 #include "net/ssl/ssl_cert_request_info.h" 47 #include "net/ssl/ssl_cert_request_info.h"
48 #include "net/ssl/ssl_cipher_suite_names.h" 48 #include "net/ssl/ssl_cipher_suite_names.h"
49 #include "net/ssl/ssl_client_session_cache.h" 49 #include "net/ssl/ssl_client_session_cache.h"
50 #include "net/ssl/ssl_connection_status_flags.h" 50 #include "net/ssl/ssl_connection_status_flags.h"
51 #include "net/ssl/ssl_failure_state.h"
52 #include "net/ssl/ssl_info.h" 51 #include "net/ssl/ssl_info.h"
53 #include "net/ssl/ssl_private_key.h" 52 #include "net/ssl/ssl_private_key.h"
54 #include "net/ssl/token_binding.h" 53 #include "net/ssl/token_binding.h"
55 54
56 #if !defined(OS_NACL) 55 #if !defined(OS_NACL)
57 #include "net/ssl/ssl_key_logger.h" 56 #include "net/ssl/ssl_key_logger.h"
58 #endif 57 #endif
59 58
60 #if defined(USE_NSS_CERTS) 59 #if defined(USE_NSS_CERTS)
61 #include "net/cert_net/nss_ocsp.h" 60 #include "net/cert_net/nss_ocsp.h"
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 transport_(std::move(transport_socket)), 503 transport_(std::move(transport_socket)),
505 host_and_port_(host_and_port), 504 host_and_port_(host_and_port),
506 ssl_config_(ssl_config), 505 ssl_config_(ssl_config),
507 ssl_session_cache_shard_(context.ssl_session_cache_shard), 506 ssl_session_cache_shard_(context.ssl_session_cache_shard),
508 next_handshake_state_(STATE_NONE), 507 next_handshake_state_(STATE_NONE),
509 disconnected_(false), 508 disconnected_(false),
510 npn_status_(kNextProtoUnsupported), 509 npn_status_(kNextProtoUnsupported),
511 channel_id_sent_(false), 510 channel_id_sent_(false),
512 session_pending_(false), 511 session_pending_(false),
513 certificate_verified_(false), 512 certificate_verified_(false),
514 ssl_failure_state_(SSL_FAILURE_NONE),
515 signature_result_(kNoPendingResult), 513 signature_result_(kNoPendingResult),
516 transport_security_state_(context.transport_security_state), 514 transport_security_state_(context.transport_security_state),
517 policy_enforcer_(context.ct_policy_enforcer), 515 policy_enforcer_(context.ct_policy_enforcer),
518 pkp_bypassed_(false), 516 pkp_bypassed_(false),
519 net_log_(transport_->socket()->NetLog()), 517 net_log_(transport_->socket()->NetLog()),
520 weak_factory_(this) { 518 weak_factory_(this) {
521 DCHECK(cert_verifier_); 519 DCHECK(cert_verifier_);
522 DCHECK(transport_security_state_); 520 DCHECK(transport_security_state_);
523 DCHECK(policy_enforcer_); 521 DCHECK(policy_enforcer_);
524 } 522 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 return ERR_FAILED; 580 return ERR_FAILED;
583 581
584 tb_signed_ekm_map_.Put(raw_public_key, *out); 582 tb_signed_ekm_map_.Put(raw_public_key, *out);
585 return OK; 583 return OK;
586 } 584 }
587 585
588 crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const { 586 crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
589 return channel_id_key_.get(); 587 return channel_id_key_.get();
590 } 588 }
591 589
592 SSLFailureState SSLClientSocketImpl::GetSSLFailureState() const {
593 return ssl_failure_state_;
594 }
595
596 int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label, 590 int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
597 bool has_context, 591 bool has_context,
598 const base::StringPiece& context, 592 const base::StringPiece& context,
599 unsigned char* out, 593 unsigned char* out,
600 unsigned int outlen) { 594 unsigned int outlen) {
601 if (!IsConnected()) 595 if (!IsConnected())
602 return ERR_SOCKET_NOT_CONNECTED; 596 return ERR_SOCKET_NOT_CONNECTED;
603 597
604 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 598 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
605 599
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 start_cert_verification_time_ = base::TimeTicks(); 694 start_cert_verification_time_ = base::TimeTicks();
701 695
702 npn_status_ = kNextProtoUnsupported; 696 npn_status_ = kNextProtoUnsupported;
703 npn_proto_.clear(); 697 npn_proto_.clear();
704 698
705 channel_id_sent_ = false; 699 channel_id_sent_ = false;
706 tb_was_negotiated_ = false; 700 tb_was_negotiated_ = false;
707 session_pending_ = false; 701 session_pending_ = false;
708 certificate_verified_ = false; 702 certificate_verified_ = false;
709 channel_id_request_.Cancel(); 703 channel_id_request_.Cancel();
710 ssl_failure_state_ = SSL_FAILURE_NONE;
711 704
712 signature_result_ = kNoPendingResult; 705 signature_result_ = kNoPendingResult;
713 signature_.clear(); 706 signature_.clear();
714 } 707 }
715 708
716 bool SSLClientSocketImpl::IsConnected() const { 709 bool SSLClientSocketImpl::IsConnected() const {
717 // If the handshake has not yet completed. 710 // If the handshake has not yet completed.
718 if (!completed_connect_) 711 if (!completed_connect_)
719 return false; 712 return false;
720 // If an asynchronous operation is still pending. 713 // If an asynchronous operation is still pending.
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 // If not done, stay in this state 1122 // If not done, stay in this state
1130 next_handshake_state_ = STATE_HANDSHAKE; 1123 next_handshake_state_ = STATE_HANDSHAKE;
1131 return ERR_IO_PENDING; 1124 return ERR_IO_PENDING;
1132 } 1125 }
1133 1126
1134 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code " 1127 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1135 << ssl_error << ", net_error " << net_error; 1128 << ssl_error << ", net_error " << net_error;
1136 net_log_.AddEvent( 1129 net_log_.AddEvent(
1137 NetLog::TYPE_SSL_HANDSHAKE_ERROR, 1130 NetLog::TYPE_SSL_HANDSHAKE_ERROR,
1138 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info)); 1131 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1139
1140 // Classify the handshake failure. This is used to determine causes of the
1141 // TLS version fallback.
1142
1143 // |cipher| is the current outgoing cipher suite, so it is non-null iff
1144 // ChangeCipherSpec was sent.
1145 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
1146 if (SSL_get_state(ssl_) == SSL3_ST_CR_SRVR_HELLO_A) {
1147 ssl_failure_state_ = SSL_FAILURE_CLIENT_HELLO;
1148 } else if (cipher && (SSL_CIPHER_get_id(cipher) ==
1149 TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 ||
1150 SSL_CIPHER_get_id(cipher) ==
1151 TLS1_CK_RSA_WITH_AES_128_GCM_SHA256)) {
1152 ssl_failure_state_ = SSL_FAILURE_BUGGY_GCM;
1153 } else if (cipher && ssl_config_.send_client_cert) {
1154 ssl_failure_state_ = SSL_FAILURE_CLIENT_AUTH;
1155 } else if (ERR_GET_LIB(error_info.error_code) == ERR_LIB_SSL &&
1156 ERR_GET_REASON(error_info.error_code) ==
1157 SSL_R_OLD_SESSION_VERSION_NOT_RETURNED) {
1158 ssl_failure_state_ = SSL_FAILURE_SESSION_MISMATCH;
1159 } else if (cipher && npn_status_ != kNextProtoUnsupported) {
1160 ssl_failure_state_ = SSL_FAILURE_NEXT_PROTO;
1161 } else {
1162 ssl_failure_state_ = SSL_FAILURE_UNKNOWN;
1163 }
1164 } 1132 }
1165 1133
1166 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE; 1134 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
1167 return net_error; 1135 return net_error;
1168 } 1136 }
1169 1137
1170 int SSLClientSocketImpl::DoHandshakeComplete(int result) { 1138 int SSLClientSocketImpl::DoHandshakeComplete(int result) {
1171 if (result < 0) 1139 if (result < 0)
1172 return result; 1140 return result;
1173 1141
(...skipping 1139 matching lines...) Expand 10 before | Expand all | Expand 10 after
2313 if (rv != OK) { 2281 if (rv != OK) {
2314 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 2282 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
2315 return; 2283 return;
2316 } 2284 }
2317 2285
2318 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, 2286 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT,
2319 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this))); 2287 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
2320 } 2288 }
2321 2289
2322 } // namespace net 2290 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698