| 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 <openssl/bio.h> | 8 #include <openssl/bio.h> |
| 9 #include <openssl/bytestring.h> | 9 #include <openssl/bytestring.h> |
| 10 #include <openssl/err.h> | 10 #include <openssl/err.h> |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 static int PrivateKeyTypeCallback(SSL* ssl) { | 339 static int PrivateKeyTypeCallback(SSL* ssl) { |
| 340 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); | 340 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
| 341 return socket->PrivateKeyTypeCallback(); | 341 return socket->PrivateKeyTypeCallback(); |
| 342 } | 342 } |
| 343 | 343 |
| 344 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) { | 344 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) { |
| 345 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); | 345 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
| 346 return socket->PrivateKeyMaxSignatureLenCallback(); | 346 return socket->PrivateKeyMaxSignatureLenCallback(); |
| 347 } | 347 } |
| 348 | 348 |
| 349 static ssl_private_key_result_t PrivateKeySignCallback(SSL* ssl, | 349 static ssl_private_key_result_t PrivateKeySignDigestCallback( |
| 350 uint8_t* out, | |
| 351 size_t* out_len, | |
| 352 size_t max_out, | |
| 353 const EVP_MD* md, | |
| 354 const uint8_t* in, | |
| 355 size_t in_len) { | |
| 356 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); | |
| 357 return socket->PrivateKeySignCallback(out, out_len, max_out, md, in, | |
| 358 in_len); | |
| 359 } | |
| 360 | |
| 361 static ssl_private_key_result_t PrivateKeySignCompleteCallback( | |
| 362 SSL* ssl, | 350 SSL* ssl, |
| 363 uint8_t* out, | 351 uint8_t* out, |
| 364 size_t* out_len, | 352 size_t* out_len, |
| 365 size_t max_out) { | 353 size_t max_out, |
| 354 const EVP_MD* md, |
| 355 const uint8_t* in, |
| 356 size_t in_len) { |
| 366 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); | 357 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
| 367 return socket->PrivateKeySignCompleteCallback(out, out_len, max_out); | 358 return socket->PrivateKeySignDigestCallback(out, out_len, max_out, md, in, |
| 359 in_len); |
| 360 } |
| 361 |
| 362 static ssl_private_key_result_t PrivateKeyCompleteCallback(SSL* ssl, |
| 363 uint8_t* out, |
| 364 size_t* out_len, |
| 365 size_t max_out) { |
| 366 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
| 367 return socket->PrivateKeyCompleteCallback(out, out_len, max_out); |
| 368 } | 368 } |
| 369 | 369 |
| 370 #if !defined(OS_NACL) | 370 #if !defined(OS_NACL) |
| 371 static void KeyLogCallback(const SSL* ssl, const char* line) { | 371 static void KeyLogCallback(const SSL* ssl, const char* line) { |
| 372 GetInstance()->ssl_key_logger_->WriteLine(line); | 372 GetInstance()->ssl_key_logger_->WriteLine(line); |
| 373 } | 373 } |
| 374 #endif | 374 #endif |
| 375 | 375 |
| 376 // This is the index used with SSL_get_ex_data to retrieve the owner | 376 // This is the index used with SSL_get_ex_data to retrieve the owner |
| 377 // SSLClientSocketImpl object from an SSL instance. | 377 // SSLClientSocketImpl object from an SSL instance. |
| 378 int ssl_socket_data_index_; | 378 int ssl_socket_data_index_; |
| 379 | 379 |
| 380 ScopedSSL_CTX ssl_ctx_; | 380 ScopedSSL_CTX ssl_ctx_; |
| 381 | 381 |
| 382 #if !defined(OS_NACL) | 382 #if !defined(OS_NACL) |
| 383 std::unique_ptr<SSLKeyLogger> ssl_key_logger_; | 383 std::unique_ptr<SSLKeyLogger> ssl_key_logger_; |
| 384 #endif | 384 #endif |
| 385 | 385 |
| 386 // TODO(davidben): Use a separate cache per URLRequestContext. | 386 // TODO(davidben): Use a separate cache per URLRequestContext. |
| 387 // https://crbug.com/458365 | 387 // https://crbug.com/458365 |
| 388 // | 388 // |
| 389 // TODO(davidben): Sessions should be invalidated on fatal | 389 // TODO(davidben): Sessions should be invalidated on fatal |
| 390 // alerts. https://crbug.com/466352 | 390 // alerts. https://crbug.com/466352 |
| 391 SSLClientSessionCache session_cache_; | 391 SSLClientSessionCache session_cache_; |
| 392 }; | 392 }; |
| 393 | 393 |
| 394 // TODO(davidben): Switch from sign_digest to sign. |
| 394 const SSL_PRIVATE_KEY_METHOD | 395 const SSL_PRIVATE_KEY_METHOD |
| 395 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = { | 396 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = { |
| 396 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback, | 397 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback, |
| 397 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback, | 398 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback, |
| 398 &SSLClientSocketImpl::SSLContext::PrivateKeySignCallback, | 399 nullptr /* sign */, |
| 399 &SSLClientSocketImpl::SSLContext::PrivateKeySignCompleteCallback, | 400 &SSLClientSocketImpl::SSLContext::PrivateKeySignDigestCallback, |
| 401 nullptr /* decrypt */, |
| 402 &SSLClientSocketImpl::SSLContext::PrivateKeyCompleteCallback, |
| 400 }; | 403 }; |
| 401 | 404 |
| 402 // PeerCertificateChain is a helper object which extracts the certificate | 405 // PeerCertificateChain is a helper object which extracts the certificate |
| 403 // chain, as given by the server, from an OpenSSL socket and performs the needed | 406 // chain, as given by the server, from an OpenSSL socket and performs the needed |
| 404 // resource management. The first element of the chain is the leaf certificate | 407 // resource management. The first element of the chain is the leaf certificate |
| 405 // and the other elements are in the order given by the server. | 408 // and the other elements are in the order given by the server. |
| 406 class SSLClientSocketImpl::PeerCertificateChain { | 409 class SSLClientSocketImpl::PeerCertificateChain { |
| 407 public: | 410 public: |
| 408 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); } | 411 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); } |
| 409 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; } | 412 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; } |
| (...skipping 1740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2150 return EVP_PKEY_EC; | 2153 return EVP_PKEY_EC; |
| 2151 } | 2154 } |
| 2152 NOTREACHED(); | 2155 NOTREACHED(); |
| 2153 return EVP_PKEY_NONE; | 2156 return EVP_PKEY_NONE; |
| 2154 } | 2157 } |
| 2155 | 2158 |
| 2156 size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() { | 2159 size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() { |
| 2157 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes(); | 2160 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes(); |
| 2158 } | 2161 } |
| 2159 | 2162 |
| 2160 ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignCallback( | 2163 ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignDigestCallback( |
| 2161 uint8_t* out, | 2164 uint8_t* out, |
| 2162 size_t* out_len, | 2165 size_t* out_len, |
| 2163 size_t max_out, | 2166 size_t max_out, |
| 2164 const EVP_MD* md, | 2167 const EVP_MD* md, |
| 2165 const uint8_t* in, | 2168 const uint8_t* in, |
| 2166 size_t in_len) { | 2169 size_t in_len) { |
| 2167 DCHECK_EQ(kNoPendingResult, signature_result_); | 2170 DCHECK_EQ(kNoPendingResult, signature_result_); |
| 2168 DCHECK(signature_.empty()); | 2171 DCHECK(signature_.empty()); |
| 2169 DCHECK(ssl_config_.client_private_key); | 2172 DCHECK(ssl_config_.client_private_key); |
| 2170 | 2173 |
| 2171 SSLPrivateKey::Hash hash; | 2174 SSLPrivateKey::Hash hash; |
| 2172 if (!EVP_MDToPrivateKeyHash(md, &hash)) { | 2175 if (!EVP_MDToPrivateKeyHash(md, &hash)) { |
| 2173 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); | 2176 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
| 2174 return ssl_private_key_failure; | 2177 return ssl_private_key_failure; |
| 2175 } | 2178 } |
| 2176 | 2179 |
| 2177 net_log_.BeginEvent( | 2180 net_log_.BeginEvent( |
| 2178 NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION, | 2181 NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION, |
| 2179 base::Bind(&NetLogPrivateKeyOperationCallback, | 2182 base::Bind(&NetLogPrivateKeyOperationCallback, |
| 2180 ssl_config_.client_private_key->GetType(), hash)); | 2183 ssl_config_.client_private_key->GetType(), hash)); |
| 2181 | 2184 |
| 2182 signature_result_ = ERR_IO_PENDING; | 2185 signature_result_ = ERR_IO_PENDING; |
| 2183 ssl_config_.client_private_key->SignDigest( | 2186 ssl_config_.client_private_key->SignDigest( |
| 2184 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len), | 2187 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len), |
| 2185 base::Bind(&SSLClientSocketImpl::OnPrivateKeySignComplete, | 2188 base::Bind(&SSLClientSocketImpl::OnPrivateKeyComplete, |
| 2186 weak_factory_.GetWeakPtr())); | 2189 weak_factory_.GetWeakPtr())); |
| 2187 return ssl_private_key_retry; | 2190 return ssl_private_key_retry; |
| 2188 } | 2191 } |
| 2189 | 2192 |
| 2190 ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignCompleteCallback( | 2193 ssl_private_key_result_t SSLClientSocketImpl::PrivateKeyCompleteCallback( |
| 2191 uint8_t* out, | 2194 uint8_t* out, |
| 2192 size_t* out_len, | 2195 size_t* out_len, |
| 2193 size_t max_out) { | 2196 size_t max_out) { |
| 2194 DCHECK_NE(kNoPendingResult, signature_result_); | 2197 DCHECK_NE(kNoPendingResult, signature_result_); |
| 2195 DCHECK(ssl_config_.client_private_key); | 2198 DCHECK(ssl_config_.client_private_key); |
| 2196 | 2199 |
| 2197 if (signature_result_ == ERR_IO_PENDING) | 2200 if (signature_result_ == ERR_IO_PENDING) |
| 2198 return ssl_private_key_retry; | 2201 return ssl_private_key_retry; |
| 2199 if (signature_result_ != OK) { | 2202 if (signature_result_ != OK) { |
| 2200 OpenSSLPutNetError(FROM_HERE, signature_result_); | 2203 OpenSSLPutNetError(FROM_HERE, signature_result_); |
| 2201 return ssl_private_key_failure; | 2204 return ssl_private_key_failure; |
| 2202 } | 2205 } |
| 2203 if (signature_.size() > max_out) { | 2206 if (signature_.size() > max_out) { |
| 2204 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); | 2207 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
| 2205 return ssl_private_key_failure; | 2208 return ssl_private_key_failure; |
| 2206 } | 2209 } |
| 2207 memcpy(out, signature_.data(), signature_.size()); | 2210 memcpy(out, signature_.data(), signature_.size()); |
| 2208 *out_len = signature_.size(); | 2211 *out_len = signature_.size(); |
| 2209 signature_.clear(); | 2212 signature_.clear(); |
| 2210 return ssl_private_key_success; | 2213 return ssl_private_key_success; |
| 2211 } | 2214 } |
| 2212 | 2215 |
| 2213 void SSLClientSocketImpl::OnPrivateKeySignComplete( | 2216 void SSLClientSocketImpl::OnPrivateKeyComplete( |
| 2214 Error error, | 2217 Error error, |
| 2215 const std::vector<uint8_t>& signature) { | 2218 const std::vector<uint8_t>& signature) { |
| 2216 DCHECK_EQ(ERR_IO_PENDING, signature_result_); | 2219 DCHECK_EQ(ERR_IO_PENDING, signature_result_); |
| 2217 DCHECK(signature_.empty()); | 2220 DCHECK(signature_.empty()); |
| 2218 DCHECK(ssl_config_.client_private_key); | 2221 DCHECK(ssl_config_.client_private_key); |
| 2219 | 2222 |
| 2220 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION, | 2223 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION, |
| 2221 error); | 2224 error); |
| 2222 | 2225 |
| 2223 signature_result_ = error; | 2226 signature_result_ = error; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2317 if (rv != OK) { | 2320 if (rv != OK) { |
| 2318 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 2321 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
| 2319 return; | 2322 return; |
| 2320 } | 2323 } |
| 2321 | 2324 |
| 2322 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, | 2325 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, |
| 2323 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this))); | 2326 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this))); |
| 2324 } | 2327 } |
| 2325 | 2328 |
| 2326 } // namespace net | 2329 } // namespace net |
| OLD | NEW |