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

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

Issue 493793003: Align SSLClientSocketOpenSSL and SSLClientSocketNSS histograms. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: asvitkine comments Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « net/socket/ssl_client_socket_openssl.h ('k') | net/socket/ssl_client_socket_pool.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // 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 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 transport_read_error_ = OK; 482 transport_read_error_ = OK;
483 transport_write_error_ = OK; 483 transport_write_error_ = OK;
484 484
485 server_cert_verify_result_.Reset(); 485 server_cert_verify_result_.Reset();
486 completed_connect_ = false; 486 completed_connect_ = false;
487 487
488 cert_authorities_.clear(); 488 cert_authorities_.clear();
489 cert_key_types_.clear(); 489 cert_key_types_.clear();
490 client_auth_cert_needed_ = false; 490 client_auth_cert_needed_ = false;
491 491
492 start_cert_verification_time_ = base::TimeTicks();
493
492 npn_status_ = kNextProtoUnsupported; 494 npn_status_ = kNextProtoUnsupported;
493 npn_proto_.clear(); 495 npn_proto_.clear();
494 496
495 channel_id_xtn_negotiated_ = false; 497 channel_id_xtn_negotiated_ = false;
496 channel_id_request_handle_.Cancel(); 498 channel_id_request_handle_.Cancel();
497 } 499 }
498 500
499 bool SSLClientSocketOpenSSL::IsConnected() const { 501 bool SSLClientSocketOpenSSL::IsConnected() const {
500 // If the handshake has not yet completed. 502 // If the handshake has not yet completed.
501 if (!completed_connect_) 503 if (!completed_connect_)
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 ssl_info->cert_status = server_cert_verify_result_.cert_status; 575 ssl_info->cert_status = server_cert_verify_result_.cert_status;
574 ssl_info->is_issued_by_known_root = 576 ssl_info->is_issued_by_known_root =
575 server_cert_verify_result_.is_issued_by_known_root; 577 server_cert_verify_result_.is_issued_by_known_root;
576 ssl_info->public_key_hashes = 578 ssl_info->public_key_hashes =
577 server_cert_verify_result_.public_key_hashes; 579 server_cert_verify_result_.public_key_hashes;
578 ssl_info->client_cert_sent = 580 ssl_info->client_cert_sent =
579 ssl_config_.send_client_cert && ssl_config_.client_cert.get(); 581 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
580 ssl_info->channel_id_sent = WasChannelIDSent(); 582 ssl_info->channel_id_sent = WasChannelIDSent();
581 ssl_info->pinning_failure_log = pinning_failure_log_; 583 ssl_info->pinning_failure_log = pinning_failure_log_;
582 584
583 RecordChannelIDSupport(channel_id_service_,
584 channel_id_xtn_negotiated_,
585 ssl_config_.channel_id_enabled,
586 crypto::ECPrivateKey::IsSupported());
587
588 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_); 585 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
589 CHECK(cipher); 586 CHECK(cipher);
590 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL); 587 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
591 588
592 ssl_info->connection_status = EncodeSSLConnectionStatus( 589 ssl_info->connection_status = EncodeSSLConnectionStatus(
593 SSL_CIPHER_get_id(cipher), 0 /* no compression */, 590 SSL_CIPHER_get_id(cipher), 0 /* no compression */,
594 GetNetSSLVersion(ssl_)); 591 GetNetSSLVersion(ssl_));
595 592
596 bool peer_supports_renego_ext = !!SSL_get_secure_renegotiation_support(ssl_); 593 if (!SSL_get_secure_renegotiation_support(ssl_))
597 if (!peer_supports_renego_ext)
598 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION; 594 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
599 UMA_HISTOGRAM_ENUMERATION("Net.RenegotiationExtensionSupported",
600 implicit_cast<int>(peer_supports_renego_ext), 2);
601 595
602 if (ssl_config_.version_fallback) 596 if (ssl_config_.version_fallback)
603 ssl_info->connection_status |= SSL_CONNECTION_VERSION_FALLBACK; 597 ssl_info->connection_status |= SSL_CONNECTION_VERSION_FALLBACK;
604 598
605 ssl_info->handshake_type = SSL_session_reused(ssl_) ? 599 ssl_info->handshake_type = SSL_session_reused(ssl_) ?
606 SSLInfo::HANDSHAKE_RESUME : SSLInfo::HANDSHAKE_FULL; 600 SSLInfo::HANDSHAKE_RESUME : SSLInfo::HANDSHAKE_FULL;
607 601
608 DVLOG(3) << "Encoded connection status: cipher suite = " 602 DVLOG(3) << "Encoded connection status: cipher suite = "
609 << SSLConnectionStatusToCipherSuite(ssl_info->connection_status) 603 << SSLConnectionStatusToCipherSuite(ssl_info->connection_status)
610 << " version = " 604 << " version = "
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 if (npn_status_ == kNextProtoUnsupported) { 877 if (npn_status_ == kNextProtoUnsupported) {
884 const uint8_t* alpn_proto = NULL; 878 const uint8_t* alpn_proto = NULL;
885 unsigned alpn_len = 0; 879 unsigned alpn_len = 0;
886 SSL_get0_alpn_selected(ssl_, &alpn_proto, &alpn_len); 880 SSL_get0_alpn_selected(ssl_, &alpn_proto, &alpn_len);
887 if (alpn_len > 0) { 881 if (alpn_len > 0) {
888 npn_proto_.assign(reinterpret_cast<const char*>(alpn_proto), alpn_len); 882 npn_proto_.assign(reinterpret_cast<const char*>(alpn_proto), alpn_len);
889 npn_status_ = kNextProtoNegotiated; 883 npn_status_ = kNextProtoNegotiated;
890 } 884 }
891 } 885 }
892 886
887 RecordChannelIDSupport(channel_id_service_,
888 channel_id_xtn_negotiated_,
889 ssl_config_.channel_id_enabled,
890 crypto::ECPrivateKey::IsSupported());
891
893 // Verify the certificate. 892 // Verify the certificate.
894 const bool got_cert = !!UpdateServerCert(); 893 const bool got_cert = !!UpdateServerCert();
895 DCHECK(got_cert); 894 DCHECK(got_cert);
896 net_log_.AddEvent( 895 net_log_.AddEvent(
897 NetLog::TYPE_SSL_CERTIFICATES_RECEIVED, 896 NetLog::TYPE_SSL_CERTIFICATES_RECEIVED,
898 base::Bind(&NetLogX509CertificateCallback, 897 base::Bind(&NetLogX509CertificateCallback,
899 base::Unretained(server_cert_.get()))); 898 base::Unretained(server_cert_.get())));
900 GotoState(STATE_VERIFY_CERT); 899 GotoState(STATE_VERIFY_CERT);
901 } else { 900 } else {
902 int ssl_error = SSL_get_error(ssl_, rv); 901 int ssl_error = SSL_get_error(ssl_, rv);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 } 971 }
973 972
974 // Return to the handshake. 973 // Return to the handshake.
975 set_channel_id_sent(true); 974 set_channel_id_sent(true);
976 GotoState(STATE_HANDSHAKE); 975 GotoState(STATE_HANDSHAKE);
977 return OK; 976 return OK;
978 } 977 }
979 978
980 int SSLClientSocketOpenSSL::DoVerifyCert(int result) { 979 int SSLClientSocketOpenSSL::DoVerifyCert(int result) {
981 DCHECK(server_cert_.get()); 980 DCHECK(server_cert_.get());
981 DCHECK(start_cert_verification_time_.is_null());
982 GotoState(STATE_VERIFY_CERT_COMPLETE); 982 GotoState(STATE_VERIFY_CERT_COMPLETE);
983 983
984 CertStatus cert_status; 984 CertStatus cert_status;
985 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) { 985 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) {
986 VLOG(1) << "Received an expected bad cert with status: " << cert_status; 986 VLOG(1) << "Received an expected bad cert with status: " << cert_status;
987 server_cert_verify_result_.Reset(); 987 server_cert_verify_result_.Reset();
988 server_cert_verify_result_.cert_status = cert_status; 988 server_cert_verify_result_.cert_status = cert_status;
989 server_cert_verify_result_.verified_cert = server_cert_; 989 server_cert_verify_result_.verified_cert = server_cert_;
990 return OK; 990 return OK;
991 } 991 }
992 992
993 start_cert_verification_time_ = base::TimeTicks::Now();
994
993 int flags = 0; 995 int flags = 0;
994 if (ssl_config_.rev_checking_enabled) 996 if (ssl_config_.rev_checking_enabled)
995 flags |= CertVerifier::VERIFY_REV_CHECKING_ENABLED; 997 flags |= CertVerifier::VERIFY_REV_CHECKING_ENABLED;
996 if (ssl_config_.verify_ev_cert) 998 if (ssl_config_.verify_ev_cert)
997 flags |= CertVerifier::VERIFY_EV_CERT; 999 flags |= CertVerifier::VERIFY_EV_CERT;
998 if (ssl_config_.cert_io_enabled) 1000 if (ssl_config_.cert_io_enabled)
999 flags |= CertVerifier::VERIFY_CERT_IO_ENABLED; 1001 flags |= CertVerifier::VERIFY_CERT_IO_ENABLED;
1000 if (ssl_config_.rev_checking_required_local_anchors) 1002 if (ssl_config_.rev_checking_required_local_anchors)
1001 flags |= CertVerifier::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS; 1003 flags |= CertVerifier::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS;
1002 verifier_.reset(new SingleRequestCertVerifier(cert_verifier_)); 1004 verifier_.reset(new SingleRequestCertVerifier(cert_verifier_));
1003 return verifier_->Verify( 1005 return verifier_->Verify(
1004 server_cert_.get(), 1006 server_cert_.get(),
1005 host_and_port_.host(), 1007 host_and_port_.host(),
1006 flags, 1008 flags,
1007 NULL /* no CRL set */, 1009 NULL /* no CRL set */,
1008 &server_cert_verify_result_, 1010 &server_cert_verify_result_,
1009 base::Bind(&SSLClientSocketOpenSSL::OnHandshakeIOComplete, 1011 base::Bind(&SSLClientSocketOpenSSL::OnHandshakeIOComplete,
1010 base::Unretained(this)), 1012 base::Unretained(this)),
1011 net_log_); 1013 net_log_);
1012 } 1014 }
1013 1015
1014 int SSLClientSocketOpenSSL::DoVerifyCertComplete(int result) { 1016 int SSLClientSocketOpenSSL::DoVerifyCertComplete(int result) {
1015 verifier_.reset(); 1017 verifier_.reset();
1016 1018
1019 if (!start_cert_verification_time_.is_null()) {
1020 base::TimeDelta verify_time =
1021 base::TimeTicks::Now() - start_cert_verification_time_;
1022 if (result == OK) {
1023 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1024 } else {
1025 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1026 }
1027 }
1028
1017 bool sni_available = ssl_config_.version_max >= SSL_PROTOCOL_VERSION_TLS1 || 1029 bool sni_available = ssl_config_.version_max >= SSL_PROTOCOL_VERSION_TLS1 ||
1018 ssl_config_.version_fallback; 1030 ssl_config_.version_fallback;
1019 const CertStatus cert_status = server_cert_verify_result_.cert_status; 1031 const CertStatus cert_status = server_cert_verify_result_.cert_status;
1020 if (transport_security_state_ && 1032 if (transport_security_state_ &&
1021 (result == OK || 1033 (result == OK ||
1022 (IsCertificateError(result) && IsCertStatusMinorError(cert_status))) && 1034 (IsCertificateError(result) && IsCertStatusMinorError(cert_status))) &&
1023 !transport_security_state_->CheckPublicKeyPins( 1035 !transport_security_state_->CheckPublicKeyPins(
1024 host_and_port_.host(), 1036 host_and_port_.host(),
1025 sni_available, 1037 sni_available,
1026 server_cert_verify_result_.is_issued_by_known_root, 1038 server_cert_verify_result_.is_issued_by_known_root,
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after
1619 if (handshake_succeeded_ && marked_session_as_good_) 1631 if (handshake_succeeded_ && marked_session_as_good_)
1620 OnHandshakeCompletion(); 1632 OnHandshakeCompletion();
1621 } 1633 }
1622 1634
1623 scoped_refptr<X509Certificate> 1635 scoped_refptr<X509Certificate>
1624 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { 1636 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const {
1625 return server_cert_; 1637 return server_cert_;
1626 } 1638 }
1627 1639
1628 } // namespace net 1640 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_openssl.h ('k') | net/socket/ssl_client_socket_pool.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698