Module: wine Branch: master Commit: c5a6b7b36674e8b7f7dc687b01773b88fa7d7312 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c5a6b7b36674e8b7f7dc687b01...
Author: Juan Lang juan.lang@gmail.com Date: Tue Mar 30 10:26:48 2010 -0700
rsaenh: Support setting salt via KP_SALT (resend).
---
dlls/rsaenh/rsaenh.c | 27 +++++++++++++++++++++++++++ dlls/rsaenh/tests/rsaenh.c | 3 --- 2 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c index 74ad392..d35805a 100644 --- a/dlls/rsaenh/rsaenh.c +++ b/dlls/rsaenh/rsaenh.c @@ -3354,6 +3354,33 @@ BOOL WINAPI RSAENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam setup_key(pCryptKey); return TRUE;
+ case KP_SALT: + switch (pCryptKey->aiAlgid) { + case CALG_RC2: + case CALG_RC4: + if (!pbData) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + /* MSDN: the base provider always sets eleven bytes of + * salt value. + */ + memcpy(pCryptKey->abKeyValue + pCryptKey->dwKeyLen, + pbData, 11); + pCryptKey->dwSaltLen = 11; + setup_key(pCryptKey); + /* Strange but true: salt length reset to 0 after setting + * it via KP_SALT. + */ + pCryptKey->dwSaltLen = 0; + break; + default: + SetLastError(NTE_BAD_KEY); + return FALSE; + } + return TRUE; + case KP_SALT_EX: { CRYPT_INTEGER_BLOB *blob = (CRYPT_INTEGER_BLOB *)pbData; diff --git a/dlls/rsaenh/tests/rsaenh.c b/dlls/rsaenh/tests/rsaenh.c index 9e17531..53fc0d6 100644 --- a/dlls/rsaenh/tests/rsaenh.c +++ b/dlls/rsaenh/tests/rsaenh.c @@ -986,13 +986,11 @@ static void test_rc2(void)
/* Setting the salt also succeeds... */ result = CryptSetKeyParam(hKey, KP_SALT, pbData, 0); - todo_wine ok(result, "setting salt failed: %08x\n", GetLastError()); /* but the resulting salt length is now zero? */ dwLen = 0; result = CryptGetKeyParam(hKey, KP_SALT, NULL, &dwLen, 0); ok(result, "%08x\n", GetLastError()); - todo_wine ok(dwLen == 0, "unexpected salt length %d\n", dwLen); /* What sizes salt can I set? */ salt.pbData = pbData; @@ -1154,7 +1152,6 @@ static void test_rc4(void)
/* Setting the salt also succeeds... */ result = CryptSetKeyParam(hKey, KP_SALT, pbData, 0); - todo_wine ok(result, "setting salt failed: %08x\n", GetLastError()); /* but the resulting salt length is now zero? */ dwLen = 0;