Module: wine Branch: master Commit: 0eb9ae17fe8df7c8146103926c8139542f7a460f URL: http://source.winehq.org/git/wine.git/?a=commit;h=0eb9ae17fe8df7c8146103926c...
Author: Juan Lang juan.lang@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,"