Juan Lang : rsaenh: Fix CryptSetKeyParam for KP_PERMISSIONS.

Alexandre Julliard julliard at winehq.org
Thu Jan 29 09:14:56 CST 2009


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Wed Jan 28 20:31:35 2009 -0800

rsaenh: Fix CryptSetKeyParam for KP_PERMISSIONS.

---

 dlls/rsaenh/rsaenh.c       |   20 +++++++++++++++++++-
 dlls/rsaenh/tests/rsaenh.c |    4 ----
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index 28603c6..bbccac7 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -2824,8 +2824,26 @@ BOOL WINAPI RSAENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam
             return TRUE;
 
         case KP_PERMISSIONS:
-            pCryptKey->dwPermissions = *(DWORD*)pbData;
+        {
+            DWORD perms = *(DWORD *)pbData;
+
+            if ((perms & CRYPT_EXPORT) &&
+                !(pCryptKey->dwPermissions & CRYPT_EXPORT))
+            {
+                SetLastError(NTE_BAD_DATA);
+                return FALSE;
+            }
+            else if (!(perms & CRYPT_EXPORT) &&
+                (pCryptKey->dwPermissions & CRYPT_EXPORT))
+            {
+                /* Clearing the export permission appears to be ignored,
+                 * see tests.
+                 */
+                perms |= CRYPT_EXPORT;
+            }
+            pCryptKey->dwPermissions = perms;
             return TRUE;
+        }
 
         case KP_IV:
             memcpy(pCryptKey->abInitVector, pbData, pCryptKey->dwBlockLen);
diff --git a/dlls/rsaenh/tests/rsaenh.c b/dlls/rsaenh/tests/rsaenh.c
index 83aad70..e13bc1c 100644
--- a/dlls/rsaenh/tests/rsaenh.c
+++ b/dlls/rsaenh/tests/rsaenh.c
@@ -1581,7 +1581,6 @@ static void test_rsa_encrypt(void)
     dwVal |= CRYPT_EXPORT;
     SetLastError(0xdeadbeef);
     result = CryptSetKeyParam(hRSAKey, KP_PERMISSIONS, (BYTE *)&dwVal, 0);
-    todo_wine
     ok(!result && GetLastError() == NTE_BAD_DATA,
         "expected NTE_BAD_DATA, got %08x\n", GetLastError());
 
@@ -1614,7 +1613,6 @@ static void test_rsa_encrypt(void)
     dwVal |= CRYPT_EXPORT;
     SetLastError(0xdeadbeef);
     result = CryptSetKeyParam(hRSAKey, KP_PERMISSIONS, (BYTE *)&dwVal, 0);
-    todo_wine
     ok(!result && GetLastError() == NTE_BAD_DATA,
         "expected NTE_BAD_DATA, got %08x\n", GetLastError());
 
@@ -2157,7 +2155,6 @@ static void test_key_permissions(void)
     dwLen = sizeof(DWORD);
     result = CryptGetKeyParam(hKey1, KP_PERMISSIONS, (BYTE*)&dwVal, &dwLen, 0);
     ok(result, "%08x\n", GetLastError());
-    todo_wine
     ok(dwVal ==
         (CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_EXPORT|CRYPT_DECRYPT|CRYPT_ENCRYPT),
         "expected CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_EXPORT|CRYPT_DECRYPT|CRYPT_ENCRYPT,"
@@ -2178,7 +2175,6 @@ static void test_key_permissions(void)
     dwLen = sizeof(DWORD);
     result = CryptGetKeyParam(hKey2, KP_PERMISSIONS, (BYTE*)&dwVal, &dwLen, 0);
     ok(result, "%08x\n", GetLastError());
-    todo_wine
     ok(dwVal ==
         (CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_EXPORT|CRYPT_DECRYPT|CRYPT_ENCRYPT),
         "expected CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_EXPORT|CRYPT_DECRYPT|CRYPT_ENCRYPT,"




More information about the wine-cvs mailing list