Hi, I have implemented the AES support for rsaenh.dll Please test the attached patch.
Thanks, VJ On Sep 24, 2007 12:04 PM, Rob Seger <[EMAIL PROTECTED]> wrote: > Sweet! Thanks! > > I'll see what I can do and probably end up asking some more specific > questions later ;) > > Rob > > > On 9/24/07, Juan Lang <[EMAIL PROTECTED]> wrote: > > > I found the wincrypt.h #define line that says what type 024 > > > is: #define PROV_RSA_AES 24. > > > > In that case, it should be straightforward enough to add an AES > > implementation to Wine's rsaenh.dll. There's free (as in speech) > > source available for it. Take a look at rsaenh.c and implglue.c in > > dlls/rsaenh; you'd want to add it as a new block cipher. > > > > --Juan > > > > >
From 34eb26f43746b68b054897f9c68eba27027668ff Mon Sep 17 00:00:00 2001 From: Vijay Kiran Kamuju <[EMAIL PROTECTED]> Date: Fri, 9 Nov 2007 14:05:26 -0600 Subject: [PATCH] Add AES support to rsaenh.dll with tests --- dlls/rsaenh/Makefile.in | 1 + dlls/rsaenh/implglue.c | 29 ++++++++++++++++++++++ dlls/rsaenh/implglue.h | 1 + dlls/rsaenh/rsaenh.c | 31 +++++++++++++++++++++++- dlls/rsaenh/tests/rsaenh.c | 57 +++++++++++++++++++++++++++++++++++++++++++- dlls/rsaenh/tomcrypt.h | 9 +++++++ 6 files changed, 126 insertions(+), 2 deletions(-) diff --git a/dlls/rsaenh/Makefile.in b/dlls/rsaenh/Makefile.in index e6b9470..7c5a054 100644 --- a/dlls/rsaenh/Makefile.in +++ b/dlls/rsaenh/Makefile.in @@ -8,6 +8,7 @@ IMPORTLIB = librsaenh.$(IMPLIBEXT) IMPORTS = crypt32 advapi32 kernel32 C_SRCS = \ + aes.c \ des.c \ handle.c \ implglue.c \ diff --git a/dlls/rsaenh/implglue.c b/dlls/rsaenh/implglue.c index d31f615..bb39a7b 100644 --- a/dlls/rsaenh/implglue.c +++ b/dlls/rsaenh/implglue.c @@ -3,6 +3,7 @@ * Glueing the RSAENH specific code to the crypto library * * Copyright (c) 2004, 2005 Michael Jung + * Copyright (c) 2007 Vijay Kiran Kamuju * * based on code by Mike McCormack and David Hammerton * @@ -194,6 +195,19 @@ BOOL setup_key_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, DWORD dwKeyLen, case CALG_DES: des_setup(abKeyValue, 8, 0, &pKeyContext->des); break; + + case CALG_AES: + case CALG_AES_128: + aes_setup(abKeyValue, 16, 0, &pKeyContext->aes); + break; + + case CALG_AES_192: + aes_setup(abKeyValue, 24, 0, &pKeyContext->aes); + break; + + case CALG_AES_256: + aes_setup(abKeyValue, 32, 0, &pKeyContext->aes); + break; } return TRUE; @@ -209,6 +223,10 @@ BOOL duplicate_key_impl(ALG_ID aiAlgid, CONST KEY_CONTEXT *pSrcKeyContext, case CALG_3DES: case CALG_3DES_112: case CALG_DES: + case CALG_AES: + case CALG_AES_128: + case CALG_AES_192: + case CALG_AES_256: memcpy(pDestKeyContext, pSrcKeyContext, sizeof(KEY_CONTEXT)); break; case CALG_RSA_KEYX: @@ -275,6 +293,17 @@ BOOL encrypt_block_impl(ALG_ID aiAlgid, DWORD dwKeySpec, KEY_CONTEXT *pKeyContex } break; + case CALG_AES: + case CALG_AES_128: + case CALG_AES_192: + case CALG_AES_256: + if (enc) { + aes_ecb_encrypt(in, out, &pKeyContext->aes); + } else { + aes_ecb_decrypt(in, out, &pKeyContext->aes); + } + break; + case CALG_RSA_KEYX: case CALG_RSA_SIGN: outlen = inlen = (mp_count_bits(&pKeyContext->rsa.N)+7)/8; diff --git a/dlls/rsaenh/implglue.h b/dlls/rsaenh/implglue.h index d421c3d..5deaf53 100644 --- a/dlls/rsaenh/implglue.h +++ b/dlls/rsaenh/implglue.h @@ -63,6 +63,7 @@ typedef union tagKEY_CONTEXT { rc2_key rc2; des_key des; des3_key des3; + aes_key aes; prng_state rc4; rsa_key rsa; } KEY_CONTEXT; diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c index 4bb64ab..734f44b 100644 --- a/dlls/rsaenh/rsaenh.c +++ b/dlls/rsaenh/rsaenh.c @@ -5,6 +5,7 @@ * Copyright 2002 TransGaming Technologies (David Hammerton) * Copyright 2004 Mike McCormack for CodeWeavers * Copyright 2004, 2005 Michael Jung + * Copyright 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 @@ -153,7 +154,7 @@ typedef struct tagKEYCONTAINER /****************************************************************************** * aProvEnumAlgsEx - Defines the capabilities of the CSP personalities. */ -#define RSAENH_MAX_ENUMALGS 20 +#define RSAENH_MAX_ENUMALGS 24 #define RSAENH_PCT1_SSL2_SSL3_TLS1 (CRYPT_FLAG_PCT1|CRYPT_FLAG_SSL2|CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1) static const PROV_ENUMALGS_EX aProvEnumAlgsEx[4][RSAENH_MAX_ENUMALGS+1] = { @@ -161,6 +162,10 @@ static const PROV_ENUMALGS_EX aProvEnumAlgsEx[4][RSAENH_MAX_ENUMALGS+1] = {CALG_RC2, 40, 40, 56,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_AES, 128,128, 128,0, 4,"AES", 35,"Advanced Encryption Standard (AES)"}, + {CALG_AES_128, 128,128, 128,0, 8,"AES-128", 39,"Advanced Encryption Standard (AES-128)"}, + {CALG_AES_192, 192,192, 192,0, 8,"AES-192", 39,"Advanced Encryption Standard (AES-192)"}, + {CALG_AES_256, 256,256, 256,0, 8,"AES-256", 39,"Advanced Encryption Standard (AES-256)"}, {CALG_SHA, 160,160, 160,CRYPT_FLAG_SIGNING, 6,"SHA-1", 30,"Secure Hash Algorithm (SHA-1)"}, {CALG_MD2, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD2", 23,"Message Digest 2 (MD2)"}, {CALG_MD4, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD4", 23,"Message Digest 4 (MD4)"}, @@ -178,6 +183,10 @@ static const PROV_ENUMALGS_EX aProvEnumAlgsEx[4][RSAENH_MAX_ENUMALGS+1] = {CALG_DES, 56, 56, 56,0, 4,"DES", 31,"Data Encryption Standard (DES)"}, {CALG_3DES_112, 112,112, 112,0, 13,"3DES TWO KEY",19,"Two Key Triple DES"}, {CALG_3DES, 168,168, 168,0, 5,"3DES", 21,"Three Key Triple DES"}, + {CALG_AES, 128,128, 128,0, 4,"AES", 35,"Advanced Encryption Standard (AES)"}, + {CALG_AES_128, 128,128, 128,0, 8,"AES-128", 39,"Advanced Encryption Standard (AES-128)"}, + {CALG_AES_192, 192,192, 192,0, 8,"AES-192", 39,"Advanced Encryption Standard (AES-192)"}, + {CALG_AES_256, 256,256, 256,0, 8,"AES-256", 39,"Advanced Encryption Standard (AES-256)"}, {CALG_SHA, 160,160, 160,CRYPT_FLAG_SIGNING, 6,"SHA-1", 30,"Secure Hash Algorithm (SHA-1)"}, {CALG_MD2, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD2", 23,"Message Digest 2 (MD2)"}, {CALG_MD4, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD4", 23,"Message Digest 4 (MD4)"}, @@ -195,6 +204,10 @@ static const PROV_ENUMALGS_EX aProvEnumAlgsEx[4][RSAENH_MAX_ENUMALGS+1] = {CALG_DES, 56, 56, 56,0, 4,"DES", 31,"Data Encryption Standard (DES)"}, {CALG_3DES_112, 112,112, 112,0, 13,"3DES TWO KEY",19,"Two Key Triple DES"}, {CALG_3DES, 168,168, 168,0, 5,"3DES", 21,"Three Key Triple DES"}, + {CALG_AES, 128,128, 128,0, 4,"AES", 35,"Advanced Encryption Standard (AES)"}, + {CALG_AES_128, 128,128, 128,0, 8,"AES-128", 39,"Advanced Encryption Standard (AES-128)"}, + {CALG_AES_192, 192,192, 192,0, 8,"AES-192", 39,"Advanced Encryption Standard (AES-192)"}, + {CALG_AES_256, 256,256, 256,0, 8,"AES-256", 39,"Advanced Encryption Standard (AES-256)"}, {CALG_SHA, 160,160, 160,CRYPT_FLAG_SIGNING, 6,"SHA-1", 30,"Secure Hash Algorithm (SHA-1)"}, {CALG_MD2, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD2", 23,"Message Digest 2 (MD2)"}, {CALG_MD4, 128,128, 128,CRYPT_FLAG_SIGNING, 4,"MD4", 23,"Message Digest 4 (MD4)"}, @@ -212,6 +225,10 @@ static const PROV_ENUMALGS_EX aProvEnumAlgsEx[4][RSAENH_MAX_ENUMALGS+1] = {CALG_DES, 56, 56, 56,RSAENH_PCT1_SSL2_SSL3_TLS1, 4,"DES", 31,"Data Encryption Standard (DES)"}, {CALG_3DES_112, 112,112, 112,RSAENH_PCT1_SSL2_SSL3_TLS1,13,"3DES TWO KEY",19,"Two Key Triple DES"}, {CALG_3DES, 168,168, 168,RSAENH_PCT1_SSL2_SSL3_TLS1, 5,"3DES", 21,"Three Key Triple DES"}, + {CALG_AES, 128,128, 128,RSAENH_PCT1_SSL2_SSL3_TLS1, 4,"AES", 35,"Advanced Encryption Standard (AES)"}, + {CALG_AES_128, 128,128, 128,RSAENH_PCT1_SSL2_SSL3_TLS1, 8,"AES-128", 39,"Advanced Encryption Standard (AES-128)"}, + {CALG_AES_192, 192,192, 192,RSAENH_PCT1_SSL2_SSL3_TLS1, 8,"AES-192", 39,"Advanced Encryption Standard (AES-192)"}, + {CALG_AES_256, 256,256, 256,RSAENH_PCT1_SSL2_SSL3_TLS1, 8,"AES-256", 39,"Advanced Encryption Standard (AES-256)"}, {CALG_SHA,160,160,160,CRYPT_FLAG_SIGNING|RSAENH_PCT1_SSL2_SSL3_TLS1,6,"SHA-1",30,"Secure Hash Algorithm (SHA-1)"}, {CALG_MD5,128,128,128,CRYPT_FLAG_SIGNING|RSAENH_PCT1_SSL2_SSL3_TLS1,4,"MD5",23,"Message Digest 5 (MD5)"}, {CALG_SSL3_SHAMD5,288,288,288,0, 12,"SSL3 SHAMD5",12,"SSL3 SHAMD5"}, @@ -844,6 +861,14 @@ static HCRYPTKEY new_key(HCRYPTPROV hProv, ALG_ID aiAlgid, DWORD dwFlags, CRYPTK pCryptKey->dwMode = CRYPT_MODE_CBC; break; + case CALG_AES: + case CALG_AES_128: + case CALG_AES_192: + case CALG_AES_256: + pCryptKey->dwBlockLen = 16; + pCryptKey->dwMode = CRYPT_MODE_CBC; + break; + case CALG_RSA_KEYX: case CALG_RSA_SIGN: pCryptKey->dwBlockLen = dwKeyLen >> 3; @@ -2550,6 +2575,10 @@ BOOL WINAPI RSAENH_CPGenKey(HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYP case CALG_DES: case CALG_3DES_112: case CALG_3DES: + case CALG_AES: + case CALG_AES_128: + case CALG_AES_192: + case CALG_AES_256: case CALG_PCT1_MASTER: case CALG_SSL2_MASTER: case CALG_SSL3_MASTER: diff --git a/dlls/rsaenh/tests/rsaenh.c b/dlls/rsaenh/tests/rsaenh.c index 076467e..a74f388 100644 --- a/dlls/rsaenh/tests/rsaenh.c +++ b/dlls/rsaenh/tests/rsaenh.c @@ -2,6 +2,7 @@ * Unit tests for rsaenh functions * * Copyright (c) 2004 Michael Jung + * 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 @@ -145,7 +146,7 @@ static BOOL derive_key(ALG_ID aiAlgid, HCRYPTKEY *phKey, DWORD len) ok(result, "%08x\n", GetLastError()); if (!result) return FALSE; result = CryptHashData(hHash, (BYTE*)pbData, sizeof(pbData), 0); - ok(result, "%08x\n", GetLastError()); + ok(result, "%08x no hash data\n", GetLastError()); if (!result) return FALSE; result = CryptDeriveKey(hProv, aiAlgid, hHash, (len << 16) | CRYPT_EXPORTABLE, phKey); ok(result, "%08x\n", GetLastError()); @@ -493,6 +494,56 @@ static void test_3des(void) ok(result, "%08x\n", GetLastError()); } +static void test_aes(unsigned int keylength) +{ + HCRYPTKEY hKey; + BOOL result; + DWORD dwLen, dwMode; + unsigned char pbData[16]; + int i; + + switch(keylength) + { + case 192: + result = derive_key(CALG_AES_192, &hKey, 0); + break; + case 256: + result = derive_key(CALG_AES_256, &hKey, 0); + break; + case 128: + result = derive_key(CALG_AES_128, &hKey, 0); + break; + default: + result = derive_key(CALG_AES, &hKey, 0); + break; + } + if (!result) { + /* rsaenh compiled without OpenSSL */ + ok(GetLastError()==NTE_BAD_ALGID, "%08x\n", GetLastError()); + return; + } + + dwMode = CRYPT_MODE_ECB; + result = CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0); + ok(result, "%08x\n", GetLastError()); + + dwLen = sizeof(DWORD); + result = CryptGetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, &dwLen, 0); + ok(result, "%08x\n", GetLastError()); + + for (i=0; i<sizeof(pbData); i++) pbData[i] = (unsigned char)(i); + + dwLen = 13; + result = CryptEncrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, pbData, &dwLen, 16); + ok(result, "%08x\n", GetLastError()); + + result = CryptDecrypt(hKey, (HCRYPTHASH)NULL, TRUE, 0, pbData, &dwLen); + ok(result, "%08x\n", GetLastError()); + + result = CryptDestroyKey(hKey); + ok(result, "%08x\n", GetLastError()); +} + static void test_rc2(void) { static const BYTE rc2encrypted[16] = { @@ -1798,6 +1849,10 @@ START_TEST(rsaenh) test_des(); test_3des112(); test_3des(); + test_aes(1024); + test_aes(128); + test_aes(192); + test_aes(256); test_hmac(); test_mac(); test_block_cipher_modes(); diff --git a/dlls/rsaenh/tomcrypt.h b/dlls/rsaenh/tomcrypt.h index 53c2f40..b76757c 100644 --- a/dlls/rsaenh/tomcrypt.h +++ b/dlls/rsaenh/tomcrypt.h @@ -129,6 +129,11 @@ typedef struct tag_des3_key { ulong32 ek[3][32], dk[3][32]; } des3_key; +typedef struct tag_aes_key { + ulong32 eK[64], dK[64]; + int Nr; +} aes_key; + int rc2_setup(const unsigned char *key, int keylen, int bits, int num_rounds, rc2_key *skey); void rc2_ecb_encrypt(const unsigned char *pt, unsigned char *ct, rc2_key *key); void rc2_ecb_decrypt(const unsigned char *ct, unsigned char *pt, rc2_key *key); @@ -141,6 +146,10 @@ int des3_setup(const unsigned char *key, int keylen, int num_rounds, des3_key *s void des3_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const des3_key *key); void des3_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const des3_key *key); +int aes_setup(const unsigned char *key, int keylen, int rounds, aes_key *skey); +void aes_ecb_encrypt(const unsigned char *pt, unsigned char *ct, aes_key *skey); +void aes_ecb_decrypt(const unsigned char *ct, unsigned char *pt, aes_key *skey); + typedef struct tag_md2_state { unsigned char chksum[16], X[48], buf[16]; unsigned long curlen; -- 1.5.2.5