Module: wine Branch: master Commit: 3af72bec1eb139e446f157fa0e7d00cd55932612 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3af72bec1eb139e446f157fa0e...
Author: Kai Blin kai.blin@gmail.com Date: Sat Nov 4 12:30:30 2006 +0100
secur32: Test and fix DecryptMessage for multiple data buffers.
---
dlls/secur32/ntlm.c | 39 ++++++++++++++++++++++++++++----------- dlls/secur32/tests/ntlm.c | 24 ++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 11 deletions(-)
diff --git a/dlls/secur32/ntlm.c b/dlls/secur32/ntlm.c index d1d951f..8cc206d 100644 --- a/dlls/secur32/ntlm.c +++ b/dlls/secur32/ntlm.c @@ -1308,6 +1308,7 @@ static SECURITY_STATUS SEC_ENTRY ntlm_Ve ULONG fQOP = 0; UINT i; int token_idx = -1; + SECURITY_STATUS ret;
TRACE("%p %p %d %p\n", phContext, pMessage, MessageSeqNo, pfQOP); if(!phContext) @@ -1345,26 +1346,42 @@ static SECURITY_STATUS SEC_ENTRY ntlm_Ve if(helper->neg_flags & NTLMSSP_NEGOTIATE_SIGN) { SecBufferDesc local_desc; - SecBuffer local_buff[2]; + PSecBuffer local_buff; BYTE local_sig[16];
+ local_buff = HeapAlloc(GetProcessHeap(), 0, pMessage->cBuffers * sizeof(SecBuffer)); + local_desc.ulVersion = SECBUFFER_VERSION; - local_desc.cBuffers = 2; + local_desc.cBuffers = pMessage->cBuffers; local_desc.pBuffers = local_buff; - local_buff[0].BufferType = SECBUFFER_TOKEN; - local_buff[0].cbBuffer = 16; - local_buff[0].pvBuffer = local_sig; - local_buff[1].BufferType = SECBUFFER_DATA; - local_buff[1].cbBuffer = pMessage->pBuffers[1].cbBuffer; - local_buff[1].pvBuffer = pMessage->pBuffers[1].pvBuffer; + + for(i=0; i < pMessage->cBuffers; ++i) + { + if(pMessage->pBuffers[i].BufferType == SECBUFFER_TOKEN) + { + local_buff[i].BufferType = SECBUFFER_TOKEN; + local_buff[i].cbBuffer = 16; + local_buff[i].pvBuffer = local_sig; + } + else + { + local_buff[i].BufferType = pMessage->pBuffers[i].BufferType; + local_buff[i].cbBuffer = pMessage->pBuffers[i].cbBuffer; + local_buff[i].pvBuffer = pMessage->pBuffers[i].pvBuffer; + } + }
ntlm_MakeSignature(phContext, fQOP, &local_desc, MessageSeqNo);
- if(memcmp(((PBYTE)local_buff[0].pvBuffer) + 8, + if(memcmp(((PBYTE)local_buff[token_idx].pvBuffer) + 8, ((PBYTE)pMessage->pBuffers[token_idx].pvBuffer) + 8, 8)) - return SEC_E_MESSAGE_ALTERED; + ret = SEC_E_MESSAGE_ALTERED; + else + ret = SEC_E_OK;
- return SEC_E_OK; + HeapFree(GetProcessHeap(), 0, local_buff); + + return ret; }
if(helper->neg_flags & NTLMSSP_NEGOTIATE_KEY_EXCHANGE) diff --git a/dlls/secur32/tests/ntlm.c b/dlls/secur32/tests/ntlm.c index 7e63697..7fa9358 100644 --- a/dlls/secur32/tests/ntlm.c +++ b/dlls/secur32/tests/ntlm.c @@ -137,6 +137,14 @@ static BYTE crypt_message_server[] = {0xf6, 0xb7, 0x92, 0x0c, 0xac, 0xea, 0x98, 0xe6, 0xef, 0xa0, 0x29, 0x66, 0xfd};
+static BYTE crypt_trailer_server2[] = + {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x4e, + 0x46, 0xb7, 0xca, 0xf7, 0x7f, 0xb3}; + +static BYTE crypt_message_server2[] = + {0xc8, 0xf2, 0x39, 0x7f, 0x0c, 0xaf, 0xf5, 0x5d, 0xef, 0x0c, + 0x8b, 0x5f, 0x82}; + static void InitFunctionPtrs(void) { secdll = LoadLibraryA("secur32.dll"); @@ -846,6 +854,12 @@ static void testSignSeal() ok(!memcmp(crypt.pBuffers[3].pvBuffer, message_signature, crypt.pBuffers[3].cbBuffer), "Signature is not as expected.\n");
+ /* Being a dummy signature, it will verify right away, as if the server + * sent it */ + sec_status = pVerifySignature(client.ctxt, &crypt, 0, &qop); + ok(sec_status == SEC_E_OK, "VerifySignature returned %s, not SEC_E_OK\n", + getSecError(sec_status)); + sec_status = pEncryptMessage(client.ctxt, 0, &crypt, 0); ok(sec_status == SEC_E_OK, "EncryptMessage returned %s, not SEC_E_OK.\n", getSecError(sec_status)); @@ -856,6 +870,14 @@ static void testSignSeal() ok(!memcmp(crypt.pBuffers[1].pvBuffer, crypt_message_client2, crypt.pBuffers[1].cbBuffer), "Crypt message not as expected.\n");
+ memcpy(complex_data[1].pvBuffer, crypt_message_server2, complex_data[1].cbBuffer); + memcpy(complex_data[3].pvBuffer, crypt_trailer_server2, complex_data[3].cbBuffer); + + sec_status = pDecryptMessage(client.ctxt, &crypt, 0, &qop); + ok(sec_status == SEC_E_OK, "DecryptMessage returned %s, not SEC_E_OK.\n", + getSecError(sec_status)); + + end: cleanupBuffers(&client); cleanupBuffers(&server); @@ -867,6 +889,8 @@ end: HeapFree(GetProcessHeap(), 0, fake_data[1].pvBuffer); HeapFree(GetProcessHeap(), 0, data[0].pvBuffer); HeapFree(GetProcessHeap(), 0, data[1].pvBuffer); + HeapFree(GetProcessHeap(), 0, complex_data[1].pvBuffer); + HeapFree(GetProcessHeap(), 0, complex_data[3].pvBuffer); } else {