[PATCH 2/5] secur32: Add a helper to read TLS record size.
Hans Leidekker
hans at codeweavers.com
Wed Mar 10 08:50:25 CST 2021
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/secur32/schannel.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index d47c4d79258..3a34007a8cb 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -772,6 +772,13 @@ static void dump_buffer_desc(SecBufferDesc *desc)
}
}
+#define HEADER_SIZE_TLS 5
+
+static inline SIZE_T read_record_size(const BYTE *buf, SIZE_T header_size)
+{
+ return (buf[header_size - 2] << 8) | buf[header_size - 1];
+}
+
/***********************************************************************
* InitializeSecurityContextW
*/
@@ -870,9 +877,9 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW(
ptr = buffer->pvBuffer;
expected_size = 0;
- while (buffer->cbBuffer > expected_size + 5)
+ while (buffer->cbBuffer > expected_size + HEADER_SIZE_TLS)
{
- record_size = 5 + ((ptr[3] << 8) | ptr[4]);
+ record_size = HEADER_SIZE_TLS + read_record_size(ptr, HEADER_SIZE_TLS);
if (buffer->cbBuffer < expected_size + record_size)
break;
@@ -1035,7 +1042,7 @@ static SECURITY_STATUS SEC_ENTRY schan_QueryContextAttributesW(
mac_size, message_size, block_size);
/* These are defined by the TLS RFC */
- stream_sizes->cbHeader = 5;
+ stream_sizes->cbHeader = HEADER_SIZE_TLS;
stream_sizes->cbTrailer = mac_size + 256; /* Max 255 bytes padding + 1 for padding size */
stream_sizes->cbMaximumMessage = message_size;
stream_sizes->cbBuffers = 4;
@@ -1360,7 +1367,7 @@ static SECURITY_STATUS SEC_ENTRY schan_DecryptMessage(PCtxtHandle context_handle
buffer = &message->pBuffers[idx];
buf_ptr = buffer->pvBuffer;
- expected_size = 5 + ((buf_ptr[3] << 8) | buf_ptr[4]);
+ expected_size = HEADER_SIZE_TLS + read_record_size(buf_ptr, HEADER_SIZE_TLS);
if(buffer->cbBuffer < expected_size)
{
TRACE("Expected %u bytes, but buffer only contains %u bytes\n", expected_size, buffer->cbBuffer);
@@ -1377,7 +1384,7 @@ static SECURITY_STATUS SEC_ENTRY schan_DecryptMessage(PCtxtHandle context_handle
return SEC_E_INCOMPLETE_MESSAGE;
}
- data_size = expected_size - 5;
+ data_size = expected_size - HEADER_SIZE_TLS;
data = heap_alloc(data_size);
init_schan_buffers(&ctx->transport.in, message, schan_decrypt_message_get_next_buffer);
@@ -1412,21 +1419,21 @@ static SECURITY_STATUS SEC_ENTRY schan_DecryptMessage(PCtxtHandle context_handle
TRACE("Received %ld bytes\n", received);
- memcpy(buf_ptr + 5, data, received);
+ memcpy(buf_ptr + HEADER_SIZE_TLS, data, received);
heap_free(data);
schan_decrypt_fill_buffer(message, SECBUFFER_DATA,
- buf_ptr + 5, received);
+ buf_ptr + HEADER_SIZE_TLS, received);
schan_decrypt_fill_buffer(message, SECBUFFER_STREAM_TRAILER,
- buf_ptr + 5 + received, buffer->cbBuffer - 5 - received);
+ buf_ptr + HEADER_SIZE_TLS + received, buffer->cbBuffer - HEADER_SIZE_TLS - received);
if(buffer->cbBuffer > expected_size)
schan_decrypt_fill_buffer(message, SECBUFFER_EXTRA,
buf_ptr + expected_size, buffer->cbBuffer - expected_size);
buffer->BufferType = SECBUFFER_STREAM_HEADER;
- buffer->cbBuffer = 5;
+ buffer->cbBuffer = HEADER_SIZE_TLS;
return status;
}
--
2.30.1
More information about the wine-devel
mailing list