| 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 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 const HostPortPair& host_and_port, | 348 const HostPortPair& host_and_port, |
| 349 const SSLConfig& ssl_config, | 349 const SSLConfig& ssl_config, |
| 350 const SSLClientSocketContext& context) | 350 const SSLClientSocketContext& context) |
| 351 : transport_send_busy_(false), | 351 : transport_send_busy_(false), |
| 352 transport_recv_busy_(false), | 352 transport_recv_busy_(false), |
| 353 transport_recv_eof_(false), | 353 transport_recv_eof_(false), |
| 354 weak_factory_(this), | 354 weak_factory_(this), |
| 355 pending_read_error_(kNoPendingReadResult), | 355 pending_read_error_(kNoPendingReadResult), |
| 356 transport_write_error_(OK), | 356 transport_write_error_(OK), |
| 357 completed_handshake_(false), | 357 completed_handshake_(false), |
| 358 was_used_to_convey_data_(false), |
| 358 client_auth_cert_needed_(false), | 359 client_auth_cert_needed_(false), |
| 359 cert_verifier_(context.cert_verifier), | 360 cert_verifier_(context.cert_verifier), |
| 360 server_bound_cert_service_(context.server_bound_cert_service), | 361 server_bound_cert_service_(context.server_bound_cert_service), |
| 361 ssl_(NULL), | 362 ssl_(NULL), |
| 362 transport_bio_(NULL), | 363 transport_bio_(NULL), |
| 363 transport_(transport_socket.Pass()), | 364 transport_(transport_socket.Pass()), |
| 364 host_and_port_(host_and_port), | 365 host_and_port_(host_and_port), |
| 365 ssl_config_(ssl_config), | 366 ssl_config_(ssl_config), |
| 366 ssl_session_cache_shard_(context.ssl_session_cache_shard), | 367 ssl_session_cache_shard_(context.ssl_session_cache_shard), |
| 367 trying_cached_session_(false), | 368 trying_cached_session_(false), |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 | 538 |
| 538 void SSLClientSocketOpenSSL::SetOmniboxSpeculation() { | 539 void SSLClientSocketOpenSSL::SetOmniboxSpeculation() { |
| 539 if (transport_.get() && transport_->socket()) { | 540 if (transport_.get() && transport_->socket()) { |
| 540 transport_->socket()->SetOmniboxSpeculation(); | 541 transport_->socket()->SetOmniboxSpeculation(); |
| 541 } else { | 542 } else { |
| 542 NOTREACHED(); | 543 NOTREACHED(); |
| 543 } | 544 } |
| 544 } | 545 } |
| 545 | 546 |
| 546 bool SSLClientSocketOpenSSL::WasEverUsed() const { | 547 bool SSLClientSocketOpenSSL::WasEverUsed() const { |
| 547 if (transport_.get() && transport_->socket()) | 548 return was_used_to_convey_data_; |
| 548 return transport_->socket()->WasEverUsed(); | |
| 549 | |
| 550 NOTREACHED(); | |
| 551 return false; | |
| 552 } | 549 } |
| 553 | 550 |
| 554 bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const { | 551 bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const { |
| 555 if (transport_.get() && transport_->socket()) | 552 if (transport_.get() && transport_->socket()) |
| 556 return transport_->socket()->UsingTCPFastOpen(); | 553 return transport_->socket()->UsingTCPFastOpen(); |
| 557 | 554 |
| 558 NOTREACHED(); | 555 NOTREACHED(); |
| 559 return false; | 556 return false; |
| 560 } | 557 } |
| 561 | 558 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 int buf_len, | 609 int buf_len, |
| 613 const CompletionCallback& callback) { | 610 const CompletionCallback& callback) { |
| 614 user_read_buf_ = buf; | 611 user_read_buf_ = buf; |
| 615 user_read_buf_len_ = buf_len; | 612 user_read_buf_len_ = buf_len; |
| 616 | 613 |
| 617 int rv = DoReadLoop(OK); | 614 int rv = DoReadLoop(OK); |
| 618 | 615 |
| 619 if (rv == ERR_IO_PENDING) { | 616 if (rv == ERR_IO_PENDING) { |
| 620 user_read_callback_ = callback; | 617 user_read_callback_ = callback; |
| 621 } else { | 618 } else { |
| 619 if (rv > 0) |
| 620 was_used_to_convey_data_ = true; |
| 622 user_read_buf_ = NULL; | 621 user_read_buf_ = NULL; |
| 623 user_read_buf_len_ = 0; | 622 user_read_buf_len_ = 0; |
| 624 } | 623 } |
| 625 | 624 |
| 626 return rv; | 625 return rv; |
| 627 } | 626 } |
| 628 | 627 |
| 629 int SSLClientSocketOpenSSL::Write(IOBuffer* buf, | 628 int SSLClientSocketOpenSSL::Write(IOBuffer* buf, |
| 630 int buf_len, | 629 int buf_len, |
| 631 const CompletionCallback& callback) { | 630 const CompletionCallback& callback) { |
| 632 user_write_buf_ = buf; | 631 user_write_buf_ = buf; |
| 633 user_write_buf_len_ = buf_len; | 632 user_write_buf_len_ = buf_len; |
| 634 | 633 |
| 635 int rv = DoWriteLoop(OK); | 634 int rv = DoWriteLoop(OK); |
| 636 | 635 |
| 637 if (rv == ERR_IO_PENDING) { | 636 if (rv == ERR_IO_PENDING) { |
| 638 user_write_callback_ = callback; | 637 user_write_callback_ = callback; |
| 639 } else { | 638 } else { |
| 639 if (rv > 0) |
| 640 was_used_to_convey_data_ = true; |
| 640 user_write_buf_ = NULL; | 641 user_write_buf_ = NULL; |
| 641 user_write_buf_len_ = 0; | 642 user_write_buf_len_ = 0; |
| 642 } | 643 } |
| 643 | 644 |
| 644 return rv; | 645 return rv; |
| 645 } | 646 } |
| 646 | 647 |
| 647 bool SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { | 648 bool SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { |
| 648 return transport_->socket()->SetReceiveBufferSize(size); | 649 return transport_->socket()->SetReceiveBufferSize(size); |
| 649 } | 650 } |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 if (IsChannelIDEnabled(ssl_config_, server_bound_cert_service_)) { | 770 if (IsChannelIDEnabled(ssl_config_, server_bound_cert_service_)) { |
| 770 SSL_enable_tls_channel_id(ssl_); | 771 SSL_enable_tls_channel_id(ssl_); |
| 771 } | 772 } |
| 772 | 773 |
| 773 return true; | 774 return true; |
| 774 } | 775 } |
| 775 | 776 |
| 776 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { | 777 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { |
| 777 // Since Run may result in Read being called, clear |user_read_callback_| | 778 // Since Run may result in Read being called, clear |user_read_callback_| |
| 778 // up front. | 779 // up front. |
| 780 if (rv > 0) |
| 781 was_used_to_convey_data_ = true; |
| 779 user_read_buf_ = NULL; | 782 user_read_buf_ = NULL; |
| 780 user_read_buf_len_ = 0; | 783 user_read_buf_len_ = 0; |
| 781 base::ResetAndReturn(&user_read_callback_).Run(rv); | 784 base::ResetAndReturn(&user_read_callback_).Run(rv); |
| 782 } | 785 } |
| 783 | 786 |
| 784 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { | 787 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { |
| 785 // Since Run may result in Write being called, clear |user_write_callback_| | 788 // Since Run may result in Write being called, clear |user_write_callback_| |
| 786 // up front. | 789 // up front. |
| 790 if (rv > 0) |
| 791 was_used_to_convey_data_ = true; |
| 787 user_write_buf_ = NULL; | 792 user_write_buf_ = NULL; |
| 788 user_write_buf_len_ = 0; | 793 user_write_buf_len_ = 0; |
| 789 base::ResetAndReturn(&user_write_callback_).Run(rv); | 794 base::ResetAndReturn(&user_write_callback_).Run(rv); |
| 790 } | 795 } |
| 791 | 796 |
| 792 bool SSLClientSocketOpenSSL::DoTransportIO() { | 797 bool SSLClientSocketOpenSSL::DoTransportIO() { |
| 793 bool network_moved = false; | 798 bool network_moved = false; |
| 794 int rv; | 799 int rv; |
| 795 // Read and write as much data as possible. The loop is necessary because | 800 // Read and write as much data as possible. The loop is necessary because |
| 796 // Write() may return synchronously. | 801 // Write() may return synchronously. |
| (...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 } | 1446 } |
| 1442 | 1447 |
| 1443 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen); | 1448 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen); |
| 1444 server_protos_.assign(reinterpret_cast<const char*>(in), inlen); | 1449 server_protos_.assign(reinterpret_cast<const char*>(in), inlen); |
| 1445 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; | 1450 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; |
| 1446 #endif | 1451 #endif |
| 1447 return SSL_TLSEXT_ERR_OK; | 1452 return SSL_TLSEXT_ERR_OK; |
| 1448 } | 1453 } |
| 1449 | 1454 |
| 1450 } // namespace net | 1455 } // namespace net |
| OLD | NEW |