| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/socket/ssl_client_socket_impl.h" | 5 #include "net/socket/ssl_client_socket_impl.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <openssl/bio.h> | 8 #include <openssl/bio.h> |
| 9 #include <openssl/bytestring.h> | 9 #include <openssl/bytestring.h> |
| 10 #include <openssl/err.h> | 10 #include <openssl/err.h> |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME); | 193 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME); |
| 194 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite( | 194 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite( |
| 195 ssl_info.connection_status)); | 195 ssl_info.connection_status)); |
| 196 | 196 |
| 197 dict->SetString("next_proto", SSLClientSocket::NextProtoToString( | 197 dict->SetString("next_proto", SSLClientSocket::NextProtoToString( |
| 198 socket->GetNegotiatedProtocol())); | 198 socket->GetNegotiatedProtocol())); |
| 199 | 199 |
| 200 return std::move(dict); | 200 return std::move(dict); |
| 201 } | 201 } |
| 202 | 202 |
| 203 int GetBufferSize(const char* field_trial) { |
| 204 // Get buffer sizes from field trials, if possible. If values not present, |
| 205 // use default. Also make sure values are in reasonable range. |
| 206 int buffer_size = kDefaultOpenSSLBufferSize; |
| 207 #if !defined(OS_NACL) |
| 208 int override_buffer_size; |
| 209 if (base::StringToInt(base::FieldTrialList::FindFullName(field_trial), |
| 210 &override_buffer_size)) { |
| 211 buffer_size = override_buffer_size; |
| 212 buffer_size = std::max(buffer_size, 1000); |
| 213 buffer_size = std::min(buffer_size, 2 * kDefaultOpenSSLBufferSize); |
| 214 } |
| 215 #endif // !defined(OS_NACL) |
| 216 return buffer_size; |
| 217 } |
| 218 |
| 203 } // namespace | 219 } // namespace |
| 204 | 220 |
| 205 class SSLClientSocketImpl::SSLContext { | 221 class SSLClientSocketImpl::SSLContext { |
| 206 public: | 222 public: |
| 207 static SSLContext* GetInstance() { | 223 static SSLContext* GetInstance() { |
| 208 return base::Singleton<SSLContext>::get(); | 224 return base::Singleton<SSLContext>::get(); |
| 209 } | 225 } |
| 210 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } | 226 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } |
| 211 SSLClientSessionCache* session_cache() { return &session_cache_; } | 227 SSLClientSessionCache* session_cache() { return &session_cache_; } |
| 212 | 228 |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 SSLClientSocketImpl::SSLContext* context = | 485 SSLClientSocketImpl::SSLContext* context = |
| 470 SSLClientSocketImpl::SSLContext::GetInstance(); | 486 SSLClientSocketImpl::SSLContext::GetInstance(); |
| 471 context->session_cache()->Flush(); | 487 context->session_cache()->Flush(); |
| 472 } | 488 } |
| 473 | 489 |
| 474 SSLClientSocketImpl::SSLClientSocketImpl( | 490 SSLClientSocketImpl::SSLClientSocketImpl( |
| 475 std::unique_ptr<ClientSocketHandle> transport_socket, | 491 std::unique_ptr<ClientSocketHandle> transport_socket, |
| 476 const HostPortPair& host_and_port, | 492 const HostPortPair& host_and_port, |
| 477 const SSLConfig& ssl_config, | 493 const SSLConfig& ssl_config, |
| 478 const SSLClientSocketContext& context) | 494 const SSLClientSocketContext& context) |
| 479 : transport_send_busy_(false), | 495 : pending_read_error_(kNoPendingResult), |
| 480 transport_recv_busy_(false), | |
| 481 pending_read_error_(kNoPendingResult), | |
| 482 pending_read_ssl_error_(SSL_ERROR_NONE), | 496 pending_read_ssl_error_(SSL_ERROR_NONE), |
| 483 transport_read_error_(OK), | |
| 484 transport_write_error_(OK), | |
| 485 server_cert_chain_(new PeerCertificateChain(NULL)), | 497 server_cert_chain_(new PeerCertificateChain(NULL)), |
| 486 completed_connect_(false), | 498 completed_connect_(false), |
| 487 was_ever_used_(false), | 499 was_ever_used_(false), |
| 488 cert_verifier_(context.cert_verifier), | 500 cert_verifier_(context.cert_verifier), |
| 489 cert_transparency_verifier_(context.cert_transparency_verifier), | 501 cert_transparency_verifier_(context.cert_transparency_verifier), |
| 490 channel_id_service_(context.channel_id_service), | 502 channel_id_service_(context.channel_id_service), |
| 491 tb_was_negotiated_(false), | 503 tb_was_negotiated_(false), |
| 492 tb_negotiated_param_(TB_PARAM_ECDSAP256), | 504 tb_negotiated_param_(TB_PARAM_ECDSAP256), |
| 493 tb_signature_map_(10), | 505 tb_signature_map_(10), |
| 494 transport_(std::move(transport_socket)), | 506 transport_(std::move(transport_socket)), |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 626 return rv > OK ? OK : rv; | 638 return rv > OK ? OK : rv; |
| 627 } | 639 } |
| 628 | 640 |
| 629 void SSLClientSocketImpl::Disconnect() { | 641 void SSLClientSocketImpl::Disconnect() { |
| 630 disconnected_ = true; | 642 disconnected_ = true; |
| 631 | 643 |
| 632 // Shut down anything that may call us back. | 644 // Shut down anything that may call us back. |
| 633 cert_verifier_request_.reset(); | 645 cert_verifier_request_.reset(); |
| 634 channel_id_request_.Cancel(); | 646 channel_id_request_.Cancel(); |
| 635 weak_factory_.InvalidateWeakPtrs(); | 647 weak_factory_.InvalidateWeakPtrs(); |
| 648 transport_adapter_.reset(); |
| 636 | 649 |
| 637 // Release user callbacks. | 650 // Release user callbacks. |
| 638 user_connect_callback_.Reset(); | 651 user_connect_callback_.Reset(); |
| 639 user_read_callback_.Reset(); | 652 user_read_callback_.Reset(); |
| 640 user_write_callback_.Reset(); | 653 user_write_callback_.Reset(); |
| 641 user_read_buf_ = NULL; | 654 user_read_buf_ = NULL; |
| 642 user_read_buf_len_ = 0; | 655 user_read_buf_len_ = 0; |
| 643 user_write_buf_ = NULL; | 656 user_write_buf_ = NULL; |
| 644 user_write_buf_len_ = 0; | 657 user_write_buf_len_ = 0; |
| 645 | 658 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 663 // disconnected. | 676 // disconnected. |
| 664 if (!completed_connect_ || disconnected_) | 677 if (!completed_connect_ || disconnected_) |
| 665 return false; | 678 return false; |
| 666 // If an asynchronous operation is still pending. | 679 // If an asynchronous operation is still pending. |
| 667 if (user_read_buf_.get() || user_write_buf_.get()) | 680 if (user_read_buf_.get() || user_write_buf_.get()) |
| 668 return false; | 681 return false; |
| 669 | 682 |
| 670 // If there is data read from the network that has not yet been consumed, do | 683 // If there is data read from the network that has not yet been consumed, do |
| 671 // not treat the connection as idle. | 684 // not treat the connection as idle. |
| 672 // | 685 // |
| 673 // Note that this does not check |BIO_pending|, whether there is ciphertext | 686 // Note that this does not check whether there is ciphertext that has not yet |
| 674 // that has not yet been flushed to the network. |Write| returns early, so | 687 // been flushed to the network. |Write| returns early, so this can cause race |
| 675 // this can cause race conditions which cause a socket to not be treated | 688 // conditions which cause a socket to not be treated reusable when it should |
| 676 // reusable when it should be. See https://crbug.com/466147. | 689 // be. See https://crbug.com/466147. |
| 677 if (BIO_wpending(transport_bio_.get()) > 0) | 690 if (transport_adapter_->HasPendingReadData()) |
| 678 return false; | 691 return false; |
| 679 | 692 |
| 680 return transport_->socket()->IsConnectedAndIdle(); | 693 return transport_->socket()->IsConnectedAndIdle(); |
| 681 } | 694 } |
| 682 | 695 |
| 683 int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const { | 696 int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const { |
| 684 return transport_->socket()->GetPeerAddress(addressList); | 697 return transport_->socket()->GetPeerAddress(addressList); |
| 685 } | 698 } |
| 686 | 699 |
| 687 int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const { | 700 int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const { | 784 int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const { |
| 772 return transport_->socket()->GetTotalReceivedBytes(); | 785 return transport_->socket()->GetTotalReceivedBytes(); |
| 773 } | 786 } |
| 774 | 787 |
| 775 int SSLClientSocketImpl::Read(IOBuffer* buf, | 788 int SSLClientSocketImpl::Read(IOBuffer* buf, |
| 776 int buf_len, | 789 int buf_len, |
| 777 const CompletionCallback& callback) { | 790 const CompletionCallback& callback) { |
| 778 user_read_buf_ = buf; | 791 user_read_buf_ = buf; |
| 779 user_read_buf_len_ = buf_len; | 792 user_read_buf_len_ = buf_len; |
| 780 | 793 |
| 781 int rv = DoReadLoop(); | 794 int rv = DoPayloadRead(); |
| 782 | 795 |
| 783 if (rv == ERR_IO_PENDING) { | 796 if (rv == ERR_IO_PENDING) { |
| 784 user_read_callback_ = callback; | 797 user_read_callback_ = callback; |
| 785 } else { | 798 } else { |
| 786 if (rv > 0) | 799 if (rv > 0) |
| 787 was_ever_used_ = true; | 800 was_ever_used_ = true; |
| 788 user_read_buf_ = NULL; | 801 user_read_buf_ = NULL; |
| 789 user_read_buf_len_ = 0; | 802 user_read_buf_len_ = 0; |
| 790 } | 803 } |
| 791 | 804 |
| 792 return rv; | 805 return rv; |
| 793 } | 806 } |
| 794 | 807 |
| 795 int SSLClientSocketImpl::Write(IOBuffer* buf, | 808 int SSLClientSocketImpl::Write(IOBuffer* buf, |
| 796 int buf_len, | 809 int buf_len, |
| 797 const CompletionCallback& callback) { | 810 const CompletionCallback& callback) { |
| 798 user_write_buf_ = buf; | 811 user_write_buf_ = buf; |
| 799 user_write_buf_len_ = buf_len; | 812 user_write_buf_len_ = buf_len; |
| 800 | 813 |
| 801 int rv = DoWriteLoop(); | 814 int rv = DoPayloadWrite(); |
| 802 | 815 |
| 803 if (rv == ERR_IO_PENDING) { | 816 if (rv == ERR_IO_PENDING) { |
| 804 user_write_callback_ = callback; | 817 user_write_callback_ = callback; |
| 805 } else { | 818 } else { |
| 806 if (rv > 0) | 819 if (rv > 0) |
| 807 was_ever_used_ = true; | 820 was_ever_used_ = true; |
| 808 user_write_buf_ = NULL; | 821 user_write_buf_ = NULL; |
| 809 user_write_buf_len_ = 0; | 822 user_write_buf_len_ = 0; |
| 810 } | 823 } |
| 811 | 824 |
| 812 return rv; | 825 return rv; |
| 813 } | 826 } |
| 814 | 827 |
| 815 int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) { | 828 int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) { |
| 816 return transport_->socket()->SetReceiveBufferSize(size); | 829 return transport_->socket()->SetReceiveBufferSize(size); |
| 817 } | 830 } |
| 818 | 831 |
| 819 int SSLClientSocketImpl::SetSendBufferSize(int32_t size) { | 832 int SSLClientSocketImpl::SetSendBufferSize(int32_t size) { |
| 820 return transport_->socket()->SetSendBufferSize(size); | 833 return transport_->socket()->SetSendBufferSize(size); |
| 821 } | 834 } |
| 822 | 835 |
| 836 void SSLClientSocketImpl::OnReadReady() { |
| 837 // During a renegotiation, either Read or Write calls may be blocked on a |
| 838 // transport read. |
| 839 RetryAllOperations(); |
| 840 } |
| 841 |
| 842 void SSLClientSocketImpl::OnWriteReady() { |
| 843 // During a renegotiation, either Read or Write calls may be blocked on a |
| 844 // transport read. |
| 845 RetryAllOperations(); |
| 846 } |
| 847 |
| 823 int SSLClientSocketImpl::Init() { | 848 int SSLClientSocketImpl::Init() { |
| 824 DCHECK(!ssl_); | 849 DCHECK(!ssl_); |
| 825 DCHECK(!transport_bio_); | |
| 826 | 850 |
| 827 #if defined(USE_NSS_CERTS) | 851 #if defined(USE_NSS_CERTS) |
| 828 if (ssl_config_.cert_io_enabled) { | 852 if (ssl_config_.cert_io_enabled) { |
| 829 // TODO(davidben): Move this out of SSLClientSocket. See | 853 // TODO(davidben): Move this out of SSLClientSocket. See |
| 830 // https://crbug.com/539520. | 854 // https://crbug.com/539520. |
| 831 EnsureNSSHttpIOInit(); | 855 EnsureNSSHttpIOInit(); |
| 832 } | 856 } |
| 833 #endif | 857 #endif |
| 834 | 858 |
| 835 SSLContext* context = SSLContext::GetInstance(); | 859 SSLContext* context = SSLContext::GetInstance(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 848 if (!unused.AssignFromIPLiteral(host_and_port_.host()) && | 872 if (!unused.AssignFromIPLiteral(host_and_port_.host()) && |
| 849 !SSL_set_tlsext_host_name(ssl_.get(), host_and_port_.host().c_str())) { | 873 !SSL_set_tlsext_host_name(ssl_.get(), host_and_port_.host().c_str())) { |
| 850 return ERR_UNEXPECTED; | 874 return ERR_UNEXPECTED; |
| 851 } | 875 } |
| 852 | 876 |
| 853 bssl::UniquePtr<SSL_SESSION> session = | 877 bssl::UniquePtr<SSL_SESSION> session = |
| 854 context->session_cache()->Lookup(GetSessionCacheKey()); | 878 context->session_cache()->Lookup(GetSessionCacheKey()); |
| 855 if (session) | 879 if (session) |
| 856 SSL_set_session(ssl_.get(), session.get()); | 880 SSL_set_session(ssl_.get(), session.get()); |
| 857 | 881 |
| 858 // Get read and write buffer sizes from field trials, if possible. If values | 882 transport_adapter_.reset(new SocketBIOAdapter( |
| 859 // not present, use default. Also make sure values are in reasonable range. | 883 transport_->socket(), GetBufferSize("SSLBufferSizeRecv"), |
| 860 int send_buffer_size = kDefaultOpenSSLBufferSize; | 884 GetBufferSize("SSLBufferSizeSend"), this)); |
| 861 #if !defined(OS_NACL) | 885 BIO* transport_bio = transport_adapter_->bio(); |
| 862 int override_send_buffer_size; | |
| 863 if (base::StringToInt(base::FieldTrialList::FindFullName("SSLBufferSizeSend"), | |
| 864 &override_send_buffer_size)) { | |
| 865 send_buffer_size = override_send_buffer_size; | |
| 866 send_buffer_size = std::max(send_buffer_size, 1000); | |
| 867 send_buffer_size = | |
| 868 std::min(send_buffer_size, 2 * kDefaultOpenSSLBufferSize); | |
| 869 } | |
| 870 #endif // !defined(OS_NACL) | |
| 871 send_buffer_ = new GrowableIOBuffer(); | |
| 872 send_buffer_->SetCapacity(send_buffer_size); | |
| 873 | 886 |
| 874 int recv_buffer_size = kDefaultOpenSSLBufferSize; | 887 BIO_up_ref(transport_bio); // SSL_set0_rbio takes ownership. |
| 875 #if !defined(OS_NACL) | 888 SSL_set0_rbio(ssl_.get(), transport_bio); |
| 876 int override_recv_buffer_size; | |
| 877 if (base::StringToInt(base::FieldTrialList::FindFullName("SSLBufferSizeRecv"), | |
| 878 &override_recv_buffer_size)) { | |
| 879 recv_buffer_size = override_recv_buffer_size; | |
| 880 recv_buffer_size = std::max(recv_buffer_size, 1000); | |
| 881 recv_buffer_size = | |
| 882 std::min(recv_buffer_size, 2 * kDefaultOpenSSLBufferSize); | |
| 883 } | |
| 884 #endif // !defined(OS_NACL) | |
| 885 recv_buffer_ = new GrowableIOBuffer(); | |
| 886 recv_buffer_->SetCapacity(recv_buffer_size); | |
| 887 | 889 |
| 888 BIO* ssl_bio = NULL; | 890 BIO_up_ref(transport_bio); // SSL_set0_wbio takes ownership. |
| 889 | 891 SSL_set0_wbio(ssl_.get(), transport_bio); |
| 890 // SSLClientSocketImpl retains ownership of the BIO buffers. | |
| 891 BIO* transport_bio_raw; | |
| 892 if (!BIO_new_bio_pair_external_buf( | |
| 893 &ssl_bio, send_buffer_->capacity(), | |
| 894 reinterpret_cast<uint8_t*>(send_buffer_->data()), &transport_bio_raw, | |
| 895 recv_buffer_->capacity(), | |
| 896 reinterpret_cast<uint8_t*>(recv_buffer_->data()))) | |
| 897 return ERR_UNEXPECTED; | |
| 898 transport_bio_.reset(transport_bio_raw); | |
| 899 DCHECK(ssl_bio); | |
| 900 DCHECK(transport_bio_); | |
| 901 | |
| 902 // Install a callback on OpenSSL's end to plumb transport errors through. | |
| 903 BIO_set_callback(ssl_bio, &SSLClientSocketImpl::BIOCallback); | |
| 904 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this)); | |
| 905 | |
| 906 SSL_set_bio(ssl_.get(), ssl_bio, ssl_bio); | |
| 907 | 892 |
| 908 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min); | 893 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min); |
| 909 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max); | 894 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max); |
| 910 if (!SSL_set_min_proto_version(ssl_.get(), ssl_config_.version_min) || | 895 if (!SSL_set_min_proto_version(ssl_.get(), ssl_config_.version_min) || |
| 911 !SSL_set_max_proto_version(ssl_.get(), ssl_config_.version_max)) { | 896 !SSL_set_max_proto_version(ssl_.get(), ssl_config_.version_max)) { |
| 912 return ERR_UNEXPECTED; | 897 return ERR_UNEXPECTED; |
| 913 } | 898 } |
| 914 | 899 |
| 915 // OpenSSL defaults some options to on, others to off. To avoid ambiguity, | 900 // OpenSSL defaults some options to on, others to off. To avoid ambiguity, |
| 916 // set everything we care about to an absolute value. | 901 // set everything we care about to an absolute value. |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 void SSLClientSocketImpl::DoWriteCallback(int rv) { | 1009 void SSLClientSocketImpl::DoWriteCallback(int rv) { |
| 1025 // Since Run may result in Write being called, clear |user_write_callback_| | 1010 // Since Run may result in Write being called, clear |user_write_callback_| |
| 1026 // up front. | 1011 // up front. |
| 1027 if (rv > 0) | 1012 if (rv > 0) |
| 1028 was_ever_used_ = true; | 1013 was_ever_used_ = true; |
| 1029 user_write_buf_ = NULL; | 1014 user_write_buf_ = NULL; |
| 1030 user_write_buf_len_ = 0; | 1015 user_write_buf_len_ = 0; |
| 1031 base::ResetAndReturn(&user_write_callback_).Run(rv); | 1016 base::ResetAndReturn(&user_write_callback_).Run(rv); |
| 1032 } | 1017 } |
| 1033 | 1018 |
| 1034 bool SSLClientSocketImpl::DoTransportIO() { | |
| 1035 bool network_moved = false; | |
| 1036 int rv; | |
| 1037 // Read and write as much data as possible. The loop is necessary because | |
| 1038 // Write() may return synchronously. | |
| 1039 do { | |
| 1040 rv = BufferSend(); | |
| 1041 if (rv != ERR_IO_PENDING && rv != 0) | |
| 1042 network_moved = true; | |
| 1043 } while (rv > 0); | |
| 1044 if (transport_read_error_ == OK && BufferRecv() != ERR_IO_PENDING) | |
| 1045 network_moved = true; | |
| 1046 return network_moved; | |
| 1047 } | |
| 1048 | |
| 1049 // TODO(cbentzel): Remove including "base/threading/thread_local.h" and | 1019 // TODO(cbentzel): Remove including "base/threading/thread_local.h" and |
| 1050 // g_first_run_completed once crbug.com/424386 is fixed. | 1020 // g_first_run_completed once crbug.com/424386 is fixed. |
| 1051 base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed = | 1021 base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed = |
| 1052 LAZY_INSTANCE_INITIALIZER; | 1022 LAZY_INSTANCE_INITIALIZER; |
| 1053 | 1023 |
| 1054 int SSLClientSocketImpl::DoHandshake() { | 1024 int SSLClientSocketImpl::DoHandshake() { |
| 1055 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 1025 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
| 1056 | 1026 |
| 1057 int rv; | 1027 int rv; |
| 1058 | 1028 |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1326 } | 1296 } |
| 1327 | 1297 |
| 1328 void SSLClientSocketImpl::OnHandshakeIOComplete(int result) { | 1298 void SSLClientSocketImpl::OnHandshakeIOComplete(int result) { |
| 1329 int rv = DoHandshakeLoop(result); | 1299 int rv = DoHandshakeLoop(result); |
| 1330 if (rv != ERR_IO_PENDING) { | 1300 if (rv != ERR_IO_PENDING) { |
| 1331 LogConnectEndEvent(rv); | 1301 LogConnectEndEvent(rv); |
| 1332 DoConnectCallback(rv); | 1302 DoConnectCallback(rv); |
| 1333 } | 1303 } |
| 1334 } | 1304 } |
| 1335 | 1305 |
| 1336 void SSLClientSocketImpl::OnSendComplete(int result) { | |
| 1337 if (next_handshake_state_ == STATE_HANDSHAKE) { | |
| 1338 // In handshake phase. | |
| 1339 OnHandshakeIOComplete(result); | |
| 1340 return; | |
| 1341 } | |
| 1342 | |
| 1343 // During a renegotiation, a Read call may also be blocked on a transport | |
| 1344 // write, so retry both operations. | |
| 1345 PumpReadWriteEvents(); | |
| 1346 } | |
| 1347 | |
| 1348 void SSLClientSocketImpl::OnRecvComplete(int result) { | |
| 1349 TRACE_EVENT0("net", "SSLClientSocketImpl::OnRecvComplete"); | |
| 1350 if (next_handshake_state_ == STATE_HANDSHAKE) { | |
| 1351 // In handshake phase. | |
| 1352 OnHandshakeIOComplete(result); | |
| 1353 return; | |
| 1354 } | |
| 1355 | |
| 1356 // Network layer received some data, check if client requested to read | |
| 1357 // decrypted data. | |
| 1358 if (!user_read_buf_.get()) | |
| 1359 return; | |
| 1360 | |
| 1361 int rv = DoReadLoop(); | |
| 1362 if (rv != ERR_IO_PENDING) | |
| 1363 DoReadCallback(rv); | |
| 1364 } | |
| 1365 | |
| 1366 int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) { | 1306 int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) { |
| 1367 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop"); | 1307 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop"); |
| 1368 int rv = last_io_result; | 1308 int rv = last_io_result; |
| 1369 do { | 1309 do { |
| 1370 // Default to STATE_NONE for next state. | 1310 // Default to STATE_NONE for next state. |
| 1371 // (This is a quirk carried over from the windows | 1311 // (This is a quirk carried over from the windows |
| 1372 // implementation. It makes reading the logs a bit harder.) | 1312 // implementation. It makes reading the logs a bit harder.) |
| 1373 // State handlers can and often do call GotoState just | 1313 // State handlers can and often do call GotoState just |
| 1374 // to stay in the current state. | 1314 // to stay in the current state. |
| 1375 State state = next_handshake_state_; | 1315 State state = next_handshake_state_; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1394 break; | 1334 break; |
| 1395 case STATE_VERIFY_CERT_COMPLETE: | 1335 case STATE_VERIFY_CERT_COMPLETE: |
| 1396 rv = DoVerifyCertComplete(rv); | 1336 rv = DoVerifyCertComplete(rv); |
| 1397 break; | 1337 break; |
| 1398 case STATE_NONE: | 1338 case STATE_NONE: |
| 1399 default: | 1339 default: |
| 1400 rv = ERR_UNEXPECTED; | 1340 rv = ERR_UNEXPECTED; |
| 1401 NOTREACHED() << "unexpected state" << state; | 1341 NOTREACHED() << "unexpected state" << state; |
| 1402 break; | 1342 break; |
| 1403 } | 1343 } |
| 1404 | |
| 1405 bool network_moved = DoTransportIO(); | |
| 1406 if (network_moved && next_handshake_state_ == STATE_HANDSHAKE) { | |
| 1407 // In general we exit the loop if rv is ERR_IO_PENDING. In this | |
| 1408 // special case we keep looping even if rv is ERR_IO_PENDING because | |
| 1409 // the transport IO may allow DoHandshake to make progress. | |
| 1410 rv = OK; // This causes us to stay in the loop. | |
| 1411 } | |
| 1412 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE); | 1344 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE); |
| 1413 return rv; | 1345 return rv; |
| 1414 } | 1346 } |
| 1415 | 1347 |
| 1416 int SSLClientSocketImpl::DoReadLoop() { | |
| 1417 bool network_moved; | |
| 1418 int rv; | |
| 1419 do { | |
| 1420 rv = DoPayloadRead(); | |
| 1421 network_moved = DoTransportIO(); | |
| 1422 } while (rv == ERR_IO_PENDING && network_moved); | |
| 1423 | |
| 1424 return rv; | |
| 1425 } | |
| 1426 | |
| 1427 int SSLClientSocketImpl::DoWriteLoop() { | |
| 1428 bool network_moved; | |
| 1429 int rv; | |
| 1430 do { | |
| 1431 rv = DoPayloadWrite(); | |
| 1432 network_moved = DoTransportIO(); | |
| 1433 } while (rv == ERR_IO_PENDING && network_moved); | |
| 1434 | |
| 1435 return rv; | |
| 1436 } | |
| 1437 | |
| 1438 int SSLClientSocketImpl::DoPayloadRead() { | 1348 int SSLClientSocketImpl::DoPayloadRead() { |
| 1439 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 1349 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
| 1440 | 1350 |
| 1441 DCHECK_LT(0, user_read_buf_len_); | 1351 DCHECK_LT(0, user_read_buf_len_); |
| 1442 DCHECK(user_read_buf_.get()); | 1352 DCHECK(user_read_buf_.get()); |
| 1443 | 1353 |
| 1444 int rv; | 1354 int rv; |
| 1445 if (pending_read_error_ != kNoPendingResult) { | 1355 if (pending_read_error_ != kNoPendingResult) { |
| 1446 rv = pending_read_error_; | 1356 rv = pending_read_error_; |
| 1447 pending_read_error_ = kNoPendingResult; | 1357 pending_read_error_ = kNoPendingResult; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1504 pending_read_error_ = 0; | 1414 pending_read_error_ = 0; |
| 1505 } | 1415 } |
| 1506 | 1416 |
| 1507 if (total_bytes_read > 0) { | 1417 if (total_bytes_read > 0) { |
| 1508 // Return any bytes read to the caller. The error will be deferred to the | 1418 // Return any bytes read to the caller. The error will be deferred to the |
| 1509 // next call of DoPayloadRead. | 1419 // next call of DoPayloadRead. |
| 1510 rv = total_bytes_read; | 1420 rv = total_bytes_read; |
| 1511 | 1421 |
| 1512 // Do not treat insufficient data as an error to return in the next call to | 1422 // Do not treat insufficient data as an error to return in the next call to |
| 1513 // DoPayloadRead() - instead, let the call fall through to check SSL_read() | 1423 // DoPayloadRead() - instead, let the call fall through to check SSL_read() |
| 1514 // again. This is because DoTransportIO() may complete in between the next | 1424 // again. The transport may have data available by then. |
| 1515 // call to DoPayloadRead(), and thus it is important to check SSL_read() on | |
| 1516 // subsequent invocations to see if a complete record may now be read. | |
| 1517 if (pending_read_error_ == ERR_IO_PENDING) | 1425 if (pending_read_error_ == ERR_IO_PENDING) |
| 1518 pending_read_error_ = kNoPendingResult; | 1426 pending_read_error_ = kNoPendingResult; |
| 1519 } else { | 1427 } else { |
| 1520 // No bytes were returned. Return the pending read error immediately. | 1428 // No bytes were returned. Return the pending read error immediately. |
| 1521 DCHECK_NE(kNoPendingResult, pending_read_error_); | 1429 DCHECK_NE(kNoPendingResult, pending_read_error_); |
| 1522 rv = pending_read_error_; | 1430 rv = pending_read_error_; |
| 1523 pending_read_error_ = kNoPendingResult; | 1431 pending_read_error_ = kNoPendingResult; |
| 1524 } | 1432 } |
| 1525 | 1433 |
| 1526 if (rv >= 0) { | 1434 if (rv >= 0) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1554 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info); | 1462 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info); |
| 1555 | 1463 |
| 1556 if (net_error != ERR_IO_PENDING) { | 1464 if (net_error != ERR_IO_PENDING) { |
| 1557 net_log_.AddEvent( | 1465 net_log_.AddEvent( |
| 1558 NetLogEventType::SSL_WRITE_ERROR, | 1466 NetLogEventType::SSL_WRITE_ERROR, |
| 1559 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info)); | 1467 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info)); |
| 1560 } | 1468 } |
| 1561 return net_error; | 1469 return net_error; |
| 1562 } | 1470 } |
| 1563 | 1471 |
| 1564 void SSLClientSocketImpl::PumpReadWriteEvents() { | 1472 void SSLClientSocketImpl::RetryAllOperations() { |
| 1473 // SSL_do_handshake, SSL_read, and SSL_write may all be retried when blocked, |
| 1474 // so retry all operations for simplicity. (Otherwise, SSL_get_error for each |
| 1475 // operation may be remembered to retry only the blocked ones.) |
| 1476 |
| 1477 if (next_handshake_state_ == STATE_HANDSHAKE) { |
| 1478 // In handshake phase. The parameter to OnHandshakeIOComplete is unused. |
| 1479 OnHandshakeIOComplete(OK); |
| 1480 return; |
| 1481 } |
| 1482 |
| 1565 int rv_read = ERR_IO_PENDING; | 1483 int rv_read = ERR_IO_PENDING; |
| 1566 int rv_write = ERR_IO_PENDING; | 1484 int rv_write = ERR_IO_PENDING; |
| 1567 bool network_moved; | 1485 if (user_read_buf_) |
| 1568 do { | 1486 rv_read = DoPayloadRead(); |
| 1569 if (user_read_buf_.get()) | 1487 if (user_write_buf_) |
| 1570 rv_read = DoPayloadRead(); | 1488 rv_write = DoPayloadWrite(); |
| 1571 if (user_write_buf_.get()) | |
| 1572 rv_write = DoPayloadWrite(); | |
| 1573 network_moved = DoTransportIO(); | |
| 1574 } while (rv_read == ERR_IO_PENDING && rv_write == ERR_IO_PENDING && | |
| 1575 (user_read_buf_.get() || user_write_buf_.get()) && network_moved); | |
| 1576 | 1489 |
| 1577 // Performing the Read callback may cause |this| to be deleted. If this | 1490 // Performing the Read callback may cause |this| to be deleted. If this |
| 1578 // happens, the Write callback should not be invoked. Guard against this by | 1491 // happens, the Write callback should not be invoked. Guard against this by |
| 1579 // holding a WeakPtr to |this| and ensuring it's still valid. | 1492 // holding a WeakPtr to |this| and ensuring it's still valid. |
| 1580 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr()); | 1493 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr()); |
| 1581 if (user_read_buf_.get() && rv_read != ERR_IO_PENDING) | 1494 if (rv_read != ERR_IO_PENDING) |
| 1582 DoReadCallback(rv_read); | 1495 DoReadCallback(rv_read); |
| 1583 | 1496 |
| 1584 if (!guard.get()) | 1497 if (!guard.get()) |
| 1585 return; | 1498 return; |
| 1586 | 1499 |
| 1587 if (user_write_buf_.get() && rv_write != ERR_IO_PENDING) | 1500 if (rv_write != ERR_IO_PENDING) |
| 1588 DoWriteCallback(rv_write); | 1501 DoWriteCallback(rv_write); |
| 1589 } | 1502 } |
| 1590 | 1503 |
| 1591 int SSLClientSocketImpl::BufferSend(void) { | |
| 1592 if (transport_send_busy_) | |
| 1593 return ERR_IO_PENDING; | |
| 1594 | |
| 1595 size_t buffer_read_offset; | |
| 1596 uint8_t* read_buf; | |
| 1597 size_t max_read; | |
| 1598 int status = BIO_zero_copy_get_read_buf(transport_bio_.get(), &read_buf, | |
| 1599 &buffer_read_offset, &max_read); | |
| 1600 DCHECK_EQ(status, 1); // Should never fail. | |
| 1601 if (!max_read) | |
| 1602 return 0; // Nothing pending in the OpenSSL write BIO. | |
| 1603 CHECK_EQ(read_buf, reinterpret_cast<uint8_t*>(send_buffer_->StartOfBuffer())); | |
| 1604 CHECK_LT(buffer_read_offset, static_cast<size_t>(send_buffer_->capacity())); | |
| 1605 send_buffer_->set_offset(buffer_read_offset); | |
| 1606 | |
| 1607 int rv = transport_->socket()->Write( | |
| 1608 send_buffer_.get(), max_read, | |
| 1609 base::Bind(&SSLClientSocketImpl::BufferSendComplete, | |
| 1610 base::Unretained(this))); | |
| 1611 if (rv == ERR_IO_PENDING) { | |
| 1612 transport_send_busy_ = true; | |
| 1613 } else { | |
| 1614 TransportWriteComplete(rv); | |
| 1615 } | |
| 1616 return rv; | |
| 1617 } | |
| 1618 | |
| 1619 int SSLClientSocketImpl::BufferRecv(void) { | |
| 1620 if (transport_recv_busy_) | |
| 1621 return ERR_IO_PENDING; | |
| 1622 | |
| 1623 // Determine how much was requested from |transport_bio_| that was not | |
| 1624 // actually available. | |
| 1625 size_t requested = BIO_ctrl_get_read_request(transport_bio_.get()); | |
| 1626 if (requested == 0) { | |
| 1627 // This is not a perfect match of error codes, as no operation is | |
| 1628 // actually pending. However, returning 0 would be interpreted as | |
| 1629 // a possible sign of EOF, which is also an inappropriate match. | |
| 1630 return ERR_IO_PENDING; | |
| 1631 } | |
| 1632 | |
| 1633 // Known Issue: While only reading |requested| data is the more correct | |
| 1634 // implementation, it has the downside of resulting in frequent reads: | |
| 1635 // One read for the SSL record header (~5 bytes) and one read for the SSL | |
| 1636 // record body. Rather than issuing these reads to the underlying socket | |
| 1637 // (and constantly allocating new IOBuffers), a single Read() request to | |
| 1638 // fill |transport_bio_| is issued. As long as an SSL client socket cannot | |
| 1639 // be gracefully shutdown (via SSL close alerts) and re-used for non-SSL | |
| 1640 // traffic, this over-subscribed Read()ing will not cause issues. | |
| 1641 | |
| 1642 size_t buffer_write_offset; | |
| 1643 uint8_t* write_buf; | |
| 1644 size_t max_write; | |
| 1645 int status = BIO_zero_copy_get_write_buf(transport_bio_.get(), &write_buf, | |
| 1646 &buffer_write_offset, &max_write); | |
| 1647 DCHECK_EQ(status, 1); // Should never fail. | |
| 1648 if (!max_write) | |
| 1649 return ERR_IO_PENDING; | |
| 1650 | |
| 1651 CHECK_EQ(write_buf, | |
| 1652 reinterpret_cast<uint8_t*>(recv_buffer_->StartOfBuffer())); | |
| 1653 CHECK_LT(buffer_write_offset, static_cast<size_t>(recv_buffer_->capacity())); | |
| 1654 | |
| 1655 recv_buffer_->set_offset(buffer_write_offset); | |
| 1656 int rv = transport_->socket()->Read( | |
| 1657 recv_buffer_.get(), max_write, | |
| 1658 base::Bind(&SSLClientSocketImpl::BufferRecvComplete, | |
| 1659 base::Unretained(this))); | |
| 1660 if (rv == ERR_IO_PENDING) { | |
| 1661 transport_recv_busy_ = true; | |
| 1662 } else { | |
| 1663 rv = TransportReadComplete(rv); | |
| 1664 } | |
| 1665 return rv; | |
| 1666 } | |
| 1667 | |
| 1668 void SSLClientSocketImpl::BufferSendComplete(int result) { | |
| 1669 TransportWriteComplete(result); | |
| 1670 OnSendComplete(result); | |
| 1671 } | |
| 1672 | |
| 1673 void SSLClientSocketImpl::BufferRecvComplete(int result) { | |
| 1674 result = TransportReadComplete(result); | |
| 1675 OnRecvComplete(result); | |
| 1676 } | |
| 1677 | |
| 1678 void SSLClientSocketImpl::TransportWriteComplete(int result) { | |
| 1679 DCHECK(ERR_IO_PENDING != result); | |
| 1680 int bytes_written = 0; | |
| 1681 if (result < 0) { | |
| 1682 // Record the error. Save it to be reported in a future read or write on | |
| 1683 // transport_bio_'s peer. | |
| 1684 transport_write_error_ = result; | |
| 1685 } else { | |
| 1686 bytes_written = result; | |
| 1687 } | |
| 1688 DCHECK_GE(send_buffer_->RemainingCapacity(), bytes_written); | |
| 1689 int ret = | |
| 1690 BIO_zero_copy_get_read_buf_done(transport_bio_.get(), bytes_written); | |
| 1691 DCHECK_EQ(1, ret); | |
| 1692 transport_send_busy_ = false; | |
| 1693 } | |
| 1694 | |
| 1695 int SSLClientSocketImpl::TransportReadComplete(int result) { | |
| 1696 DCHECK(ERR_IO_PENDING != result); | |
| 1697 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError | |
| 1698 // does not report success. | |
| 1699 if (result == 0) | |
| 1700 result = ERR_CONNECTION_CLOSED; | |
| 1701 int bytes_read = 0; | |
| 1702 if (result < 0) { | |
| 1703 // Received an error. Save it to be reported in a future read on | |
| 1704 // transport_bio_'s peer. | |
| 1705 transport_read_error_ = result; | |
| 1706 } else { | |
| 1707 bytes_read = result; | |
| 1708 } | |
| 1709 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read); | |
| 1710 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_.get(), bytes_read); | |
| 1711 DCHECK_EQ(1, ret); | |
| 1712 transport_recv_busy_ = false; | |
| 1713 return result; | |
| 1714 } | |
| 1715 | |
| 1716 int SSLClientSocketImpl::VerifyCT() { | 1504 int SSLClientSocketImpl::VerifyCT() { |
| 1717 const uint8_t* sct_list_raw; | 1505 const uint8_t* sct_list_raw; |
| 1718 size_t sct_list_len; | 1506 size_t sct_list_len; |
| 1719 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len); | 1507 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len); |
| 1720 std::string sct_list; | 1508 std::string sct_list; |
| 1721 if (sct_list_len > 0) | 1509 if (sct_list_len > 0) |
| 1722 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len); | 1510 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len); |
| 1723 | 1511 |
| 1724 // Note that this is a completely synchronous operation: The CT Log Verifier | 1512 // Note that this is a completely synchronous operation: The CT Log Verifier |
| 1725 // gets all the data it needs for SCT verification and does not do any | 1513 // gets all the data it needs for SCT verification and does not do any |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1905 return 0; | 1693 return 0; |
| 1906 } | 1694 } |
| 1907 if (old_der != new_der) { | 1695 if (old_der != new_der) { |
| 1908 LOG(ERROR) << "Server certificate changed between handshakes"; | 1696 LOG(ERROR) << "Server certificate changed between handshakes"; |
| 1909 return 0; | 1697 return 0; |
| 1910 } | 1698 } |
| 1911 | 1699 |
| 1912 return 1; | 1700 return 1; |
| 1913 } | 1701 } |
| 1914 | 1702 |
| 1915 long SSLClientSocketImpl::MaybeReplayTransportError(BIO* bio, | |
| 1916 int cmd, | |
| 1917 const char* argp, | |
| 1918 int argi, | |
| 1919 long argl, | |
| 1920 long retvalue) { | |
| 1921 if (cmd == (BIO_CB_READ | BIO_CB_RETURN) && retvalue <= 0) { | |
| 1922 // If there is no more data in the buffer, report any pending errors that | |
| 1923 // were observed. Note that both the readbuf and the writebuf are checked | |
| 1924 // for errors, since the application may have encountered a socket error | |
| 1925 // while writing that would otherwise not be reported until the application | |
| 1926 // attempted to write again - which it may never do. See | |
| 1927 // https://crbug.com/249848. | |
| 1928 if (transport_read_error_ != OK) { | |
| 1929 OpenSSLPutNetError(FROM_HERE, transport_read_error_); | |
| 1930 return -1; | |
| 1931 } | |
| 1932 if (transport_write_error_ != OK) { | |
| 1933 OpenSSLPutNetError(FROM_HERE, transport_write_error_); | |
| 1934 return -1; | |
| 1935 } | |
| 1936 } else if (cmd == BIO_CB_WRITE) { | |
| 1937 // Because of the write buffer, this reports a failure from the previous | |
| 1938 // write payload. If the current payload fails to write, the error will be | |
| 1939 // reported in a future write or read to |bio|. | |
| 1940 if (transport_write_error_ != OK) { | |
| 1941 OpenSSLPutNetError(FROM_HERE, transport_write_error_); | |
| 1942 return -1; | |
| 1943 } | |
| 1944 } | |
| 1945 return retvalue; | |
| 1946 } | |
| 1947 | |
| 1948 // static | |
| 1949 long SSLClientSocketImpl::BIOCallback(BIO* bio, | |
| 1950 int cmd, | |
| 1951 const char* argp, | |
| 1952 int argi, | |
| 1953 long argl, | |
| 1954 long retvalue) { | |
| 1955 SSLClientSocketImpl* socket = | |
| 1956 reinterpret_cast<SSLClientSocketImpl*>(BIO_get_callback_arg(bio)); | |
| 1957 CHECK(socket); | |
| 1958 return socket->MaybeReplayTransportError(bio, cmd, argp, argi, argl, | |
| 1959 retvalue); | |
| 1960 } | |
| 1961 | |
| 1962 void SSLClientSocketImpl::MaybeCacheSession() { | 1703 void SSLClientSocketImpl::MaybeCacheSession() { |
| 1963 // Only cache the session once both a new session has been established and the | 1704 // Only cache the session once both a new session has been established and the |
| 1964 // certificate has been verified. Due to False Start, these events may happen | 1705 // certificate has been verified. Due to False Start, these events may happen |
| 1965 // in either order. | 1706 // in either order. |
| 1966 if (!pending_session_ || !certificate_verified_) | 1707 if (!pending_session_ || !certificate_verified_) |
| 1967 return; | 1708 return; |
| 1968 | 1709 |
| 1969 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(), | 1710 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(), |
| 1970 pending_session_.get()); | 1711 pending_session_.get()); |
| 1971 pending_session_ = nullptr; | 1712 pending_session_ = nullptr; |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2090 DCHECK_EQ(ERR_IO_PENDING, signature_result_); | 1831 DCHECK_EQ(ERR_IO_PENDING, signature_result_); |
| 2091 DCHECK(signature_.empty()); | 1832 DCHECK(signature_.empty()); |
| 2092 DCHECK(ssl_config_.client_private_key); | 1833 DCHECK(ssl_config_.client_private_key); |
| 2093 | 1834 |
| 2094 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error); | 1835 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error); |
| 2095 | 1836 |
| 2096 signature_result_ = error; | 1837 signature_result_ = error; |
| 2097 if (signature_result_ == OK) | 1838 if (signature_result_ == OK) |
| 2098 signature_ = signature; | 1839 signature_ = signature; |
| 2099 | 1840 |
| 2100 if (next_handshake_state_ == STATE_HANDSHAKE) { | |
| 2101 OnHandshakeIOComplete(signature_result_); | |
| 2102 return; | |
| 2103 } | |
| 2104 | |
| 2105 // During a renegotiation, either Read or Write calls may be blocked on an | 1841 // During a renegotiation, either Read or Write calls may be blocked on an |
| 2106 // asynchronous private key operation. | 1842 // asynchronous private key operation. |
| 2107 PumpReadWriteEvents(); | 1843 RetryAllOperations(); |
| 2108 } | 1844 } |
| 2109 | 1845 |
| 2110 int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out, | 1846 int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out, |
| 2111 size_t* out_len, | 1847 size_t* out_len, |
| 2112 int* out_alert_value) { | 1848 int* out_alert_value) { |
| 2113 if (ssl_config_.token_binding_params.empty()) { | 1849 if (ssl_config_.token_binding_params.empty()) { |
| 2114 return 0; | 1850 return 0; |
| 2115 } | 1851 } |
| 2116 bssl::ScopedCBB output; | 1852 bssl::ScopedCBB output; |
| 2117 CBB parameters_list; | 1853 CBB parameters_list; |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2255 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED && | 1991 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED && |
| 2256 !certificate_requested_) { | 1992 !certificate_requested_) { |
| 2257 net_error = ERR_SSL_PROTOCOL_ERROR; | 1993 net_error = ERR_SSL_PROTOCOL_ERROR; |
| 2258 } | 1994 } |
| 2259 } | 1995 } |
| 2260 | 1996 |
| 2261 return net_error; | 1997 return net_error; |
| 2262 } | 1998 } |
| 2263 | 1999 |
| 2264 } // namespace net | 2000 } // namespace net |
| OLD | NEW |