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



Reply via email to