Module: wine Branch: master Commit: 85655db106c125c6541c63945a1108da4588ba3c URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=85655db106c125c6541c6394...
Author: Kai Blin kai.blin@gmail.com Date: Thu Sep 7 16:17:06 2006 +0200
secur32: Fix generation of the session key.
---
dlls/secur32/ntlm.c | 19 ++++++++++++++++++- dlls/secur32/secur32_priv.h | 2 +- dlls/secur32/tests/ntlm.c | 5 ++--- dlls/secur32/util.c | 4 ++-- 4 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/dlls/secur32/ntlm.c b/dlls/secur32/ntlm.c index ce8da6f..a3f584f 100644 --- a/dlls/secur32/ntlm.c +++ b/dlls/secur32/ntlm.c @@ -648,7 +648,24 @@ static SECURITY_STATUS SEC_ENTRY ntlm_In helper->session_key = HeapAlloc(GetProcessHeap(), 0, 16); /*Generate the dummy session key = MD4(MD4(password))*/ if(helper->password) - SECUR32_CreateNTLMv1SessionKey(helper->password, helper->session_key); + { + SEC_WCHAR *unicode_password; + int passwd_lenW; + + TRACE("Converting password to unicode.\n"); + passwd_lenW = MultiByteToWideChar(CP_ACP, 0, + (LPCSTR)helper->password, helper->pwlen, + NULL, 0); + unicode_password = HeapAlloc(GetProcessHeap(), 0, + passwd_lenW * sizeof(SEC_WCHAR)); + MultiByteToWideChar(CP_ACP, 0, (LPCSTR)helper->password, + helper->pwlen, unicode_password, passwd_lenW); + + SECUR32_CreateNTLMv1SessionKey((PBYTE)unicode_password, + lstrlenW(unicode_password) * sizeof(SEC_WCHAR), helper->session_key); + + HeapFree(GetProcessHeap(), 0, unicode_password); + } else memset(helper->session_key, 0, 16); } diff --git a/dlls/secur32/secur32_priv.h b/dlls/secur32/secur32_priv.h index 007a14b..1ad62c5 100644 --- a/dlls/secur32/secur32_priv.h +++ b/dlls/secur32/secur32_priv.h @@ -137,7 +137,7 @@ SECURITY_STATUS decodeBase64(char *in_bu
/* Functions from util.c */ ULONG ComputeCrc32(const BYTE *pData, INT iLen); -SECURITY_STATUS SECUR32_CreateNTLMv1SessionKey(const char* password, PBYTE session_key); +SECURITY_STATUS SECUR32_CreateNTLMv1SessionKey(PBYTE password, int len, PBYTE session_key); arc4_info *SECUR32_arc4Alloc(void); void SECUR32_arc4Init(arc4_info *a4i, const BYTE *key, unsigned int keyLen); void SECUR32_arc4Process(arc4_info *a4i, BYTE *inoutString, unsigned int length); diff --git a/dlls/secur32/tests/ntlm.c b/dlls/secur32/tests/ntlm.c index 9128620..1b13948 100644 --- a/dlls/secur32/tests/ntlm.c +++ b/dlls/secur32/tests/ntlm.c @@ -807,12 +807,11 @@ static void testSignSeal() 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)); - todo_wine{ + ok(!memcmp(crypt->pBuffers[0].pvBuffer, crypt_trailer_client, crypt->pBuffers[0].cbBuffer), "Crypt trailer not as expected.\n"); ok(!memcmp(crypt->pBuffers[1].pvBuffer, crypt_message_client, crypt->pBuffers[1].cbBuffer), "Crypt message not as expected.\n"); - }
data[0].cbBuffer = sizeof(crypt_trailer_server); data[1].cbBuffer = sizeof(crypt_message_server); @@ -823,10 +822,10 @@ static void testSignSeal() todo_wine { ok(sec_status == SEC_E_OK, "DecryptMessage returned %s, not SEC_E_OK.\n", getSecError(sec_status)); + } ok(!memcmp(crypt->pBuffers[1].pvBuffer, message_binary, crypt->pBuffers[1].cbBuffer), "Failed to decrypt message correctly.\n"); - }
end: cleanupBuffers(&client); diff --git a/dlls/secur32/util.c b/dlls/secur32/util.c index e762c8c..4462ae9 100644 --- a/dlls/secur32/util.c +++ b/dlls/secur32/util.c @@ -106,7 +106,7 @@ ULONG ComputeCrc32(const BYTE *pData, IN return ~crc; }
-SECURITY_STATUS SECUR32_CreateNTLMv1SessionKey(const char* password, PBYTE session_key) +SECURITY_STATUS SECUR32_CreateNTLMv1SessionKey(PBYTE password, int len, PBYTE session_key) { MD4_CTX ctx; BYTE ntlm_hash[16]; @@ -114,7 +114,7 @@ SECURITY_STATUS SECUR32_CreateNTLMv1Sess TRACE("(%p, %p)\n", password, session_key);
MD4Init(&ctx); - MD4Update(&ctx, (const unsigned char*) password, lstrlenA(password)); + MD4Update(&ctx, (const unsigned char*) password, len); MD4Final(&ctx);
memcpy(ntlm_hash, ctx.digest, 0x10);