Module: wine Branch: master Commit: ea1f8c7ad86e21603244180db10687e1cf3b6ba5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ea1f8c7ad86e21603244180db1...
Author: Vijay Kiran Kamuju infyquest@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(); }