Juan Lang : rsaenh: Add more tests of the RC2 key length.

Alexandre Julliard julliard at winehq.org
Thu Oct 22 10:39:55 CDT 2009


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Wed Oct 21 13:33:18 2009 -0700

rsaenh: Add more tests of the RC2 key length.

---

 dlls/advapi32/tests/crypt.c |   84 +++++++++++++++++++++++++++++++++++++++---
 1 files changed, 78 insertions(+), 6 deletions(-)

diff --git a/dlls/advapi32/tests/crypt.c b/dlls/advapi32/tests/crypt.c
index e4b5934..022d3e6 100644
--- a/dlls/advapi32/tests/crypt.c
+++ b/dlls/advapi32/tests/crypt.c
@@ -939,13 +939,13 @@ static const unsigned char key[key_length] =
     { 0xbf, 0xf6, 0x83, 0x4b, 0x3e, 0xa3, 0x23, 0xdd,
       0x96, 0x78, 0x70, 0x8e, 0xa1, 0x9d, 0x3b, 0x40 };
 
-static void hashtest(void)
+static void test_rc2_keylen(void)
 {
     struct KeyBlob
     {
         BLOBHEADER header;
         DWORD key_size;
-        BYTE key_data[key_length];
+        BYTE key_data[2048];
     } key_blob;
 
     HCRYPTPROV provider;
@@ -961,20 +961,92 @@ static void hashtest(void)
     key_blob.header.bVersion = CUR_BLOB_VERSION;
     key_blob.header.reserved = 0;
     key_blob.header.aiKeyAlg = CALG_RC2;
-    key_blob.key_size = key_length;
+    key_blob.key_size = sizeof(key);
     memcpy(key_blob.key_data, key, key_length);
 
+    /* Importing a 16-byte key works with the default provider. */
     SetLastError(0xdeadbeef);
     ret = pCryptImportKey(provider, (BYTE*)&key_blob,
-                      sizeof(BLOBHEADER)+sizeof(DWORD)+key_length,
+                      sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
                       0, CRYPT_IPSEC_HMAC_KEY, &hkey);
     /* CRYPT_IPSEC_HMAC_KEY is not supported on W2K and lower */
     ok(ret ||
        broken(!ret && GetLastError() == NTE_BAD_FLAGS),
-       "CryptImportKey error %u\n", GetLastError());
+       "CryptImportKey error %08x\n", GetLastError());
 
     pCryptDestroyKey(hkey);
     pCryptReleaseContext(provider, 0);
+
+    SetLastError(0xdeadbeef);
+    ret = pCryptAcquireContextA(&provider, NULL, MS_DEF_PROV,
+                                PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
+    ok(ret, "CryptAcquireContext error %08x\n", GetLastError());
+
+    /* Importing a 16-byte key doesn't work with the base provider.. */
+    SetLastError(0xdeadbeef);
+    ret = pCryptImportKey(provider, (BYTE*)&key_blob,
+                          sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
+                          0, 0, &hkey);
+    todo_wine
+    ok(!ret && GetLastError() == NTE_BAD_DATA,
+       "expected NTE_BAD_DATA, got %08x\n", GetLastError());
+    /* but importing an 8-bit (7-byte) key does.. */
+    key_blob.key_size = 7;
+    SetLastError(0xdeadbeef);
+    ret = pCryptImportKey(provider, (BYTE*)&key_blob,
+                          sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
+                          0, 0, &hkey);
+    ok(ret, "CryptAcquireContext error %08x\n", GetLastError());
+    pCryptDestroyKey(hkey);
+    /* as does importing a 16-byte key with the base provider when
+     * CRYPT_IPSEC_HMAC_KEY is specified.
+     */
+    key_blob.key_size = sizeof(key);
+    SetLastError(0xdeadbeef);
+    ret = pCryptImportKey(provider, (BYTE*)&key_blob,
+                          sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
+                          0, CRYPT_IPSEC_HMAC_KEY, &hkey);
+    /* CRYPT_IPSEC_HMAC_KEY is not supported on W2K and lower */
+    ok(ret ||
+       broken(!ret && GetLastError() == NTE_BAD_FLAGS),
+       "CryptImportKey error %08x\n", GetLastError());
+    pCryptDestroyKey(hkey);
+
+    pCryptReleaseContext(provider, 0);
+
+    key_blob.key_size = sizeof(key);
+    SetLastError(0xdeadbeef);
+    ret = pCryptAcquireContextA(&provider, NULL, NULL,
+                                PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
+    ok(ret, "CryptAcquireContext error %08x\n", GetLastError());
+
+    /* Importing a 16-byte key also works with the default provider when
+     * CRYPT_IPSEC_HMAC_KEY is specified.
+     */
+    SetLastError(0xdeadbeef);
+    ret = pCryptImportKey(provider, (BYTE*)&key_blob,
+                          sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
+                          0, CRYPT_IPSEC_HMAC_KEY, &hkey);
+    ok(ret ||
+       broken(!ret && GetLastError() == NTE_BAD_FLAGS),
+       "CryptImportKey error %08x\n", GetLastError());
+    pCryptDestroyKey(hkey);
+
+    /* There is no apparent limit to the size of the input key when
+     * CRYPT_IPSEC_HMAC_KEY is specified.
+     */
+    key_blob.key_size = sizeof(key_blob.key_data);
+    SetLastError(0xdeadbeef);
+    ret = pCryptImportKey(provider, (BYTE*)&key_blob,
+                          sizeof(BLOBHEADER)+sizeof(DWORD)+key_blob.key_size,
+                          0, CRYPT_IPSEC_HMAC_KEY, &hkey);
+    todo_wine
+    ok(ret ||
+       broken(!ret && GetLastError() == NTE_BAD_FLAGS),
+       "CryptImportKey error %08x\n", GetLastError());
+    pCryptDestroyKey(hkey);
+
+    pCryptReleaseContext(provider, 0);
 }
 
 START_TEST(crypt)
@@ -982,7 +1054,7 @@ START_TEST(crypt)
     init_function_pointers();
     if (pCryptAcquireContextA && pCryptReleaseContext)
     {
-	hashtest();
+	test_rc2_keylen();
 	init_environment();
 	test_acquire_context();
 	test_incorrect_api_usage();




More information about the wine-cvs mailing list