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

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

Issue 2728303005: Don't use crypto/x509 in SSLClientSocketImpl. (Closed)
Patch Set: fix ios Created 3 years, 9 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/ssl/ssl_client_session_cache.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 <string.h> 8 #include <string.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 // TODO(davidben): Remove this after the ECDSA CBC removal sticks. 227 // TODO(davidben): Remove this after the ECDSA CBC removal sticks.
228 // https:/crbug.com/666191. 228 // https:/crbug.com/666191.
229 const base::Feature kLegacyECDSACiphersFeature{ 229 const base::Feature kLegacyECDSACiphersFeature{
230 "SSLLegacyECDSACiphers", base::FEATURE_DISABLED_BY_DEFAULT}; 230 "SSLLegacyECDSACiphers", base::FEATURE_DISABLED_BY_DEFAULT};
231 231
232 bool AreLegacyECDSACiphersEnabled() { 232 bool AreLegacyECDSACiphersEnabled() {
233 return base::FeatureList::IsEnabled(kLegacyECDSACiphersFeature); 233 return base::FeatureList::IsEnabled(kLegacyECDSACiphersFeature);
234 } 234 }
235 #endif 235 #endif
236 236
237 scoped_refptr<X509Certificate> OSChainFromOpenSSL(STACK_OF(X509) * 237 scoped_refptr<X509Certificate> OSChainFromBuffers(STACK_OF(CRYPTO_BUFFER) *
238 openssl_chain) { 238 openssl_chain) {
239 if (sk_X509_num(openssl_chain) == 0) { 239 if (sk_CRYPTO_BUFFER_num(openssl_chain) == 0) {
240 NOTREACHED(); 240 NOTREACHED();
241 return nullptr; 241 return nullptr;
242 } 242 }
243 243
244 #if defined(USE_OPENSSL_CERTS)
245 // When OSCertHandle is typedef'ed to X509, this implementation does a short
246 // cut to avoid converting back and forth between DER and the X509 struct.
247 X509Certificate::OSCertHandles intermediates;
248 for (size_t i = 1; i < sk_X509_num(openssl_chain); ++i) {
249 X509* cert = sk_X509_value(openssl_chain, i);
250 DCHECK(cert->buf);
251 intermediates.push_back(cert);
252 }
253
254 X509* leaf = sk_X509_value(openssl_chain, 0);
255 DCHECK(leaf->buf);
256 return X509Certificate::CreateFromHandle(leaf, intermediates);
257 #else
258 // Convert the certificate chains to a platform certificate handle. 244 // Convert the certificate chains to a platform certificate handle.
259 std::vector<base::StringPiece> der_chain; 245 std::vector<base::StringPiece> der_chain;
260 der_chain.reserve(sk_X509_num(openssl_chain)); 246 der_chain.reserve(sk_CRYPTO_BUFFER_num(openssl_chain));
261 for (size_t i = 0; i < sk_X509_num(openssl_chain); ++i) { 247 for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(openssl_chain); ++i) {
262 X509* cert = sk_X509_value(openssl_chain, i); 248 const CRYPTO_BUFFER* cert = sk_CRYPTO_BUFFER_value(openssl_chain, i);
263 DCHECK(cert->buf);
264 base::StringPiece der; 249 base::StringPiece der;
265 if (!x509_util::GetDER(cert, &der)) 250 der_chain.push_back(base::StringPiece(
266 return nullptr; 251 reinterpret_cast<const char*>(CRYPTO_BUFFER_data(cert)),
267 der_chain.push_back(der); 252 CRYPTO_BUFFER_len(cert)));
268 } 253 }
269 return X509Certificate::CreateFromDERCertChain(der_chain); 254 return X509Certificate::CreateFromDERCertChain(der_chain);
255 }
256
257 #if !defined(OS_IOS)
258 bssl::UniquePtr<CRYPTO_BUFFER> OSCertHandleToBuffer(
259 X509Certificate::OSCertHandle os_handle) {
260 std::string der_encoded;
261 if (!X509Certificate::GetDEREncoded(os_handle, &der_encoded))
262 return nullptr;
263 return x509_util::CreateCryptoBuffer(der_encoded);
264 }
270 #endif 265 #endif
271 }
272 266
273 } // namespace 267 } // namespace
274 268
275 class SSLClientSocketImpl::SSLContext { 269 class SSLClientSocketImpl::SSLContext {
276 public: 270 public:
277 static SSLContext* GetInstance() { 271 static SSLContext* GetInstance() {
278 return base::Singleton<SSLContext, 272 return base::Singleton<SSLContext,
279 base::LeakySingletonTraits<SSLContext>>::get(); 273 base::LeakySingletonTraits<SSLContext>>::get();
280 } 274 }
281 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } 275 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
(...skipping 23 matching lines...) Expand all
305 299
306 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod; 300 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
307 301
308 private: 302 private:
309 friend struct base::DefaultSingletonTraits<SSLContext>; 303 friend struct base::DefaultSingletonTraits<SSLContext>;
310 304
311 SSLContext() : session_cache_(SSLClientSessionCache::Config()) { 305 SSLContext() : session_cache_(SSLClientSessionCache::Config()) {
312 crypto::EnsureOpenSSLInit(); 306 crypto::EnsureOpenSSLInit();
313 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0); 307 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
314 DCHECK_NE(ssl_socket_data_index_, -1); 308 DCHECK_NE(ssl_socket_data_index_, -1);
315 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method())); 309 ssl_ctx_.reset(SSL_CTX_new(TLS_with_buffers_method()));
316 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL);
317 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL); 310 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
318 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL); 311
312 // The server certificate is verified after the handshake in DoVerifyCert.
313 SSL_CTX_i_promise_to_verify_certs_after_the_handshake(ssl_ctx_.get());
davidben 2017/03/08 20:06:36 Yyyyyup. :-) This is a placeholder until the asyn
319 314
320 // Disable the internal session cache. Session caching is handled 315 // Disable the internal session cache. Session caching is handled
321 // externally (i.e. by SSLClientSessionCache). 316 // externally (i.e. by SSLClientSessionCache).
322 SSL_CTX_set_session_cache_mode( 317 SSL_CTX_set_session_cache_mode(
323 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL); 318 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
324 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback); 319 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
325 SSL_CTX_set_timeout(ssl_ctx_.get(), 1 * 60 * 60 /* one hour */); 320 SSL_CTX_set_timeout(ssl_ctx_.get(), 1 * 60 * 60 /* one hour */);
326 321
327 SSL_CTX_set_grease_enabled(ssl_ctx_.get(), 1); 322 SSL_CTX_set_grease_enabled(ssl_ctx_.get(), 1);
328 323
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 ssl); 365 ssl);
371 return socket->TokenBindingParse(contents, contents_len, out_alert_value); 366 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
372 } 367 }
373 368
374 static int ClientCertRequestCallback(SSL* ssl, void* arg) { 369 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
375 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); 370 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
376 DCHECK(socket); 371 DCHECK(socket);
377 return socket->ClientCertRequestCallback(ssl); 372 return socket->ClientCertRequestCallback(ssl);
378 } 373 }
379 374
380 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) {
381 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
382 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
383 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
384 CHECK(socket);
385
386 return socket->CertVerifyCallback(store_ctx);
387 }
388
389 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) { 375 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
390 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); 376 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
391 return socket->NewSessionCallback(session); 377 return socket->NewSessionCallback(session);
392 } 378 }
393 379
394 static int PrivateKeyTypeCallback(SSL* ssl) { 380 static int PrivateKeyTypeCallback(SSL* ssl) {
395 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); 381 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
396 return socket->PrivateKeyTypeCallback(); 382 return socket->PrivateKeyTypeCallback();
397 } 383 }
398 384
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 void SSLClientSocketImpl::GetSSLCertRequestInfo( 502 void SSLClientSocketImpl::GetSSLCertRequestInfo(
517 SSLCertRequestInfo* cert_request_info) { 503 SSLCertRequestInfo* cert_request_info) {
518 if (!ssl_) { 504 if (!ssl_) {
519 NOTREACHED(); 505 NOTREACHED();
520 return; 506 return;
521 } 507 }
522 508
523 cert_request_info->host_and_port = host_and_port_; 509 cert_request_info->host_and_port = host_and_port_;
524 510
525 cert_request_info->cert_authorities.clear(); 511 cert_request_info->cert_authorities.clear();
526 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl_.get()); 512 const STACK_OF(CRYPTO_BUFFER)* authorities =
527 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) { 513 SSL_get0_server_requested_CAs(ssl_.get());
528 X509_NAME* ca_name = sk_X509_NAME_value(authorities, i); 514 for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(authorities); i++) {
529 uint8_t* str = nullptr; 515 const CRYPTO_BUFFER* ca_name = sk_CRYPTO_BUFFER_value(authorities, i);
530 int length = i2d_X509_NAME(ca_name, &str); 516 cert_request_info->cert_authorities.push_back(
531 if (length > 0) { 517 std::string(reinterpret_cast<const char*>(CRYPTO_BUFFER_data(ca_name)),
532 cert_request_info->cert_authorities.push_back(std::string( 518 CRYPTO_BUFFER_len(ca_name)));
533 reinterpret_cast<const char*>(str), static_cast<size_t>(length)));
534 } else {
535 NOTREACHED(); // Error serializing |ca_name|.
536 }
537 OPENSSL_free(str);
538 } 519 }
539 520
540 cert_request_info->cert_key_types.clear(); 521 cert_request_info->cert_key_types.clear();
541 const uint8_t* client_cert_types; 522 const uint8_t* client_cert_types;
542 size_t num_client_cert_types = 523 size_t num_client_cert_types =
543 SSL_get0_certificate_types(ssl_.get(), &client_cert_types); 524 SSL_get0_certificate_types(ssl_.get(), &client_cert_types);
544 for (size_t i = 0; i < num_client_cert_types; i++) { 525 for (size_t i = 0; i < num_client_cert_types; i++) {
545 cert_request_info->cert_key_types.push_back( 526 cert_request_info->cert_key_types.push_back(
546 static_cast<SSLClientCertType>(client_cert_types[i])); 527 static_cast<SSLClientCertType>(client_cert_types[i]));
547 } 528 }
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 out->clear(); 762 out->clear();
782 } 763 }
783 764
784 int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const { 765 int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
785 return transport_->socket()->GetTotalReceivedBytes(); 766 return transport_->socket()->GetTotalReceivedBytes();
786 } 767 }
787 768
788 void SSLClientSocketImpl::DumpMemoryStats(SocketMemoryStats* stats) const { 769 void SSLClientSocketImpl::DumpMemoryStats(SocketMemoryStats* stats) const {
789 if (transport_adapter_) 770 if (transport_adapter_)
790 stats->buffer_size = transport_adapter_->GetAllocationSize(); 771 stats->buffer_size = transport_adapter_->GetAllocationSize();
791 STACK_OF(X509)* server_cert_chain = SSL_get_peer_cert_chain(ssl_.get()); 772 const STACK_OF(CRYPTO_BUFFER)* server_cert_chain =
773 SSL_get0_peer_certificates(ssl_.get());
792 if (server_cert_chain) { 774 if (server_cert_chain) {
793 for (size_t i = 0; i < sk_X509_num(server_cert_chain); ++i) { 775 for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(server_cert_chain); ++i) {
794 X509* cert = sk_X509_value(server_cert_chain, i); 776 const CRYPTO_BUFFER* cert = sk_CRYPTO_BUFFER_value(server_cert_chain, i);
795 // Estimate the size of the certificate before deduplication. 777 stats->cert_size += CRYPTO_BUFFER_len(cert);
796 // The multiplier (4) is added to account for the difference between the
797 // serialized cert size and the actual cert allocation.
798 // TODO(xunjieli): Update this after crbug.com/671420 is done.
799 stats->cert_size += 4 * i2d_X509(cert, nullptr);
800 } 778 }
801 stats->cert_count = sk_X509_num(server_cert_chain); 779 stats->cert_count = sk_CRYPTO_BUFFER_num(server_cert_chain);
802 } 780 }
803 stats->total_size = stats->buffer_size + stats->cert_size; 781 stats->total_size = stats->buffer_size + stats->cert_size;
804 } 782 }
805 783
806 // static 784 // static
807 void SSLClientSocketImpl::DumpSSLClientSessionMemoryStats( 785 void SSLClientSocketImpl::DumpSSLClientSessionMemoryStats(
808 base::trace_event::ProcessMemoryDump* pmd) { 786 base::trace_event::ProcessMemoryDump* pmd) {
809 SSLContext::GetInstance()->session_cache()->DumpMemoryStats(pmd); 787 SSLContext::GetInstance()->session_cache()->DumpMemoryStats(pmd);
810 } 788 }
811 789
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
1187 1165
1188 // Return to the handshake. 1166 // Return to the handshake.
1189 channel_id_sent_ = true; 1167 channel_id_sent_ = true;
1190 next_handshake_state_ = STATE_HANDSHAKE; 1168 next_handshake_state_ = STATE_HANDSHAKE;
1191 return OK; 1169 return OK;
1192 } 1170 }
1193 1171
1194 int SSLClientSocketImpl::DoVerifyCert(int result) { 1172 int SSLClientSocketImpl::DoVerifyCert(int result) {
1195 DCHECK(start_cert_verification_time_.is_null()); 1173 DCHECK(start_cert_verification_time_.is_null());
1196 1174
1197 server_cert_ = OSChainFromOpenSSL(SSL_get_peer_cert_chain(ssl_.get())); 1175 server_cert_ = OSChainFromBuffers(SSL_get0_peer_certificates(ssl_.get()));
1198 1176
1199 // OpenSSL decoded the certificate, but the platform certificate 1177 // OpenSSL decoded the certificate, but the platform certificate
1200 // implementation could not. This is treated as a fatal SSL-level protocol 1178 // implementation could not. This is treated as a fatal SSL-level protocol
1201 // error rather than a certificate error. See https://crbug.com/91341. 1179 // error rather than a certificate error. See https://crbug.com/91341.
1202 if (!server_cert_) 1180 if (!server_cert_)
1203 return ERR_SSL_SERVER_CERT_BAD_FORMAT; 1181 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1204 1182
1205 net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED, 1183 net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED,
1206 base::Bind(&NetLogX509CertificateCallback, 1184 base::Bind(&NetLogX509CertificateCallback,
1207 base::Unretained(server_cert_.get()))); 1185 base::Unretained(server_cert_.get())));
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
1605 #else // !defined(OS_IOS) 1583 #else // !defined(OS_IOS)
1606 if (!ssl_config_.send_client_cert) { 1584 if (!ssl_config_.send_client_cert) {
1607 // First pass: we know that a client certificate is needed, but we do not 1585 // First pass: we know that a client certificate is needed, but we do not
1608 // have one at hand. Suspend the handshake. SSL_get_error will return 1586 // have one at hand. Suspend the handshake. SSL_get_error will return
1609 // SSL_ERROR_WANT_X509_LOOKUP. 1587 // SSL_ERROR_WANT_X509_LOOKUP.
1610 return -1; 1588 return -1;
1611 } 1589 }
1612 1590
1613 // Second pass: a client certificate should have been selected. 1591 // Second pass: a client certificate should have been selected.
1614 if (ssl_config_.client_cert.get()) { 1592 if (ssl_config_.client_cert.get()) {
1615 bssl::UniquePtr<X509> leaf_x509 =
1616 OSCertHandleToOpenSSL(ssl_config_.client_cert->os_cert_handle());
1617 if (!leaf_x509) {
1618 LOG(WARNING) << "Failed to import certificate";
1619 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1620 return -1;
1621 }
1622
1623 bssl::UniquePtr<STACK_OF(X509)> chain = OSCertHandlesToOpenSSL(
1624 ssl_config_.client_cert->GetIntermediateCertificates());
1625 if (!chain) {
1626 LOG(WARNING) << "Failed to import intermediate certificates";
1627 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1628 return -1;
1629 }
1630
1631 if (!SSL_use_certificate(ssl_.get(), leaf_x509.get()) ||
1632 !SSL_set1_chain(ssl_.get(), chain.get())) {
1633 LOG(WARNING) << "Failed to set client certificate";
1634 return -1;
1635 }
1636
1637 if (!ssl_config_.client_private_key) { 1593 if (!ssl_config_.client_private_key) {
1638 // The caller supplied a null private key. Fail the handshake and surface 1594 // The caller supplied a null private key. Fail the handshake and surface
1639 // an appropriate error to the caller. 1595 // an appropriate error to the caller.
1640 LOG(WARNING) << "Client cert found without private key"; 1596 LOG(WARNING) << "Client cert found without private key";
1641 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY); 1597 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1642 return -1; 1598 return -1;
1643 } 1599 }
1644 1600
1645 SSL_set_private_key_method(ssl_.get(), &SSLContext::kPrivateKeyMethod); 1601 std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> chain;
1602 std::vector<CRYPTO_BUFFER*> chain_raw;
1603 bssl::UniquePtr<CRYPTO_BUFFER> buf =
1604 OSCertHandleToBuffer(ssl_config_.client_cert->os_cert_handle());
1605 if (!buf) {
1606 LOG(WARNING) << "Failed to import certificate";
1607 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1608 return -1;
1609 }
1610 chain_raw.push_back(buf.get());
1611 chain.push_back(std::move(buf));
1612
1613 for (X509Certificate::OSCertHandle cert :
1614 ssl_config_.client_cert->GetIntermediateCertificates()) {
1615 bssl::UniquePtr<CRYPTO_BUFFER> buf = OSCertHandleToBuffer(cert);
1616 if (!buf) {
1617 LOG(WARNING) << "Failed to import intermediate";
1618 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1619 return -1;
1620 }
1621 chain_raw.push_back(buf.get());
1622 chain.push_back(std::move(buf));
1623 }
1624
1625 if (!SSL_set_chain_and_key(ssl_.get(), chain_raw.data(), chain_raw.size(),
1626 nullptr, &SSLContext::kPrivateKeyMethod)) {
1627 LOG(WARNING) << "Failed to set client certificate";
1628 return -1;
1629 }
davidben 2017/03/08 20:06:36 This is really obnoxious, but I'm assuming ultimat
mattm 2017/03/09 04:37:54 yeah
1646 1630
1647 std::vector<SSLPrivateKey::Hash> digest_prefs = 1631 std::vector<SSLPrivateKey::Hash> digest_prefs =
1648 ssl_config_.client_private_key->GetDigestPreferences(); 1632 ssl_config_.client_private_key->GetDigestPreferences();
1649 1633
1650 size_t digests_len = digest_prefs.size(); 1634 size_t digests_len = digest_prefs.size();
1651 std::vector<int> digests; 1635 std::vector<int> digests;
1652 for (size_t i = 0; i < digests_len; i++) { 1636 for (size_t i = 0; i < digests_len; i++) {
1653 switch (digest_prefs[i]) { 1637 switch (digest_prefs[i]) {
1654 case SSLPrivateKey::Hash::SHA1: 1638 case SSLPrivateKey::Hash::SHA1:
1655 digests.push_back(NID_sha1); 1639 digests.push_back(NID_sha1);
1656 break; 1640 break;
1657 case SSLPrivateKey::Hash::SHA256: 1641 case SSLPrivateKey::Hash::SHA256:
1658 digests.push_back(NID_sha256); 1642 digests.push_back(NID_sha256);
1659 break; 1643 break;
1660 case SSLPrivateKey::Hash::SHA384: 1644 case SSLPrivateKey::Hash::SHA384:
1661 digests.push_back(NID_sha384); 1645 digests.push_back(NID_sha384);
1662 break; 1646 break;
1663 case SSLPrivateKey::Hash::SHA512: 1647 case SSLPrivateKey::Hash::SHA512:
1664 digests.push_back(NID_sha512); 1648 digests.push_back(NID_sha512);
1665 break; 1649 break;
1666 case SSLPrivateKey::Hash::MD5_SHA1: 1650 case SSLPrivateKey::Hash::MD5_SHA1:
1667 // MD5-SHA1 is not used in TLS 1.2. 1651 // MD5-SHA1 is not used in TLS 1.2.
1668 break; 1652 break;
1669 } 1653 }
1670 } 1654 }
1671 1655
1672 SSL_set_private_key_digest_prefs(ssl_.get(), digests.data(), 1656 SSL_set_private_key_digest_prefs(ssl_.get(), digests.data(),
1673 digests.size()); 1657 digests.size());
1674 1658
1675 int cert_count = 1 + sk_X509_num(chain.get());
1676 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED, 1659 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
1677 NetLog::IntCallback("cert_count", cert_count)); 1660 NetLog::IntCallback("cert_count", chain.size()));
1678 return 1; 1661 return 1;
1679 } 1662 }
1680 #endif // defined(OS_IOS) 1663 #endif // defined(OS_IOS)
1681 1664
1682 // Send no client certificate. 1665 // Send no client certificate.
1683 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED, 1666 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
1684 NetLog::IntCallback("cert_count", 0)); 1667 NetLog::IntCallback("cert_count", 0));
1685 return 1; 1668 return 1;
1686 } 1669 }
1687 1670
1688 int SSLClientSocketImpl::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
1689 // The server certificate is verified later in DoVerifyCert.
1690 return 1;
1691 }
1692
1693 void SSLClientSocketImpl::MaybeCacheSession() { 1671 void SSLClientSocketImpl::MaybeCacheSession() {
1694 // Only cache the session once both a new session has been established and the 1672 // Only cache the session once both a new session has been established and the
1695 // certificate has been verified. Due to False Start, these events may happen 1673 // certificate has been verified. Due to False Start, these events may happen
1696 // in either order. 1674 // in either order.
1697 if (!pending_session_ || !certificate_verified_) 1675 if (!pending_session_ || !certificate_verified_)
1698 return; 1676 return;
1699 1677
1700 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(), 1678 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
1701 pending_session_.get()); 1679 pending_session_.get());
1702 pending_session_ = nullptr; 1680 pending_session_ = nullptr;
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
1981 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED && 1959 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED &&
1982 !certificate_requested_) { 1960 !certificate_requested_) {
1983 net_error = ERR_SSL_PROTOCOL_ERROR; 1961 net_error = ERR_SSL_PROTOCOL_ERROR;
1984 } 1962 }
1985 } 1963 }
1986 1964
1987 return net_error; 1965 return net_error;
1988 } 1966 }
1989 1967
1990 } // namespace net 1968 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_impl.h ('k') | net/ssl/ssl_client_session_cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698