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 // 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 <openssl/ssl.h> | 10 #include <openssl/ssl.h> |
11 #include <openssl/err.h> | 11 #include <openssl/err.h> |
12 #include <openssl/opensslv.h> | 12 #include <openssl/opensslv.h> |
13 | 13 |
14 #include "base/bind.h" | 14 #include "base/bind.h" |
15 #include "base/callback_helpers.h" | 15 #include "base/callback_helpers.h" |
16 #include "base/memory/singleton.h" | 16 #include "base/memory/singleton.h" |
17 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
18 #include "base/synchronization/lock.h" | 18 #include "base/synchronization/lock.h" |
19 #include "crypto/openssl_util.h" | 19 #include "crypto/openssl_util.h" |
20 #include "net/base/cert_verifier.h" | 20 #include "net/base/cert_verifier.h" |
21 #include "net/base/net_errors.h" | 21 #include "net/base/net_errors.h" |
22 #include "net/base/openssl_private_key_store.h" | 22 #include "net/base/openssl_client_key_store.h" |
23 #include "net/base/single_request_cert_verifier.h" | 23 #include "net/base/single_request_cert_verifier.h" |
24 #include "net/base/ssl_cert_request_info.h" | 24 #include "net/base/ssl_cert_request_info.h" |
25 #include "net/base/ssl_connection_status_flags.h" | 25 #include "net/base/ssl_connection_status_flags.h" |
26 #include "net/base/ssl_info.h" | 26 #include "net/base/ssl_info.h" |
27 #include "net/base/x509_certificate_net_log_param.h" | 27 #include "net/base/x509_certificate_net_log_param.h" |
28 #include "net/socket/ssl_error_params.h" | 28 #include "net/socket/ssl_error_params.h" |
29 | 29 |
30 namespace net { | 30 namespace net { |
31 | 31 |
32 namespace { | 32 namespace { |
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 reinterpret_cast<const char*>(str), | 583 reinterpret_cast<const char*>(str), |
584 static_cast<size_t>(length))); | 584 static_cast<size_t>(length))); |
585 OPENSSL_free(str); | 585 OPENSSL_free(str); |
586 } | 586 } |
587 | 587 |
588 return -1; // Suspends handshake. | 588 return -1; // Suspends handshake. |
589 } | 589 } |
590 | 590 |
591 // Second pass: a client certificate should have been selected. | 591 // Second pass: a client certificate should have been selected. |
592 if (ssl_config_.client_cert) { | 592 if (ssl_config_.client_cert) { |
593 EVP_PKEY* privkey = OpenSSLPrivateKeyStore::GetInstance()->FetchPrivateKey( | 593 // A note about ownership: FetchClientCertPrivateKey() increments |
594 X509_PUBKEY_get(X509_get_X509_PUBKEY( | 594 // the reference count of the EVP_PKEY. Ownership of this reference |
595 ssl_config_.client_cert->os_cert_handle()))); | 595 // is passed directly to OpenSSL, which will release the reference |
596 if (privkey) { | 596 // using EVP_PKEY_free() when the SSL object is destroyed. |
| 597 OpenSSLClientKeyStore::ScopedEVP_PKEY privkey; |
| 598 if (OpenSSLClientKeyStore::GetInstance()->FetchClientCertPrivateKey( |
| 599 ssl_config_.client_cert.get(), &privkey)) { |
597 // TODO(joth): (copied from NSS) We should wait for server certificate | 600 // TODO(joth): (copied from NSS) We should wait for server certificate |
598 // verification before sending our credentials. See http://crbug.com/13934 | 601 // verification before sending our credentials. See http://crbug.com/13934 |
599 *x509 = X509Certificate::DupOSCertHandle( | 602 *x509 = X509Certificate::DupOSCertHandle( |
600 ssl_config_.client_cert->os_cert_handle()); | 603 ssl_config_.client_cert->os_cert_handle()); |
601 *pkey = privkey; | 604 *pkey = privkey.release(); |
602 return 1; | 605 return 1; |
603 } | 606 } |
604 LOG(WARNING) << "Client cert found without private key"; | 607 LOG(WARNING) << "Client cert found without private key"; |
605 } | 608 } |
606 | 609 |
607 // Send no client certificate. | 610 // Send no client certificate. |
608 return 0; | 611 return 0; |
609 } | 612 } |
610 | 613 |
611 // SSLClientSocket methods | 614 // SSLClientSocket methods |
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1416 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, | 1419 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, |
1417 user_write_buf_->data()); | 1420 user_write_buf_->data()); |
1418 return rv; | 1421 return rv; |
1419 } | 1422 } |
1420 | 1423 |
1421 int err = SSL_get_error(ssl_, rv); | 1424 int err = SSL_get_error(ssl_, rv); |
1422 return MapOpenSSLError(err, err_tracer); | 1425 return MapOpenSSLError(err, err_tracer); |
1423 } | 1426 } |
1424 | 1427 |
1425 } // namespace net | 1428 } // namespace net |
OLD | NEW |