| 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 #include "net/socket/ssl_client_socket_win.h" | 5 #include "net/socket/ssl_client_socket_win.h" |
| 6 | 6 |
| 7 #include <schnlsp.h> | 7 #include <schnlsp.h> |
| 8 #include <map> | 8 #include <map> |
| 9 | 9 |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 733 | 733 |
| 734 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len, | 734 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len, |
| 735 CompletionCallback* callback) { | 735 CompletionCallback* callback) { |
| 736 DCHECK(completed_handshake()); | 736 DCHECK(completed_handshake()); |
| 737 DCHECK(!user_read_callback_); | 737 DCHECK(!user_read_callback_); |
| 738 | 738 |
| 739 // If we have surplus decrypted plaintext, satisfy the Read with it without | 739 // If we have surplus decrypted plaintext, satisfy the Read with it without |
| 740 // reading more ciphertext from the transport socket. | 740 // reading more ciphertext from the transport socket. |
| 741 if (bytes_decrypted_ != 0) { | 741 if (bytes_decrypted_ != 0) { |
| 742 int len = std::min(buf_len, bytes_decrypted_); | 742 int len = std::min(buf_len, bytes_decrypted_); |
| 743 LogByteTransfer(net_log_, NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, | 743 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, |
| 744 decrypted_ptr_); | 744 decrypted_ptr_); |
| 745 memcpy(buf->data(), decrypted_ptr_, len); | 745 memcpy(buf->data(), decrypted_ptr_, len); |
| 746 decrypted_ptr_ += len; | 746 decrypted_ptr_ += len; |
| 747 bytes_decrypted_ -= len; | 747 bytes_decrypted_ -= len; |
| 748 if (bytes_decrypted_ == 0) { | 748 if (bytes_decrypted_ == 0) { |
| 749 decrypted_ptr_ = NULL; | 749 decrypted_ptr_ = NULL; |
| 750 if (bytes_received_ != 0) { | 750 if (bytes_received_ != 0) { |
| 751 memmove(recv_buffer_.get(), received_ptr_, bytes_received_); | 751 memmove(recv_buffer_.get(), received_ptr_, bytes_received_); |
| 752 received_ptr_ = recv_buffer_.get(); | 752 received_ptr_ = recv_buffer_.get(); |
| 753 } | 753 } |
| 754 } | 754 } |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1354 // application, even though more is already buffered and ready to be | 1354 // application, even though more is already buffered and ready to be |
| 1355 // decoded. | 1355 // decoded. |
| 1356 if (len) | 1356 if (len) |
| 1357 break; | 1357 break; |
| 1358 } | 1358 } |
| 1359 | 1359 |
| 1360 // If we decrypted 0 bytes, don't report 0 bytes read, which would be | 1360 // If we decrypted 0 bytes, don't report 0 bytes read, which would be |
| 1361 // mistaken for EOF. Continue decrypting or read more. | 1361 // mistaken for EOF. Continue decrypting or read more. |
| 1362 if (len == 0) | 1362 if (len == 0) |
| 1363 return DoPayloadRead(); | 1363 return DoPayloadRead(); |
| 1364 LogByteTransfer(net_log_, NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, | 1364 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, |
| 1365 user_read_buf_->data()); | 1365 user_read_buf_->data()); |
| 1366 return len; | 1366 return len; |
| 1367 } | 1367 } |
| 1368 | 1368 |
| 1369 int SSLClientSocketWin::DoPayloadEncrypt() { | 1369 int SSLClientSocketWin::DoPayloadEncrypt() { |
| 1370 DCHECK(completed_handshake()); | 1370 DCHECK(completed_handshake()); |
| 1371 DCHECK(user_write_buf_); | 1371 DCHECK(user_write_buf_); |
| 1372 DCHECK(user_write_buf_len_ > 0); | 1372 DCHECK(user_write_buf_len_ > 0); |
| 1373 | 1373 |
| 1374 ULONG message_len = std::min( | 1374 ULONG message_len = std::min( |
| 1375 stream_sizes_.cbMaximumMessage, static_cast<ULONG>(user_write_buf_len_)); | 1375 stream_sizes_.cbMaximumMessage, static_cast<ULONG>(user_write_buf_len_)); |
| 1376 ULONG alloc_len = | 1376 ULONG alloc_len = |
| 1377 message_len + stream_sizes_.cbHeader + stream_sizes_.cbTrailer; | 1377 message_len + stream_sizes_.cbHeader + stream_sizes_.cbTrailer; |
| 1378 user_write_buf_len_ = message_len; | 1378 user_write_buf_len_ = message_len; |
| 1379 | 1379 |
| 1380 payload_send_buffer_.reset(new char[alloc_len]); | 1380 payload_send_buffer_.reset(new char[alloc_len]); |
| 1381 memcpy(&payload_send_buffer_[stream_sizes_.cbHeader], | 1381 memcpy(&payload_send_buffer_[stream_sizes_.cbHeader], |
| 1382 user_write_buf_->data(), message_len); | 1382 user_write_buf_->data(), message_len); |
| 1383 LogByteTransfer(net_log_, NetLog::TYPE_SSL_SOCKET_BYTES_SENT, message_len, | 1383 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, message_len, |
| 1384 user_write_buf_->data()); | 1384 user_write_buf_->data()); |
| 1385 | 1385 |
| 1386 SecBuffer buffers[4]; | 1386 SecBuffer buffers[4]; |
| 1387 buffers[0].pvBuffer = payload_send_buffer_.get(); | 1387 buffers[0].pvBuffer = payload_send_buffer_.get(); |
| 1388 buffers[0].cbBuffer = stream_sizes_.cbHeader; | 1388 buffers[0].cbBuffer = stream_sizes_.cbHeader; |
| 1389 buffers[0].BufferType = SECBUFFER_STREAM_HEADER; | 1389 buffers[0].BufferType = SECBUFFER_STREAM_HEADER; |
| 1390 | 1390 |
| 1391 buffers[1].pvBuffer = &payload_send_buffer_[stream_sizes_.cbHeader]; | 1391 buffers[1].pvBuffer = &payload_send_buffer_[stream_sizes_.cbHeader]; |
| 1392 buffers[1].cbBuffer = message_len; | 1392 buffers[1].cbBuffer = message_len; |
| 1393 buffers[1].BufferType = SECBUFFER_DATA; | 1393 buffers[1].BufferType = SECBUFFER_DATA; |
| 1394 | 1394 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1530 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2_CA); | 1530 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2_CA); |
| 1531 } | 1531 } |
| 1532 | 1532 |
| 1533 void SSLClientSocketWin::FreeSendBuffer() { | 1533 void SSLClientSocketWin::FreeSendBuffer() { |
| 1534 SECURITY_STATUS status = FreeContextBuffer(send_buffer_.pvBuffer); | 1534 SECURITY_STATUS status = FreeContextBuffer(send_buffer_.pvBuffer); |
| 1535 DCHECK(status == SEC_E_OK); | 1535 DCHECK(status == SEC_E_OK); |
| 1536 memset(&send_buffer_, 0, sizeof(send_buffer_)); | 1536 memset(&send_buffer_, 0, sizeof(send_buffer_)); |
| 1537 } | 1537 } |
| 1538 | 1538 |
| 1539 } // namespace net | 1539 } // namespace net |
| OLD | NEW |