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 |