rsaenh/tests: Run the tests in the Base and Strong providers too

Bruno Jesus 00cpxxx at gmail.com
Wed Jul 30 14:21:26 CDT 2014


Aside from the Enhanced provider. Little changes were required but the
benefits worth it. Related to bug 16365.
-------------- next part --------------
diff --git a/dlls/rsaenh/tests/rsaenh.c b/dlls/rsaenh/tests/rsaenh.c
index 7106c80..1dfca3c 100644
--- a/dlls/rsaenh/tests/rsaenh.c
+++ b/dlls/rsaenh/tests/rsaenh.c
@@ -30,8 +30,14 @@
 #include "winreg.h"
 
 static HCRYPTPROV hProv;
+static const char *szProviders[] = {MS_ENHANCED_PROV_A, MS_DEF_PROV_A, MS_STRONG_PROV_A};
+static int iProv;
 static const char szContainer[] = "winetest";
-static const char szProvider[] = MS_ENHANCED_PROV_A;
+static const char *szProvider;
+
+#define ENHANCED_PROV (iProv == 0)
+#define BASE_PROV (iProv == 1)
+#define STRONG_PROV (iProv == 2)
 
 typedef struct _ctdatatype {
        unsigned char origstr[32];
@@ -122,10 +128,12 @@ static void trace_hex(BYTE *pbData, DWORD dwLen) {
 }
 */
 
-static BOOL init_base_environment(DWORD dwKeyFlags)
+static BOOL init_base_environment(const char *provider, DWORD dwKeyFlags)
 {
     HCRYPTKEY hKey;
     BOOL result;
+
+    if (provider) szProvider = provider;
         
     pCryptDuplicateHash = (void *)GetProcAddress(GetModuleHandleA("advapi32.dll"), "CryptDuplicateHash");
         
@@ -901,6 +909,9 @@ static void test_des(void)
     static const BYTE des_old_behavior[16] = {
         0xb0, 0xfd, 0x11, 0x69, 0x76, 0xb1, 0xa1, 0x03,
         0xf7, 0xbc, 0x23, 0xaa, 0xd4, 0xc1, 0xc9, 0x55 };
+    static const BYTE des_old_strong[16] = {
+        0x9b, 0xc1, 0x2a, 0xec, 0x4a, 0xf9, 0x0f, 0x14,
+        0x0a, 0xed, 0xf6, 0xd3, 0xdc, 0xad, 0xf7, 0x0c };
     int i;
 
     result = derive_key(CALG_DES, &hKey, 0);
@@ -1001,8 +1012,9 @@ static void test_des(void)
     dwLen = 13;
     result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwLen, 16);
     ok(result, "%08x\n", GetLastError());
-
-    ok(!memcmp(pbData, des, sizeof(des)) || broken(!memcmp(pbData, des_old_behavior, sizeof(des))) /* <= 2000 */,
+    ok(!memcmp(pbData, des, sizeof(des)) || broken(
+    !memcmp(pbData, des_old_behavior, sizeof(des)) ||
+    (STRONG_PROV && !memcmp(pbData, des_old_strong, sizeof(des)))) /* <= 2000 */,
        "DES encryption failed!\n");
 
     result = CryptDestroyKey(hKey);
@@ -1337,8 +1349,11 @@ static void test_rc2(void)
         0xc0, 0x9a, 0xe4, 0x2f, 0x0a, 0x47, 0x67, 0x11,
         0xfb, 0x18, 0x87, 0xce, 0x0c, 0x75, 0x07, 0xb1 };
     static const BYTE rc2_128_encrypted[] = {
-        0x82,0x81,0xf7,0xff,0xdd,0xd7,0x88,0x8c,0x2a,0x2a,0xc0,0xce,0x4c,0x89,
-        0xb6,0x66 };
+        0x82,0x81,0xf7,0xff,0xdd,0xd7,0x88,0x8c,
+        0x2a,0x2a,0xc0,0xce,0x4c,0x89,0xb6,0x66 };
+    static const BYTE rc2_40def_encrypted[] = {
+        0x23,0xc8,0x70,0x13,0x42,0x2e,0xa8,0x98,
+        0x5c,0xdf,0x7a,0x9b,0xea,0xdb,0x96,0x1b };
     HCRYPTHASH hHash;
     HCRYPTKEY hKey;
     BOOL result;
@@ -1511,13 +1526,28 @@ static void test_rc2(void)
 
         dwKeyLen = 128;
         result = CryptSetKeyParam(hKey, KP_EFFECTIVE_KEYLEN, (LPBYTE)&dwKeyLen, 0);
-        ok(result, "%d\n", GetLastError());
+        if (!BASE_PROV)
+            ok(result, "expected success, got error 0x%08X\n", GetLastError());
+        else
+            todo_wine
+            ok(!result, "expected error\n");
 
         dwLen = sizeof(dwKeyLen);
         CryptGetKeyParam(hKey, KP_KEYLEN, (BYTE *)&dwKeyLen, &dwLen, 0);
         ok(dwKeyLen == 56, "%d (%08x)\n", dwKeyLen, GetLastError());
         CryptGetKeyParam(hKey, KP_EFFECTIVE_KEYLEN, (BYTE *)&dwKeyLen, &dwLen, 0);
-        ok(dwKeyLen == 128, "%d (%08x)\n", dwKeyLen, GetLastError());
+        /* Remove IF when fixed */
+        if(BASE_PROV)
+        {
+        todo_wine
+        ok((!BASE_PROV && dwKeyLen == 128) || (BASE_PROV && dwKeyLen == 40),
+           "%d (%08x)\n", dwKeyLen, GetLastError());
+        }
+        else
+        {
+        ok((!BASE_PROV && dwKeyLen == 128) || (BASE_PROV && dwKeyLen == 40),
+           "%d (%08x)\n", dwKeyLen, GetLastError());
+        }
 
         result = CryptDestroyHash(hHash);
         ok(result, "%08x\n", GetLastError());
@@ -1526,8 +1556,18 @@ static void test_rc2(void)
         result = CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, 24);
         ok(result, "%08x\n", GetLastError());
 
-        ok(!memcmp(pbData, rc2_128_encrypted, sizeof(rc2_128_encrypted)),
-                "RC2 encryption failed!\n");
+        /* Remove IF when fixed */
+        if(BASE_PROV)
+        {
+        todo_wine
+        ok(!memcmp(pbData, !BASE_PROV ? rc2_128_encrypted : rc2_40def_encrypted,
+           sizeof(rc2_128_encrypted)), "RC2 encryption failed!\n");
+        }
+        else
+        {
+        ok(!memcmp(pbData, !BASE_PROV ? rc2_128_encrypted : rc2_40def_encrypted,
+           sizeof(rc2_128_encrypted)), "RC2 encryption failed!\n");
+        }
 
         /* Oddly enough this succeeds, though it should have no effect */
         dwKeyLen = 40;
@@ -1795,8 +1835,9 @@ static void test_import_private(void)
 
     dwLen = (DWORD)sizeof(abEncryptedMessage);
     result = CryptDecrypt(hSessionKey, 0, TRUE, 0, abEncryptedMessage, &dwLen);
-    ok(result && dwLen == 12 && !memcmp(abEncryptedMessage, "Wine rocks!",12), 
-       "%08x, len: %d\n", GetLastError(), dwLen);
+    ok(result, "%08x\n", GetLastError());
+    ok(dwLen == 12, "expected 12, got %d\n", dwLen);
+    ok(!memcmp(abEncryptedMessage, "Wine rocks!", 12), "decrypt failed\n");
     CryptDestroyKey(hSessionKey);
     
     if (!derive_key(CALG_RC4, &hSessionKey, 56)) return;
@@ -2132,6 +2173,11 @@ static void test_rsa_encrypt(void)
 
     dwLen = 12;
     result = CryptEncrypt(hRSAKey, 0, TRUE, 0, NULL, &dwLen, (DWORD)sizeof(abData));
+    if(!ENHANCED_PROV && !result && GetLastError() == NTE_BAD_KEY)
+    {
+        CryptDestroyKey(hRSAKey);
+        return;
+    }
     ok(result, "CryptEncrypt failed: %08x\n", GetLastError());
     ok(dwLen == 128, "Unexpected length %d\n", dwLen);
     dwLen = 12;
@@ -3123,7 +3169,7 @@ static void test_key_permissions(void)
     BOOL result;
 
     /* Create keys that are exportable */
-    if (!init_base_environment(CRYPT_EXPORTABLE))
+    if (!init_base_environment(NULL, CRYPT_EXPORTABLE))
         return;
 
     result = CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hKey1);
@@ -3576,27 +3622,37 @@ err:
 
 START_TEST(rsaenh)
 {
-    if (!init_base_environment(0))
-        return;
-    test_prov();
-    test_gen_random();
-    test_hashes();
-    test_rc4();
-    test_rc2();
-    test_des();
-    test_3des112();
-    test_3des();
-    test_hmac();
-    test_mac();
-    test_block_cipher_modes();
-    test_import_private();
-    test_verify_signature();
-    test_rsa_encrypt();
-    test_import_export();
-    test_import_hmac();
-    test_enum_container();
-    test_key_derivation("RSA");
-    clean_up_base_environment();
+    for (iProv = 0; iProv < sizeof(szProviders) / sizeof(szProviders[0]); iProv++)
+    {
+        if (!init_base_environment(szProviders[iProv], 0))
+            return;
+        trace("Testing '%s'\n", szProviders[iProv]);
+        test_prov();
+        test_gen_random();
+        test_hashes();
+        test_rc4();
+        test_rc2();
+        test_des();
+        if(!BASE_PROV)
+        {
+            test_3des112();
+            test_3des();
+        }
+        if(ENHANCED_PROV)
+        {
+            test_import_private();
+        }
+        test_hmac();
+        test_mac();
+        test_block_cipher_modes();
+        test_verify_signature();
+        test_rsa_encrypt();
+        test_import_export();
+        test_import_hmac();
+        test_enum_container();
+        if(!BASE_PROV) test_key_derivation(STRONG_PROV ? "STRONG" : "ENH");
+        clean_up_base_environment();
+    }
     test_key_permissions();
     test_key_initialization();
     test_schannel_provider();


More information about the wine-patches mailing list