rsaenh: Don't reset the salt length after setting a salt for Base and Strong providers.

This commit is contained in:
Bruno Jesus 2015-01-10 08:05:14 -02:00 committed by Alexandre Julliard
parent c0e4759d8d
commit 6bad16363b
2 changed files with 22 additions and 15 deletions

View File

@ -3462,6 +3462,8 @@ BOOL WINAPI RSAENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam
switch (pCryptKey->aiAlgid) { switch (pCryptKey->aiAlgid) {
case CALG_RC2: case CALG_RC2:
case CALG_RC4: case CALG_RC4:
{
KEYCONTAINER *pKeyContainer = get_key_container(pCryptKey->hProv);
if (!pbData) if (!pbData)
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
@ -3474,11 +3476,13 @@ BOOL WINAPI RSAENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam
pbData, 11); pbData, 11);
pCryptKey->dwSaltLen = 11; pCryptKey->dwSaltLen = 11;
setup_key(pCryptKey); setup_key(pCryptKey);
/* Strange but true: salt length reset to 0 after setting /* After setting the salt value if the provider is not base or
* it via KP_SALT. * strong the salt length will be reset. */
*/ if (pKeyContainer->dwPersonality != RSAENH_PERSONALITY_BASE &&
pCryptKey->dwSaltLen = 0; pKeyContainer->dwPersonality != RSAENH_PERSONALITY_STRONG)
pCryptKey->dwSaltLen = 0;
break; break;
}
default: default:
SetLastError(NTE_BAD_KEY); SetLastError(NTE_BAD_KEY);
return FALSE; return FALSE;

View File

@ -62,7 +62,7 @@ static const cryptdata cTestData[4] = {
12,12,16} 12,12,16}
}; };
static int win2k; static int win2k, nt4;
/* /*
* 1. Take the MD5 Hash of the container name (with an extra null byte) * 1. Take the MD5 Hash of the container name (with an extra null byte)
@ -249,7 +249,10 @@ static void test_prov(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
result = CryptGetProvParam(hProv, PP_SIG_KEYSIZE_INC, (BYTE*)&dwInc, &dwLen, 0); result = CryptGetProvParam(hProv, PP_SIG_KEYSIZE_INC, (BYTE*)&dwInc, &dwLen, 0);
if (!result && GetLastError() == NTE_BAD_TYPE) if (!result && GetLastError() == NTE_BAD_TYPE)
{
skip("PP_SIG_KEYSIZE_INC is not supported (win9x or NT)\n"); skip("PP_SIG_KEYSIZE_INC is not supported (win9x or NT)\n");
nt4++;
}
else else
ok(result && dwInc==8, "%08x, %d\n", GetLastError(), dwInc); ok(result && dwInc==8, "%08x, %d\n", GetLastError(), dwInc);
@ -1472,16 +1475,16 @@ static void test_rc2(void)
result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen); result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen);
ok(result, "%08x\n", GetLastError()); ok(result, "%08x\n", GetLastError());
/* Setting the salt also succeeds... */ /* Setting the salt value will not reset the salt length in base or strong providers */
result = CryptSetKeyParam(hKey, KP_SALT, pbData, 0); result = CryptSetKeyParam(hKey, KP_SALT, pbData, 0);
ok(result, "setting salt failed: %08x\n", GetLastError()); ok(result, "setting salt failed: %08x\n", GetLastError());
/* but the resulting salt length is now zero? */
dwLen = 0; dwLen = 0;
result = CryptGetKeyParam(hKey, KP_SALT, NULL, &dwLen, 0); result = CryptGetKeyParam(hKey, KP_SALT, NULL, &dwLen, 0);
ok(result, "%08x\n", GetLastError()); ok(result, "%08x\n", GetLastError());
ok(dwLen == 0 || if (BASE_PROV || STRONG_PROV)
broken(dwLen == 11), /* Win9x/WinMe/NT4 */ ok(dwLen == 11, "expected salt length 11, got %d\n", dwLen);
"unexpected salt length %d\n", dwLen); else
ok(dwLen == 0 || broken(nt4 && dwLen == 11), "expected salt length 0, got %d\n", dwLen);
/* What sizes salt can I set? */ /* What sizes salt can I set? */
salt.pbData = pbData; salt.pbData = pbData;
for (i=0; i<24; i++) for (i=0; i<24; i++)
@ -1719,16 +1722,16 @@ static void test_rc4(void)
result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen); result = CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen);
ok(result, "%08x\n", GetLastError()); ok(result, "%08x\n", GetLastError());
/* Setting the salt also succeeds... */ /* Setting the salt value will not reset the salt length in base or strong providers */
result = CryptSetKeyParam(hKey, KP_SALT, pbData, 0); result = CryptSetKeyParam(hKey, KP_SALT, pbData, 0);
ok(result, "setting salt failed: %08x\n", GetLastError()); ok(result, "setting salt failed: %08x\n", GetLastError());
/* but the resulting salt length is now zero? */
dwLen = 0; dwLen = 0;
result = CryptGetKeyParam(hKey, KP_SALT, NULL, &dwLen, 0); result = CryptGetKeyParam(hKey, KP_SALT, NULL, &dwLen, 0);
ok(result, "%08x\n", GetLastError()); ok(result, "%08x\n", GetLastError());
ok(dwLen == 0 || if (BASE_PROV || STRONG_PROV || nt4)
broken(dwLen == 11), /* Win9x/WinMe/NT4 */ ok(dwLen == 11, "expected salt length 11, got %d\n", dwLen);
"unexpected salt length %d\n", dwLen); else
ok(dwLen == 0 || broken(nt4 && dwLen == 11), "expected salt length 0, got %d\n", dwLen);
/* What sizes salt can I set? */ /* What sizes salt can I set? */
salt.pbData = pbData; salt.pbData = pbData;
for (i=0; i<24; i++) for (i=0; i<24; i++)