[PATCH 3/3] Fill buffers in schan_DecryptMessage the same way as windows does

Mikko Rasa tdb at tdb.fi
Mon Aug 30 11:37:39 CDT 2010


---
 dlls/secur32/schannel.c |   32 ++++++++++++++++++++++++++++++--
 1 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index ef24656..3eff004 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -1191,6 +1191,19 @@ static int schan_validate_decrypt_buffer_desc(PSecBufferDesc message)
     return data_idx;
 }
 
+static void schan_decrypt_fill_buffer(PSecBufferDesc message, ULONG buffer_type, void *data, ULONG size)
+{
+    int idx;
+    SecBuffer *buffer;
+
+    idx = schan_find_sec_buffer_idx(message, 0, SECBUFFER_EMPTY);
+    buffer = &message->pBuffers[idx];
+
+    buffer->BufferType = buffer_type;
+    buffer->pvBuffer = data;
+    buffer->cbBuffer = size;
+}
+
 static SECURITY_STATUS SEC_ENTRY schan_DecryptMessage(PCtxtHandle context_handle,
         PSecBufferDesc message, ULONG message_seq_no, PULONG quality)
 {
@@ -1202,6 +1215,8 @@ static SECURITY_STATUS SEC_ENTRY schan_DecryptMessage(PCtxtHandle context_handle
     ssize_t received = 0;
     ssize_t ret;
     int idx;
+    char *buf_ptr;
+    unsigned int offset;
 
     TRACE("context_handle %p, message %p, message_seq_no %d, quality %p\n",
             context_handle, message, message_seq_no, quality);
@@ -1256,10 +1271,23 @@ static SECURITY_STATUS SEC_ENTRY schan_DecryptMessage(PCtxtHandle context_handle
 
     TRACE("Received %zd bytes\n", received);
 
-    memcpy(buffer->pvBuffer, data, received);
-    buffer->cbBuffer = received;
+    buf_ptr = (char *)buffer->pvBuffer;
+    offset = ctx->header_bytes;
+    memcpy(buf_ptr + offset, data, received);
     HeapFree(GetProcessHeap(), 0, data);
 
+    schan_decrypt_fill_buffer(message, SECBUFFER_DATA, buf_ptr + offset, received);
+    offset += received;
+
+    schan_decrypt_fill_buffer(message, SECBUFFER_STREAM_TRAILER, buf_ptr + offset, buffer->cbBuffer - offset);
+    offset += ctx->trailer_bytes;
+
+    if(buffer->cbBuffer > offset)
+        schan_decrypt_fill_buffer(message, SECBUFFER_EXTRA, buf_ptr + offset, buffer->cbBuffer - offset);
+
+    buffer->BufferType = SECBUFFER_STREAM_HEADER;
+    buffer->cbBuffer = ctx->header_bytes;
+
     return SEC_E_OK;
 }
 
-- 
1.7.1




More information about the wine-patches mailing list