Juan Lang : rsaenh: Support setting salt via KP_SALT (resend).

Alexandre Julliard julliard at winehq.org
Wed Mar 31 10:04:49 CDT 2010


Module: wine
Branch: master
Commit: c5a6b7b36674e8b7f7dc687b01773b88fa7d7312
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c5a6b7b36674e8b7f7dc687b01773b88fa7d7312

Author: Juan Lang <juan.lang at 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;




More information about the wine-cvs mailing list