From c5a6b7b36674e8b7f7dc687b01773b88fa7d7312 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Tue, 30 Mar 2010 10:26:48 -0700 Subject: [PATCH] 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 74ad392f2f2..d35805ade25 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 9e17531d1b5..53fc0d69dec 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; -- 2.11.4.GIT