rsaenh: Fix the accepted RC2 key length, based on a test case by Dan Kegel.
Dmitry Timoshkov
dmitry at codeweavers.com
Tue Oct 13 01:46:59 CDT 2009
dlls/rsaenh/rc2.c,rc2_setup() accepts key length from 5 to 128, while
the provider description has the limits set to 40-56.
This patch fixes the problem reported in the bug 20337.
---
dlls/advapi32/tests/crypt.c | 48 ++++++++++++++++++++++++++++++++++++++++--
dlls/rsaenh/rsaenh.c | 2 +-
include/wincrypt.h | 3 ++
3 files changed, 49 insertions(+), 4 deletions(-)
diff --git a/dlls/advapi32/tests/crypt.c b/dlls/advapi32/tests/crypt.c
index 4ce8907..3b60aea 100644
--- a/dlls/advapi32/tests/crypt.c
+++ b/dlls/advapi32/tests/crypt.c
@@ -933,17 +933,59 @@ static void test_machine_guid(void)
RegCloseKey(key);
}
+#define key_length 16
+
+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)
+{
+ struct KeyBlob
+ {
+ BLOBHEADER header;
+ DWORD key_size;
+ BYTE key_data[key_length];
+ } key_blob;
+
+ HCRYPTPROV provider;
+ HCRYPTKEY hkey;
+ BOOL ret;
+
+ SetLastError(0xdeadbeef);
+ ret = pCryptAcquireContextA(&provider, NULL, NULL,
+ PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
+ ok(ret, "CryptAcquireContext error %u\n", GetLastError());
+
+ key_blob.header.bType = PLAINTEXTKEYBLOB;
+ key_blob.header.bVersion = CUR_BLOB_VERSION;
+ key_blob.header.reserved = 0;
+ key_blob.header.aiKeyAlg = CALG_RC2;
+ key_blob.key_size = key_length;
+ memcpy(key_blob.key_data, key, key_length);
+
+ SetLastError(0xdeadbeef);
+ ret = pCryptImportKey(provider, (BYTE*)&key_blob,
+ sizeof(BLOBHEADER)+sizeof(DWORD)+key_length,
+ 0, CRYPT_IPSEC_HMAC_KEY, &hkey);
+ ok(ret, "CryptImportKey error %u\n", GetLastError());
+
+ pCryptReleaseContext(provider, 0);
+}
+
START_TEST(crypt)
{
- init_function_pointers();
- if(pCryptAcquireContextA && pCryptReleaseContext) {
+ init_function_pointers();
+ if (pCryptAcquireContextA && pCryptReleaseContext)
+ {
+ hashtest();
init_environment();
test_acquire_context();
test_incorrect_api_usage();
test_verify_sig();
test_machine_guid();
clean_up_environment();
- }
+ }
test_enum_providers();
test_enum_provider_types();
diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index 8ae9659..04048cf 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -159,7 +159,7 @@ typedef struct tagKEYCONTAINER
static const PROV_ENUMALGS_EX aProvEnumAlgsEx[5][RSAENH_MAX_ENUMALGS+1] =
{
{
- {CALG_RC2, 40, 40, 56,0, 4,"RC2", 24,"RSA Data Security's RC2"},
+ {CALG_RC2, 40, 5, 128,0, 4,"RC2", 24,"RSA Data Security's RC2"},
{CALG_RC4, 40, 40, 56,0, 4,"RC4", 24,"RSA Data Security's RC4"},
{CALG_DES, 56, 56, 56,0, 4,"DES", 31,"Data Encryption Standard (DES)"},
{CALG_SHA, 160,160, 160,CRYPT_FLAG_SIGNING, 6,"SHA-1", 30,"Secure Hash Algorithm (SHA-1)"},
diff --git a/include/wincrypt.h b/include/wincrypt.h
index 0aef72e..56a0155 100644
--- a/include/wincrypt.h
+++ b/include/wincrypt.h
@@ -80,6 +80,9 @@ typedef struct _SCHANNEL_ALG {
DWORD dwReserved;
} SCHANNEL_ALG, *PSCHANNEL_ALG;
+
+#define CRYPT_IPSEC_HMAC_KEY 0x0100
+
typedef struct _HMAC_INFO {
ALG_ID HashAlgid;
BYTE* pbInnerString;
--
1.6.4.2
More information about the wine-patches
mailing list