RSAENH_CPGetProvParam

Mounir IDRASSI mounir.idrassi at idrix.fr
Mon May 7 18:07:45 CDT 2007


Hi,
This patch adds support for mandatory parameters in
RSAENH_CPGetProvParam that is missing. 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 9950f15ea6e195370369eedd0a19ce08afc18653 Mon Sep 17 00:00:00 2001
From: Mounir IDRASSI <mounir.idrassi at idrix.fr>
Date: Tue, 8 May 2007 00:01:52 +0200
Subject: rsaenh: fix bug in RSAENH_CPGetProvParam

---
 dlls/rsaenh/rsaenh.c       |   24 ++++++++++++++++++++++++
 dlls/rsaenh/tests/rsaenh.c |   35 ++++++++++++++++++++++++++++++-----
 2 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index f875a12..cb84d06 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,29 @@ 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 = GetVersion();
+            /* for Windows NT, 95,98, Me, return CRYPT_PSTORE | CRYPT_UI_PROMPT | CRYPT_SEC_DESCR
+             * for the others, return CRYPT_SEC_DESCR
+             */
+            if(dwTemp < 0x80000000 && ((dwTemp & 0x000000FF)  != 0x00000004))
+                dwTemp = CRYPT_SEC_DESCR;
+            else
+                dwTemp = CRYPT_PSTORE | CRYPT_UI_PROMPT | 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 2d1b677..8d073ae 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,18 +1557,42 @@ 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());
     result = CryptGetUserKey(prov, AT_SIGNATURE, &key);
     ok(!result && GetLastError() == NTE_NO_KEY,
      "Expected NTE_NO_KEY, got %08x\n", GetLastError());
-
+     
     /* Importing a key exchange blob.. */
     result = CryptImportKey(prov, abPlainPrivateKey, sizeof(abPlainPrivateKey),
      0, 0, &key);
-- 
1.4.4.2



More information about the wine-patches mailing list