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 #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 <string.h> | 8 #include <string.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1165 alpn_len); | 1165 alpn_len); |
1166 negotiated_protocol_ = NextProtoFromString(proto); | 1166 negotiated_protocol_ = NextProtoFromString(proto); |
1167 } | 1167 } |
1168 | 1168 |
1169 RecordNegotiatedProtocol(); | 1169 RecordNegotiatedProtocol(); |
1170 RecordChannelIDSupport(); | 1170 RecordChannelIDSupport(); |
1171 | 1171 |
1172 const uint8_t* ocsp_response_raw; | 1172 const uint8_t* ocsp_response_raw; |
1173 size_t ocsp_response_len; | 1173 size_t ocsp_response_len; |
1174 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len); | 1174 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len); |
1175 std::string ocsp_response; | |
1176 if (ocsp_response_len > 0) { | |
1177 ocsp_response_.assign(reinterpret_cast<const char*>(ocsp_response_raw), | |
1178 ocsp_response_len); | |
1179 } | |
1180 set_stapled_ocsp_response_received(ocsp_response_len != 0); | 1175 set_stapled_ocsp_response_received(ocsp_response_len != 0); |
1181 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0); | 1176 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0); |
1182 | 1177 |
1183 const uint8_t* sct_list; | 1178 const uint8_t* sct_list; |
1184 size_t sct_list_len; | 1179 size_t sct_list_len; |
1185 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list, &sct_list_len); | 1180 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list, &sct_list_len); |
1186 set_signed_cert_timestamps_received(sct_list_len != 0); | 1181 set_signed_cert_timestamps_received(sct_list_len != 0); |
1187 | 1182 |
1188 if (IsRenegotiationAllowed()) | 1183 if (IsRenegotiationAllowed()) |
1189 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_freely); | 1184 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_freely); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1251 CertStatus cert_status; | 1246 CertStatus cert_status; |
1252 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) { | 1247 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) { |
1253 server_cert_verify_result_.Reset(); | 1248 server_cert_verify_result_.Reset(); |
1254 server_cert_verify_result_.cert_status = cert_status; | 1249 server_cert_verify_result_.cert_status = cert_status; |
1255 server_cert_verify_result_.verified_cert = server_cert_; | 1250 server_cert_verify_result_.verified_cert = server_cert_; |
1256 return OK; | 1251 return OK; |
1257 } | 1252 } |
1258 | 1253 |
1259 start_cert_verification_time_ = base::TimeTicks::Now(); | 1254 start_cert_verification_time_ = base::TimeTicks::Now(); |
1260 | 1255 |
| 1256 const uint8_t* ocsp_response_raw; |
| 1257 size_t ocsp_response_len; |
| 1258 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len); |
| 1259 base::StringPiece ocsp_response( |
| 1260 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len); |
| 1261 |
1261 return cert_verifier_->Verify( | 1262 return cert_verifier_->Verify( |
1262 CertVerifier::RequestParams(server_cert_, host_and_port_.host(), | 1263 CertVerifier::RequestParams(server_cert_, host_and_port_.host(), |
1263 ssl_config_.GetCertVerifyFlags(), | 1264 ssl_config_.GetCertVerifyFlags(), |
1264 ocsp_response_, CertificateList()), | 1265 ocsp_response.as_string(), CertificateList()), |
1265 // TODO(davidben): Route the CRLSet through SSLConfig so | 1266 // TODO(davidben): Route the CRLSet through SSLConfig so |
1266 // SSLClientSocket doesn't depend on SSLConfigService. | 1267 // SSLClientSocket doesn't depend on SSLConfigService. |
1267 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_, | 1268 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_, |
1268 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete, | 1269 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete, |
1269 base::Unretained(this)), | 1270 base::Unretained(this)), |
1270 &cert_verifier_request_, net_log_); | 1271 &cert_verifier_request_, net_log_); |
1271 } | 1272 } |
1272 | 1273 |
1273 int SSLClientSocketImpl::DoVerifyCertComplete(int result) { | 1274 int SSLClientSocketImpl::DoVerifyCertComplete(int result) { |
1274 cert_verifier_request_.reset(); | 1275 cert_verifier_request_.reset(); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1312 result = ct_result; | 1313 result = ct_result; |
1313 } | 1314 } |
1314 | 1315 |
1315 if (result == OK) { | 1316 if (result == OK) { |
1316 DCHECK(!certificate_verified_); | 1317 DCHECK(!certificate_verified_); |
1317 certificate_verified_ = true; | 1318 certificate_verified_ = true; |
1318 MaybeCacheSession(); | 1319 MaybeCacheSession(); |
1319 SSLInfo ssl_info; | 1320 SSLInfo ssl_info; |
1320 bool ok = GetSSLInfo(&ssl_info); | 1321 bool ok = GetSSLInfo(&ssl_info); |
1321 DCHECK(ok); | 1322 DCHECK(ok); |
| 1323 |
| 1324 const uint8_t* ocsp_response_raw; |
| 1325 size_t ocsp_response_len; |
| 1326 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len); |
| 1327 base::StringPiece ocsp_response( |
| 1328 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len); |
| 1329 |
1322 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info, | 1330 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info, |
1323 ocsp_response_); | 1331 ocsp_response); |
1324 } | 1332 } |
1325 | 1333 |
1326 completed_connect_ = true; | 1334 completed_connect_ = true; |
1327 // Exit DoHandshakeLoop and return the result to the caller to Connect. | 1335 // Exit DoHandshakeLoop and return the result to the caller to Connect. |
1328 DCHECK_EQ(STATE_NONE, next_handshake_state_); | 1336 DCHECK_EQ(STATE_NONE, next_handshake_state_); |
1329 return result; | 1337 return result; |
1330 } | 1338 } |
1331 | 1339 |
1332 void SSLClientSocketImpl::DoConnectCallback(int rv) { | 1340 void SSLClientSocketImpl::DoConnectCallback(int rv) { |
1333 if (!user_connect_callback_.is_null()) { | 1341 if (!user_connect_callback_.is_null()) { |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1550 return; | 1558 return; |
1551 | 1559 |
1552 if (rv_write != ERR_IO_PENDING) | 1560 if (rv_write != ERR_IO_PENDING) |
1553 DoWriteCallback(rv_write); | 1561 DoWriteCallback(rv_write); |
1554 } | 1562 } |
1555 | 1563 |
1556 int SSLClientSocketImpl::VerifyCT() { | 1564 int SSLClientSocketImpl::VerifyCT() { |
1557 const uint8_t* sct_list_raw; | 1565 const uint8_t* sct_list_raw; |
1558 size_t sct_list_len; | 1566 size_t sct_list_len; |
1559 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len); | 1567 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len); |
1560 std::string sct_list; | 1568 base::StringPiece sct_list(reinterpret_cast<const char*>(sct_list_raw), |
1561 if (sct_list_len > 0) | 1569 sct_list_len); |
1562 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len); | 1570 |
| 1571 const uint8_t* ocsp_response_raw; |
| 1572 size_t ocsp_response_len; |
| 1573 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len); |
| 1574 base::StringPiece ocsp_response( |
| 1575 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len); |
1563 | 1576 |
1564 // Note that this is a completely synchronous operation: The CT Log Verifier | 1577 // Note that this is a completely synchronous operation: The CT Log Verifier |
1565 // gets all the data it needs for SCT verification and does not do any | 1578 // gets all the data it needs for SCT verification and does not do any |
1566 // external communication. | 1579 // external communication. |
1567 cert_transparency_verifier_->Verify( | 1580 cert_transparency_verifier_->Verify( |
1568 server_cert_verify_result_.verified_cert.get(), ocsp_response_, sct_list, | 1581 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list, |
1569 &ct_verify_result_.scts, net_log_); | 1582 &ct_verify_result_.scts, net_log_); |
1570 | 1583 |
1571 ct_verify_result_.ct_policies_applied = true; | 1584 ct_verify_result_.ct_policies_applied = true; |
1572 ct_verify_result_.ev_policy_compliance = | 1585 ct_verify_result_.ev_policy_compliance = |
1573 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY; | 1586 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY; |
1574 | 1587 |
1575 SCTList verified_scts = | 1588 SCTList verified_scts = |
1576 ct::SCTsMatchingStatus(ct_verify_result_.scts, ct::SCT_STATUS_OK); | 1589 ct::SCTsMatchingStatus(ct_verify_result_.scts, ct::SCT_STATUS_OK); |
1577 | 1590 |
1578 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) { | 1591 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) { |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2045 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED && | 2058 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED && |
2046 !certificate_requested_) { | 2059 !certificate_requested_) { |
2047 net_error = ERR_SSL_PROTOCOL_ERROR; | 2060 net_error = ERR_SSL_PROTOCOL_ERROR; |
2048 } | 2061 } |
2049 } | 2062 } |
2050 | 2063 |
2051 return net_error; | 2064 return net_error; |
2052 } | 2065 } |
2053 | 2066 |
2054 } // namespace net | 2067 } // namespace net |
OLD | NEW |