| 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 // 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/ssl.h> | 10 #include <openssl/ssl.h> |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 long clear_mask; | 377 long clear_mask; |
| 378 }; | 378 }; |
| 379 | 379 |
| 380 } // namespace | 380 } // namespace |
| 381 | 381 |
| 382 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( | 382 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( |
| 383 ClientSocketHandle* transport_socket, | 383 ClientSocketHandle* transport_socket, |
| 384 const HostPortPair& host_and_port, | 384 const HostPortPair& host_and_port, |
| 385 const SSLConfig& ssl_config, | 385 const SSLConfig& ssl_config, |
| 386 const SSLClientSocketContext& context) | 386 const SSLClientSocketContext& context) |
| 387 : ALLOW_THIS_IN_INITIALIZER_LIST(buffer_send_callback_( | 387 : transport_send_busy_(false), |
| 388 this, &SSLClientSocketOpenSSL::BufferSendComplete)), | |
| 389 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( | |
| 390 this, &SSLClientSocketOpenSSL::BufferRecvComplete)), | |
| 391 transport_send_busy_(false), | |
| 392 transport_recv_busy_(false), | 388 transport_recv_busy_(false), |
| 393 old_user_connect_callback_(NULL), | |
| 394 old_user_read_callback_(NULL), | |
| 395 user_write_callback_(NULL), | |
| 396 completed_handshake_(false), | 389 completed_handshake_(false), |
| 397 client_auth_cert_needed_(false), | 390 client_auth_cert_needed_(false), |
| 398 cert_verifier_(context.cert_verifier), | 391 cert_verifier_(context.cert_verifier), |
| 399 ssl_(NULL), | 392 ssl_(NULL), |
| 400 transport_bio_(NULL), | 393 transport_bio_(NULL), |
| 401 transport_(transport_socket), | 394 transport_(transport_socket), |
| 402 host_and_port_(host_and_port), | 395 host_and_port_(host_and_port), |
| 403 ssl_config_(ssl_config), | 396 ssl_config_(ssl_config), |
| 404 trying_cached_session_(false), | 397 trying_cached_session_(false), |
| 405 npn_status_(kNextProtoUnsupported), | 398 npn_status_(kNextProtoUnsupported), |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 SSLClientSocket::NextProtoStatus SSLClientSocketOpenSSL::GetNextProto( | 600 SSLClientSocket::NextProtoStatus SSLClientSocketOpenSSL::GetNextProto( |
| 608 std::string* proto, std::string* server_protos) { | 601 std::string* proto, std::string* server_protos) { |
| 609 *proto = npn_proto_; | 602 *proto = npn_proto_; |
| 610 *server_protos = server_protos_; | 603 *server_protos = server_protos_; |
| 611 return npn_status_; | 604 return npn_status_; |
| 612 } | 605 } |
| 613 | 606 |
| 614 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { | 607 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { |
| 615 // Since Run may result in Read being called, clear |user_read_callback_| | 608 // Since Run may result in Read being called, clear |user_read_callback_| |
| 616 // up front. | 609 // up front. |
| 617 if (old_user_read_callback_) { | 610 CompletionCallback c = user_read_callback_; |
| 618 OldCompletionCallback* c = old_user_read_callback_; | 611 user_read_callback_.Reset(); |
| 619 old_user_read_callback_ = NULL; | 612 user_read_buf_ = NULL; |
| 620 user_read_buf_ = NULL; | 613 user_read_buf_len_ = 0; |
| 621 user_read_buf_len_ = 0; | 614 c.Run(rv); |
| 622 c->Run(rv); | |
| 623 } else { | |
| 624 CompletionCallback c = user_read_callback_; | |
| 625 user_read_callback_.Reset(); | |
| 626 user_read_buf_ = NULL; | |
| 627 user_read_buf_len_ = 0; | |
| 628 c.Run(rv); | |
| 629 } | |
| 630 } | 615 } |
| 631 | 616 |
| 632 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { | 617 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { |
| 633 // Since Run may result in Write being called, clear |user_write_callback_| | 618 // Since Run may result in Write being called, clear |user_write_callback_| |
| 634 // up front. | 619 // up front. |
| 635 OldCompletionCallback* c = user_write_callback_; | 620 CompletionCallback c = user_write_callback_; |
| 636 user_write_callback_ = NULL; | 621 user_write_callback_.Reset(); |
| 637 user_write_buf_ = NULL; | 622 user_write_buf_ = NULL; |
| 638 user_write_buf_len_ = 0; | 623 user_write_buf_len_ = 0; |
| 639 c->Run(rv); | 624 c.Run(rv); |
| 640 } | 625 } |
| 641 | 626 |
| 642 // StreamSocket methods | 627 // StreamSocket implementation. |
| 643 | |
| 644 int SSLClientSocketOpenSSL::Connect(OldCompletionCallback* callback) { | |
| 645 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
| 646 | |
| 647 // Set up new ssl object. | |
| 648 if (!Init()) { | |
| 649 int result = ERR_UNEXPECTED; | |
| 650 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, result); | |
| 651 return result; | |
| 652 } | |
| 653 | |
| 654 // Set SSL to client mode. Handshake happens in the loop below. | |
| 655 SSL_set_connect_state(ssl_); | |
| 656 | |
| 657 GotoState(STATE_HANDSHAKE); | |
| 658 int rv = DoHandshakeLoop(net::OK); | |
| 659 if (rv == ERR_IO_PENDING) { | |
| 660 old_user_connect_callback_ = callback; | |
| 661 } else { | |
| 662 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 663 } | |
| 664 | |
| 665 return rv > OK ? OK : rv; | |
| 666 } | |
| 667 int SSLClientSocketOpenSSL::Connect(const CompletionCallback& callback) { | 628 int SSLClientSocketOpenSSL::Connect(const CompletionCallback& callback) { |
| 668 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 629 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 669 | 630 |
| 670 // Set up new ssl object. | 631 // Set up new ssl object. |
| 671 if (!Init()) { | 632 if (!Init()) { |
| 672 int result = ERR_UNEXPECTED; | 633 int result = ERR_UNEXPECTED; |
| 673 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, result); | 634 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, result); |
| 674 return result; | 635 return result; |
| 675 } | 636 } |
| 676 | 637 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 701 // Shut down anything that may call us back. | 662 // Shut down anything that may call us back. |
| 702 verifier_.reset(); | 663 verifier_.reset(); |
| 703 transport_->socket()->Disconnect(); | 664 transport_->socket()->Disconnect(); |
| 704 | 665 |
| 705 // Null all callbacks, delete all buffers. | 666 // Null all callbacks, delete all buffers. |
| 706 transport_send_busy_ = false; | 667 transport_send_busy_ = false; |
| 707 send_buffer_ = NULL; | 668 send_buffer_ = NULL; |
| 708 transport_recv_busy_ = false; | 669 transport_recv_busy_ = false; |
| 709 recv_buffer_ = NULL; | 670 recv_buffer_ = NULL; |
| 710 | 671 |
| 711 old_user_connect_callback_ = NULL; | |
| 712 user_connect_callback_.Reset(); | 672 user_connect_callback_.Reset(); |
| 713 old_user_read_callback_ = NULL; | |
| 714 user_read_callback_.Reset(); | 673 user_read_callback_.Reset(); |
| 715 user_write_callback_ = NULL; | 674 user_write_callback_.Reset(); |
| 716 user_read_buf_ = NULL; | 675 user_read_buf_ = NULL; |
| 717 user_read_buf_len_ = 0; | 676 user_read_buf_len_ = 0; |
| 718 user_write_buf_ = NULL; | 677 user_write_buf_ = NULL; |
| 719 user_write_buf_len_ = 0; | 678 user_write_buf_len_ = 0; |
| 720 | 679 |
| 721 server_cert_verify_result_.Reset(); | 680 server_cert_verify_result_.Reset(); |
| 722 completed_handshake_ = false; | 681 completed_handshake_ = false; |
| 723 | 682 |
| 724 client_certs_.clear(); | 683 client_certs_.clear(); |
| 725 client_auth_cert_needed_ = false; | 684 client_auth_cert_needed_ = false; |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 964 if (max_read > 0) { | 923 if (max_read > 0) { |
| 965 send_buffer_ = new DrainableIOBuffer(new IOBuffer(max_read), max_read); | 924 send_buffer_ = new DrainableIOBuffer(new IOBuffer(max_read), max_read); |
| 966 int read_bytes = BIO_read(transport_bio_, send_buffer_->data(), max_read); | 925 int read_bytes = BIO_read(transport_bio_, send_buffer_->data(), max_read); |
| 967 DCHECK_GT(read_bytes, 0); | 926 DCHECK_GT(read_bytes, 0); |
| 968 CHECK_EQ(static_cast<int>(max_read), read_bytes); | 927 CHECK_EQ(static_cast<int>(max_read), read_bytes); |
| 969 } | 928 } |
| 970 } | 929 } |
| 971 | 930 |
| 972 int rv = 0; | 931 int rv = 0; |
| 973 while (send_buffer_) { | 932 while (send_buffer_) { |
| 974 rv = transport_->socket()->Write(send_buffer_, | 933 rv = transport_->socket()->Write( |
| 975 send_buffer_->BytesRemaining(), | 934 send_buffer_, |
| 976 &buffer_send_callback_); | 935 send_buffer_->BytesRemaining(), |
| 936 base::Bind(&SSLClientSocketOpenSSL::BufferSendComplete, |
| 937 base::Unretained(this))); |
| 977 if (rv == ERR_IO_PENDING) { | 938 if (rv == ERR_IO_PENDING) { |
| 978 transport_send_busy_ = true; | 939 transport_send_busy_ = true; |
| 979 return rv; | 940 return rv; |
| 980 } | 941 } |
| 981 TransportWriteComplete(rv); | 942 TransportWriteComplete(rv); |
| 982 } | 943 } |
| 983 return rv; | 944 return rv; |
| 984 } | 945 } |
| 985 | 946 |
| 986 void SSLClientSocketOpenSSL::BufferSendComplete(int result) { | 947 void SSLClientSocketOpenSSL::BufferSendComplete(int result) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1010 return ERR_IO_PENDING; | 971 return ERR_IO_PENDING; |
| 1011 | 972 |
| 1012 size_t max_write = BIO_ctrl_get_write_guarantee(transport_bio_); | 973 size_t max_write = BIO_ctrl_get_write_guarantee(transport_bio_); |
| 1013 if (max_write > kMaxRecvBufferSize) | 974 if (max_write > kMaxRecvBufferSize) |
| 1014 max_write = kMaxRecvBufferSize; | 975 max_write = kMaxRecvBufferSize; |
| 1015 | 976 |
| 1016 if (!max_write) | 977 if (!max_write) |
| 1017 return ERR_IO_PENDING; | 978 return ERR_IO_PENDING; |
| 1018 | 979 |
| 1019 recv_buffer_ = new IOBuffer(max_write); | 980 recv_buffer_ = new IOBuffer(max_write); |
| 1020 int rv = transport_->socket()->Read(recv_buffer_, max_write, | 981 int rv = transport_->socket()->Read( |
| 1021 &buffer_recv_callback_); | 982 recv_buffer_, max_write, |
| 983 base::Bind(&SSLClientSocketOpenSSL::BufferRecvComplete, |
| 984 base::Unretained(this))); |
| 1022 if (rv == ERR_IO_PENDING) { | 985 if (rv == ERR_IO_PENDING) { |
| 1023 transport_recv_busy_ = true; | 986 transport_recv_busy_ = true; |
| 1024 } else { | 987 } else { |
| 1025 TransportReadComplete(rv); | 988 TransportReadComplete(rv); |
| 1026 } | 989 } |
| 1027 return rv; | 990 return rv; |
| 1028 } | 991 } |
| 1029 | 992 |
| 1030 void SSLClientSocketOpenSSL::BufferRecvComplete(int result) { | 993 void SSLClientSocketOpenSSL::BufferRecvComplete(int result) { |
| 1031 TransportReadComplete(result); | 994 TransportReadComplete(result); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1045 DCHECK(recv_buffer_); | 1008 DCHECK(recv_buffer_); |
| 1046 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result); | 1009 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result); |
| 1047 // A write into a memory BIO should always succeed. | 1010 // A write into a memory BIO should always succeed. |
| 1048 CHECK_EQ(result, ret); | 1011 CHECK_EQ(result, ret); |
| 1049 } | 1012 } |
| 1050 recv_buffer_ = NULL; | 1013 recv_buffer_ = NULL; |
| 1051 transport_recv_busy_ = false; | 1014 transport_recv_busy_ = false; |
| 1052 } | 1015 } |
| 1053 | 1016 |
| 1054 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { | 1017 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { |
| 1055 if (old_user_connect_callback_) { | 1018 if (!user_connect_callback_.is_null()) { |
| 1056 OldCompletionCallback* c = old_user_connect_callback_; | |
| 1057 old_user_connect_callback_ = NULL; | |
| 1058 c->Run(rv > OK ? OK : rv); | |
| 1059 } else { | |
| 1060 CompletionCallback c = user_connect_callback_; | 1019 CompletionCallback c = user_connect_callback_; |
| 1061 user_connect_callback_.Reset(); | 1020 user_connect_callback_.Reset(); |
| 1062 c.Run(rv > OK ? OK : rv); | 1021 c.Run(rv > OK ? OK : rv); |
| 1063 } | 1022 } |
| 1064 } | 1023 } |
| 1065 | 1024 |
| 1066 void SSLClientSocketOpenSSL::OnHandshakeIOComplete(int result) { | 1025 void SSLClientSocketOpenSSL::OnHandshakeIOComplete(int result) { |
| 1067 int rv = DoHandshakeLoop(result); | 1026 int rv = DoHandshakeLoop(result); |
| 1068 if (rv != ERR_IO_PENDING) { | 1027 if (rv != ERR_IO_PENDING) { |
| 1069 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 1028 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1183 return transport_->socket()->GetConnectTimeMicros(); | 1142 return transport_->socket()->GetConnectTimeMicros(); |
| 1184 | 1143 |
| 1185 NOTREACHED(); | 1144 NOTREACHED(); |
| 1186 return base::TimeDelta::FromMicroseconds(-1); | 1145 return base::TimeDelta::FromMicroseconds(-1); |
| 1187 } | 1146 } |
| 1188 | 1147 |
| 1189 // Socket methods | 1148 // Socket methods |
| 1190 | 1149 |
| 1191 int SSLClientSocketOpenSSL::Read(IOBuffer* buf, | 1150 int SSLClientSocketOpenSSL::Read(IOBuffer* buf, |
| 1192 int buf_len, | 1151 int buf_len, |
| 1193 OldCompletionCallback* callback) { | |
| 1194 user_read_buf_ = buf; | |
| 1195 user_read_buf_len_ = buf_len; | |
| 1196 | |
| 1197 int rv = DoReadLoop(OK); | |
| 1198 | |
| 1199 if (rv == ERR_IO_PENDING) { | |
| 1200 old_user_read_callback_ = callback; | |
| 1201 } else { | |
| 1202 user_read_buf_ = NULL; | |
| 1203 user_read_buf_len_ = 0; | |
| 1204 } | |
| 1205 | |
| 1206 return rv; | |
| 1207 } | |
| 1208 int SSLClientSocketOpenSSL::Read(IOBuffer* buf, | |
| 1209 int buf_len, | |
| 1210 const CompletionCallback& callback) { | 1152 const CompletionCallback& callback) { |
| 1211 user_read_buf_ = buf; | 1153 user_read_buf_ = buf; |
| 1212 user_read_buf_len_ = buf_len; | 1154 user_read_buf_len_ = buf_len; |
| 1213 | 1155 |
| 1214 int rv = DoReadLoop(OK); | 1156 int rv = DoReadLoop(OK); |
| 1215 | 1157 |
| 1216 if (rv == ERR_IO_PENDING) { | 1158 if (rv == ERR_IO_PENDING) { |
| 1217 user_read_callback_ = callback; | 1159 user_read_callback_ = callback; |
| 1218 } else { | 1160 } else { |
| 1219 user_read_buf_ = NULL; | 1161 user_read_buf_ = NULL; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1232 do { | 1174 do { |
| 1233 rv = DoPayloadRead(); | 1175 rv = DoPayloadRead(); |
| 1234 network_moved = DoTransportIO(); | 1176 network_moved = DoTransportIO(); |
| 1235 } while (rv == ERR_IO_PENDING && network_moved); | 1177 } while (rv == ERR_IO_PENDING && network_moved); |
| 1236 | 1178 |
| 1237 return rv; | 1179 return rv; |
| 1238 } | 1180 } |
| 1239 | 1181 |
| 1240 int SSLClientSocketOpenSSL::Write(IOBuffer* buf, | 1182 int SSLClientSocketOpenSSL::Write(IOBuffer* buf, |
| 1241 int buf_len, | 1183 int buf_len, |
| 1242 OldCompletionCallback* callback) { | 1184 const CompletionCallback& callback) { |
| 1243 user_write_buf_ = buf; | 1185 user_write_buf_ = buf; |
| 1244 user_write_buf_len_ = buf_len; | 1186 user_write_buf_len_ = buf_len; |
| 1245 | 1187 |
| 1246 int rv = DoWriteLoop(OK); | 1188 int rv = DoWriteLoop(OK); |
| 1247 | 1189 |
| 1248 if (rv == ERR_IO_PENDING) { | 1190 if (rv == ERR_IO_PENDING) { |
| 1249 user_write_callback_ = callback; | 1191 user_write_callback_ = callback; |
| 1250 } else { | 1192 } else { |
| 1251 user_write_buf_ = NULL; | 1193 user_write_buf_ = NULL; |
| 1252 user_write_buf_len_ = 0; | 1194 user_write_buf_len_ = 0; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1303 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, | 1245 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, |
| 1304 user_write_buf_->data()); | 1246 user_write_buf_->data()); |
| 1305 return rv; | 1247 return rv; |
| 1306 } | 1248 } |
| 1307 | 1249 |
| 1308 int err = SSL_get_error(ssl_, rv); | 1250 int err = SSL_get_error(ssl_, rv); |
| 1309 return MapOpenSSLError(err, err_tracer); | 1251 return MapOpenSSLError(err, err_tracer); |
| 1310 } | 1252 } |
| 1311 | 1253 |
| 1312 } // namespace net | 1254 } // namespace net |
| OLD | NEW |