| 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 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 : ALLOW_THIS_IN_INITIALIZER_LIST(buffer_send_callback_( |
| 388 this, &SSLClientSocketOpenSSL::BufferSendComplete)), | 388 this, &SSLClientSocketOpenSSL::BufferSendComplete)), |
| 389 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( | 389 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( |
| 390 this, &SSLClientSocketOpenSSL::BufferRecvComplete)), | 390 this, &SSLClientSocketOpenSSL::BufferRecvComplete)), |
| 391 transport_send_busy_(false), | 391 transport_send_busy_(false), |
| 392 transport_recv_busy_(false), | 392 transport_recv_busy_(false), |
| 393 user_connect_callback_(NULL), | 393 old_user_connect_callback_(NULL), |
| 394 user_read_callback_(NULL), | 394 user_read_callback_(NULL), |
| 395 user_write_callback_(NULL), | 395 user_write_callback_(NULL), |
| 396 completed_handshake_(false), | 396 completed_handshake_(false), |
| 397 client_auth_cert_needed_(false), | 397 client_auth_cert_needed_(false), |
| 398 cert_verifier_(context.cert_verifier), | 398 cert_verifier_(context.cert_verifier), |
| 399 ssl_(NULL), | 399 ssl_(NULL), |
| 400 transport_bio_(NULL), | 400 transport_bio_(NULL), |
| 401 transport_(transport_socket), | 401 transport_(transport_socket), |
| 402 host_and_port_(host_and_port), | 402 host_and_port_(host_and_port), |
| 403 ssl_config_(ssl_config), | 403 ssl_config_(ssl_config), |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, result); | 641 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, result); |
| 642 return result; | 642 return result; |
| 643 } | 643 } |
| 644 | 644 |
| 645 // Set SSL to client mode. Handshake happens in the loop below. | 645 // Set SSL to client mode. Handshake happens in the loop below. |
| 646 SSL_set_connect_state(ssl_); | 646 SSL_set_connect_state(ssl_); |
| 647 | 647 |
| 648 GotoState(STATE_HANDSHAKE); | 648 GotoState(STATE_HANDSHAKE); |
| 649 int rv = DoHandshakeLoop(net::OK); | 649 int rv = DoHandshakeLoop(net::OK); |
| 650 if (rv == ERR_IO_PENDING) { | 650 if (rv == ERR_IO_PENDING) { |
| 651 old_user_connect_callback_ = callback; |
| 652 } else { |
| 653 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
| 654 } |
| 655 |
| 656 return rv > OK ? OK : rv; |
| 657 } |
| 658 int SSLClientSocketOpenSSL::Connect(const CompletionCallback& callback) { |
| 659 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 660 |
| 661 // Set up new ssl object. |
| 662 if (!Init()) { |
| 663 int result = ERR_UNEXPECTED; |
| 664 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, result); |
| 665 return result; |
| 666 } |
| 667 |
| 668 // Set SSL to client mode. Handshake happens in the loop below. |
| 669 SSL_set_connect_state(ssl_); |
| 670 |
| 671 GotoState(STATE_HANDSHAKE); |
| 672 int rv = DoHandshakeLoop(net::OK); |
| 673 if (rv == ERR_IO_PENDING) { |
| 651 user_connect_callback_ = callback; | 674 user_connect_callback_ = callback; |
| 652 } else { | 675 } else { |
| 653 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 676 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
| 654 } | 677 } |
| 655 | 678 |
| 656 return rv > OK ? OK : rv; | 679 return rv > OK ? OK : rv; |
| 657 } | 680 } |
| 658 | 681 |
| 659 void SSLClientSocketOpenSSL::Disconnect() { | 682 void SSLClientSocketOpenSSL::Disconnect() { |
| 660 if (ssl_) { | 683 if (ssl_) { |
| 661 SSL_free(ssl_); | 684 SSL_free(ssl_); |
| 662 ssl_ = NULL; | 685 ssl_ = NULL; |
| 663 } | 686 } |
| 664 if (transport_bio_) { | 687 if (transport_bio_) { |
| 665 BIO_free_all(transport_bio_); | 688 BIO_free_all(transport_bio_); |
| 666 transport_bio_ = NULL; | 689 transport_bio_ = NULL; |
| 667 } | 690 } |
| 668 | 691 |
| 669 // Shut down anything that may call us back. | 692 // Shut down anything that may call us back. |
| 670 verifier_.reset(); | 693 verifier_.reset(); |
| 671 transport_->socket()->Disconnect(); | 694 transport_->socket()->Disconnect(); |
| 672 | 695 |
| 673 // Null all callbacks, delete all buffers. | 696 // Null all callbacks, delete all buffers. |
| 674 transport_send_busy_ = false; | 697 transport_send_busy_ = false; |
| 675 send_buffer_ = NULL; | 698 send_buffer_ = NULL; |
| 676 transport_recv_busy_ = false; | 699 transport_recv_busy_ = false; |
| 677 recv_buffer_ = NULL; | 700 recv_buffer_ = NULL; |
| 678 | 701 |
| 679 user_connect_callback_ = NULL; | 702 old_user_connect_callback_ = NULL; |
| 703 user_connect_callback_.Reset(); |
| 680 user_read_callback_ = NULL; | 704 user_read_callback_ = NULL; |
| 681 user_write_callback_ = NULL; | 705 user_write_callback_ = NULL; |
| 682 user_read_buf_ = NULL; | 706 user_read_buf_ = NULL; |
| 683 user_read_buf_len_ = 0; | 707 user_read_buf_len_ = 0; |
| 684 user_write_buf_ = NULL; | 708 user_write_buf_ = NULL; |
| 685 user_write_buf_len_ = 0; | 709 user_write_buf_len_ = 0; |
| 686 | 710 |
| 687 server_cert_verify_result_.Reset(); | 711 server_cert_verify_result_.Reset(); |
| 688 completed_handshake_ = false; | 712 completed_handshake_ = false; |
| 689 | 713 |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1010 DCHECK(recv_buffer_); | 1034 DCHECK(recv_buffer_); |
| 1011 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result); | 1035 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result); |
| 1012 // A write into a memory BIO should always succeed. | 1036 // A write into a memory BIO should always succeed. |
| 1013 CHECK_EQ(result, ret); | 1037 CHECK_EQ(result, ret); |
| 1014 } | 1038 } |
| 1015 recv_buffer_ = NULL; | 1039 recv_buffer_ = NULL; |
| 1016 transport_recv_busy_ = false; | 1040 transport_recv_busy_ = false; |
| 1017 } | 1041 } |
| 1018 | 1042 |
| 1019 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { | 1043 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { |
| 1020 OldCompletionCallback* c = user_connect_callback_; | 1044 if (old_user_connect_callback_) { |
| 1021 user_connect_callback_ = NULL; | 1045 OldCompletionCallback* c = old_user_connect_callback_; |
| 1022 c->Run(rv > OK ? OK : rv); | 1046 old_user_connect_callback_ = NULL; |
| 1047 c->Run(rv > OK ? OK : rv); |
| 1048 } else { |
| 1049 CompletionCallback c = user_connect_callback_; |
| 1050 user_connect_callback_.Reset(); |
| 1051 c.Run(rv > OK ? OK : rv); |
| 1052 } |
| 1023 } | 1053 } |
| 1024 | 1054 |
| 1025 void SSLClientSocketOpenSSL::OnHandshakeIOComplete(int result) { | 1055 void SSLClientSocketOpenSSL::OnHandshakeIOComplete(int result) { |
| 1026 int rv = DoHandshakeLoop(result); | 1056 int rv = DoHandshakeLoop(result); |
| 1027 if (rv != ERR_IO_PENDING) { | 1057 if (rv != ERR_IO_PENDING) { |
| 1028 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 1058 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
| 1029 DoConnectCallback(rv); | 1059 DoConnectCallback(rv); |
| 1030 } | 1060 } |
| 1031 } | 1061 } |
| 1032 | 1062 |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1245 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, | 1275 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, |
| 1246 user_write_buf_->data()); | 1276 user_write_buf_->data()); |
| 1247 return rv; | 1277 return rv; |
| 1248 } | 1278 } |
| 1249 | 1279 |
| 1250 int err = SSL_get_error(ssl_, rv); | 1280 int err = SSL_get_error(ssl_, rv); |
| 1251 return MapOpenSSLError(err, err_tracer); | 1281 return MapOpenSSLError(err, err_tracer); |
| 1252 } | 1282 } |
| 1253 | 1283 |
| 1254 } // namespace net | 1284 } // namespace net |
| OLD | NEW |