| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_win.h" | 5 #include "net/socket/ssl_client_socket_win.h" |
| 6 | 6 |
| 7 #include <schnlsp.h> | 7 #include <schnlsp.h> |
| 8 #include <map> | 8 #include <map> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 // breakdown of the size: | 380 // breakdown of the size: |
| 381 // 5: SSL record header | 381 // 5: SSL record header |
| 382 // 16K: SSL record maximum size | 382 // 16K: SSL record maximum size |
| 383 // 64: >= SSL record trailer (16 or 20 have been observed) | 383 // 64: >= SSL record trailer (16 or 20 have been observed) |
| 384 static const int kRecvBufferSize = (5 + 16*1024 + 64); | 384 static const int kRecvBufferSize = (5 + 16*1024 + 64); |
| 385 | 385 |
| 386 SSLClientSocketWin::SSLClientSocketWin(ClientSocketHandle* transport_socket, | 386 SSLClientSocketWin::SSLClientSocketWin(ClientSocketHandle* transport_socket, |
| 387 const HostPortPair& host_and_port, | 387 const HostPortPair& host_and_port, |
| 388 const SSLConfig& ssl_config, | 388 const SSLConfig& ssl_config, |
| 389 const SSLClientSocketContext& context) | 389 const SSLClientSocketContext& context) |
| 390 : ALLOW_THIS_IN_INITIALIZER_LIST( | 390 : transport_(transport_socket), |
| 391 handshake_io_callback_(this, | |
| 392 &SSLClientSocketWin::OnHandshakeIOComplete)), | |
| 393 ALLOW_THIS_IN_INITIALIZER_LIST( | |
| 394 read_callback_(this, &SSLClientSocketWin::OnReadComplete)), | |
| 395 ALLOW_THIS_IN_INITIALIZER_LIST( | |
| 396 write_callback_(this, &SSLClientSocketWin::OnWriteComplete)), | |
| 397 transport_(transport_socket), | |
| 398 host_and_port_(host_and_port), | 391 host_and_port_(host_and_port), |
| 399 ssl_config_(ssl_config), | 392 ssl_config_(ssl_config), |
| 400 old_user_connect_callback_(NULL), | |
| 401 old_user_read_callback_(NULL), | |
| 402 user_read_buf_len_(0), | 393 user_read_buf_len_(0), |
| 403 user_write_callback_(NULL), | |
| 404 user_write_buf_len_(0), | 394 user_write_buf_len_(0), |
| 405 next_state_(STATE_NONE), | 395 next_state_(STATE_NONE), |
| 406 cert_verifier_(context.cert_verifier), | 396 cert_verifier_(context.cert_verifier), |
| 407 creds_(NULL), | 397 creds_(NULL), |
| 408 isc_status_(SEC_E_OK), | 398 isc_status_(SEC_E_OK), |
| 409 payload_send_buffer_len_(0), | 399 payload_send_buffer_len_(0), |
| 410 bytes_sent_(0), | 400 bytes_sent_(0), |
| 411 decrypted_ptr_(NULL), | 401 decrypted_ptr_(NULL), |
| 412 bytes_decrypted_(0), | 402 bytes_decrypted_(0), |
| 413 received_ptr_(NULL), | 403 received_ptr_(NULL), |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 } | 545 } |
| 556 | 546 |
| 557 SSLClientSocket::NextProtoStatus | 547 SSLClientSocket::NextProtoStatus |
| 558 SSLClientSocketWin::GetNextProto(std::string* proto, | 548 SSLClientSocketWin::GetNextProto(std::string* proto, |
| 559 std::string* server_protos) { | 549 std::string* server_protos) { |
| 560 proto->clear(); | 550 proto->clear(); |
| 561 server_protos->clear(); | 551 server_protos->clear(); |
| 562 return kNextProtoUnsupported; | 552 return kNextProtoUnsupported; |
| 563 } | 553 } |
| 564 | 554 |
| 565 int SSLClientSocketWin::Connect(OldCompletionCallback* callback) { | 555 int SSLClientSocketWin::Connect(const CompletionCallback& callback) { |
| 566 DCHECK(transport_.get()); | 556 DCHECK(transport_.get()); |
| 567 DCHECK(next_state_ == STATE_NONE); | 557 DCHECK(next_state_ == STATE_NONE); |
| 568 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 558 DCHECK(user_connect_callback_.is_null()); |
| 569 | 559 |
| 570 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 560 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 571 | 561 |
| 572 int rv = InitializeSSLContext(); | |
| 573 if (rv != OK) { | |
| 574 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
| 575 return rv; | |
| 576 } | |
| 577 | |
| 578 writing_first_token_ = true; | |
| 579 next_state_ = STATE_HANDSHAKE_WRITE; | |
| 580 rv = DoLoop(OK); | |
| 581 if (rv == ERR_IO_PENDING) { | |
| 582 old_user_connect_callback_ = callback; | |
| 583 } else { | |
| 584 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
| 585 } | |
| 586 return rv; | |
| 587 } | |
| 588 int SSLClientSocketWin::Connect(const CompletionCallback& callback) { | |
| 589 DCHECK(transport_.get()); | |
| 590 DCHECK(next_state_ == STATE_NONE); | |
| 591 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | |
| 592 | |
| 593 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
| 594 | |
| 595 int rv = InitializeSSLContext(); | 562 int rv = InitializeSSLContext(); |
| 596 if (rv != OK) { | 563 if (rv != OK) { |
| 597 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 564 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 598 return rv; | 565 return rv; |
| 599 } | 566 } |
| 600 | 567 |
| 601 writing_first_token_ = true; | 568 writing_first_token_ = true; |
| 602 next_state_ = STATE_HANDSHAKE_WRITE; | 569 next_state_ = STATE_HANDSHAKE_WRITE; |
| 603 rv = DoLoop(OK); | 570 rv = DoLoop(OK); |
| 604 if (rv == ERR_IO_PENDING) { | 571 if (rv == ERR_IO_PENDING) { |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 777 | 744 |
| 778 base::TimeDelta SSLClientSocketWin::GetConnectTimeMicros() const { | 745 base::TimeDelta SSLClientSocketWin::GetConnectTimeMicros() const { |
| 779 if (transport_.get() && transport_->socket()) { | 746 if (transport_.get() && transport_->socket()) { |
| 780 return transport_->socket()->GetConnectTimeMicros(); | 747 return transport_->socket()->GetConnectTimeMicros(); |
| 781 } | 748 } |
| 782 NOTREACHED(); | 749 NOTREACHED(); |
| 783 return base::TimeDelta::FromMicroseconds(-1); | 750 return base::TimeDelta::FromMicroseconds(-1); |
| 784 } | 751 } |
| 785 | 752 |
| 786 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len, | 753 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len, |
| 787 OldCompletionCallback* callback) { | 754 const CompletionCallback& callback) { |
| 788 DCHECK(completed_handshake()); | 755 DCHECK(completed_handshake()); |
| 789 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | 756 DCHECK(user_read_callback_.is_null()); |
| 790 | 757 |
| 791 // If we have surplus decrypted plaintext, satisfy the Read with it without | 758 // If we have surplus decrypted plaintext, satisfy the Read with it without |
| 792 // reading more ciphertext from the transport socket. | 759 // reading more ciphertext from the transport socket. |
| 793 if (bytes_decrypted_ != 0) { | |
| 794 int len = std::min(buf_len, bytes_decrypted_); | |
| 795 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, | |
| 796 decrypted_ptr_); | |
| 797 memcpy(buf->data(), decrypted_ptr_, len); | |
| 798 decrypted_ptr_ += len; | |
| 799 bytes_decrypted_ -= len; | |
| 800 if (bytes_decrypted_ == 0) { | |
| 801 decrypted_ptr_ = NULL; | |
| 802 if (bytes_received_ != 0) { | |
| 803 memmove(recv_buffer_.get(), received_ptr_, bytes_received_); | |
| 804 received_ptr_ = recv_buffer_.get(); | |
| 805 } | |
| 806 } | |
| 807 return len; | |
| 808 } | |
| 809 | |
| 810 DCHECK(!user_read_buf_); | |
| 811 // http://crbug.com/16371: We're seeing |buf->data()| return NULL. See if the | |
| 812 // user is passing in an IOBuffer with a NULL |data_|. | |
| 813 CHECK(buf); | |
| 814 CHECK(buf->data()); | |
| 815 user_read_buf_ = buf; | |
| 816 user_read_buf_len_ = buf_len; | |
| 817 | |
| 818 int rv = DoPayloadRead(); | |
| 819 if (rv == ERR_IO_PENDING) { | |
| 820 old_user_read_callback_ = callback; | |
| 821 } else { | |
| 822 user_read_buf_ = NULL; | |
| 823 user_read_buf_len_ = 0; | |
| 824 } | |
| 825 return rv; | |
| 826 } | |
| 827 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len, | |
| 828 const CompletionCallback& callback) { | |
| 829 DCHECK(completed_handshake()); | |
| 830 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | |
| 831 | |
| 832 // If we have surplus decrypted plaintext, satisfy the Read with it without | |
| 833 // reading more ciphertext from the transport socket. | |
| 834 if (bytes_decrypted_ != 0) { | 760 if (bytes_decrypted_ != 0) { |
| 835 int len = std::min(buf_len, bytes_decrypted_); | 761 int len = std::min(buf_len, bytes_decrypted_); |
| 836 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, | 762 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, |
| 837 decrypted_ptr_); | 763 decrypted_ptr_); |
| 838 memcpy(buf->data(), decrypted_ptr_, len); | 764 memcpy(buf->data(), decrypted_ptr_, len); |
| 839 decrypted_ptr_ += len; | 765 decrypted_ptr_ += len; |
| 840 bytes_decrypted_ -= len; | 766 bytes_decrypted_ -= len; |
| 841 if (bytes_decrypted_ == 0) { | 767 if (bytes_decrypted_ == 0) { |
| 842 decrypted_ptr_ = NULL; | 768 decrypted_ptr_ = NULL; |
| 843 if (bytes_received_ != 0) { | 769 if (bytes_received_ != 0) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 860 if (rv == ERR_IO_PENDING) { | 786 if (rv == ERR_IO_PENDING) { |
| 861 user_read_callback_ = callback; | 787 user_read_callback_ = callback; |
| 862 } else { | 788 } else { |
| 863 user_read_buf_ = NULL; | 789 user_read_buf_ = NULL; |
| 864 user_read_buf_len_ = 0; | 790 user_read_buf_len_ = 0; |
| 865 } | 791 } |
| 866 return rv; | 792 return rv; |
| 867 } | 793 } |
| 868 | 794 |
| 869 int SSLClientSocketWin::Write(IOBuffer* buf, int buf_len, | 795 int SSLClientSocketWin::Write(IOBuffer* buf, int buf_len, |
| 870 OldCompletionCallback* callback) { | 796 const CompletionCallback& callback) { |
| 871 DCHECK(completed_handshake()); | 797 DCHECK(completed_handshake()); |
| 872 DCHECK(!user_write_callback_); | 798 DCHECK(user_write_callback_.is_null()); |
| 873 | 799 |
| 874 DCHECK(!user_write_buf_); | 800 DCHECK(!user_write_buf_); |
| 875 user_write_buf_ = buf; | 801 user_write_buf_ = buf; |
| 876 user_write_buf_len_ = buf_len; | 802 user_write_buf_len_ = buf_len; |
| 877 | 803 |
| 878 int rv = DoPayloadEncrypt(); | 804 int rv = DoPayloadEncrypt(); |
| 879 if (rv != OK) | 805 if (rv != OK) |
| 880 return rv; | 806 return rv; |
| 881 | 807 |
| 882 rv = DoPayloadWrite(); | 808 rv = DoPayloadWrite(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 899 | 825 |
| 900 void SSLClientSocketWin::OnHandshakeIOComplete(int result) { | 826 void SSLClientSocketWin::OnHandshakeIOComplete(int result) { |
| 901 int rv = DoLoop(result); | 827 int rv = DoLoop(result); |
| 902 | 828 |
| 903 // The SSL handshake has some round trips. We need to notify the caller of | 829 // The SSL handshake has some round trips. We need to notify the caller of |
| 904 // success or any error, other than waiting for IO. | 830 // success or any error, other than waiting for IO. |
| 905 if (rv != ERR_IO_PENDING) { | 831 if (rv != ERR_IO_PENDING) { |
| 906 // If there is no connect callback available to call, we are renegotiating | 832 // If there is no connect callback available to call, we are renegotiating |
| 907 // (which occurs because we are in the middle of a Read when the | 833 // (which occurs because we are in the middle of a Read when the |
| 908 // renegotiation process starts). So we complete the Read here. | 834 // renegotiation process starts). So we complete the Read here. |
| 909 if (!old_user_connect_callback_ && user_connect_callback_.is_null()) { | 835 if (user_connect_callback_.is_null()) { |
| 910 if (old_user_read_callback_) { | 836 CompletionCallback c = user_read_callback_; |
| 911 OldCompletionCallback* c = old_user_read_callback_; | 837 user_read_callback_.Reset(); |
| 912 old_user_read_callback_ = NULL; | 838 user_read_buf_ = NULL; |
| 913 user_read_buf_ = NULL; | 839 user_read_buf_len_ = 0; |
| 914 user_read_buf_len_ = 0; | 840 c.Run(rv); |
| 915 c->Run(rv); | |
| 916 } else { | |
| 917 CompletionCallback c = user_read_callback_; | |
| 918 user_read_callback_.Reset(); | |
| 919 user_read_buf_ = NULL; | |
| 920 user_read_buf_len_ = 0; | |
| 921 c.Run(rv); | |
| 922 } | |
| 923 return; | 841 return; |
| 924 } | 842 } |
| 925 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 843 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 926 if (old_user_connect_callback_) { | 844 CompletionCallback c = user_connect_callback_; |
| 927 OldCompletionCallback* c = old_user_connect_callback_; | 845 user_connect_callback_.Reset(); |
| 928 old_user_connect_callback_ = NULL; | 846 c.Run(rv); |
| 929 c->Run(rv); | |
| 930 } else { | |
| 931 CompletionCallback c = user_connect_callback_; | |
| 932 user_connect_callback_.Reset(); | |
| 933 c.Run(rv); | |
| 934 } | |
| 935 } | 847 } |
| 936 } | 848 } |
| 937 | 849 |
| 938 void SSLClientSocketWin::OnReadComplete(int result) { | 850 void SSLClientSocketWin::OnReadComplete(int result) { |
| 939 DCHECK(completed_handshake()); | 851 DCHECK(completed_handshake()); |
| 940 | 852 |
| 941 result = DoPayloadReadComplete(result); | 853 result = DoPayloadReadComplete(result); |
| 942 if (result > 0) | 854 if (result > 0) |
| 943 result = DoPayloadDecrypt(); | 855 result = DoPayloadDecrypt(); |
| 944 if (result != ERR_IO_PENDING) { | 856 if (result != ERR_IO_PENDING) { |
| 945 DCHECK(old_user_read_callback_ || !user_read_callback_.is_null()); | 857 DCHECK(!user_read_callback_.is_null()); |
| 946 if (old_user_read_callback_) { | 858 CompletionCallback c = user_read_callback_; |
| 947 OldCompletionCallback* c = old_user_read_callback_; | 859 user_read_callback_.Reset(); |
| 948 old_user_read_callback_ = NULL; | 860 user_read_buf_ = NULL; |
| 949 user_read_buf_ = NULL; | 861 user_read_buf_len_ = 0; |
| 950 user_read_buf_len_ = 0; | 862 c.Run(result); |
| 951 c->Run(result); | |
| 952 } else { | |
| 953 CompletionCallback c = user_read_callback_; | |
| 954 user_read_callback_.Reset(); | |
| 955 user_read_buf_ = NULL; | |
| 956 user_read_buf_len_ = 0; | |
| 957 c.Run(result); | |
| 958 } | |
| 959 } | 863 } |
| 960 } | 864 } |
| 961 | 865 |
| 962 void SSLClientSocketWin::OnWriteComplete(int result) { | 866 void SSLClientSocketWin::OnWriteComplete(int result) { |
| 963 DCHECK(completed_handshake()); | 867 DCHECK(completed_handshake()); |
| 964 | 868 |
| 965 int rv = DoPayloadWriteComplete(result); | 869 int rv = DoPayloadWriteComplete(result); |
| 966 if (rv != ERR_IO_PENDING) { | 870 if (rv != ERR_IO_PENDING) { |
| 967 DCHECK(user_write_callback_); | 871 DCHECK(!user_write_callback_.is_null()); |
| 968 OldCompletionCallback* c = user_write_callback_; | 872 CompletionCallback c = user_write_callback_; |
| 969 user_write_callback_ = NULL; | 873 user_write_callback_.Reset(); |
| 970 user_write_buf_ = NULL; | 874 user_write_buf_ = NULL; |
| 971 user_write_buf_len_ = 0; | 875 user_write_buf_len_ = 0; |
| 972 c->Run(rv); | 876 c.Run(rv); |
| 973 } | 877 } |
| 974 } | 878 } |
| 975 | 879 |
| 976 | 880 |
| 977 int SSLClientSocketWin::DoLoop(int last_io_result) { | 881 int SSLClientSocketWin::DoLoop(int last_io_result) { |
| 978 DCHECK(next_state_ != STATE_NONE); | 882 DCHECK(next_state_ != STATE_NONE); |
| 979 int rv = last_io_result; | 883 int rv = last_io_result; |
| 980 do { | 884 do { |
| 981 State state = next_state_; | 885 State state = next_state_; |
| 982 next_state_ = STATE_NONE; | 886 next_state_ = STATE_NONE; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 int buf_len = kRecvBufferSize - bytes_received_; | 928 int buf_len = kRecvBufferSize - bytes_received_; |
| 1025 | 929 |
| 1026 if (buf_len <= 0) { | 930 if (buf_len <= 0) { |
| 1027 LOG(DFATAL) << "Receive buffer is too small!"; | 931 LOG(DFATAL) << "Receive buffer is too small!"; |
| 1028 return ERR_UNEXPECTED; | 932 return ERR_UNEXPECTED; |
| 1029 } | 933 } |
| 1030 | 934 |
| 1031 DCHECK(!transport_read_buf_); | 935 DCHECK(!transport_read_buf_); |
| 1032 transport_read_buf_ = new IOBuffer(buf_len); | 936 transport_read_buf_ = new IOBuffer(buf_len); |
| 1033 | 937 |
| 1034 return transport_->socket()->Read(transport_read_buf_, buf_len, | 938 return transport_->socket()->Read( |
| 1035 &handshake_io_callback_); | 939 transport_read_buf_, buf_len, |
| 940 base::Bind(&SSLClientSocketWin::OnHandshakeIOComplete, |
| 941 base::Unretained(this))); |
| 1036 } | 942 } |
| 1037 | 943 |
| 1038 int SSLClientSocketWin::DoHandshakeReadComplete(int result) { | 944 int SSLClientSocketWin::DoHandshakeReadComplete(int result) { |
| 1039 if (result < 0) { | 945 if (result < 0) { |
| 1040 transport_read_buf_ = NULL; | 946 transport_read_buf_ = NULL; |
| 1041 return result; | 947 return result; |
| 1042 } | 948 } |
| 1043 | 949 |
| 1044 if (transport_read_buf_) { | 950 if (transport_read_buf_) { |
| 1045 // A transition to STATE_HANDSHAKE_READ_COMPLETE is set in multiple places, | 951 // A transition to STATE_HANDSHAKE_READ_COMPLETE is set in multiple places, |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1202 // We should have something to send. | 1108 // We should have something to send. |
| 1203 DCHECK(send_buffer_.pvBuffer); | 1109 DCHECK(send_buffer_.pvBuffer); |
| 1204 DCHECK(send_buffer_.cbBuffer > 0); | 1110 DCHECK(send_buffer_.cbBuffer > 0); |
| 1205 DCHECK(!transport_write_buf_); | 1111 DCHECK(!transport_write_buf_); |
| 1206 | 1112 |
| 1207 const char* buf = static_cast<char*>(send_buffer_.pvBuffer) + bytes_sent_; | 1113 const char* buf = static_cast<char*>(send_buffer_.pvBuffer) + bytes_sent_; |
| 1208 int buf_len = send_buffer_.cbBuffer - bytes_sent_; | 1114 int buf_len = send_buffer_.cbBuffer - bytes_sent_; |
| 1209 transport_write_buf_ = new IOBuffer(buf_len); | 1115 transport_write_buf_ = new IOBuffer(buf_len); |
| 1210 memcpy(transport_write_buf_->data(), buf, buf_len); | 1116 memcpy(transport_write_buf_->data(), buf, buf_len); |
| 1211 | 1117 |
| 1212 return transport_->socket()->Write(transport_write_buf_, buf_len, | 1118 return transport_->socket()->Write( |
| 1213 &handshake_io_callback_); | 1119 transport_write_buf_, buf_len, |
| 1120 base::Bind(&SSLClientSocketWin::OnHandshakeIOComplete, |
| 1121 base::Unretained(this))); |
| 1214 } | 1122 } |
| 1215 | 1123 |
| 1216 int SSLClientSocketWin::DoHandshakeWriteComplete(int result) { | 1124 int SSLClientSocketWin::DoHandshakeWriteComplete(int result) { |
| 1217 DCHECK(transport_write_buf_); | 1125 DCHECK(transport_write_buf_); |
| 1218 transport_write_buf_ = NULL; | 1126 transport_write_buf_ = NULL; |
| 1219 if (result < 0) | 1127 if (result < 0) |
| 1220 return result; | 1128 return result; |
| 1221 | 1129 |
| 1222 DCHECK(result != 0); | 1130 DCHECK(result != 0); |
| 1223 | 1131 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1301 return ERR_FAILED; | 1209 return ERR_FAILED; |
| 1302 } | 1210 } |
| 1303 | 1211 |
| 1304 int rv; | 1212 int rv; |
| 1305 // If bytes_received_, we have some data from a previous read still ready | 1213 // If bytes_received_, we have some data from a previous read still ready |
| 1306 // for decoding. Otherwise, we need to issue a real read. | 1214 // for decoding. Otherwise, we need to issue a real read. |
| 1307 if (!bytes_received_ || need_more_data_) { | 1215 if (!bytes_received_ || need_more_data_) { |
| 1308 DCHECK(!transport_read_buf_); | 1216 DCHECK(!transport_read_buf_); |
| 1309 transport_read_buf_ = new IOBuffer(buf_len); | 1217 transport_read_buf_ = new IOBuffer(buf_len); |
| 1310 | 1218 |
| 1311 rv = transport_->socket()->Read(transport_read_buf_, buf_len, | 1219 rv = transport_->socket()->Read( |
| 1312 &read_callback_); | 1220 transport_read_buf_, buf_len, |
| 1221 base::Bind(&SSLClientSocketWin::OnReadComplete, |
| 1222 base::Unretained(this))); |
| 1313 if (rv != ERR_IO_PENDING) | 1223 if (rv != ERR_IO_PENDING) |
| 1314 rv = DoPayloadReadComplete(rv); | 1224 rv = DoPayloadReadComplete(rv); |
| 1315 if (rv <= 0) | 1225 if (rv <= 0) |
| 1316 return rv; | 1226 return rv; |
| 1317 } | 1227 } |
| 1318 | 1228 |
| 1319 // Decode what we've read. If there is not enough data to decode yet, | 1229 // Decode what we've read. If there is not enough data to decode yet, |
| 1320 // this may return ERR_IO_PENDING still. | 1230 // this may return ERR_IO_PENDING still. |
| 1321 return DoPayloadDecrypt(); | 1231 return DoPayloadDecrypt(); |
| 1322 } | 1232 } |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1544 // We should have something to send. | 1454 // We should have something to send. |
| 1545 DCHECK(payload_send_buffer_.get()); | 1455 DCHECK(payload_send_buffer_.get()); |
| 1546 DCHECK(payload_send_buffer_len_ > 0); | 1456 DCHECK(payload_send_buffer_len_ > 0); |
| 1547 DCHECK(!transport_write_buf_); | 1457 DCHECK(!transport_write_buf_); |
| 1548 | 1458 |
| 1549 const char* buf = payload_send_buffer_.get() + bytes_sent_; | 1459 const char* buf = payload_send_buffer_.get() + bytes_sent_; |
| 1550 int buf_len = payload_send_buffer_len_ - bytes_sent_; | 1460 int buf_len = payload_send_buffer_len_ - bytes_sent_; |
| 1551 transport_write_buf_ = new IOBuffer(buf_len); | 1461 transport_write_buf_ = new IOBuffer(buf_len); |
| 1552 memcpy(transport_write_buf_->data(), buf, buf_len); | 1462 memcpy(transport_write_buf_->data(), buf, buf_len); |
| 1553 | 1463 |
| 1554 int rv = transport_->socket()->Write(transport_write_buf_, buf_len, | 1464 int rv = transport_->socket()->Write( |
| 1555 &write_callback_); | 1465 transport_write_buf_, buf_len, |
| 1466 base::Bind(&SSLClientSocketWin::OnWriteComplete, |
| 1467 base::Unretained(this))); |
| 1556 if (rv != ERR_IO_PENDING) | 1468 if (rv != ERR_IO_PENDING) |
| 1557 rv = DoPayloadWriteComplete(rv); | 1469 rv = DoPayloadWriteComplete(rv); |
| 1558 return rv; | 1470 return rv; |
| 1559 } | 1471 } |
| 1560 | 1472 |
| 1561 int SSLClientSocketWin::DoPayloadWriteComplete(int result) { | 1473 int SSLClientSocketWin::DoPayloadWriteComplete(int result) { |
| 1562 DCHECK(transport_write_buf_); | 1474 DCHECK(transport_write_buf_); |
| 1563 transport_write_buf_ = NULL; | 1475 transport_write_buf_ = NULL; |
| 1564 if (result < 0) | 1476 if (result < 0) |
| 1565 return result; | 1477 return result; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1628 server_cert_ = new_server_cert; | 1540 server_cert_ = new_server_cert; |
| 1629 next_state_ = STATE_VERIFY_CERT; | 1541 next_state_ = STATE_VERIFY_CERT; |
| 1630 } | 1542 } |
| 1631 CertFreeCertificateContext(server_cert_handle); | 1543 CertFreeCertificateContext(server_cert_handle); |
| 1632 return OK; | 1544 return OK; |
| 1633 } | 1545 } |
| 1634 | 1546 |
| 1635 // Called when a renegotiation is completed. |result| is the verification | 1547 // Called when a renegotiation is completed. |result| is the verification |
| 1636 // result of the server certificate received during renegotiation. | 1548 // result of the server certificate received during renegotiation. |
| 1637 void SSLClientSocketWin::DidCompleteRenegotiation() { | 1549 void SSLClientSocketWin::DidCompleteRenegotiation() { |
| 1638 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 1550 DCHECK(user_connect_callback_.is_null()); |
| 1639 DCHECK(old_user_read_callback_ || !user_read_callback_.is_null()); | 1551 DCHECK(!user_read_callback_.is_null()); |
| 1640 renegotiating_ = false; | 1552 renegotiating_ = false; |
| 1641 next_state_ = STATE_COMPLETED_RENEGOTIATION; | 1553 next_state_ = STATE_COMPLETED_RENEGOTIATION; |
| 1642 } | 1554 } |
| 1643 | 1555 |
| 1644 void SSLClientSocketWin::LogConnectionTypeMetrics() const { | 1556 void SSLClientSocketWin::LogConnectionTypeMetrics() const { |
| 1645 UpdateConnectionTypeHistograms(CONNECTION_SSL); | 1557 UpdateConnectionTypeHistograms(CONNECTION_SSL); |
| 1646 if (server_cert_verify_result_.has_md5) | 1558 if (server_cert_verify_result_.has_md5) |
| 1647 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5); | 1559 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5); |
| 1648 if (server_cert_verify_result_.has_md2) | 1560 if (server_cert_verify_result_.has_md2) |
| 1649 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2); | 1561 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2); |
| 1650 if (server_cert_verify_result_.has_md4) | 1562 if (server_cert_verify_result_.has_md4) |
| 1651 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD4); | 1563 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD4); |
| 1652 if (server_cert_verify_result_.has_md5_ca) | 1564 if (server_cert_verify_result_.has_md5_ca) |
| 1653 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5_CA); | 1565 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5_CA); |
| 1654 if (server_cert_verify_result_.has_md2_ca) | 1566 if (server_cert_verify_result_.has_md2_ca) |
| 1655 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2_CA); | 1567 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2_CA); |
| 1656 } | 1568 } |
| 1657 | 1569 |
| 1658 void SSLClientSocketWin::FreeSendBuffer() { | 1570 void SSLClientSocketWin::FreeSendBuffer() { |
| 1659 SECURITY_STATUS status = FreeContextBuffer(send_buffer_.pvBuffer); | 1571 SECURITY_STATUS status = FreeContextBuffer(send_buffer_.pvBuffer); |
| 1660 DCHECK(status == SEC_E_OK); | 1572 DCHECK(status == SEC_E_OK); |
| 1661 memset(&send_buffer_, 0, sizeof(send_buffer_)); | 1573 memset(&send_buffer_, 0, sizeof(send_buffer_)); |
| 1662 } | 1574 } |
| 1663 | 1575 |
| 1664 } // namespace net | 1576 } // namespace net |
| OLD | NEW |