Vijay Kiran Kamuju : rsaenh: Add tests for RSA_AES provider.

Alexandre Julliard julliard at winehq.org
Wed Nov 21 07:47:43 CST 2007


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

Author: Vijay Kiran Kamuju <infyquest at gmail.com>
Date:   Tue Nov 20 16:56:15 2007 -0600

rsaenh: Add tests for RSA_AES provider.

---

 dlls/rsaenh/tests/rsaenh.c |  139 ++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 134 insertions(+), 5 deletions(-)

diff --git a/dlls/rsaenh/tests/rsaenh.c b/dlls/rsaenh/tests/rsaenh.c
index a8c8c4f..38a28bf 100644
--- a/dlls/rsaenh/tests/rsaenh.c
+++ b/dlls/rsaenh/tests/rsaenh.c
@@ -2,6 +2,8 @@
  * Unit tests for rsaenh functions
  *
  * Copyright (c) 2004 Michael Jung
+ * Copyright (c) 2006 Juan Lang
+ * Copyright (c) 2007 Vijay Kiran Kamuju
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -83,7 +85,7 @@ static void trace_hex(BYTE *pbData, DWORD dwLen) {
 }
 */
 
-static int init_environment(void)
+static int init_base_environment(void)
 {
     HCRYPTKEY hKey;
     BOOL result;
@@ -100,7 +102,7 @@ static int init_environment(void)
         ok(GetLastError()==NTE_BAD_KEYSET, "%08x\n", GetLastError());
         if (GetLastError()!=NTE_BAD_KEYSET) return 0;
         result = CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, 
-                                    CRYPT_NEWKEYSET);
+                                     CRYPT_NEWKEYSET);
         ok(result, "%08x\n", GetLastError());
         if (!result) return 0;
         result = CryptGenKey(hProv, AT_KEYEXCHANGE, 0, &hKey);
@@ -113,7 +115,7 @@ static int init_environment(void)
     return 1;
 }
 
-static void clean_up_environment(void)
+static void clean_up_base_environment(void)
 {
     BOOL result;
 
@@ -123,6 +125,61 @@ static void clean_up_environment(void)
     CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
 }
 
+static int init_aes_environment(void)
+{
+    HCRYPTKEY hKey;
+    BOOL result;
+
+    pCryptDuplicateHash = (void *)GetProcAddress(GetModuleHandleA("advapi32.dll"), "CryptDuplicateHash");
+
+    hProv = (HCRYPTPROV)INVALID_HANDLE_VALUE;
+
+    /* we are using NULL as provider name for RSA_AES provider as the provider
+     * names are different in Windows XP and Vista. Its different as to what
+     * its defined in the SDK on Windows XP.
+     * This provider is available on Windows XP, Windows 2003 and Vista.      */
+
+    result = CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
+    todo_wine {
+    ok(!result && GetLastError()==NTE_BAD_FLAGS, "%d, %08x\n", result, GetLastError());
+    }
+
+    if (!CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_AES, 0))
+    {
+        todo_wine {
+        ok(GetLastError()==NTE_BAD_KEYSET, "%08x\n", GetLastError());
+        }
+        if (GetLastError()!=NTE_BAD_KEYSET) return 0;
+        result = CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_AES,
+                                     CRYPT_NEWKEYSET);
+        todo_wine {
+        ok(result, "%08x\n", GetLastError());
+        }
+        if (!result) return 0;
+        result = CryptGenKey(hProv, AT_KEYEXCHANGE, 0, &hKey);
+        todo_wine {
+        ok(result, "%08x\n", GetLastError());
+        }
+        if (result) CryptDestroyKey(hKey);
+        result = CryptGenKey(hProv, AT_SIGNATURE, 0, &hKey);
+        todo_wine {
+        ok(result, "%08x\n", GetLastError());
+        }
+        if (result) CryptDestroyKey(hKey);
+    }
+    return 1;
+}
+
+static void clean_up_aes_environment(void)
+{
+    BOOL result;
+
+    result = CryptReleaseContext(hProv, 1);
+    todo_wine ok(!result && GetLastError()==NTE_BAD_FLAGS, "%08x\n", GetLastError());
+
+    CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_AES, CRYPT_DELETEKEYSET);
+}
+
 static void test_prov(void) 
 {
     BOOL result;
@@ -586,6 +643,72 @@ static void test_3des(void)
     ok(result, "%08x\n", GetLastError());
 }
 
+static void test_aes(int keylen)
+{
+    HCRYPTKEY hKey;
+    BOOL result;
+    DWORD dwLen;
+    unsigned char pbData[16];
+    int i;
+
+    switch (keylen)
+    {
+        case 256:
+            result = derive_key(CALG_AES_256, &hKey, 0);
+            break;
+        case 192:
+            result = derive_key(CALG_AES_192, &hKey, 0);
+            break;
+        default:
+        case 128:
+            result = derive_key(CALG_AES_128, &hKey, 0);
+            break;
+    }
+    if (!result) return;
+
+    for (i=0; i<sizeof(pbData); i++) pbData[i] = (unsigned char)i;
+
+    dwLen = 13;
+    result = CryptEncrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, pbData, &dwLen, 16);
+    todo_wine {
+    ok(result, "%08x\n", GetLastError());
+    }
+
+    result = CryptDecrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, pbData, &dwLen);
+    todo_wine {
+    ok(result, "%08x\n", GetLastError());
+    }
+
+    for (i=0; i<4; i++)
+    {
+      memcpy(pbData,cTestData[i].origstr,cTestData[i].strlen);
+
+      dwLen = cTestData[i].enclen;
+      result = CryptEncrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, pbData, &dwLen, cTestData[i].buflen);
+      todo_wine {
+      ok(result, "%08x\n", GetLastError());
+      ok(dwLen==cTestData[i].buflen,"length incorrect, got %d, expected %d\n",dwLen,cTestData[i].buflen);
+      }
+
+      result = CryptDecrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, pbData, &dwLen);
+      todo_wine {
+      ok(result, "%08x\n", GetLastError());
+      ok(dwLen==cTestData[i].enclen,"length incorrect, got %d, expected %d\n",dwLen,cTestData[i].enclen);
+      ok(memcmp(pbData,cTestData[i].decstr,cTestData[1].enclen)==0,"decryption incorrect %d\n",i);
+      if((dwLen != cTestData[i].enclen) ||
+         memcmp(pbData,cTestData[i].decstr,cTestData[i].enclen))
+      {
+          printBytes("expected",cTestData[i].decstr,cTestData[i].strlen);
+          printBytes("got",pbData,dwLen);
+      }
+      }
+    }
+    result = CryptDestroyKey(hKey);
+    todo_wine {
+    ok(result, "%08x\n", GetLastError());
+    }
+}
+
 static void test_rc2(void)
 {
     static const BYTE rc2encrypted[16] = { 
@@ -1881,7 +2004,7 @@ static void test_null_provider(void)
 
 START_TEST(rsaenh)
 {
-    if (!init_environment()) 
+    if (!init_base_environment())
         return;
     test_prov();
     test_gen_random();
@@ -1899,7 +2022,13 @@ START_TEST(rsaenh)
     test_rsa_encrypt();
     test_import_export();
     test_enum_container();
-    clean_up_environment();
+    clean_up_base_environment();
     test_schannel_provider();
     test_null_provider();
+    if (!init_aes_environment())
+        return;
+    test_aes(128);
+    test_aes(192);
+    test_aes(256);
+    clean_up_aes_environment();
 }




More information about the wine-cvs mailing list