From d3c482250a8232e9657ecefb3e61fff0194e3fbe Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Tue, 13 Oct 2009 19:25:31 +0900 Subject: [PATCH] rsaenh: Fix the accepted RC2 key length, based on a test case by Dan Kegel. --- dlls/advapi32/tests/crypt.c | 49 ++++++++++++++++++++++++++++++++++--- dlls/rsaenh/rsaenh.c | 2 +- include/wincrypt.h | 3 +++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/dlls/advapi32/tests/crypt.c b/dlls/advapi32/tests/crypt.c index 4ce89078f84..08c53f00424 100644 --- a/dlls/advapi32/tests/crypt.c +++ b/dlls/advapi32/tests/crypt.c @@ -933,17 +933,60 @@ 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()); + + pCryptDestroyKey(hkey); + 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 8ae96593e19..04048cf0120 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 0aef72e82c4..56a0155ef36 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;