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 |