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 <errno.h> | 10 #include <errno.h> |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 const HostPortPair& host_and_port, | 341 const HostPortPair& host_and_port, |
342 const SSLConfig& ssl_config, | 342 const SSLConfig& ssl_config, |
343 const SSLClientSocketContext& context) | 343 const SSLClientSocketContext& context) |
344 : transport_send_busy_(false), | 344 : transport_send_busy_(false), |
345 transport_recv_busy_(false), | 345 transport_recv_busy_(false), |
346 weak_factory_(this), | 346 weak_factory_(this), |
347 pending_read_error_(kNoPendingReadResult), | 347 pending_read_error_(kNoPendingReadResult), |
348 transport_read_error_(OK), | 348 transport_read_error_(OK), |
349 transport_write_error_(OK), | 349 transport_write_error_(OK), |
350 server_cert_chain_(new PeerCertificateChain(NULL)), | 350 server_cert_chain_(new PeerCertificateChain(NULL)), |
351 completed_handshake_(false), | 351 completed_connect_(false), |
352 was_ever_used_(false), | 352 was_ever_used_(false), |
353 client_auth_cert_needed_(false), | 353 client_auth_cert_needed_(false), |
354 cert_verifier_(context.cert_verifier), | 354 cert_verifier_(context.cert_verifier), |
355 channel_id_service_(context.channel_id_service), | 355 channel_id_service_(context.channel_id_service), |
356 ssl_(NULL), | 356 ssl_(NULL), |
357 transport_bio_(NULL), | 357 transport_bio_(NULL), |
358 transport_(transport_socket.Pass()), | 358 transport_(transport_socket.Pass()), |
359 host_and_port_(host_and_port), | 359 host_and_port_(host_and_port), |
360 ssl_config_(ssl_config), | 360 ssl_config_(ssl_config), |
361 ssl_session_cache_shard_(context.ssl_session_cache_shard), | 361 ssl_session_cache_shard_(context.ssl_session_cache_shard), |
362 trying_cached_session_(false), | 362 trying_cached_session_(false), |
363 next_handshake_state_(STATE_NONE), | 363 next_handshake_state_(STATE_NONE), |
364 npn_status_(kNextProtoUnsupported), | 364 npn_status_(kNextProtoUnsupported), |
365 channel_id_xtn_negotiated_(false), | 365 channel_id_xtn_negotiated_(false), |
366 ran_handshake_finished_callback_(false), | 366 handshake_succeeded_(false), |
367 marked_session_as_good_(false), | 367 marked_session_as_good_(false), |
368 net_log_(transport_->socket()->NetLog()) { | 368 net_log_(transport_->socket()->NetLog()) { |
369 } | 369 } |
370 | 370 |
371 SSLClientSocketOpenSSL::~SSLClientSocketOpenSSL() { | 371 SSLClientSocketOpenSSL::~SSLClientSocketOpenSSL() { |
372 Disconnect(); | 372 Disconnect(); |
373 } | 373 } |
374 | 374 |
375 bool SSLClientSocketOpenSSL::InSessionCache() const { | 375 bool SSLClientSocketOpenSSL::InSessionCache() const { |
376 SSLContext* context = SSLContext::GetInstance(); | 376 SSLContext* context = SSLContext::GetInstance(); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 user_read_buf_ = NULL; | 486 user_read_buf_ = NULL; |
487 user_read_buf_len_ = 0; | 487 user_read_buf_len_ = 0; |
488 user_write_buf_ = NULL; | 488 user_write_buf_ = NULL; |
489 user_write_buf_len_ = 0; | 489 user_write_buf_len_ = 0; |
490 | 490 |
491 pending_read_error_ = kNoPendingReadResult; | 491 pending_read_error_ = kNoPendingReadResult; |
492 transport_read_error_ = OK; | 492 transport_read_error_ = OK; |
493 transport_write_error_ = OK; | 493 transport_write_error_ = OK; |
494 | 494 |
495 server_cert_verify_result_.Reset(); | 495 server_cert_verify_result_.Reset(); |
496 completed_handshake_ = false; | 496 completed_connect_ = false; |
497 | 497 |
498 cert_authorities_.clear(); | 498 cert_authorities_.clear(); |
499 cert_key_types_.clear(); | 499 cert_key_types_.clear(); |
500 client_auth_cert_needed_ = false; | 500 client_auth_cert_needed_ = false; |
501 | 501 |
502 npn_status_ = kNextProtoUnsupported; | 502 npn_status_ = kNextProtoUnsupported; |
503 npn_proto_.clear(); | 503 npn_proto_.clear(); |
504 | 504 |
505 channel_id_xtn_negotiated_ = false; | 505 channel_id_xtn_negotiated_ = false; |
506 channel_id_request_handle_.Cancel(); | 506 channel_id_request_handle_.Cancel(); |
507 } | 507 } |
508 | 508 |
509 bool SSLClientSocketOpenSSL::IsConnected() const { | 509 bool SSLClientSocketOpenSSL::IsConnected() const { |
510 // If the handshake has not yet completed. | 510 // If the handshake has not yet completed. |
511 if (!completed_handshake_) | 511 if (!completed_connect_) |
512 return false; | 512 return false; |
513 // If an asynchronous operation is still pending. | 513 // If an asynchronous operation is still pending. |
514 if (user_read_buf_.get() || user_write_buf_.get()) | 514 if (user_read_buf_.get() || user_write_buf_.get()) |
515 return true; | 515 return true; |
516 | 516 |
517 return transport_->socket()->IsConnected(); | 517 return transport_->socket()->IsConnected(); |
518 } | 518 } |
519 | 519 |
520 bool SSLClientSocketOpenSSL::IsConnectedAndIdle() const { | 520 bool SSLClientSocketOpenSSL::IsConnectedAndIdle() const { |
521 // If the handshake has not yet completed. | 521 // If the handshake has not yet completed. |
522 if (!completed_handshake_) | 522 if (!completed_connect_) |
523 return false; | 523 return false; |
524 // If an asynchronous operation is still pending. | 524 // If an asynchronous operation is still pending. |
525 if (user_read_buf_.get() || user_write_buf_.get()) | 525 if (user_read_buf_.get() || user_write_buf_.get()) |
526 return false; | 526 return false; |
527 // If there is data waiting to be sent, or data read from the network that | 527 // If there is data waiting to be sent, or data read from the network that |
528 // has not yet been consumed. | 528 // has not yet been consumed. |
529 if (BIO_pending(transport_bio_) > 0 || | 529 if (BIO_pending(transport_bio_) > 0 || |
530 BIO_wpending(transport_bio_) > 0) { | 530 BIO_wpending(transport_bio_) > 0) { |
531 return false; | 531 return false; |
532 } | 532 } |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 } | 672 } |
673 | 673 |
674 int SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { | 674 int SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { |
675 return transport_->socket()->SetReceiveBufferSize(size); | 675 return transport_->socket()->SetReceiveBufferSize(size); |
676 } | 676 } |
677 | 677 |
678 int SSLClientSocketOpenSSL::SetSendBufferSize(int32 size) { | 678 int SSLClientSocketOpenSSL::SetSendBufferSize(int32 size) { |
679 return transport_->socket()->SetSendBufferSize(size); | 679 return transport_->socket()->SetSendBufferSize(size); |
680 } | 680 } |
681 | 681 |
682 // static | |
683 void SSLClientSocketOpenSSL::InfoCallback(const SSL* ssl, | |
684 int result, | |
685 int /*unused*/) { | |
686 SSLClientSocketOpenSSL* ssl_socket = | |
687 SSLContext::GetInstance()->GetClientSocketFromSSL(ssl); | |
688 if (result == SSL_CB_HANDSHAKE_DONE) { | |
689 ssl_socket->ran_handshake_finished_callback_ = true; | |
690 ssl_socket->CheckIfHandshakeFinished(); | |
691 } | |
692 } | |
693 | |
694 int SSLClientSocketOpenSSL::Init() { | 682 int SSLClientSocketOpenSSL::Init() { |
695 DCHECK(!ssl_); | 683 DCHECK(!ssl_); |
696 DCHECK(!transport_bio_); | 684 DCHECK(!transport_bio_); |
697 | 685 |
698 SSLContext* context = SSLContext::GetInstance(); | 686 SSLContext* context = SSLContext::GetInstance(); |
699 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 687 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
700 | 688 |
701 ssl_ = SSL_new(context->ssl_ctx()); | 689 ssl_ = SSL_new(context->ssl_ctx()); |
702 if (!ssl_ || !context->SetClientSocketForSSL(ssl_, this)) | 690 if (!ssl_ || !context->SetClientSocketForSSL(ssl_, this)) |
703 return ERR_UNEXPECTED; | 691 return ERR_UNEXPECTED; |
704 | 692 |
705 if (!SSL_set_tlsext_host_name(ssl_, host_and_port_.host().c_str())) | 693 if (!SSL_set_tlsext_host_name(ssl_, host_and_port_.host().c_str())) |
706 return ERR_UNEXPECTED; | 694 return ERR_UNEXPECTED; |
707 | 695 |
708 // Set an OpenSSL callback to monitor this SSL*'s connection. | 696 // Set an OpenSSL callback to monitor this SSL*'s connection. |
709 SSL_set_info_callback(ssl_, &InfoCallback); | 697 SSL_set_info_callback(ssl_, &InfoCallback); |
710 | 698 |
711 trying_cached_session_ = context->session_cache()->SetSSLSessionWithKey( | 699 trying_cached_session_ = context->session_cache()->SetSSLSessionWithKey( |
712 ssl_, GetSessionCacheKey()); | 700 ssl_, GetSessionCacheKey()); |
713 | 701 |
714 BIO* ssl_bio = NULL; | 702 BIO* ssl_bio = NULL; |
715 // 0 => use default buffer sizes. | 703 // 0 => use default buffer sizes. |
716 if (!BIO_new_bio_pair(&ssl_bio, 0, &transport_bio_, 0)) | 704 if (!BIO_new_bio_pair(&ssl_bio, 0, &transport_bio_, 0)) |
717 return ERR_UNEXPECTED; | 705 return ERR_UNEXPECTED; |
718 DCHECK(ssl_bio); | 706 DCHECK(ssl_bio); |
719 DCHECK(transport_bio_); | 707 DCHECK(transport_bio_); |
720 | 708 |
721 // Install a callback on OpenSSL's end to plumb transport errors through. | 709 // Install a callback on OpenSSL's end to plumb transport errors through. |
722 BIO_set_callback(ssl_bio, &SSLClientSocketOpenSSL::BIOCallback); | 710 BIO_set_callback(ssl_bio, BIOCallback); |
723 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this)); | 711 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this)); |
724 | 712 |
725 SSL_set_bio(ssl_, ssl_bio, ssl_bio); | 713 SSL_set_bio(ssl_, ssl_bio, ssl_bio); |
726 | 714 |
727 // OpenSSL defaults some options to on, others to off. To avoid ambiguity, | 715 // OpenSSL defaults some options to on, others to off. To avoid ambiguity, |
728 // set everything we care about to an absolute value. | 716 // set everything we care about to an absolute value. |
729 SslSetClearMask options; | 717 SslSetClearMask options; |
730 options.ConfigureFlag(SSL_OP_NO_SSLv2, true); | 718 options.ConfigureFlag(SSL_OP_NO_SSLv2, true); |
731 bool ssl3_enabled = (ssl_config_.version_min == SSL_PROTOCOL_VERSION_SSL3); | 719 bool ssl3_enabled = (ssl_config_.version_min == SSL_PROTOCOL_VERSION_SSL3); |
732 options.ConfigureFlag(SSL_OP_NO_SSLv3, !ssl3_enabled); | 720 options.ConfigureFlag(SSL_OP_NO_SSLv3, !ssl3_enabled); |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1039 // TODO(joth): Work out if we need to remember the intermediate CA certs | 1027 // TODO(joth): Work out if we need to remember the intermediate CA certs |
1040 // when the server sends them to us, and do so here. | 1028 // when the server sends them to us, and do so here. |
1041 SSLContext::GetInstance()->session_cache()->MarkSSLSessionAsGood(ssl_); | 1029 SSLContext::GetInstance()->session_cache()->MarkSSLSessionAsGood(ssl_); |
1042 marked_session_as_good_ = true; | 1030 marked_session_as_good_ = true; |
1043 CheckIfHandshakeFinished(); | 1031 CheckIfHandshakeFinished(); |
1044 } else { | 1032 } else { |
1045 DVLOG(1) << "DoVerifyCertComplete error " << ErrorToString(result) | 1033 DVLOG(1) << "DoVerifyCertComplete error " << ErrorToString(result) |
1046 << " (" << result << ")"; | 1034 << " (" << result << ")"; |
1047 } | 1035 } |
1048 | 1036 |
1049 completed_handshake_ = true; | 1037 completed_connect_ = true; |
1050 // Exit DoHandshakeLoop and return the result to the caller to Connect. | 1038 // Exit DoHandshakeLoop and return the result to the caller to Connect. |
1051 DCHECK_EQ(STATE_NONE, next_handshake_state_); | 1039 DCHECK_EQ(STATE_NONE, next_handshake_state_); |
1052 return result; | 1040 return result; |
1053 } | 1041 } |
1054 | 1042 |
1055 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { | 1043 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { |
1056 if (rv < OK) | 1044 if (rv < OK) |
1057 OnHandshakeCompletion(); | 1045 OnHandshakeCompletion(); |
1058 if (!user_connect_callback_.is_null()) { | 1046 if (!user_connect_callback_.is_null()) { |
1059 CompletionCallback c = user_connect_callback_; | 1047 CompletionCallback c = user_connect_callback_; |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1479 *pkey = privkey.release(); | 1467 *pkey = privkey.release(); |
1480 return 1; | 1468 return 1; |
1481 } | 1469 } |
1482 #endif // defined(OS_IOS) | 1470 #endif // defined(OS_IOS) |
1483 | 1471 |
1484 // Send no client certificate. | 1472 // Send no client certificate. |
1485 return 0; | 1473 return 0; |
1486 } | 1474 } |
1487 | 1475 |
1488 int SSLClientSocketOpenSSL::CertVerifyCallback(X509_STORE_CTX* store_ctx) { | 1476 int SSLClientSocketOpenSSL::CertVerifyCallback(X509_STORE_CTX* store_ctx) { |
1489 if (!completed_handshake_) { | 1477 if (!completed_connect_) { |
1490 // If the first handshake hasn't completed then we accept any certificates | 1478 // If the first handshake hasn't completed then we accept any certificates |
1491 // because we verify after the handshake. | 1479 // because we verify after the handshake. |
1492 return 1; | 1480 return 1; |
1493 } | 1481 } |
1494 | 1482 |
1495 CHECK(server_cert_.get()); | 1483 CHECK(server_cert_.get()); |
1496 | 1484 |
1497 PeerCertificateChain chain(store_ctx->untrusted); | 1485 PeerCertificateChain chain(store_ctx->untrusted); |
1498 if (chain.IsValid() && server_cert_->Equals(chain.AsOSChain())) | 1486 if (chain.IsValid() && server_cert_->Equals(chain.AsOSChain())) |
1499 return 1; | 1487 return 1; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1579 // write payload. If the current payload fails to write, the error will be | 1567 // write payload. If the current payload fails to write, the error will be |
1580 // reported in a future write or read to |bio|. | 1568 // reported in a future write or read to |bio|. |
1581 if (transport_write_error_ != OK) { | 1569 if (transport_write_error_ != OK) { |
1582 OpenSSLPutNetError(FROM_HERE, transport_write_error_); | 1570 OpenSSLPutNetError(FROM_HERE, transport_write_error_); |
1583 return -1; | 1571 return -1; |
1584 } | 1572 } |
1585 } | 1573 } |
1586 return retvalue; | 1574 return retvalue; |
1587 } | 1575 } |
1588 | 1576 |
1589 // Determines if the session for |ssl_| is in the cache, and calls the | |
1590 // handshake completion callback if that is the case. | |
1591 // | |
1592 // CheckIfHandshakeFinished is called twice per connection: once after | |
1593 // MarkSSLSessionAsGood, when the certificate has been verified, and | |
1594 // once via an OpenSSL callback when the handshake has completed. On the | |
1595 // second call, when the certificate has been verified and the handshake | |
1596 // has completed, the connection's handshake completion callback is run. | |
1597 void SSLClientSocketOpenSSL::CheckIfHandshakeFinished() { | |
1598 if (ran_handshake_finished_callback_ && marked_session_as_good_) | |
1599 OnHandshakeCompletion(); | |
1600 } | |
1601 | |
1602 // static | 1577 // static |
1603 long SSLClientSocketOpenSSL::BIOCallback( | 1578 long SSLClientSocketOpenSSL::BIOCallback( |
1604 BIO *bio, | 1579 BIO *bio, |
1605 int cmd, | 1580 int cmd, |
1606 const char *argp, int argi, long argl, | 1581 const char *argp, int argi, long argl, |
1607 long retvalue) { | 1582 long retvalue) { |
1608 SSLClientSocketOpenSSL* socket = reinterpret_cast<SSLClientSocketOpenSSL*>( | 1583 SSLClientSocketOpenSSL* socket = reinterpret_cast<SSLClientSocketOpenSSL*>( |
1609 BIO_get_callback_arg(bio)); | 1584 BIO_get_callback_arg(bio)); |
1610 CHECK(socket); | 1585 CHECK(socket); |
1611 return socket->MaybeReplayTransportError( | 1586 return socket->MaybeReplayTransportError( |
1612 bio, cmd, argp, argi, argl, retvalue); | 1587 bio, cmd, argp, argi, argl, retvalue); |
1613 } | 1588 } |
1614 | 1589 |
| 1590 // static |
| 1591 void SSLClientSocketOpenSSL::InfoCallback(const SSL* ssl, |
| 1592 int type, |
| 1593 int /*val*/) { |
| 1594 if (type == SSL_CB_HANDSHAKE_DONE) { |
| 1595 SSLClientSocketOpenSSL* ssl_socket = |
| 1596 SSLContext::GetInstance()->GetClientSocketFromSSL(ssl); |
| 1597 ssl_socket->handshake_succeeded_ = true; |
| 1598 ssl_socket->CheckIfHandshakeFinished(); |
| 1599 } |
| 1600 } |
| 1601 |
| 1602 // Determines if both the handshake and certificate verification have completed |
| 1603 // successfully, and calls the handshake completion callback if that is the |
| 1604 // case. |
| 1605 // |
| 1606 // CheckIfHandshakeFinished is called twice per connection: once after |
| 1607 // MarkSSLSessionAsGood, when the certificate has been verified, and |
| 1608 // once via an OpenSSL callback when the handshake has completed. On the |
| 1609 // second call, when the certificate has been verified and the handshake |
| 1610 // has completed, the connection's handshake completion callback is run. |
| 1611 void SSLClientSocketOpenSSL::CheckIfHandshakeFinished() { |
| 1612 if (handshake_succeeded_ && marked_session_as_good_) |
| 1613 OnHandshakeCompletion(); |
| 1614 } |
| 1615 |
1615 scoped_refptr<X509Certificate> | 1616 scoped_refptr<X509Certificate> |
1616 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { | 1617 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
1617 return server_cert_; | 1618 return server_cert_; |
1618 } | 1619 } |
1619 | 1620 |
1620 } // namespace net | 1621 } // namespace net |
OLD | NEW |