secur32: Fix generation of the session key.
This commit is contained in:
parent
822e6af604
commit
85655db106
|
@ -648,7 +648,24 @@ static SECURITY_STATUS SEC_ENTRY ntlm_InitializeSecurityContextW(
|
||||||
helper->session_key = HeapAlloc(GetProcessHeap(), 0, 16);
|
helper->session_key = HeapAlloc(GetProcessHeap(), 0, 16);
|
||||||
/*Generate the dummy session key = MD4(MD4(password))*/
|
/*Generate the dummy session key = MD4(MD4(password))*/
|
||||||
if(helper->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
|
else
|
||||||
memset(helper->session_key, 0, 16);
|
memset(helper->session_key, 0, 16);
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,7 +137,7 @@ SECURITY_STATUS decodeBase64(char *in_buf, int in_len, BYTE *out_buf,
|
||||||
|
|
||||||
/* Functions from util.c */
|
/* Functions from util.c */
|
||||||
ULONG ComputeCrc32(const BYTE *pData, INT iLen);
|
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);
|
arc4_info *SECUR32_arc4Alloc(void);
|
||||||
void SECUR32_arc4Init(arc4_info *a4i, const BYTE *key, unsigned int keyLen);
|
void SECUR32_arc4Init(arc4_info *a4i, const BYTE *key, unsigned int keyLen);
|
||||||
void SECUR32_arc4Process(arc4_info *a4i, BYTE *inoutString, unsigned int length);
|
void SECUR32_arc4Process(arc4_info *a4i, BYTE *inoutString, unsigned int length);
|
||||||
|
|
|
@ -807,12 +807,11 @@ static void testSignSeal()
|
||||||
sec_status = pEncryptMessage(client.ctxt, 0, crypt, 0);
|
sec_status = pEncryptMessage(client.ctxt, 0, crypt, 0);
|
||||||
ok(sec_status == SEC_E_OK, "EncryptMessage returned %s, not SEC_E_OK.\n",
|
ok(sec_status == SEC_E_OK, "EncryptMessage returned %s, not SEC_E_OK.\n",
|
||||||
getSecError(sec_status));
|
getSecError(sec_status));
|
||||||
todo_wine{
|
|
||||||
ok(!memcmp(crypt->pBuffers[0].pvBuffer, crypt_trailer_client,
|
ok(!memcmp(crypt->pBuffers[0].pvBuffer, crypt_trailer_client,
|
||||||
crypt->pBuffers[0].cbBuffer), "Crypt trailer not as expected.\n");
|
crypt->pBuffers[0].cbBuffer), "Crypt trailer not as expected.\n");
|
||||||
ok(!memcmp(crypt->pBuffers[1].pvBuffer, crypt_message_client,
|
ok(!memcmp(crypt->pBuffers[1].pvBuffer, crypt_message_client,
|
||||||
crypt->pBuffers[1].cbBuffer), "Crypt message not as expected.\n");
|
crypt->pBuffers[1].cbBuffer), "Crypt message not as expected.\n");
|
||||||
}
|
|
||||||
|
|
||||||
data[0].cbBuffer = sizeof(crypt_trailer_server);
|
data[0].cbBuffer = sizeof(crypt_trailer_server);
|
||||||
data[1].cbBuffer = sizeof(crypt_message_server);
|
data[1].cbBuffer = sizeof(crypt_message_server);
|
||||||
|
@ -823,10 +822,10 @@ static void testSignSeal()
|
||||||
todo_wine {
|
todo_wine {
|
||||||
ok(sec_status == SEC_E_OK, "DecryptMessage returned %s, not SEC_E_OK.\n",
|
ok(sec_status == SEC_E_OK, "DecryptMessage returned %s, not SEC_E_OK.\n",
|
||||||
getSecError(sec_status));
|
getSecError(sec_status));
|
||||||
|
}
|
||||||
ok(!memcmp(crypt->pBuffers[1].pvBuffer, message_binary,
|
ok(!memcmp(crypt->pBuffers[1].pvBuffer, message_binary,
|
||||||
crypt->pBuffers[1].cbBuffer),
|
crypt->pBuffers[1].cbBuffer),
|
||||||
"Failed to decrypt message correctly.\n");
|
"Failed to decrypt message correctly.\n");
|
||||||
}
|
|
||||||
|
|
||||||
end:
|
end:
|
||||||
cleanupBuffers(&client);
|
cleanupBuffers(&client);
|
||||||
|
|
|
@ -106,7 +106,7 @@ ULONG ComputeCrc32(const BYTE *pData, INT iLen)
|
||||||
return ~crc;
|
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;
|
MD4_CTX ctx;
|
||||||
BYTE ntlm_hash[16];
|
BYTE ntlm_hash[16];
|
||||||
|
@ -114,7 +114,7 @@ SECURITY_STATUS SECUR32_CreateNTLMv1SessionKey(const char* password, PBYTE sessi
|
||||||
TRACE("(%p, %p)\n", password, session_key);
|
TRACE("(%p, %p)\n", password, session_key);
|
||||||
|
|
||||||
MD4Init(&ctx);
|
MD4Init(&ctx);
|
||||||
MD4Update(&ctx, (const unsigned char*) password, lstrlenA(password));
|
MD4Update(&ctx, (const unsigned char*) password, len);
|
||||||
MD4Final(&ctx);
|
MD4Final(&ctx);
|
||||||
|
|
||||||
memcpy(ntlm_hash, ctx.digest, 0x10);
|
memcpy(ntlm_hash, ctx.digest, 0x10);
|
||||||
|
|
Loading…
Reference in New Issue