Chromium Code Reviews| Index: net/socket/ssl_client_socket_openssl.cc |
| diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc |
| index d8713f28f9e37e3fc48e0d94d38dba708b895380..4209229dde667bfbf29b4d4377fd83d525f15125 100644 |
| --- a/net/socket/ssl_client_socket_openssl.cc |
| +++ b/net/socket/ssl_client_socket_openssl.cc |
| @@ -24,6 +24,7 @@ |
| #include "base/threading/thread_local.h" |
| #include "crypto/ec_private_key.h" |
| #include "crypto/openssl_util.h" |
| +#include "crypto/rsa_private_key.h" |
| #include "crypto/scoped_openssl_types.h" |
| #include "net/base/net_errors.h" |
| #include "net/cert/cert_policy_enforcer.h" |
| @@ -35,6 +36,7 @@ |
| #include "net/cert/x509_util_openssl.h" |
| #include "net/http/transport_security_state.h" |
| #include "net/socket/ssl_session_cache_openssl.h" |
| +#include "net/ssl/openssl_ssl_util.h" |
| #include "net/ssl/scoped_openssl_types.h" |
| #include "net/ssl/ssl_cert_request_info.h" |
| #include "net/ssl/ssl_connection_status_flags.h" |
| @@ -1814,18 +1816,26 @@ int SSLClientSocketOpenSSL::ClientCertRequestCallback(SSL* ssl) { |
| return -1; |
| } |
| - // TODO(davidben): With Linux client auth support, this should be |
| - // conditioned on OS_ANDROID and then, with https://crbug.com/394131, |
| - // removed altogether. OpenSSLClientKeyStore is mostly an artifact of the |
| - // net/ client auth API lacking a private key handle. |
| + crypto::ScopedEVP_PKEY privkey; |
|
davidben
2015/03/25 00:05:33
This entire mess should be EVP_PKEY_dup (which bum
|
| + if (client_private_key_.get()) { |
|
Ryan Sleevi
2015/03/19 04:38:24
STYLE: Don't use .get() for scoped_ptr bool testin
|
| + privkey.reset(EVP_PKEY_new()); |
| + crypto::ScopedRSA rsa(EVP_PKEY_get1_RSA(client_private_key_->key())); |
| + if (!EVP_PKEY_set1_RSA(privkey.get(), rsa.get())) { |
| + privkey.reset(NULL); |
| + } |
|
Ryan Sleevi
2015/03/19 04:38:24
STYLE: no braces for single-line if
STYLE: nullptr
|
| + } else { |
| +// TODO(davidben): With Linux client auth support, this should be |
| +// conditioned on OS_ANDROID and then, with https://crbug.com/394131, |
| +// removed altogether. OpenSSLClientKeyStore is mostly an artifact of the |
| +// net/ client auth API lacking a private key handle. |
|
Ryan Sleevi
2015/03/19 04:38:24
STYLE: This comment style is ugly.
If nececessary
|
| #if defined(USE_OPENSSL_CERTS) |
| - crypto::ScopedEVP_PKEY privkey = |
| - OpenSSLClientKeyStore::GetInstance()->FetchClientCertPrivateKey( |
| - ssl_config_.client_cert.get()); |
| + privkey = OpenSSLClientKeyStore::GetInstance() |
| + ->FetchClientCertPrivateKey(ssl_config_.client_cert.get()) |
| + .Pass(); |
| #else // !defined(USE_OPENSSL_CERTS) |
| - crypto::ScopedEVP_PKEY privkey = |
| - FetchClientCertPrivateKey(ssl_config_.client_cert.get()); |
| + privkey = FetchClientCertPrivateKey(ssl_config_.client_cert.get()).Pass(); |
| #endif // defined(USE_OPENSSL_CERTS) |
| + } |
| if (!privkey) { |
| // Could not find the private key. Fail the handshake and surface an |
| // appropriate error to the caller. |
| @@ -2049,4 +2059,12 @@ SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
| return server_cert_; |
| } |
| +void SSLClientSocketOpenSSL::ForceClientCertificateAndKeyForTest( |
| + scoped_refptr<X509Certificate> client_cert, |
| + scoped_ptr<crypto::RSAPrivateKey> client_private_key) { |
| + ssl_config_.send_client_cert = true; |
| + ssl_config_.client_cert = client_cert; |
| + client_private_key_ = client_private_key.Pass(); |
| +} |
| + |
| } // namespace net |