Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(227)

Side by Side Diff: net/socket/ssl_client_socket_impl.cc

Issue 2156973002: Roll src/third_party/boringssl/src 10f97f3bf..8d315d705 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/socket/ssl_client_socket_impl.h ('k') | third_party/boringssl/BUILD.generated.gni » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_impl.h ('k') | third_party/boringssl/BUILD.generated.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698