| 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 // 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 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 context->session_cache()->Flush(); | 409 context->session_cache()->Flush(); |
| 410 } | 410 } |
| 411 | 411 |
| 412 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( | 412 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( |
| 413 ClientSocketHandle* transport_socket, | 413 ClientSocketHandle* transport_socket, |
| 414 const HostPortPair& host_and_port, | 414 const HostPortPair& host_and_port, |
| 415 const SSLConfig& ssl_config, | 415 const SSLConfig& ssl_config, |
| 416 const SSLClientSocketContext& context) | 416 const SSLClientSocketContext& context) |
| 417 : transport_send_busy_(false), | 417 : transport_send_busy_(false), |
| 418 transport_recv_busy_(false), | 418 transport_recv_busy_(false), |
| 419 transport_eof_(false), |
| 419 completed_handshake_(false), | 420 completed_handshake_(false), |
| 420 client_auth_cert_needed_(false), | 421 client_auth_cert_needed_(false), |
| 421 cert_verifier_(context.cert_verifier), | 422 cert_verifier_(context.cert_verifier), |
| 422 ssl_(NULL), | 423 ssl_(NULL), |
| 423 transport_bio_(NULL), | 424 transport_bio_(NULL), |
| 424 transport_(transport_socket), | 425 transport_(transport_socket), |
| 425 host_and_port_(host_and_port), | 426 host_and_port_(host_and_port), |
| 426 ssl_config_(ssl_config), | 427 ssl_config_(ssl_config), |
| 427 ssl_session_cache_shard_(context.ssl_session_cache_shard), | 428 ssl_session_cache_shard_(context.ssl_session_cache_shard), |
| 428 trying_cached_session_(false), | 429 trying_cached_session_(false), |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 } | 712 } |
| 712 | 713 |
| 713 // Shut down anything that may call us back. | 714 // Shut down anything that may call us back. |
| 714 verifier_.reset(); | 715 verifier_.reset(); |
| 715 transport_->socket()->Disconnect(); | 716 transport_->socket()->Disconnect(); |
| 716 | 717 |
| 717 // Null all callbacks, delete all buffers. | 718 // Null all callbacks, delete all buffers. |
| 718 transport_send_busy_ = false; | 719 transport_send_busy_ = false; |
| 719 send_buffer_ = NULL; | 720 send_buffer_ = NULL; |
| 720 transport_recv_busy_ = false; | 721 transport_recv_busy_ = false; |
| 722 transport_eof_ = false; |
| 721 recv_buffer_ = NULL; | 723 recv_buffer_ = NULL; |
| 722 | 724 |
| 723 user_connect_callback_.Reset(); | 725 user_connect_callback_.Reset(); |
| 724 user_read_callback_.Reset(); | 726 user_read_callback_.Reset(); |
| 725 user_write_callback_.Reset(); | 727 user_write_callback_.Reset(); |
| 726 user_read_buf_ = NULL; | 728 user_read_buf_ = NULL; |
| 727 user_read_buf_len_ = 0; | 729 user_read_buf_len_ = 0; |
| 728 user_write_buf_ = NULL; | 730 user_write_buf_ = NULL; |
| 729 user_write_buf_len_ = 0; | 731 user_write_buf_len_ = 0; |
| 730 | 732 |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 if (chain) { | 948 if (chain) { |
| 947 for (int i = 0; i < sk_X509_num(chain); ++i) | 949 for (int i = 0; i < sk_X509_num(chain); ++i) |
| 948 intermediates.push_back(sk_X509_value(chain, i)); | 950 intermediates.push_back(sk_X509_value(chain, i)); |
| 949 } | 951 } |
| 950 server_cert_ = X509Certificate::CreateFromHandle(cert.get(), intermediates); | 952 server_cert_ = X509Certificate::CreateFromHandle(cert.get(), intermediates); |
| 951 DCHECK(server_cert_); | 953 DCHECK(server_cert_); |
| 952 | 954 |
| 953 return server_cert_; | 955 return server_cert_; |
| 954 } | 956 } |
| 955 | 957 |
| 958 // TODO(wtc): port the ssl_client_socket_nss.cc change in |
| 959 // http://codereview.chromium.org/7399025 to this file. |
| 956 bool SSLClientSocketOpenSSL::DoTransportIO() { | 960 bool SSLClientSocketOpenSSL::DoTransportIO() { |
| 957 bool network_moved = false; | 961 bool network_moved = false; |
| 958 int nsent = BufferSend(); | 962 int nsent = BufferSend(); |
| 963 bool reached_eof = transport_eof_; |
| 959 int nreceived = BufferRecv(); | 964 int nreceived = BufferRecv(); |
| 960 network_moved = (nsent > 0 || nreceived >= 0); | 965 if (nsent > 0 || nreceived > 0 || (!reached_eof && nreceived == 0)) |
| 966 network_moved = true; |
| 961 return network_moved; | 967 return network_moved; |
| 962 } | 968 } |
| 963 | 969 |
| 964 int SSLClientSocketOpenSSL::BufferSend(void) { | 970 int SSLClientSocketOpenSSL::BufferSend(void) { |
| 965 if (transport_send_busy_) | 971 if (transport_send_busy_) |
| 966 return ERR_IO_PENDING; | 972 return ERR_IO_PENDING; |
| 967 | 973 |
| 968 if (!send_buffer_) { | 974 if (!send_buffer_) { |
| 969 // Get a fresh send buffer out of the send BIO. | 975 // Get a fresh send buffer out of the send BIO. |
| 970 size_t max_read = BIO_ctrl_pending(transport_bio_); | 976 size_t max_read = BIO_ctrl_pending(transport_bio_); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1043 OnRecvComplete(result); | 1049 OnRecvComplete(result); |
| 1044 } | 1050 } |
| 1045 | 1051 |
| 1046 void SSLClientSocketOpenSSL::TransportReadComplete(int result) { | 1052 void SSLClientSocketOpenSSL::TransportReadComplete(int result) { |
| 1047 DCHECK(ERR_IO_PENDING != result); | 1053 DCHECK(ERR_IO_PENDING != result); |
| 1048 if (result <= 0) { | 1054 if (result <= 0) { |
| 1049 DVLOG(1) << "TransportReadComplete result " << result; | 1055 DVLOG(1) << "TransportReadComplete result " << result; |
| 1050 // Received 0 (end of file) or an error. Either way, bubble it up to the | 1056 // Received 0 (end of file) or an error. Either way, bubble it up to the |
| 1051 // SSL layer via the BIO. TODO(joth): consider stashing the error code, to | 1057 // SSL layer via the BIO. TODO(joth): consider stashing the error code, to |
| 1052 // relay up to the SSL socket client (i.e. via DoReadCallback). | 1058 // relay up to the SSL socket client (i.e. via DoReadCallback). |
| 1059 if (result == 0) |
| 1060 transport_eof_ = true; |
| 1053 BIO_set_mem_eof_return(transport_bio_, 0); | 1061 BIO_set_mem_eof_return(transport_bio_, 0); |
| 1054 (void)BIO_shutdown_wr(transport_bio_); | 1062 (void)BIO_shutdown_wr(transport_bio_); |
| 1055 } else { | 1063 } else { |
| 1056 DCHECK(recv_buffer_); | 1064 DCHECK(recv_buffer_); |
| 1057 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result); | 1065 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result); |
| 1058 // A write into a memory BIO should always succeed. | 1066 // A write into a memory BIO should always succeed. |
| 1059 CHECK_EQ(result, ret); | 1067 CHECK_EQ(result, ret); |
| 1060 } | 1068 } |
| 1061 recv_buffer_ = NULL; | 1069 recv_buffer_ = NULL; |
| 1062 transport_recv_busy_ = false; | 1070 transport_recv_busy_ = false; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1091 int rv_write = ERR_IO_PENDING; | 1099 int rv_write = ERR_IO_PENDING; |
| 1092 bool network_moved; | 1100 bool network_moved; |
| 1093 do { | 1101 do { |
| 1094 if (user_read_buf_) | 1102 if (user_read_buf_) |
| 1095 rv_read = DoPayloadRead(); | 1103 rv_read = DoPayloadRead(); |
| 1096 if (user_write_buf_) | 1104 if (user_write_buf_) |
| 1097 rv_write = DoPayloadWrite(); | 1105 rv_write = DoPayloadWrite(); |
| 1098 network_moved = DoTransportIO(); | 1106 network_moved = DoTransportIO(); |
| 1099 } while (rv_read == ERR_IO_PENDING && | 1107 } while (rv_read == ERR_IO_PENDING && |
| 1100 rv_write == ERR_IO_PENDING && | 1108 rv_write == ERR_IO_PENDING && |
| 1109 (user_read_buf_ || user_write_buf_) && |
| 1101 network_moved); | 1110 network_moved); |
| 1102 | 1111 |
| 1103 if (user_read_buf_ && rv_read != ERR_IO_PENDING) | 1112 if (user_read_buf_ && rv_read != ERR_IO_PENDING) |
| 1104 DoReadCallback(rv_read); | 1113 DoReadCallback(rv_read); |
| 1105 if (user_write_buf_ && rv_write != ERR_IO_PENDING) | 1114 if (user_write_buf_ && rv_write != ERR_IO_PENDING) |
| 1106 DoWriteCallback(rv_write); | 1115 DoWriteCallback(rv_write); |
| 1107 } | 1116 } |
| 1108 | 1117 |
| 1109 void SSLClientSocketOpenSSL::OnRecvComplete(int result) { | 1118 void SSLClientSocketOpenSSL::OnRecvComplete(int result) { |
| 1110 if (next_handshake_state_ == STATE_HANDSHAKE) { | 1119 if (next_handshake_state_ == STATE_HANDSHAKE) { |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1293 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, | 1302 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, |
| 1294 user_write_buf_->data()); | 1303 user_write_buf_->data()); |
| 1295 return rv; | 1304 return rv; |
| 1296 } | 1305 } |
| 1297 | 1306 |
| 1298 int err = SSL_get_error(ssl_, rv); | 1307 int err = SSL_get_error(ssl_, rv); |
| 1299 return MapOpenSSLError(err, err_tracer); | 1308 return MapOpenSSLError(err, err_tracer); |
| 1300 } | 1309 } |
| 1301 | 1310 |
| 1302 } // namespace net | 1311 } // namespace net |
| OLD | NEW |