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/err.h> | 10 #include <openssl/err.h> |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "net/ssl/ssl_cert_request_info.h" | 29 #include "net/ssl/ssl_cert_request_info.h" |
30 #include "net/ssl/ssl_connection_status_flags.h" | 30 #include "net/ssl/ssl_connection_status_flags.h" |
31 #include "net/ssl/ssl_info.h" | 31 #include "net/ssl/ssl_info.h" |
32 | 32 |
33 namespace net { | 33 namespace net { |
34 | 34 |
35 namespace { | 35 namespace { |
36 | 36 |
37 // Enable this to see logging for state machine state transitions. | 37 // Enable this to see logging for state machine state transitions. |
38 #if 0 | 38 #if 0 |
39 #define GotoState(s) do { DVLOG(2) << (void *)this << " " << __FUNCTION__ << \ | 39 #define GotoState(s) \ |
40 " jump to state " << s; \ | 40 do { \ |
41 next_handshake_state_ = s; } while (0) | 41 DVLOG(2) << (void*) this << " " << __FUNCTION__ << " jump to state " << s; \ |
| 42 next_handshake_state_ = s; \ |
| 43 } while (0) |
42 #else | 44 #else |
43 #define GotoState(s) next_handshake_state_ = s | 45 #define GotoState(s) next_handshake_state_ = s |
44 #endif | 46 #endif |
45 | 47 |
46 // This constant can be any non-negative/non-zero value (eg: it does not | 48 // This constant can be any non-negative/non-zero value (eg: it does not |
47 // overlap with any value of the net::Error range, including net::OK). | 49 // overlap with any value of the net::Error range, including net::OK). |
48 const int kNoPendingReadResult = 1; | 50 const int kNoPendingReadResult = 1; |
49 | 51 |
50 // If a client doesn't have a list of protocols that it supports, but | 52 // If a client doesn't have a list of protocols that it supports, but |
51 // the server supports NPN, choosing "http/1.1" is the best answer. | 53 // the server supports NPN, choosing "http/1.1" is the best answer. |
52 const char kDefaultSupportedNPNProtocol[] = "http/1.1"; | 54 const char kDefaultSupportedNPNProtocol[] = "http/1.1"; |
53 | 55 |
54 #if OPENSSL_VERSION_NUMBER < 0x1000103fL | 56 #if OPENSSL_VERSION_NUMBER < 0x1000103fL |
55 // This method doesn't seem to have made it into the OpenSSL headers. | 57 // This method doesn't seem to have made it into the OpenSSL headers. |
56 unsigned long SSL_CIPHER_get_id(const SSL_CIPHER* cipher) { return cipher->id; } | 58 unsigned long SSL_CIPHER_get_id(const SSL_CIPHER* cipher) { |
| 59 return cipher->id; |
| 60 } |
57 #endif | 61 #endif |
58 | 62 |
59 // Used for encoding the |connection_status| field of an SSLInfo object. | 63 // Used for encoding the |connection_status| field of an SSLInfo object. |
60 int EncodeSSLConnectionStatus(int cipher_suite, | 64 int EncodeSSLConnectionStatus(int cipher_suite, int compression, int version) { |
61 int compression, | 65 return ((cipher_suite & SSL_CONNECTION_CIPHERSUITE_MASK) |
62 int version) { | 66 << SSL_CONNECTION_CIPHERSUITE_SHIFT) | |
63 return ((cipher_suite & SSL_CONNECTION_CIPHERSUITE_MASK) << | 67 ((compression & SSL_CONNECTION_COMPRESSION_MASK) |
64 SSL_CONNECTION_CIPHERSUITE_SHIFT) | | 68 << SSL_CONNECTION_COMPRESSION_SHIFT) | |
65 ((compression & SSL_CONNECTION_COMPRESSION_MASK) << | 69 ((version & SSL_CONNECTION_VERSION_MASK) |
66 SSL_CONNECTION_COMPRESSION_SHIFT) | | 70 << SSL_CONNECTION_VERSION_SHIFT); |
67 ((version & SSL_CONNECTION_VERSION_MASK) << | |
68 SSL_CONNECTION_VERSION_SHIFT); | |
69 } | 71 } |
70 | 72 |
71 // Returns the net SSL version number (see ssl_connection_status_flags.h) for | 73 // Returns the net SSL version number (see ssl_connection_status_flags.h) for |
72 // this SSL connection. | 74 // this SSL connection. |
73 int GetNetSSLVersion(SSL* ssl) { | 75 int GetNetSSLVersion(SSL* ssl) { |
74 switch (SSL_version(ssl)) { | 76 switch (SSL_version(ssl)) { |
75 case SSL2_VERSION: | 77 case SSL2_VERSION: |
76 return SSL_CONNECTION_VERSION_SSL2; | 78 return SSL_CONNECTION_VERSION_SSL2; |
77 case SSL3_VERSION: | 79 case SSL3_VERSION: |
78 return SSL_CONNECTION_VERSION_SSL3; | 80 return SSL_CONNECTION_VERSION_SSL3; |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 // error stack if needed. Note that |tracer| is not currently used in the | 199 // error stack if needed. Note that |tracer| is not currently used in the |
198 // implementation, but is passed in anyway as this ensures the caller will clear | 200 // implementation, but is passed in anyway as this ensures the caller will clear |
199 // any residual codes left on the error stack. | 201 // any residual codes left on the error stack. |
200 int MapOpenSSLError(int err, const crypto::OpenSSLErrStackTracer& tracer) { | 202 int MapOpenSSLError(int err, const crypto::OpenSSLErrStackTracer& tracer) { |
201 switch (err) { | 203 switch (err) { |
202 case SSL_ERROR_WANT_READ: | 204 case SSL_ERROR_WANT_READ: |
203 case SSL_ERROR_WANT_WRITE: | 205 case SSL_ERROR_WANT_WRITE: |
204 return ERR_IO_PENDING; | 206 return ERR_IO_PENDING; |
205 case SSL_ERROR_SYSCALL: | 207 case SSL_ERROR_SYSCALL: |
206 LOG(ERROR) << "OpenSSL SYSCALL error, earliest error code in " | 208 LOG(ERROR) << "OpenSSL SYSCALL error, earliest error code in " |
207 "error queue: " << ERR_peek_error() << ", errno: " | 209 "error queue: " << ERR_peek_error() << ", errno: " << errno; |
208 << errno; | |
209 return ERR_SSL_PROTOCOL_ERROR; | 210 return ERR_SSL_PROTOCOL_ERROR; |
210 case SSL_ERROR_SSL: | 211 case SSL_ERROR_SSL: |
211 return MapOpenSSLErrorSSL(); | 212 return MapOpenSSLErrorSSL(); |
212 default: | 213 default: |
213 // TODO(joth): Implement full mapping. | 214 // TODO(joth): Implement full mapping. |
214 LOG(WARNING) << "Unknown OpenSSL error " << err; | 215 LOG(WARNING) << "Unknown OpenSSL error " << err; |
215 return ERR_SSL_PROTOCOL_ERROR; | 216 return ERR_SSL_PROTOCOL_ERROR; |
216 } | 217 } |
217 } | 218 } |
218 | 219 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 DCHECK_NE(ssl_socket_data_index_, -1); | 268 DCHECK_NE(ssl_socket_data_index_, -1); |
268 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method())); | 269 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method())); |
269 session_cache_.Reset(ssl_ctx_.get(), kDefaultSessionCacheConfig); | 270 session_cache_.Reset(ssl_ctx_.get(), kDefaultSessionCacheConfig); |
270 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL); | 271 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL); |
271 SSL_CTX_set_client_cert_cb(ssl_ctx_.get(), ClientCertCallback); | 272 SSL_CTX_set_client_cert_cb(ssl_ctx_.get(), ClientCertCallback); |
272 SSL_CTX_set_channel_id_cb(ssl_ctx_.get(), ChannelIDCallback); | 273 SSL_CTX_set_channel_id_cb(ssl_ctx_.get(), ChannelIDCallback); |
273 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL); | 274 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL); |
274 // TODO(kristianm): Only select this if ssl_config_.next_proto is not empty. | 275 // TODO(kristianm): Only select this if ssl_config_.next_proto is not empty. |
275 // It would be better if the callback were not a global setting, | 276 // It would be better if the callback were not a global setting, |
276 // but that is an OpenSSL issue. | 277 // but that is an OpenSSL issue. |
277 SSL_CTX_set_next_proto_select_cb(ssl_ctx_.get(), SelectNextProtoCallback, | 278 SSL_CTX_set_next_proto_select_cb( |
278 NULL); | 279 ssl_ctx_.get(), SelectNextProtoCallback, NULL); |
279 } | 280 } |
280 | 281 |
281 static std::string GetSessionCacheKey(const SSL* ssl) { | 282 static std::string GetSessionCacheKey(const SSL* ssl) { |
282 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); | 283 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
283 DCHECK(socket); | 284 DCHECK(socket); |
284 return GetSocketSessionCacheKey(*socket); | 285 return GetSocketSessionCacheKey(*socket); |
285 } | 286 } |
286 | 287 |
287 static SSLSessionCacheOpenSSL::Config kDefaultSessionCacheConfig; | 288 static SSLSessionCacheOpenSSL::Config kDefaultSessionCacheConfig; |
288 | 289 |
289 static int ClientCertCallback(SSL* ssl, X509** x509, EVP_PKEY** pkey) { | 290 static int ClientCertCallback(SSL* ssl, X509** x509, EVP_PKEY** pkey) { |
290 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); | 291 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
291 CHECK(socket); | 292 CHECK(socket); |
292 return socket->ClientCertRequestCallback(ssl, x509, pkey); | 293 return socket->ClientCertRequestCallback(ssl, x509, pkey); |
293 } | 294 } |
294 | 295 |
295 static void ChannelIDCallback(SSL* ssl, EVP_PKEY** pkey) { | 296 static void ChannelIDCallback(SSL* ssl, EVP_PKEY** pkey) { |
296 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); | 297 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
297 CHECK(socket); | 298 CHECK(socket); |
298 socket->ChannelIDRequestCallback(ssl, pkey); | 299 socket->ChannelIDRequestCallback(ssl, pkey); |
299 } | 300 } |
300 | 301 |
301 static int CertVerifyCallback(X509_STORE_CTX *store_ctx, void *arg) { | 302 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) { |
302 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data( | 303 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data( |
303 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx())); | 304 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx())); |
304 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); | 305 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
305 CHECK(socket); | 306 CHECK(socket); |
306 | 307 |
307 return socket->CertVerifyCallback(store_ctx); | 308 return socket->CertVerifyCallback(store_ctx); |
308 } | 309 } |
309 | 310 |
310 static int SelectNextProtoCallback(SSL* ssl, | 311 static int SelectNextProtoCallback(SSL* ssl, |
311 unsigned char** out, unsigned char* outlen, | 312 unsigned char** out, |
| 313 unsigned char* outlen, |
312 const unsigned char* in, | 314 const unsigned char* in, |
313 unsigned int inlen, void* arg) { | 315 unsigned int inlen, |
| 316 void* arg) { |
314 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); | 317 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); |
315 return socket->SelectNextProtoCallback(out, outlen, in, inlen); | 318 return socket->SelectNextProtoCallback(out, outlen, in, inlen); |
316 } | 319 } |
317 | 320 |
318 // This is the index used with SSL_get_ex_data to retrieve the owner | 321 // This is the index used with SSL_get_ex_data to retrieve the owner |
319 // SSLClientSocketOpenSSL object from an SSL instance. | 322 // SSLClientSocketOpenSSL object from an SSL instance. |
320 int ssl_socket_data_index_; | 323 int ssl_socket_data_index_; |
321 | 324 |
322 crypto::ScopedOpenSSL<SSL_CTX, SSL_CTX_free> ssl_ctx_; | 325 crypto::ScopedOpenSSL<SSL_CTX, SSL_CTX_free> ssl_ctx_; |
323 // |session_cache_| must be destroyed before |ssl_ctx_|. | 326 // |session_cache_| must be destroyed before |ssl_ctx_|. |
324 SSLSessionCacheOpenSSL session_cache_; | 327 SSLSessionCacheOpenSSL session_cache_; |
325 }; | 328 }; |
326 | 329 |
327 // PeerCertificateChain is a helper object which extracts the certificate | 330 // PeerCertificateChain is a helper object which extracts the certificate |
328 // chain, as given by the server, from an OpenSSL socket and performs the needed | 331 // chain, as given by the server, from an OpenSSL socket and performs the needed |
329 // resource management. The first element of the chain is the leaf certificate | 332 // resource management. The first element of the chain is the leaf certificate |
330 // and the other elements are in the order given by the server. | 333 // and the other elements are in the order given by the server. |
331 class SSLClientSocketOpenSSL::PeerCertificateChain { | 334 class SSLClientSocketOpenSSL::PeerCertificateChain { |
332 public: | 335 public: |
333 explicit PeerCertificateChain(STACK_OF(X509)* chain) { Reset(chain); } | 336 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); } |
334 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; } | 337 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; } |
335 ~PeerCertificateChain() {} | 338 ~PeerCertificateChain() {} |
336 PeerCertificateChain& operator=(const PeerCertificateChain& other); | 339 PeerCertificateChain& operator=(const PeerCertificateChain& other); |
337 | 340 |
338 // Resets the PeerCertificateChain to the set of certificates in|chain|, | 341 // Resets the PeerCertificateChain to the set of certificates in|chain|, |
339 // which may be NULL, indicating to empty the store certificates. | 342 // which may be NULL, indicating to empty the store certificates. |
340 // Note: If an error occurs, such as being unable to parse the certificates, | 343 // Note: If an error occurs, such as being unable to parse the certificates, |
341 // this will behave as if Reset(NULL) was called. | 344 // this will behave as if Reset(NULL) was called. |
342 void Reset(STACK_OF(X509)* chain); | 345 void Reset(STACK_OF(X509) * chain); |
343 | 346 |
344 // Note that when USE_OPENSSL is defined, OSCertHandle is X509* | 347 // Note that when USE_OPENSSL is defined, OSCertHandle is X509* |
345 const scoped_refptr<X509Certificate>& AsOSChain() const { return os_chain_; } | 348 const scoped_refptr<X509Certificate>& AsOSChain() const { return os_chain_; } |
346 | 349 |
347 size_t size() const { | 350 size_t size() const { |
348 if (!openssl_chain_.get()) | 351 if (!openssl_chain_.get()) |
349 return 0; | 352 return 0; |
350 return sk_X509_num(openssl_chain_.get()); | 353 return sk_X509_num(openssl_chain_.get()); |
351 } | 354 } |
352 | 355 |
353 X509* operator[](size_t index) const { | 356 X509* operator[](size_t index) const { |
354 DCHECK_LT(index, size()); | 357 DCHECK_LT(index, size()); |
355 return sk_X509_value(openssl_chain_.get(), index); | 358 return sk_X509_value(openssl_chain_.get(), index); |
356 } | 359 } |
357 | 360 |
358 bool IsValid() { return os_chain_.get() && openssl_chain_.get(); } | 361 bool IsValid() { return os_chain_.get() && openssl_chain_.get(); } |
359 | 362 |
360 private: | 363 private: |
361 static void FreeX509Stack(STACK_OF(X509)* cert_chain) { | 364 static void FreeX509Stack(STACK_OF(X509) * cert_chain) { |
362 sk_X509_pop_free(cert_chain, X509_free); | 365 sk_X509_pop_free(cert_chain, X509_free); |
363 } | 366 } |
364 | 367 |
365 friend class crypto::ScopedOpenSSL<STACK_OF(X509), FreeX509Stack>; | 368 friend class crypto::ScopedOpenSSL<STACK_OF(X509), FreeX509Stack>; |
366 | 369 |
367 crypto::ScopedOpenSSL<STACK_OF(X509), FreeX509Stack> openssl_chain_; | 370 crypto::ScopedOpenSSL<STACK_OF(X509), FreeX509Stack> openssl_chain_; |
368 | 371 |
369 scoped_refptr<X509Certificate> os_chain_; | 372 scoped_refptr<X509Certificate> os_chain_; |
370 }; | 373 }; |
371 | 374 |
372 SSLClientSocketOpenSSL::PeerCertificateChain& | 375 SSLClientSocketOpenSSL::PeerCertificateChain& |
373 SSLClientSocketOpenSSL::PeerCertificateChain::operator=( | 376 SSLClientSocketOpenSSL::PeerCertificateChain:: |
374 const PeerCertificateChain& other) { | 377 operator=(const PeerCertificateChain& other) { |
375 if (this == &other) | 378 if (this == &other) |
376 return *this; | 379 return *this; |
377 | 380 |
378 // os_chain_ is reference counted by scoped_refptr; | 381 // os_chain_ is reference counted by scoped_refptr; |
379 os_chain_ = other.os_chain_; | 382 os_chain_ = other.os_chain_; |
380 | 383 |
381 // Must increase the reference count manually for sk_X509_dup | 384 // Must increase the reference count manually for sk_X509_dup |
382 openssl_chain_.reset(sk_X509_dup(other.openssl_chain_.get())); | 385 openssl_chain_.reset(sk_X509_dup(other.openssl_chain_.get())); |
383 for (int i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { | 386 for (int i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { |
384 X509* x = sk_X509_value(openssl_chain_.get(), i); | 387 X509* x = sk_X509_value(openssl_chain_.get(), i); |
385 CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); | 388 CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); |
386 } | 389 } |
387 return *this; | 390 return *this; |
388 } | 391 } |
389 | 392 |
390 #if defined(USE_OPENSSL_CERTS) | 393 #if defined(USE_OPENSSL_CERTS) |
391 // When OSCertHandle is typedef'ed to X509, this implementation does a short cut | 394 // When OSCertHandle is typedef'ed to X509, this implementation does a short cut |
392 // to avoid converting back and forth between der and X509 struct. | 395 // to avoid converting back and forth between der and X509 struct. |
393 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( | 396 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset(STACK_OF(X509) * |
394 STACK_OF(X509)* chain) { | 397 chain) { |
395 openssl_chain_.reset(NULL); | 398 openssl_chain_.reset(NULL); |
396 os_chain_ = NULL; | 399 os_chain_ = NULL; |
397 | 400 |
398 if (!chain) | 401 if (!chain) |
399 return; | 402 return; |
400 | 403 |
401 X509Certificate::OSCertHandles intermediates; | 404 X509Certificate::OSCertHandles intermediates; |
402 for (int i = 1; i < sk_X509_num(chain); ++i) | 405 for (int i = 1; i < sk_X509_num(chain); ++i) |
403 intermediates.push_back(sk_X509_value(chain, i)); | 406 intermediates.push_back(sk_X509_value(chain, i)); |
404 | 407 |
405 os_chain_ = | 408 os_chain_ = |
406 X509Certificate::CreateFromHandle(sk_X509_value(chain, 0), intermediates); | 409 X509Certificate::CreateFromHandle(sk_X509_value(chain, 0), intermediates); |
407 | 410 |
408 // sk_X509_dup does not increase reference count on the certs in the stack. | 411 // sk_X509_dup does not increase reference count on the certs in the stack. |
409 openssl_chain_.reset(sk_X509_dup(chain)); | 412 openssl_chain_.reset(sk_X509_dup(chain)); |
410 | 413 |
411 std::vector<base::StringPiece> der_chain; | 414 std::vector<base::StringPiece> der_chain; |
412 for (int i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { | 415 for (int i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { |
413 X509* x = sk_X509_value(openssl_chain_.get(), i); | 416 X509* x = sk_X509_value(openssl_chain_.get(), i); |
414 // Increase the reference count for the certs in openssl_chain_. | 417 // Increase the reference count for the certs in openssl_chain_. |
415 CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); | 418 CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); |
416 } | 419 } |
417 } | 420 } |
418 #else // !defined(USE_OPENSSL_CERTS) | 421 #else // !defined(USE_OPENSSL_CERTS) |
419 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( | 422 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset(STACK_OF(X509) * |
420 STACK_OF(X509)* chain) { | 423 chain) { |
421 openssl_chain_.reset(NULL); | 424 openssl_chain_.reset(NULL); |
422 os_chain_ = NULL; | 425 os_chain_ = NULL; |
423 | 426 |
424 if (!chain) | 427 if (!chain) |
425 return; | 428 return; |
426 | 429 |
427 // sk_X509_dup does not increase reference count on the certs in the stack. | 430 // sk_X509_dup does not increase reference count on the certs in the stack. |
428 openssl_chain_.reset(sk_X509_dup(chain)); | 431 openssl_chain_.reset(sk_X509_dup(chain)); |
429 | 432 |
430 std::vector<base::StringPiece> der_chain; | 433 std::vector<base::StringPiece> der_chain; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 transport_bio_(NULL), | 498 transport_bio_(NULL), |
496 transport_(transport_socket.Pass()), | 499 transport_(transport_socket.Pass()), |
497 host_and_port_(host_and_port), | 500 host_and_port_(host_and_port), |
498 ssl_config_(ssl_config), | 501 ssl_config_(ssl_config), |
499 ssl_session_cache_shard_(context.ssl_session_cache_shard), | 502 ssl_session_cache_shard_(context.ssl_session_cache_shard), |
500 trying_cached_session_(false), | 503 trying_cached_session_(false), |
501 next_handshake_state_(STATE_NONE), | 504 next_handshake_state_(STATE_NONE), |
502 npn_status_(kNextProtoUnsupported), | 505 npn_status_(kNextProtoUnsupported), |
503 channel_id_request_return_value_(ERR_UNEXPECTED), | 506 channel_id_request_return_value_(ERR_UNEXPECTED), |
504 channel_id_xtn_negotiated_(false), | 507 channel_id_xtn_negotiated_(false), |
505 net_log_(transport_->socket()->NetLog()) {} | 508 net_log_(transport_->socket()->NetLog()) { |
| 509 } |
506 | 510 |
507 SSLClientSocketOpenSSL::~SSLClientSocketOpenSSL() { | 511 SSLClientSocketOpenSSL::~SSLClientSocketOpenSSL() { |
508 Disconnect(); | 512 Disconnect(); |
509 } | 513 } |
510 | 514 |
511 void SSLClientSocketOpenSSL::GetSSLCertRequestInfo( | 515 void SSLClientSocketOpenSSL::GetSSLCertRequestInfo( |
512 SSLCertRequestInfo* cert_request_info) { | 516 SSLCertRequestInfo* cert_request_info) { |
513 cert_request_info->host_and_port = host_and_port_; | 517 cert_request_info->host_and_port = host_and_port_; |
514 cert_request_info->cert_authorities = cert_authorities_; | 518 cert_request_info->cert_authorities = cert_authorities_; |
515 } | 519 } |
516 | 520 |
517 SSLClientSocket::NextProtoStatus SSLClientSocketOpenSSL::GetNextProto( | 521 SSLClientSocket::NextProtoStatus SSLClientSocketOpenSSL::GetNextProto( |
518 std::string* proto, std::string* server_protos) { | 522 std::string* proto, |
| 523 std::string* server_protos) { |
519 *proto = npn_proto_; | 524 *proto = npn_proto_; |
520 *server_protos = server_protos_; | 525 *server_protos = server_protos_; |
521 return npn_status_; | 526 return npn_status_; |
522 } | 527 } |
523 | 528 |
524 ServerBoundCertService* | 529 ServerBoundCertService* SSLClientSocketOpenSSL::GetServerBoundCertService() |
525 SSLClientSocketOpenSSL::GetServerBoundCertService() const { | 530 const { |
526 return server_bound_cert_service_; | 531 return server_bound_cert_service_; |
527 } | 532 } |
528 | 533 |
529 int SSLClientSocketOpenSSL::ExportKeyingMaterial( | 534 int SSLClientSocketOpenSSL::ExportKeyingMaterial( |
530 const base::StringPiece& label, | 535 const base::StringPiece& label, |
531 bool has_context, const base::StringPiece& context, | 536 bool has_context, |
532 unsigned char* out, unsigned int outlen) { | 537 const base::StringPiece& context, |
| 538 unsigned char* out, |
| 539 unsigned int outlen) { |
533 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 540 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
534 | 541 |
535 int rv = SSL_export_keying_material( | 542 int rv = SSL_export_keying_material( |
536 ssl_, out, outlen, const_cast<char*>(label.data()), | 543 ssl_, |
| 544 out, |
| 545 outlen, |
| 546 const_cast<char*>(label.data()), |
537 label.size(), | 547 label.size(), |
538 reinterpret_cast<unsigned char*>(const_cast<char*>(context.data())), | 548 reinterpret_cast<unsigned char*>(const_cast<char*>(context.data())), |
539 context.length(), | 549 context.length(), |
540 context.length() > 0); | 550 context.length() > 0); |
541 | 551 |
542 if (rv != 1) { | 552 if (rv != 1) { |
543 int ssl_error = SSL_get_error(ssl_, rv); | 553 int ssl_error = SSL_get_error(ssl_, rv); |
544 LOG(ERROR) << "Failed to export keying material;" | 554 LOG(ERROR) << "Failed to export keying material;" |
545 << " returned " << rv | 555 << " returned " << rv << ", SSL error code " << ssl_error; |
546 << ", SSL error code " << ssl_error; | |
547 return MapOpenSSLError(ssl_error, err_tracer); | 556 return MapOpenSSLError(ssl_error, err_tracer); |
548 } | 557 } |
549 return OK; | 558 return OK; |
550 } | 559 } |
551 | 560 |
552 int SSLClientSocketOpenSSL::GetTLSUniqueChannelBinding(std::string* out) { | 561 int SSLClientSocketOpenSSL::GetTLSUniqueChannelBinding(std::string* out) { |
553 return ERR_NOT_IMPLEMENTED; | 562 return ERR_NOT_IMPLEMENTED; |
554 } | 563 } |
555 | 564 |
556 int SSLClientSocketOpenSSL::Connect(const CompletionCallback& callback) { | 565 int SSLClientSocketOpenSSL::Connect(const CompletionCallback& callback) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 // Null all callbacks, delete all buffers. | 606 // Null all callbacks, delete all buffers. |
598 transport_send_busy_ = false; | 607 transport_send_busy_ = false; |
599 send_buffer_ = NULL; | 608 send_buffer_ = NULL; |
600 transport_recv_busy_ = false; | 609 transport_recv_busy_ = false; |
601 transport_recv_eof_ = false; | 610 transport_recv_eof_ = false; |
602 recv_buffer_ = NULL; | 611 recv_buffer_ = NULL; |
603 | 612 |
604 user_connect_callback_.Reset(); | 613 user_connect_callback_.Reset(); |
605 user_read_callback_.Reset(); | 614 user_read_callback_.Reset(); |
606 user_write_callback_.Reset(); | 615 user_write_callback_.Reset(); |
607 user_read_buf_ = NULL; | 616 user_read_buf_ = NULL; |
608 user_read_buf_len_ = 0; | 617 user_read_buf_len_ = 0; |
609 user_write_buf_ = NULL; | 618 user_write_buf_ = NULL; |
610 user_write_buf_len_ = 0; | 619 user_write_buf_len_ = 0; |
611 | 620 |
612 pending_read_error_ = kNoPendingReadResult; | 621 pending_read_error_ = kNoPendingReadResult; |
613 transport_write_error_ = OK; | 622 transport_write_error_ = OK; |
614 | 623 |
615 server_cert_verify_result_.Reset(); | 624 server_cert_verify_result_.Reset(); |
616 completed_handshake_ = false; | 625 completed_handshake_ = false; |
617 | 626 |
618 cert_authorities_.clear(); | 627 cert_authorities_.clear(); |
619 client_auth_cert_needed_ = false; | 628 client_auth_cert_needed_ = false; |
620 } | 629 } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 | 698 |
690 bool SSLClientSocketOpenSSL::GetSSLInfo(SSLInfo* ssl_info) { | 699 bool SSLClientSocketOpenSSL::GetSSLInfo(SSLInfo* ssl_info) { |
691 ssl_info->Reset(); | 700 ssl_info->Reset(); |
692 if (!server_cert_.get()) | 701 if (!server_cert_.get()) |
693 return false; | 702 return false; |
694 | 703 |
695 ssl_info->cert = server_cert_verify_result_.verified_cert; | 704 ssl_info->cert = server_cert_verify_result_.verified_cert; |
696 ssl_info->cert_status = server_cert_verify_result_.cert_status; | 705 ssl_info->cert_status = server_cert_verify_result_.cert_status; |
697 ssl_info->is_issued_by_known_root = | 706 ssl_info->is_issued_by_known_root = |
698 server_cert_verify_result_.is_issued_by_known_root; | 707 server_cert_verify_result_.is_issued_by_known_root; |
699 ssl_info->public_key_hashes = | 708 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes; |
700 server_cert_verify_result_.public_key_hashes; | |
701 ssl_info->client_cert_sent = | 709 ssl_info->client_cert_sent = |
702 ssl_config_.send_client_cert && ssl_config_.client_cert.get(); | 710 ssl_config_.send_client_cert && ssl_config_.client_cert.get(); |
703 ssl_info->channel_id_sent = WasChannelIDSent(); | 711 ssl_info->channel_id_sent = WasChannelIDSent(); |
704 | 712 |
705 RecordChannelIDSupport(server_bound_cert_service_, | 713 RecordChannelIDSupport(server_bound_cert_service_, |
706 channel_id_xtn_negotiated_, | 714 channel_id_xtn_negotiated_, |
707 ssl_config_.channel_id_enabled, | 715 ssl_config_.channel_id_enabled, |
708 crypto::ECPrivateKey::IsSupported()); | 716 crypto::ECPrivateKey::IsSupported()); |
709 | 717 |
710 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_); | 718 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_); |
711 CHECK(cipher); | 719 CHECK(cipher); |
712 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL); | 720 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL); |
713 const COMP_METHOD* compression = SSL_get_current_compression(ssl_); | 721 const COMP_METHOD* compression = SSL_get_current_compression(ssl_); |
714 | 722 |
715 ssl_info->connection_status = EncodeSSLConnectionStatus( | 723 ssl_info->connection_status = |
716 SSL_CIPHER_get_id(cipher), | 724 EncodeSSLConnectionStatus(SSL_CIPHER_get_id(cipher), |
717 compression ? compression->type : 0, | 725 compression ? compression->type : 0, |
718 GetNetSSLVersion(ssl_)); | 726 GetNetSSLVersion(ssl_)); |
719 | 727 |
720 bool peer_supports_renego_ext = !!SSL_get_secure_renegotiation_support(ssl_); | 728 bool peer_supports_renego_ext = !!SSL_get_secure_renegotiation_support(ssl_); |
721 if (!peer_supports_renego_ext) | 729 if (!peer_supports_renego_ext) |
722 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION; | 730 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION; |
723 UMA_HISTOGRAM_ENUMERATION("Net.RenegotiationExtensionSupported", | 731 UMA_HISTOGRAM_ENUMERATION("Net.RenegotiationExtensionSupported", |
724 implicit_cast<int>(peer_supports_renego_ext), 2); | 732 implicit_cast<int>(peer_supports_renego_ext), |
| 733 2); |
725 | 734 |
726 if (ssl_config_.version_fallback) | 735 if (ssl_config_.version_fallback) |
727 ssl_info->connection_status |= SSL_CONNECTION_VERSION_FALLBACK; | 736 ssl_info->connection_status |= SSL_CONNECTION_VERSION_FALLBACK; |
728 | 737 |
729 ssl_info->handshake_type = SSL_session_reused(ssl_) ? | 738 ssl_info->handshake_type = SSL_session_reused(ssl_) |
730 SSLInfo::HANDSHAKE_RESUME : SSLInfo::HANDSHAKE_FULL; | 739 ? SSLInfo::HANDSHAKE_RESUME |
| 740 : SSLInfo::HANDSHAKE_FULL; |
731 | 741 |
732 DVLOG(3) << "Encoded connection status: cipher suite = " | 742 DVLOG(3) << "Encoded connection status: cipher suite = " |
733 << SSLConnectionStatusToCipherSuite(ssl_info->connection_status) | 743 << SSLConnectionStatusToCipherSuite(ssl_info->connection_status) |
734 << " version = " | 744 << " version = " |
735 << SSLConnectionStatusToVersion(ssl_info->connection_status); | 745 << SSLConnectionStatusToVersion(ssl_info->connection_status); |
736 return true; | 746 return true; |
737 } | 747 } |
738 | 748 |
739 int SSLClientSocketOpenSSL::Read(IOBuffer* buf, | 749 int SSLClientSocketOpenSSL::Read(IOBuffer* buf, |
740 int buf_len, | 750 int buf_len, |
741 const CompletionCallback& callback) { | 751 const CompletionCallback& callback) { |
742 user_read_buf_ = buf; | 752 user_read_buf_ = buf; |
743 user_read_buf_len_ = buf_len; | 753 user_read_buf_len_ = buf_len; |
744 | 754 |
745 int rv = DoReadLoop(OK); | 755 int rv = DoReadLoop(OK); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
849 | 859 |
850 // Removing ciphers by ID from OpenSSL is a bit involved as we must use the | 860 // Removing ciphers by ID from OpenSSL is a bit involved as we must use the |
851 // textual name with SSL_set_cipher_list because there is no public API to | 861 // textual name with SSL_set_cipher_list because there is no public API to |
852 // directly remove a cipher by ID. | 862 // directly remove a cipher by ID. |
853 STACK_OF(SSL_CIPHER)* ciphers = SSL_get_ciphers(ssl_); | 863 STACK_OF(SSL_CIPHER)* ciphers = SSL_get_ciphers(ssl_); |
854 DCHECK(ciphers); | 864 DCHECK(ciphers); |
855 // See SSLConfig::disabled_cipher_suites for description of the suites | 865 // See SSLConfig::disabled_cipher_suites for description of the suites |
856 // disabled by default. Note that !SHA256 and !SHA384 only remove HMAC-SHA256 | 866 // disabled by default. Note that !SHA256 and !SHA384 only remove HMAC-SHA256 |
857 // and HMAC-SHA384 cipher suites, not GCM cipher suites with SHA256 or SHA384 | 867 // and HMAC-SHA384 cipher suites, not GCM cipher suites with SHA256 or SHA384 |
858 // as the handshake hash. | 868 // as the handshake hash. |
859 std::string command("DEFAULT:!NULL:!aNULL:!IDEA:!FZA:!SRP:!SHA256:!SHA384:" | 869 std::string command( |
860 "!aECDH:!AESGCM+AES256"); | 870 "DEFAULT:!NULL:!aNULL:!IDEA:!FZA:!SRP:!SHA256:!SHA384:" |
| 871 "!aECDH:!AESGCM+AES256"); |
861 // Walk through all the installed ciphers, seeing if any need to be | 872 // Walk through all the installed ciphers, seeing if any need to be |
862 // appended to the cipher removal |command|. | 873 // appended to the cipher removal |command|. |
863 for (int i = 0; i < sk_SSL_CIPHER_num(ciphers); ++i) { | 874 for (int i = 0; i < sk_SSL_CIPHER_num(ciphers); ++i) { |
864 const SSL_CIPHER* cipher = sk_SSL_CIPHER_value(ciphers, i); | 875 const SSL_CIPHER* cipher = sk_SSL_CIPHER_value(ciphers, i); |
865 const uint16 id = SSL_CIPHER_get_id(cipher); | 876 const uint16 id = SSL_CIPHER_get_id(cipher); |
866 // Remove any ciphers with a strength of less than 80 bits. Note the NSS | 877 // Remove any ciphers with a strength of less than 80 bits. Note the NSS |
867 // implementation uses "effective" bits here but OpenSSL does not provide | 878 // implementation uses "effective" bits here but OpenSSL does not provide |
868 // this detail. This only impacts Triple DES: reports 112 vs. 168 bits, | 879 // this detail. This only impacts Triple DES: reports 112 vs. 168 bits, |
869 // both of which are greater than 80 anyway. | 880 // both of which are greater than 80 anyway. |
870 bool disable = SSL_CIPHER_get_bits(cipher, NULL) < 80; | 881 bool disable = SSL_CIPHER_get_bits(cipher, NULL) < 80; |
871 if (!disable) { | 882 if (!disable) { |
872 disable = std::find(ssl_config_.disabled_cipher_suites.begin(), | 883 disable = std::find(ssl_config_.disabled_cipher_suites.begin(), |
873 ssl_config_.disabled_cipher_suites.end(), id) != | 884 ssl_config_.disabled_cipher_suites.end(), |
874 ssl_config_.disabled_cipher_suites.end(); | 885 id) != ssl_config_.disabled_cipher_suites.end(); |
875 } | 886 } |
876 if (disable) { | 887 if (disable) { |
877 const char* name = SSL_CIPHER_get_name(cipher); | 888 const char* name = SSL_CIPHER_get_name(cipher); |
878 DVLOG(3) << "Found cipher to remove: '" << name << "', ID: " << id | 889 DVLOG(3) << "Found cipher to remove: '" << name << "', ID: " << id |
879 << " strength: " << SSL_CIPHER_get_bits(cipher, NULL); | 890 << " strength: " << SSL_CIPHER_get_bits(cipher, NULL); |
880 command.append(":!"); | 891 command.append(":!"); |
881 command.append(name); | 892 command.append(name); |
882 } | 893 } |
883 } | 894 } |
884 int rv = SSL_set_cipher_list(ssl_, command.c_str()); | 895 int rv = SSL_set_cipher_list(ssl_, command.c_str()); |
885 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL. | 896 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL. |
886 // This will almost certainly result in the socket failing to complete the | 897 // This will almost certainly result in the socket failing to complete the |
887 // handshake at which point the appropriate error is bubbled up to the client. | 898 // handshake at which point the appropriate error is bubbled up to the client. |
888 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') " | 899 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') " |
889 "returned " << rv; | 900 "returned " |
| 901 << rv; |
890 | 902 |
891 // TLS channel ids. | 903 // TLS channel ids. |
892 if (IsChannelIDEnabled(ssl_config_, server_bound_cert_service_)) { | 904 if (IsChannelIDEnabled(ssl_config_, server_bound_cert_service_)) { |
893 SSL_enable_tls_channel_id(ssl_); | 905 SSL_enable_tls_channel_id(ssl_); |
894 } | 906 } |
895 | 907 |
896 return true; | 908 return true; |
897 } | 909 } |
898 | 910 |
899 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { | 911 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
952 } | 964 } |
953 } | 965 } |
954 } else if (rv == 1) { | 966 } else if (rv == 1) { |
955 if (trying_cached_session_ && logging::DEBUG_MODE) { | 967 if (trying_cached_session_ && logging::DEBUG_MODE) { |
956 DVLOG(2) << "Result of session reuse for " << host_and_port_.ToString() | 968 DVLOG(2) << "Result of session reuse for " << host_and_port_.ToString() |
957 << " is: " << (SSL_session_reused(ssl_) ? "Success" : "Fail"); | 969 << " is: " << (SSL_session_reused(ssl_) ? "Success" : "Fail"); |
958 } | 970 } |
959 // SSL handshake is completed. Let's verify the certificate. | 971 // SSL handshake is completed. Let's verify the certificate. |
960 const bool got_cert = !!UpdateServerCert(); | 972 const bool got_cert = !!UpdateServerCert(); |
961 DCHECK(got_cert); | 973 DCHECK(got_cert); |
962 net_log_.AddEvent( | 974 net_log_.AddEvent(NetLog::TYPE_SSL_CERTIFICATES_RECEIVED, |
963 NetLog::TYPE_SSL_CERTIFICATES_RECEIVED, | 975 base::Bind(&NetLogX509CertificateCallback, |
964 base::Bind(&NetLogX509CertificateCallback, | 976 base::Unretained(server_cert_.get()))); |
965 base::Unretained(server_cert_.get()))); | |
966 GotoState(STATE_VERIFY_CERT); | 977 GotoState(STATE_VERIFY_CERT); |
967 } else { | 978 } else { |
968 int ssl_error = SSL_get_error(ssl_, rv); | 979 int ssl_error = SSL_get_error(ssl_, rv); |
969 | 980 |
970 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) { | 981 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) { |
971 // The server supports TLS channel id and the lookup is asynchronous. | 982 // The server supports TLS channel id and the lookup is asynchronous. |
972 // Retrieve the error from the call to |server_bound_cert_service_|. | 983 // Retrieve the error from the call to |server_bound_cert_service_|. |
973 net_error = channel_id_request_return_value_; | 984 net_error = channel_id_request_return_value_; |
974 } else { | 985 } else { |
975 net_error = MapOpenSSLError(ssl_error, err_tracer); | 986 net_error = MapOpenSSLError(ssl_error, err_tracer); |
976 } | 987 } |
977 | 988 |
978 // If not done, stay in this state | 989 // If not done, stay in this state |
979 if (net_error == ERR_IO_PENDING) { | 990 if (net_error == ERR_IO_PENDING) { |
980 GotoState(STATE_HANDSHAKE); | 991 GotoState(STATE_HANDSHAKE); |
981 } else { | 992 } else { |
982 LOG(ERROR) << "handshake failed; returned " << rv | 993 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code " |
983 << ", SSL error code " << ssl_error | 994 << ssl_error << ", net_error " << net_error; |
984 << ", net_error " << net_error; | 995 net_log_.AddEvent(NetLog::TYPE_SSL_HANDSHAKE_ERROR, |
985 net_log_.AddEvent( | 996 CreateNetLogSSLErrorCallback(net_error, ssl_error)); |
986 NetLog::TYPE_SSL_HANDSHAKE_ERROR, | |
987 CreateNetLogSSLErrorCallback(net_error, ssl_error)); | |
988 } | 997 } |
989 } | 998 } |
990 return net_error; | 999 return net_error; |
991 } | 1000 } |
992 | 1001 |
993 int SSLClientSocketOpenSSL::DoVerifyCert(int result) { | 1002 int SSLClientSocketOpenSSL::DoVerifyCert(int result) { |
994 DCHECK(server_cert_.get()); | 1003 DCHECK(server_cert_.get()); |
995 GotoState(STATE_VERIFY_CERT_COMPLETE); | 1004 GotoState(STATE_VERIFY_CERT_COMPLETE); |
996 | 1005 |
997 CertStatus cert_status; | 1006 CertStatus cert_status; |
(...skipping 27 matching lines...) Expand all Loading... |
1025 } | 1034 } |
1026 | 1035 |
1027 int SSLClientSocketOpenSSL::DoVerifyCertComplete(int result) { | 1036 int SSLClientSocketOpenSSL::DoVerifyCertComplete(int result) { |
1028 verifier_.reset(); | 1037 verifier_.reset(); |
1029 | 1038 |
1030 if (result == OK) { | 1039 if (result == OK) { |
1031 // TODO(joth): Work out if we need to remember the intermediate CA certs | 1040 // TODO(joth): Work out if we need to remember the intermediate CA certs |
1032 // when the server sends them to us, and do so here. | 1041 // when the server sends them to us, and do so here. |
1033 SSLContext::GetInstance()->session_cache()->MarkSSLSessionAsGood(ssl_); | 1042 SSLContext::GetInstance()->session_cache()->MarkSSLSessionAsGood(ssl_); |
1034 } else { | 1043 } else { |
1035 DVLOG(1) << "DoVerifyCertComplete error " << ErrorToString(result) | 1044 DVLOG(1) << "DoVerifyCertComplete error " << ErrorToString(result) << " (" |
1036 << " (" << result << ")"; | 1045 << result << ")"; |
1037 } | 1046 } |
1038 | 1047 |
1039 completed_handshake_ = true; | 1048 completed_handshake_ = true; |
1040 // Exit DoHandshakeLoop and return the result to the caller to Connect. | 1049 // Exit DoHandshakeLoop and return the result to the caller to Connect. |
1041 DCHECK_EQ(STATE_NONE, next_handshake_state_); | 1050 DCHECK_EQ(STATE_NONE, next_handshake_state_); |
1042 return result; | 1051 return result; |
1043 } | 1052 } |
1044 | 1053 |
1045 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { | 1054 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { |
1046 if (!user_connect_callback_.is_null()) { | 1055 if (!user_connect_callback_.is_null()) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1130 // to stay in the current state. | 1139 // to stay in the current state. |
1131 State state = next_handshake_state_; | 1140 State state = next_handshake_state_; |
1132 GotoState(STATE_NONE); | 1141 GotoState(STATE_NONE); |
1133 switch (state) { | 1142 switch (state) { |
1134 case STATE_HANDSHAKE: | 1143 case STATE_HANDSHAKE: |
1135 rv = DoHandshake(); | 1144 rv = DoHandshake(); |
1136 break; | 1145 break; |
1137 case STATE_VERIFY_CERT: | 1146 case STATE_VERIFY_CERT: |
1138 DCHECK(rv == OK); | 1147 DCHECK(rv == OK); |
1139 rv = DoVerifyCert(rv); | 1148 rv = DoVerifyCert(rv); |
1140 break; | 1149 break; |
1141 case STATE_VERIFY_CERT_COMPLETE: | 1150 case STATE_VERIFY_CERT_COMPLETE: |
1142 rv = DoVerifyCertComplete(rv); | 1151 rv = DoVerifyCertComplete(rv); |
1143 break; | 1152 break; |
1144 case STATE_NONE: | 1153 case STATE_NONE: |
1145 default: | 1154 default: |
1146 rv = ERR_UNEXPECTED; | 1155 rv = ERR_UNEXPECTED; |
1147 NOTREACHED() << "unexpected state" << state; | 1156 NOTREACHED() << "unexpected state" << state; |
1148 break; | 1157 break; |
1149 } | 1158 } |
1150 | 1159 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1188 } | 1197 } |
1189 | 1198 |
1190 int SSLClientSocketOpenSSL::DoPayloadRead() { | 1199 int SSLClientSocketOpenSSL::DoPayloadRead() { |
1191 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 1200 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
1192 | 1201 |
1193 int rv; | 1202 int rv; |
1194 if (pending_read_error_ != kNoPendingReadResult) { | 1203 if (pending_read_error_ != kNoPendingReadResult) { |
1195 rv = pending_read_error_; | 1204 rv = pending_read_error_; |
1196 pending_read_error_ = kNoPendingReadResult; | 1205 pending_read_error_ = kNoPendingReadResult; |
1197 if (rv == 0) { | 1206 if (rv == 0) { |
1198 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, | 1207 net_log_.AddByteTransferEvent( |
1199 rv, user_read_buf_->data()); | 1208 NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv, user_read_buf_->data()); |
1200 } | 1209 } |
1201 return rv; | 1210 return rv; |
1202 } | 1211 } |
1203 | 1212 |
1204 int total_bytes_read = 0; | 1213 int total_bytes_read = 0; |
1205 do { | 1214 do { |
1206 rv = SSL_read(ssl_, user_read_buf_->data() + total_bytes_read, | 1215 rv = SSL_read(ssl_, |
| 1216 user_read_buf_->data() + total_bytes_read, |
1207 user_read_buf_len_ - total_bytes_read); | 1217 user_read_buf_len_ - total_bytes_read); |
1208 if (rv > 0) | 1218 if (rv > 0) |
1209 total_bytes_read += rv; | 1219 total_bytes_read += rv; |
1210 } while (total_bytes_read < user_read_buf_len_ && rv > 0); | 1220 } while (total_bytes_read < user_read_buf_len_ && rv > 0); |
1211 | 1221 |
1212 if (total_bytes_read == user_read_buf_len_) { | 1222 if (total_bytes_read == user_read_buf_len_) { |
1213 rv = total_bytes_read; | 1223 rv = total_bytes_read; |
1214 } else { | 1224 } else { |
1215 // Otherwise, an error occurred (rv <= 0). The error needs to be handled | 1225 // Otherwise, an error occurred (rv <= 0). The error needs to be handled |
1216 // immediately, while the OpenSSL errors are still available in | 1226 // immediately, while the OpenSSL errors are still available in |
1217 // thread-local storage. However, the handled/remapped error code should | 1227 // thread-local storage. However, the handled/remapped error code should |
1218 // only be returned if no application data was already read; if it was, the | 1228 // only be returned if no application data was already read; if it was, the |
1219 // error code should be deferred until the next call of DoPayloadRead. | 1229 // error code should be deferred until the next call of DoPayloadRead. |
1220 // | 1230 // |
1221 // If no data was read, |*next_result| will point to the return value of | 1231 // If no data was read, |*next_result| will point to the return value of |
1222 // this function. If at least some data was read, |*next_result| will point | 1232 // this function. If at least some data was read, |*next_result| will point |
1223 // to |pending_read_error_|, to be returned in a future call to | 1233 // to |pending_read_error_|, to be returned in a future call to |
1224 // DoPayloadRead() (e.g.: after the current data is handled). | 1234 // DoPayloadRead() (e.g.: after the current data is handled). |
1225 int *next_result = &rv; | 1235 int* next_result = &rv; |
1226 if (total_bytes_read > 0) { | 1236 if (total_bytes_read > 0) { |
1227 pending_read_error_ = rv; | 1237 pending_read_error_ = rv; |
1228 rv = total_bytes_read; | 1238 rv = total_bytes_read; |
1229 next_result = &pending_read_error_; | 1239 next_result = &pending_read_error_; |
1230 } | 1240 } |
1231 | 1241 |
1232 if (client_auth_cert_needed_) { | 1242 if (client_auth_cert_needed_) { |
1233 *next_result = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; | 1243 *next_result = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; |
1234 } else if (*next_result < 0) { | 1244 } else if (*next_result < 0) { |
1235 int err = SSL_get_error(ssl_, *next_result); | 1245 int err = SSL_get_error(ssl_, *next_result); |
1236 *next_result = MapOpenSSLError(err, err_tracer); | 1246 *next_result = MapOpenSSLError(err, err_tracer); |
1237 if (rv > 0 && *next_result == ERR_IO_PENDING) { | 1247 if (rv > 0 && *next_result == ERR_IO_PENDING) { |
1238 // If at least some data was read from SSL_read(), do not treat | 1248 // If at least some data was read from SSL_read(), do not treat |
1239 // insufficient data as an error to return in the next call to | 1249 // insufficient data as an error to return in the next call to |
1240 // DoPayloadRead() - instead, let the call fall through to check | 1250 // DoPayloadRead() - instead, let the call fall through to check |
1241 // SSL_read() again. This is because DoTransportIO() may complete | 1251 // SSL_read() again. This is because DoTransportIO() may complete |
1242 // in between the next call to DoPayloadRead(), and thus it is | 1252 // in between the next call to DoPayloadRead(), and thus it is |
1243 // important to check SSL_read() on subsequent invocations to see | 1253 // important to check SSL_read() on subsequent invocations to see |
1244 // if a complete record may now be read. | 1254 // if a complete record may now be read. |
1245 *next_result = kNoPendingReadResult; | 1255 *next_result = kNoPendingReadResult; |
1246 } | 1256 } |
1247 } | 1257 } |
1248 } | 1258 } |
1249 | 1259 |
1250 if (rv >= 0) { | 1260 if (rv >= 0) { |
1251 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv, | 1261 net_log_.AddByteTransferEvent( |
1252 user_read_buf_->data()); | 1262 NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv, user_read_buf_->data()); |
1253 } | 1263 } |
1254 return rv; | 1264 return rv; |
1255 } | 1265 } |
1256 | 1266 |
1257 int SSLClientSocketOpenSSL::DoPayloadWrite() { | 1267 int SSLClientSocketOpenSSL::DoPayloadWrite() { |
1258 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 1268 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
1259 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_); | 1269 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_); |
1260 | 1270 |
1261 if (rv >= 0) { | 1271 if (rv >= 0) { |
1262 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, | 1272 net_log_.AddByteTransferEvent( |
1263 user_write_buf_->data()); | 1273 NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, user_write_buf_->data()); |
1264 return rv; | 1274 return rv; |
1265 } | 1275 } |
1266 | 1276 |
1267 int err = SSL_get_error(ssl_, rv); | 1277 int err = SSL_get_error(ssl_, rv); |
1268 return MapOpenSSLError(err, err_tracer); | 1278 return MapOpenSSLError(err, err_tracer); |
1269 } | 1279 } |
1270 | 1280 |
1271 int SSLClientSocketOpenSSL::BufferSend(void) { | 1281 int SSLClientSocketOpenSSL::BufferSend(void) { |
1272 if (transport_send_busy_) | 1282 if (transport_send_busy_) |
1273 return ERR_IO_PENDING; | 1283 return ERR_IO_PENDING; |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1408 EVP_PKEY** pkey) { | 1418 EVP_PKEY** pkey) { |
1409 DVLOG(3) << "OpenSSL ClientCertRequestCallback called"; | 1419 DVLOG(3) << "OpenSSL ClientCertRequestCallback called"; |
1410 DCHECK(ssl == ssl_); | 1420 DCHECK(ssl == ssl_); |
1411 DCHECK(*x509 == NULL); | 1421 DCHECK(*x509 == NULL); |
1412 DCHECK(*pkey == NULL); | 1422 DCHECK(*pkey == NULL); |
1413 #if defined(USE_OPENSSL_CERTS) | 1423 #if defined(USE_OPENSSL_CERTS) |
1414 if (!ssl_config_.send_client_cert) { | 1424 if (!ssl_config_.send_client_cert) { |
1415 // First pass: we know that a client certificate is needed, but we do not | 1425 // First pass: we know that a client certificate is needed, but we do not |
1416 // have one at hand. | 1426 // have one at hand. |
1417 client_auth_cert_needed_ = true; | 1427 client_auth_cert_needed_ = true; |
1418 STACK_OF(X509_NAME) *authorities = SSL_get_client_CA_list(ssl); | 1428 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl); |
1419 for (int i = 0; i < sk_X509_NAME_num(authorities); i++) { | 1429 for (int i = 0; i < sk_X509_NAME_num(authorities); i++) { |
1420 X509_NAME *ca_name = (X509_NAME *)sk_X509_NAME_value(authorities, i); | 1430 X509_NAME* ca_name = (X509_NAME*)sk_X509_NAME_value(authorities, i); |
1421 unsigned char* str = NULL; | 1431 unsigned char* str = NULL; |
1422 int length = i2d_X509_NAME(ca_name, &str); | 1432 int length = i2d_X509_NAME(ca_name, &str); |
1423 cert_authorities_.push_back(std::string( | 1433 cert_authorities_.push_back(std::string( |
1424 reinterpret_cast<const char*>(str), | 1434 reinterpret_cast<const char*>(str), static_cast<size_t>(length))); |
1425 static_cast<size_t>(length))); | |
1426 OPENSSL_free(str); | 1435 OPENSSL_free(str); |
1427 } | 1436 } |
1428 | 1437 |
1429 return -1; // Suspends handshake. | 1438 return -1; // Suspends handshake. |
1430 } | 1439 } |
1431 | 1440 |
1432 // Second pass: a client certificate should have been selected. | 1441 // Second pass: a client certificate should have been selected. |
1433 if (ssl_config_.client_cert.get()) { | 1442 if (ssl_config_.client_cert.get()) { |
1434 // A note about ownership: FetchClientCertPrivateKey() increments | 1443 // A note about ownership: FetchClientCertPrivateKey() increments |
1435 // the reference count of the EVP_PKEY. Ownership of this reference | 1444 // the reference count of the EVP_PKEY. Ownership of this reference |
1436 // is passed directly to OpenSSL, which will release the reference | 1445 // is passed directly to OpenSSL, which will release the reference |
1437 // using EVP_PKEY_free() when the SSL object is destroyed. | 1446 // using EVP_PKEY_free() when the SSL object is destroyed. |
1438 OpenSSLClientKeyStore::ScopedEVP_PKEY privkey; | 1447 OpenSSLClientKeyStore::ScopedEVP_PKEY privkey; |
1439 if (OpenSSLClientKeyStore::GetInstance()->FetchClientCertPrivateKey( | 1448 if (OpenSSLClientKeyStore::GetInstance()->FetchClientCertPrivateKey( |
1440 ssl_config_.client_cert.get(), &privkey)) { | 1449 ssl_config_.client_cert.get(), &privkey)) { |
1441 // TODO(joth): (copied from NSS) We should wait for server certificate | 1450 // TODO(joth): (copied from NSS) We should wait for server certificate |
1442 // verification before sending our credentials. See http://crbug.com/13934 | 1451 // verification before sending our credentials. See http://crbug.com/13934 |
1443 *x509 = X509Certificate::DupOSCertHandle( | 1452 *x509 = X509Certificate::DupOSCertHandle( |
1444 ssl_config_.client_cert->os_cert_handle()); | 1453 ssl_config_.client_cert->os_cert_handle()); |
1445 *pkey = privkey.release(); | 1454 *pkey = privkey.release(); |
1446 return 1; | 1455 return 1; |
1447 } | 1456 } |
1448 LOG(WARNING) << "Client cert found without private key"; | 1457 LOG(WARNING) << "Client cert found without private key"; |
1449 } | 1458 } |
1450 #else // !defined(USE_OPENSSL_CERTS) | 1459 #else // !defined(USE_OPENSSL_CERTS) |
1451 // OS handling of client certificates is not yet implemented. | 1460 // OS handling of client certificates is not yet implemented. |
1452 NOTIMPLEMENTED(); | 1461 NOTIMPLEMENTED(); |
1453 #endif // defined(USE_OPENSSL_CERTS) | 1462 #endif // defined(USE_OPENSSL_CERTS) |
1454 | 1463 |
1455 // Send no client certificate. | 1464 // Send no client certificate. |
1456 return 0; | 1465 return 0; |
1457 } | 1466 } |
1458 | 1467 |
1459 void SSLClientSocketOpenSSL::ChannelIDRequestCallback(SSL* ssl, | 1468 void SSLClientSocketOpenSSL::ChannelIDRequestCallback(SSL* ssl, |
1460 EVP_PKEY** pkey) { | 1469 EVP_PKEY** pkey) { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1529 const_cast<char*>(kDefaultSupportedNPNProtocol)); | 1538 const_cast<char*>(kDefaultSupportedNPNProtocol)); |
1530 *outlen = arraysize(kDefaultSupportedNPNProtocol) - 1; | 1539 *outlen = arraysize(kDefaultSupportedNPNProtocol) - 1; |
1531 npn_status_ = kNextProtoUnsupported; | 1540 npn_status_ = kNextProtoUnsupported; |
1532 return SSL_TLSEXT_ERR_OK; | 1541 return SSL_TLSEXT_ERR_OK; |
1533 } | 1542 } |
1534 | 1543 |
1535 // Assume there's no overlap between our protocols and the server's list. | 1544 // Assume there's no overlap between our protocols and the server's list. |
1536 npn_status_ = kNextProtoNoOverlap; | 1545 npn_status_ = kNextProtoNoOverlap; |
1537 | 1546 |
1538 // For each protocol in server preference order, see if we support it. | 1547 // For each protocol in server preference order, see if we support it. |
1539 for (unsigned int i = 0; i < inlen; i += in[i] + 1) { | 1548 for (unsigned int i = 0; i < inlen; i += in [i] + 1) { |
1540 for (std::vector<std::string>::const_iterator | 1549 for (std::vector<std::string>::const_iterator j = |
1541 j = ssl_config_.next_protos.begin(); | 1550 ssl_config_.next_protos.begin(); |
1542 j != ssl_config_.next_protos.end(); ++j) { | 1551 j != ssl_config_.next_protos.end(); |
1543 if (in[i] == j->size() && | 1552 ++j) { |
1544 memcmp(&in[i + 1], j->data(), in[i]) == 0) { | 1553 if (in[i] == j->size() && memcmp(&in[i + 1], j->data(), in[i]) == 0) { |
1545 // We found a match. | 1554 // We found a match. |
1546 *out = const_cast<unsigned char*>(in) + i + 1; | 1555 *out = const_cast<unsigned char*>(in) + i + 1; |
1547 *outlen = in[i]; | 1556 *outlen = in[i]; |
1548 npn_status_ = kNextProtoNegotiated; | 1557 npn_status_ = kNextProtoNegotiated; |
1549 break; | 1558 break; |
1550 } | 1559 } |
1551 } | 1560 } |
1552 if (npn_status_ == kNextProtoNegotiated) | 1561 if (npn_status_ == kNextProtoNegotiated) |
1553 break; | 1562 break; |
1554 } | 1563 } |
1555 | 1564 |
1556 // If we didn't find a protocol, we select the first one from our list. | 1565 // If we didn't find a protocol, we select the first one from our list. |
1557 if (npn_status_ == kNextProtoNoOverlap) { | 1566 if (npn_status_ == kNextProtoNoOverlap) { |
1558 *out = reinterpret_cast<uint8*>(const_cast<char*>( | 1567 *out = reinterpret_cast<uint8*>( |
1559 ssl_config_.next_protos[0].data())); | 1568 const_cast<char*>(ssl_config_.next_protos[0].data())); |
1560 *outlen = ssl_config_.next_protos[0].size(); | 1569 *outlen = ssl_config_.next_protos[0].size(); |
1561 } | 1570 } |
1562 | 1571 |
1563 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen); | 1572 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen); |
1564 server_protos_.assign(reinterpret_cast<const char*>(in), inlen); | 1573 server_protos_.assign(reinterpret_cast<const char*>(in), inlen); |
1565 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; | 1574 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; |
1566 return SSL_TLSEXT_ERR_OK; | 1575 return SSL_TLSEXT_ERR_OK; |
1567 } | 1576 } |
1568 | 1577 |
1569 scoped_refptr<X509Certificate> | 1578 scoped_refptr<X509Certificate> |
1570 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { | 1579 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
1571 return server_cert_; | 1580 return server_cert_; |
1572 } | 1581 } |
1573 | 1582 |
1574 } // namespace net | 1583 } // namespace net |
OLD | NEW |