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 |