rsaenh: add support for mandatory parameters to RSAENH_CPGetProvParam

Mounir IDRASSI mounir.idrassi at idrix.fr
Wed May 9 05:16:52 CDT 2007


Hi,
This patch adds support for mandatory parameters in
RSAENH_CPGetProvParam. It also adds tests for them.
The mandatory parameters are: PP_UNIQUE_CONTAINER, PP_PROVTYPE,
PP_KEYSPEC, PP_KEYSET_TYPE, PP_KEYSTORAGE.

Mounir IDRASSI
IDRIX - Cryptography and IT Security Experts
http://www.idrix.fr

-------------- next part --------------
>From fa38a8c0c663ad11e04cecdbff82857153bd39b6 Mon Sep 17 00:00:00 2001
From: Mounir IDRASSI <mounir.idrassi at idrix.fr>
Date: Wed, 9 May 2007 03:33:45 +0200
Subject: rsaenh: fix bug in RSAENH_CPGetProvParam

---
 dlls/rsaenh/rsaenh.c       |   17 +++++++++++++++++
 dlls/rsaenh/tests/rsaenh.c |   33 +++++++++++++++++++++++++++++----
 2 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index cfa230c..47dd2ea 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -2907,6 +2907,7 @@ BOOL WINAPI RSAENH_CPGetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData,
     switch (dwParam) 
     {
         case PP_CONTAINER:
+        case PP_UNIQUE_CONTAINER:/* MSDN says we can return the same value as PP_CONTAINER */				
             return copy_param(pbData, pdwDataLen, (CONST BYTE*)pKeyContainer->szName, 
                               strlen(pKeyContainer->szName)+1);
 
@@ -2914,6 +2915,22 @@ BOOL WINAPI RSAENH_CPGetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData,
             return copy_param(pbData, pdwDataLen, (CONST BYTE*)pKeyContainer->szProvName, 
                               strlen(pKeyContainer->szProvName)+1);
 
+        case PP_PROVTYPE:
+            dwTemp = PROV_RSA_FULL;
+            return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwTemp, sizeof(dwTemp));
+
+        case PP_KEYSPEC:
+            dwTemp = AT_SIGNATURE | AT_KEYEXCHANGE;
+            return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwTemp, sizeof(dwTemp));
+
+        case PP_KEYSET_TYPE:
+            dwTemp = pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET;
+            return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwTemp, sizeof(dwTemp));
+
+        case PP_KEYSTORAGE:
+            dwTemp = CRYPT_SEC_DESCR;
+            return copy_param(pbData, pdwDataLen, (CONST BYTE*)&dwTemp, sizeof(dwTemp));
+
         case PP_SIG_KEYSIZE_INC:
         case PP_KEYX_KEYSIZE_INC:
             dwTemp = 8;
diff --git a/dlls/rsaenh/tests/rsaenh.c b/dlls/rsaenh/tests/rsaenh.c
index b51a0a5..a0018f5 100644
--- a/dlls/rsaenh/tests/rsaenh.c
+++ b/dlls/rsaenh/tests/rsaenh.c
@@ -1480,7 +1480,8 @@ static void test_null_provider(void)
     HCRYPTPROV prov;
     HCRYPTKEY key;
     BOOL result;
-    DWORD keySpec, dataLen;
+    DWORD keySpec, dataLen,dwParam;
+    char szName[MAX_PATH];
 
     result = CryptAcquireContext(NULL, szContainer, NULL, 0, 0);
     ok(!result && GetLastError() == NTE_BAD_PROV_TYPE,
@@ -1556,11 +1557,35 @@ static void test_null_provider(void)
      CRYPT_NEWKEYSET);
     ok(result, "CryptAcquireContext failed: %08x\n", GetLastError());
     if (!result) return;
+    /* Test provider parameters getter */
+    dataLen = sizeof(dwParam);
+    result = CryptGetProvParam(prov, PP_PROVTYPE, (LPBYTE)&dwParam, &dataLen, 0);
+    ok(result && dataLen == sizeof(dwParam) && dwParam == PROV_RSA_FULL,
+        "Expected PROV_RSA_FULL, got 0x%08X\n",dwParam);
+    dataLen = sizeof(dwParam);
+    result = CryptGetProvParam(prov, PP_KEYSET_TYPE, (LPBYTE)&dwParam, &dataLen, 0);
+    ok(result && dataLen == sizeof(dwParam) && dwParam == 0,
+        "Expected 0, got 0x%08X\n",dwParam);
+    dataLen = sizeof(dwParam);
+    result = CryptGetProvParam(prov, PP_KEYSTORAGE, (LPBYTE)&dwParam, &dataLen, 0);
+    ok(result && dataLen == sizeof(dwParam) && (dwParam & CRYPT_SEC_DESCR),
+        "Expected CRYPT_SEC_DESCR to be set, got 0x%08X\n",dwParam);    
     dataLen = sizeof(keySpec);
     result = CryptGetProvParam(prov, PP_KEYSPEC, (LPBYTE)&keySpec, &dataLen, 0);
-    if (result)
-        ok(keySpec == (AT_KEYEXCHANGE | AT_SIGNATURE),
-         "Expected AT_KEYEXCHANGE | AT_SIGNATURE, got %08x\n", keySpec);
+    ok(result && keySpec == (AT_KEYEXCHANGE | AT_SIGNATURE),
+        "Expected AT_KEYEXCHANGE | AT_SIGNATURE, got %08x\n", keySpec);
+    /* PP_CONTAINER parameter */
+    dataLen = sizeof(szName);
+    result = CryptGetProvParam(prov, PP_CONTAINER, (LPBYTE)szName, &dataLen, 0);    
+    ok(result && dataLen == strlen(szContainer)+1 && strcmp(szContainer,szName) == 0,
+        "failed getting PP_CONTAINER. result = %s. Error 0x%08X. returned length = %d\n",
+        (result)? "TRUE":"FALSE",GetLastError(),dataLen);
+    /* PP_UNIQUE_CONTAINER parameter */
+    dataLen = sizeof(szName);    
+    result = CryptGetProvParam(prov, PP_UNIQUE_CONTAINER, (LPBYTE)szName, &dataLen, 0);    
+    ok(result && dataLen == strlen(szContainer)+1 && strcmp(szContainer,szName) == 0,
+        "failed getting PP_CONTAINER. result = %s. Error 0x%08X. returned length = %d\n",
+        (result)? "TRUE":"FALSE",GetLastError(),dataLen);   
     result = CryptGetUserKey(prov, AT_KEYEXCHANGE, &key);
     ok(!result && GetLastError() == NTE_NO_KEY,
      "Expected NTE_NO_KEY, got %08x\n", GetLastError());
-- 
1.4.4.2



More information about the wine-patches mailing list