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 #include "net/socket/ssl_client_socket_impl.h" | 5 #include "net/socket/ssl_client_socket_impl.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <string.h> | 8 #include <string.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
853 | 853 |
854 // static | 854 // static |
855 void SSLClientSocketImpl::DumpSSLClientSessionMemoryStats( | 855 void SSLClientSocketImpl::DumpSSLClientSessionMemoryStats( |
856 base::trace_event::ProcessMemoryDump* pmd) { | 856 base::trace_event::ProcessMemoryDump* pmd) { |
857 SSLContext::GetInstance()->session_cache()->DumpMemoryStats(pmd); | 857 SSLContext::GetInstance()->session_cache()->DumpMemoryStats(pmd); |
858 } | 858 } |
859 | 859 |
860 int SSLClientSocketImpl::Read(IOBuffer* buf, | 860 int SSLClientSocketImpl::Read(IOBuffer* buf, |
861 int buf_len, | 861 int buf_len, |
862 const CompletionCallback& callback) { | 862 const CompletionCallback& callback) { |
863 user_read_buf_ = buf; | 863 int rv = ReadIfReady(buf, buf_len, callback); |
864 user_read_buf_len_ = buf_len; | 864 if (rv == ERR_IO_PENDING) { |
865 user_read_buf_ = buf; | |
866 user_read_buf_len_ = buf_len; | |
867 } | |
868 return rv; | |
869 } | |
865 | 870 |
866 int rv = DoPayloadRead(); | 871 int SSLClientSocketImpl::ReadIfReady(IOBuffer* buf, |
872 int buf_len, | |
873 const CompletionCallback& callback) { | |
874 int rv = DoPayloadRead(buf, buf_len); | |
867 | 875 |
868 if (rv == ERR_IO_PENDING) { | 876 if (rv == ERR_IO_PENDING) { |
869 user_read_callback_ = callback; | 877 user_read_callback_ = callback; |
870 } else { | 878 } else { |
871 if (rv > 0) | 879 if (rv > 0) |
872 was_ever_used_ = true; | 880 was_ever_used_ = true; |
873 user_read_buf_ = NULL; | |
874 user_read_buf_len_ = 0; | |
875 } | 881 } |
876 | |
877 return rv; | 882 return rv; |
878 } | 883 } |
879 | 884 |
880 int SSLClientSocketImpl::Write(IOBuffer* buf, | 885 int SSLClientSocketImpl::Write(IOBuffer* buf, |
881 int buf_len, | 886 int buf_len, |
882 const CompletionCallback& callback) { | 887 const CompletionCallback& callback) { |
883 user_write_buf_ = buf; | 888 user_write_buf_ = buf; |
884 user_write_buf_len_ = buf_len; | 889 user_write_buf_len_ = buf_len; |
885 | 890 |
886 int rv = DoPayloadWrite(); | 891 int rv = DoPayloadWrite(); |
(...skipping 11 matching lines...) Expand all Loading... | |
898 } | 903 } |
899 | 904 |
900 int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) { | 905 int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) { |
901 return transport_->socket()->SetReceiveBufferSize(size); | 906 return transport_->socket()->SetReceiveBufferSize(size); |
902 } | 907 } |
903 | 908 |
904 int SSLClientSocketImpl::SetSendBufferSize(int32_t size) { | 909 int SSLClientSocketImpl::SetSendBufferSize(int32_t size) { |
905 return transport_->socket()->SetSendBufferSize(size); | 910 return transport_->socket()->SetSendBufferSize(size); |
906 } | 911 } |
907 | 912 |
908 void SSLClientSocketImpl::OnReadReady() { | 913 void SSLClientSocketImpl::OnReadReady(int rv) { |
909 // During a renegotiation, either Read or Write calls may be blocked on a | 914 // During a renegotiation, either Read or Write calls may be blocked on a |
910 // transport read. | 915 // transport read. |
911 RetryAllOperations(); | 916 RetryAllOperations(rv); |
912 } | 917 } |
913 | 918 |
914 void SSLClientSocketImpl::OnWriteReady() { | 919 void SSLClientSocketImpl::OnWriteReady(int rv) { |
915 // During a renegotiation, either Read or Write calls may be blocked on a | 920 // During a renegotiation, either Read or Write calls may be blocked on a |
916 // transport read. | 921 // transport read. |
917 RetryAllOperations(); | 922 RetryAllOperations(rv); |
918 } | 923 } |
919 | 924 |
920 int SSLClientSocketImpl::Init() { | 925 int SSLClientSocketImpl::Init() { |
921 DCHECK(!ssl_); | 926 DCHECK(!ssl_); |
922 | 927 |
923 #if defined(USE_NSS_CERTS) | 928 #if defined(USE_NSS_CERTS) |
924 if (ssl_config_.cert_io_enabled) { | 929 if (ssl_config_.cert_io_enabled) { |
925 // TODO(davidben): Move this out of SSLClientSocket. See | 930 // TODO(davidben): Move this out of SSLClientSocket. See |
926 // https://crbug.com/539520. | 931 // https://crbug.com/539520. |
927 EnsureNSSHttpIOInit(); | 932 EnsureNSSHttpIOInit(); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1043 SSL_enable_ocsp_stapling(ssl_.get()); | 1048 SSL_enable_ocsp_stapling(ssl_.get()); |
1044 | 1049 |
1045 return OK; | 1050 return OK; |
1046 } | 1051 } |
1047 | 1052 |
1048 void SSLClientSocketImpl::DoReadCallback(int rv) { | 1053 void SSLClientSocketImpl::DoReadCallback(int rv) { |
1049 // Since Run may result in Read being called, clear |user_read_callback_| | 1054 // Since Run may result in Read being called, clear |user_read_callback_| |
1050 // up front. | 1055 // up front. |
1051 if (rv > 0) | 1056 if (rv > 0) |
1052 was_ever_used_ = true; | 1057 was_ever_used_ = true; |
1053 user_read_buf_ = NULL; | 1058 user_read_buf_ = nullptr; |
1054 user_read_buf_len_ = 0; | 1059 user_read_buf_len_ = 0; |
1055 base::ResetAndReturn(&user_read_callback_).Run(rv); | 1060 base::ResetAndReturn(&user_read_callback_).Run(rv); |
1056 } | 1061 } |
1057 | 1062 |
1058 void SSLClientSocketImpl::DoWriteCallback(int rv) { | 1063 void SSLClientSocketImpl::DoWriteCallback(int rv) { |
1059 // Since Run may result in Write being called, clear |user_write_callback_| | 1064 // Since Run may result in Write being called, clear |user_write_callback_| |
1060 // up front. | 1065 // up front. |
1061 if (rv > 0) | 1066 if (rv > 0) |
1062 was_ever_used_ = true; | 1067 was_ever_used_ = true; |
1063 user_write_buf_ = NULL; | 1068 user_write_buf_ = NULL; |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1398 case STATE_NONE: | 1403 case STATE_NONE: |
1399 default: | 1404 default: |
1400 rv = ERR_UNEXPECTED; | 1405 rv = ERR_UNEXPECTED; |
1401 NOTREACHED() << "unexpected state" << state; | 1406 NOTREACHED() << "unexpected state" << state; |
1402 break; | 1407 break; |
1403 } | 1408 } |
1404 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE); | 1409 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE); |
1405 return rv; | 1410 return rv; |
1406 } | 1411 } |
1407 | 1412 |
1408 int SSLClientSocketImpl::DoPayloadRead() { | 1413 int SSLClientSocketImpl::DoPayloadRead(IOBuffer* buf, int buf_len) { |
1409 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 1414 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
1410 | 1415 |
1411 DCHECK_LT(0, user_read_buf_len_); | 1416 DCHECK_LT(0, buf_len); |
1412 DCHECK(user_read_buf_.get()); | 1417 DCHECK(buf); |
1413 | 1418 |
1414 int rv; | 1419 int rv; |
1415 if (pending_read_error_ != kNoPendingResult) { | 1420 if (pending_read_error_ != kNoPendingResult) { |
1416 rv = pending_read_error_; | 1421 rv = pending_read_error_; |
1417 pending_read_error_ = kNoPendingResult; | 1422 pending_read_error_ = kNoPendingResult; |
1418 if (rv == 0) { | 1423 if (rv == 0) { |
1419 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED, | 1424 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED, |
1420 rv, user_read_buf_->data()); | 1425 rv, buf->data()); |
1421 } else { | 1426 } else { |
1422 net_log_.AddEvent( | 1427 net_log_.AddEvent( |
1423 NetLogEventType::SSL_READ_ERROR, | 1428 NetLogEventType::SSL_READ_ERROR, |
1424 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_, | 1429 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_, |
1425 pending_read_error_info_)); | 1430 pending_read_error_info_)); |
1426 } | 1431 } |
1427 pending_read_ssl_error_ = SSL_ERROR_NONE; | 1432 pending_read_ssl_error_ = SSL_ERROR_NONE; |
1428 pending_read_error_info_ = OpenSSLErrorInfo(); | 1433 pending_read_error_info_ = OpenSSLErrorInfo(); |
1429 return rv; | 1434 return rv; |
1430 } | 1435 } |
1431 | 1436 |
1432 int total_bytes_read = 0; | 1437 int total_bytes_read = 0; |
1433 int ssl_ret; | 1438 int ssl_ret; |
1434 do { | 1439 do { |
1435 ssl_ret = SSL_read(ssl_.get(), user_read_buf_->data() + total_bytes_read, | 1440 ssl_ret = SSL_read(ssl_.get(), buf->data() + total_bytes_read, |
1436 user_read_buf_len_ - total_bytes_read); | 1441 buf_len - total_bytes_read); |
1437 if (ssl_ret > 0) | 1442 if (ssl_ret > 0) |
1438 total_bytes_read += ssl_ret; | 1443 total_bytes_read += ssl_ret; |
1439 } while (total_bytes_read < user_read_buf_len_ && ssl_ret > 0); | 1444 } while (total_bytes_read < buf_len && ssl_ret > 0); |
1440 | 1445 |
1441 // Although only the final SSL_read call may have failed, the failure needs to | 1446 // Although only the final SSL_read call may have failed, the failure needs to |
1442 // processed immediately, while the information still available in OpenSSL's | 1447 // processed immediately, while the information still available in OpenSSL's |
1443 // error queue. | 1448 // error queue. |
1444 if (ssl_ret <= 0) { | 1449 if (ssl_ret <= 0) { |
1445 // A zero return from SSL_read may mean any of: | 1450 // A zero return from SSL_read may mean any of: |
1446 // - The underlying BIO_read returned 0. | 1451 // - The underlying BIO_read returned 0. |
1447 // - The peer sent a close_notify. | 1452 // - The peer sent a close_notify. |
1448 // - Any arbitrary error. https://crbug.com/466303 | 1453 // - Any arbitrary error. https://crbug.com/466303 |
1449 // | 1454 // |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1486 pending_read_error_ = kNoPendingResult; | 1491 pending_read_error_ = kNoPendingResult; |
1487 } else { | 1492 } else { |
1488 // No bytes were returned. Return the pending read error immediately. | 1493 // No bytes were returned. Return the pending read error immediately. |
1489 DCHECK_NE(kNoPendingResult, pending_read_error_); | 1494 DCHECK_NE(kNoPendingResult, pending_read_error_); |
1490 rv = pending_read_error_; | 1495 rv = pending_read_error_; |
1491 pending_read_error_ = kNoPendingResult; | 1496 pending_read_error_ = kNoPendingResult; |
1492 } | 1497 } |
1493 | 1498 |
1494 if (rv >= 0) { | 1499 if (rv >= 0) { |
1495 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED, | 1500 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED, |
1496 rv, user_read_buf_->data()); | 1501 rv, buf->data()); |
1497 } else if (rv != ERR_IO_PENDING) { | 1502 } else if (rv != ERR_IO_PENDING) { |
1498 net_log_.AddEvent( | 1503 net_log_.AddEvent( |
1499 NetLogEventType::SSL_READ_ERROR, | 1504 NetLogEventType::SSL_READ_ERROR, |
1500 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_, | 1505 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_, |
1501 pending_read_error_info_)); | 1506 pending_read_error_info_)); |
1502 pending_read_ssl_error_ = SSL_ERROR_NONE; | 1507 pending_read_ssl_error_ = SSL_ERROR_NONE; |
1503 pending_read_error_info_ = OpenSSLErrorInfo(); | 1508 pending_read_error_info_ = OpenSSLErrorInfo(); |
1504 } | 1509 } |
1505 return rv; | 1510 return rv; |
1506 } | 1511 } |
(...skipping 15 matching lines...) Expand all Loading... | |
1522 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info); | 1527 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info); |
1523 | 1528 |
1524 if (net_error != ERR_IO_PENDING) { | 1529 if (net_error != ERR_IO_PENDING) { |
1525 net_log_.AddEvent( | 1530 net_log_.AddEvent( |
1526 NetLogEventType::SSL_WRITE_ERROR, | 1531 NetLogEventType::SSL_WRITE_ERROR, |
1527 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info)); | 1532 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info)); |
1528 } | 1533 } |
1529 return net_error; | 1534 return net_error; |
1530 } | 1535 } |
1531 | 1536 |
1532 void SSLClientSocketImpl::RetryAllOperations() { | 1537 void SSLClientSocketImpl::RetryAllOperations(int rv) { |
davidben
2017/03/02 20:47:02
rv is no longer used.
xunjieli
2017/03/02 22:30:20
Done.
| |
1533 // SSL_do_handshake, SSL_read, and SSL_write may all be retried when blocked, | 1538 // SSL_do_handshake, SSL_read, and SSL_write may all be retried when blocked, |
1534 // so retry all operations for simplicity. (Otherwise, SSL_get_error for each | 1539 // so retry all operations for simplicity. (Otherwise, SSL_get_error for each |
1535 // operation may be remembered to retry only the blocked ones.) | 1540 // operation may be remembered to retry only the blocked ones.) |
1536 | 1541 |
1537 if (next_handshake_state_ == STATE_HANDSHAKE) { | 1542 if (next_handshake_state_ == STATE_HANDSHAKE) { |
1538 // In handshake phase. The parameter to OnHandshakeIOComplete is unused. | 1543 // In handshake phase. The parameter to OnHandshakeIOComplete is unused. |
1539 OnHandshakeIOComplete(OK); | 1544 OnHandshakeIOComplete(OK); |
1540 return; | 1545 return; |
1541 } | 1546 } |
1542 | 1547 |
1543 int rv_read = ERR_IO_PENDING; | 1548 int rv_read = ERR_IO_PENDING; |
1544 int rv_write = ERR_IO_PENDING; | 1549 int rv_write = ERR_IO_PENDING; |
1545 if (user_read_buf_) | 1550 if (user_read_buf_) { |
1546 rv_read = DoPayloadRead(); | 1551 rv_read = DoPayloadRead(user_read_buf_.get(), user_read_buf_len_); |
1552 } else if (!user_read_callback_.is_null()) { | |
1553 // When ReadIfReady() is used, skip DoPayloadRead(). | |
1554 rv_read = OK; | |
1555 } | |
1556 | |
1547 if (user_write_buf_) | 1557 if (user_write_buf_) |
1548 rv_write = DoPayloadWrite(); | 1558 rv_write = DoPayloadWrite(); |
1549 | 1559 |
1550 // Performing the Read callback may cause |this| to be deleted. If this | 1560 // Performing the Read callback may cause |this| to be deleted. If this |
1551 // happens, the Write callback should not be invoked. Guard against this by | 1561 // happens, the Write callback should not be invoked. Guard against this by |
1552 // holding a WeakPtr to |this| and ensuring it's still valid. | 1562 // holding a WeakPtr to |this| and ensuring it's still valid. |
1553 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr()); | 1563 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr()); |
1554 if (rv_read != ERR_IO_PENDING) | 1564 if (rv_read != ERR_IO_PENDING) |
1555 DoReadCallback(rv_read); | 1565 DoReadCallback(rv_read); |
1556 | 1566 |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1882 DCHECK(ssl_config_.client_private_key); | 1892 DCHECK(ssl_config_.client_private_key); |
1883 | 1893 |
1884 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error); | 1894 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error); |
1885 | 1895 |
1886 signature_result_ = error; | 1896 signature_result_ = error; |
1887 if (signature_result_ == OK) | 1897 if (signature_result_ == OK) |
1888 signature_ = signature; | 1898 signature_ = signature; |
1889 | 1899 |
1890 // During a renegotiation, either Read or Write calls may be blocked on an | 1900 // During a renegotiation, either Read or Write calls may be blocked on an |
1891 // asynchronous private key operation. | 1901 // asynchronous private key operation. |
1892 RetryAllOperations(); | 1902 RetryAllOperations(error); |
1893 } | 1903 } |
1894 | 1904 |
1895 int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out, | 1905 int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out, |
1896 size_t* out_len, | 1906 size_t* out_len, |
1897 int* out_alert_value) { | 1907 int* out_alert_value) { |
1898 if (ssl_config_.token_binding_params.empty()) { | 1908 if (ssl_config_.token_binding_params.empty()) { |
1899 return 0; | 1909 return 0; |
1900 } | 1910 } |
1901 bssl::ScopedCBB output; | 1911 bssl::ScopedCBB output; |
1902 CBB parameters_list; | 1912 CBB parameters_list; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2040 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED && | 2050 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED && |
2041 !certificate_requested_) { | 2051 !certificate_requested_) { |
2042 net_error = ERR_SSL_PROTOCOL_ERROR; | 2052 net_error = ERR_SSL_PROTOCOL_ERROR; |
2043 } | 2053 } |
2044 } | 2054 } |
2045 | 2055 |
2046 return net_error; | 2056 return net_error; |
2047 } | 2057 } |
2048 | 2058 |
2049 } // namespace net | 2059 } // namespace net |
OLD | NEW |