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

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

Issue 2155753002: Enable Expect-Staple in SSLClientSocket. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ocsp-reporting
Patch Set: Rebase / Add QUIC todo Created 4 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
« no previous file with comments | « net/socket/ssl_client_socket_impl.h ('k') | net/url_request/url_request_unittest.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 #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 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1212 npn_proto_.assign(reinterpret_cast<const char*>(alpn_proto), alpn_len); 1212 npn_proto_.assign(reinterpret_cast<const char*>(alpn_proto), alpn_len);
1213 npn_status_ = kNextProtoNegotiated; 1213 npn_status_ = kNextProtoNegotiated;
1214 set_negotiation_extension(kExtensionALPN); 1214 set_negotiation_extension(kExtensionALPN);
1215 } 1215 }
1216 } 1216 }
1217 1217
1218 RecordNegotiationExtension(); 1218 RecordNegotiationExtension();
1219 RecordChannelIDSupport(channel_id_service_, channel_id_sent_, 1219 RecordChannelIDSupport(channel_id_service_, channel_id_sent_,
1220 ssl_config_.channel_id_enabled); 1220 ssl_config_.channel_id_enabled);
1221 1221
1222 // Only record OCSP histograms if OCSP was requested. 1222 const uint8_t* ocsp_response_raw;
1223 if (ssl_config_.signed_cert_timestamps_enabled || 1223 size_t ocsp_response_len;
1224 cert_verifier_->SupportsOCSPStapling()) { 1224 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1225 const uint8_t* ocsp_response; 1225 std::string ocsp_response;
1226 size_t ocsp_response_len; 1226 if (ocsp_response_len > 0) {
1227 SSL_get0_ocsp_response(ssl_, &ocsp_response, &ocsp_response_len); 1227 ocsp_response_.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1228 1228 ocsp_response_len);
1229 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1230 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
1231 } 1229 }
1230 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1231 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
1232 1232
1233 const uint8_t* sct_list; 1233 const uint8_t* sct_list;
1234 size_t sct_list_len; 1234 size_t sct_list_len;
1235 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len); 1235 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len);
1236 set_signed_cert_timestamps_received(sct_list_len != 0); 1236 set_signed_cert_timestamps_received(sct_list_len != 0);
1237 1237
1238 if (IsRenegotiationAllowed()) 1238 if (IsRenegotiationAllowed())
1239 SSL_set_renegotiate_mode(ssl_, ssl_renegotiate_freely); 1239 SSL_set_renegotiate_mode(ssl_, ssl_renegotiate_freely);
1240 1240
1241 uint16_t signature_algorithm = SSL_get_peer_signature_algorithm(ssl_); 1241 uint16_t signature_algorithm = SSL_get_peer_signature_algorithm(ssl_);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 return ERR_CERT_INVALID; 1306 return ERR_CERT_INVALID;
1307 } 1307 }
1308 CertStatus cert_status; 1308 CertStatus cert_status;
1309 if (ssl_config_.IsAllowedBadCert(der_cert, &cert_status)) { 1309 if (ssl_config_.IsAllowedBadCert(der_cert, &cert_status)) {
1310 server_cert_verify_result_.Reset(); 1310 server_cert_verify_result_.Reset();
1311 server_cert_verify_result_.cert_status = cert_status; 1311 server_cert_verify_result_.cert_status = cert_status;
1312 server_cert_verify_result_.verified_cert = server_cert_; 1312 server_cert_verify_result_.verified_cert = server_cert_;
1313 return OK; 1313 return OK;
1314 } 1314 }
1315 1315
1316 std::string ocsp_response;
1317 const uint8_t* ocsp_response_raw;
1318 size_t ocsp_response_len;
1319 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1320 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1321 ocsp_response_len);
1322
1323 start_cert_verification_time_ = base::TimeTicks::Now(); 1316 start_cert_verification_time_ = base::TimeTicks::Now();
1324 1317
1325 return cert_verifier_->Verify( 1318 return cert_verifier_->Verify(
1326 CertVerifier::RequestParams(server_cert_, host_and_port_.host(), 1319 CertVerifier::RequestParams(server_cert_, host_and_port_.host(),
1327 ssl_config_.GetCertVerifyFlags(), 1320 ssl_config_.GetCertVerifyFlags(),
1328 ocsp_response, CertificateList()), 1321 ocsp_response_, CertificateList()),
1329 // TODO(davidben): Route the CRLSet through SSLConfig so 1322 // TODO(davidben): Route the CRLSet through SSLConfig so
1330 // SSLClientSocket doesn't depend on SSLConfigService. 1323 // SSLClientSocket doesn't depend on SSLConfigService.
1331 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_, 1324 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
1332 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete, 1325 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
1333 base::Unretained(this)), 1326 base::Unretained(this)),
1334 &cert_verifier_request_, net_log_); 1327 &cert_verifier_request_, net_log_);
1335 } 1328 }
1336 1329
1337 int SSLClientSocketImpl::DoVerifyCertComplete(int result) { 1330 int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
1338 cert_verifier_request_.reset(); 1331 cert_verifier_request_.reset();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1373 break; 1366 break;
1374 } 1367 }
1375 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK) 1368 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK)
1376 result = ct_result; 1369 result = ct_result;
1377 } 1370 }
1378 1371
1379 if (result == OK) { 1372 if (result == OK) {
1380 DCHECK(!certificate_verified_); 1373 DCHECK(!certificate_verified_);
1381 certificate_verified_ = true; 1374 certificate_verified_ = true;
1382 MaybeCacheSession(); 1375 MaybeCacheSession();
1376 SSLInfo ssl_info;
1377 DCHECK(GetSSLInfo(&ssl_info));
1378 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info,
1379 ocsp_response_);
1383 } 1380 }
1384 1381
1385 completed_connect_ = true; 1382 completed_connect_ = true;
1386 // Exit DoHandshakeLoop and return the result to the caller to Connect. 1383 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1387 DCHECK_EQ(STATE_NONE, next_handshake_state_); 1384 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1388 return result; 1385 return result;
1389 } 1386 }
1390 1387
1391 void SSLClientSocketImpl::DoConnectCallback(int rv) { 1388 void SSLClientSocketImpl::DoConnectCallback(int rv) {
1392 if (!user_connect_callback_.is_null()) { 1389 if (!user_connect_callback_.is_null()) {
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
1788 bytes_read = result; 1785 bytes_read = result;
1789 } 1786 }
1790 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read); 1787 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read);
1791 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_, bytes_read); 1788 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_, bytes_read);
1792 DCHECK_EQ(1, ret); 1789 DCHECK_EQ(1, ret);
1793 transport_recv_busy_ = false; 1790 transport_recv_busy_ = false;
1794 return result; 1791 return result;
1795 } 1792 }
1796 1793
1797 int SSLClientSocketImpl::VerifyCT() { 1794 int SSLClientSocketImpl::VerifyCT() {
1798 const uint8_t* ocsp_response_raw;
1799 size_t ocsp_response_len;
1800 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1801 std::string ocsp_response;
1802 if (ocsp_response_len > 0) {
1803 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1804 ocsp_response_len);
1805 }
1806
1807 const uint8_t* sct_list_raw; 1795 const uint8_t* sct_list_raw;
1808 size_t sct_list_len; 1796 size_t sct_list_len;
1809 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list_raw, &sct_list_len); 1797 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list_raw, &sct_list_len);
1810 std::string sct_list; 1798 std::string sct_list;
1811 if (sct_list_len > 0) 1799 if (sct_list_len > 0)
1812 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len); 1800 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len);
1813 1801
1814 // Note that this is a completely synchronous operation: The CT Log Verifier 1802 // Note that this is a completely synchronous operation: The CT Log Verifier
1815 // gets all the data it needs for SCT verification and does not do any 1803 // gets all the data it needs for SCT verification and does not do any
1816 // external communication. 1804 // external communication.
1817 cert_transparency_verifier_->Verify( 1805 cert_transparency_verifier_->Verify(
1818 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list, 1806 server_cert_verify_result_.verified_cert.get(), ocsp_response_, sct_list,
1819 &ct_verify_result_, net_log_); 1807 &ct_verify_result_, net_log_);
1820 1808
1821 ct_verify_result_.ct_policies_applied = true; 1809 ct_verify_result_.ct_policies_applied = true;
1822 ct_verify_result_.ev_policy_compliance = 1810 ct_verify_result_.ev_policy_compliance =
1823 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY; 1811 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
1824 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) { 1812 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
1825 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist = 1813 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1826 SSLConfigService::GetEVCertsWhitelist(); 1814 SSLConfigService::GetEVCertsWhitelist();
1827 ct::EVPolicyCompliance ev_policy_compliance = 1815 ct::EVPolicyCompliance ev_policy_compliance =
1828 policy_enforcer_->DoesConformToCTEVPolicy( 1816 policy_enforcer_->DoesConformToCTEVPolicy(
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
2348 if (rv != OK) { 2336 if (rv != OK) {
2349 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 2337 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
2350 return; 2338 return;
2351 } 2339 }
2352 2340
2353 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, 2341 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT,
2354 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this))); 2342 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
2355 } 2343 }
2356 2344
2357 } // namespace net 2345 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_impl.h ('k') | net/url_request/url_request_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698