Chromium Code Reviews| 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 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |