From: Alexandre Julliard <julliard@winehq.org> --- dlls/rsaenh/Makefile.in | 4 +- dlls/rsaenh/implglue.c | 108 ++++++++++++---------------------------- dlls/rsaenh/implglue.h | 22 ++++++-- dlls/rsaenh/rsaenh.c | 1 + 4 files changed, 52 insertions(+), 83 deletions(-) diff --git a/dlls/rsaenh/Makefile.in b/dlls/rsaenh/Makefile.in index ab53b2fe0ef..7a7be6679a5 100644 --- a/dlls/rsaenh/Makefile.in +++ b/dlls/rsaenh/Makefile.in @@ -1,7 +1,7 @@ MODULE = rsaenh.dll IMPORTLIB = rsaenh -IMPORTS = $(TOMCRYPT_PE_LIBS) crypt32 advapi32 -EXTRAINCL = $(TOMCRYPT_PE_CFLAGS) +IMPORTS = $(TOMCRYPT_PE_LIBS) $(SYMCRYPT_PE_LIBS) crypt32 advapi32 +EXTRAINCL = $(TOMCRYPT_PE_CFLAGS) $(SYMCRYPT_PE_CFLAGS) VER_PRODUCTVERSION = 5,1,2600,2180 diff --git a/dlls/rsaenh/implglue.c b/dlls/rsaenh/implglue.c index 900c620c9ef..f81c038cdc0 100644 --- a/dlls/rsaenh/implglue.c +++ b/dlls/rsaenh/implglue.c @@ -31,60 +31,29 @@ #include "implglue.h" +SYMCRYPT_ENVIRONMENT_DEFS( WindowsUsermodeWin8_1nLater ); + prng_state prng = { 0 }; int wprng = 0; BOOL init_hash_impl( ALG_ID algid, struct hash *hash ) { - memset( hash, 0, sizeof(*hash) ); - - switch (algid) + const SYMCRYPT_HASH *algorithms[] = { - case CALG_MD2: - hash->desc = &md2_desc; - break; - - case CALG_MD4: - hash->desc = &md4_desc; - break; - - case CALG_MD5: - hash->desc = &md5_desc; - break; - - case CALG_SHA: - hash->desc = &sha1_desc; - break; - - case CALG_SHA_256: - hash->desc = &sha256_desc; - break; - - case CALG_SHA_384: - hash->desc = &sha384_desc; - break; - - case CALG_SHA_512: - hash->desc = &sha512_desc; - break; - - default: - return TRUE; - } - - hash->desc->init( &hash->state ); - return TRUE; -} - -BOOL update_hash_impl( struct hash *hash, const BYTE *data, DWORD len ) -{ - hash->desc->process( &hash->state, data, len ); - return TRUE; -} + [ALG_SID_MD2] = SymCryptMd2Algorithm, + [ALG_SID_MD4] = SymCryptMd4Algorithm, + [ALG_SID_MD5] = SymCryptMd5Algorithm, + [ALG_SID_SHA] = SymCryptSha1Algorithm, + [ALG_SID_SHA_256] = SymCryptSha256Algorithm, + [ALG_SID_SHA_384] = SymCryptSha384Algorithm, + [ALG_SID_SHA_512] = SymCryptSha512Algorithm, + }; -BOOL finalize_hash_impl( struct hash *hash, BYTE *hash_value, DWORD hash_size ) -{ - hash->desc->done( &hash->state, hash_value ); + memset( hash, 0, sizeof(*hash) ); + if (GET_ALG_CLASS(algid) != ALG_CLASS_HASH) return TRUE; + if (GET_ALG_SID(algid) >= ARRAY_SIZE(algorithms)) return TRUE; + if (!(hash->desc = algorithms[GET_ALG_SID(algid)])) return TRUE; + SymCryptHashInit( hash->desc, &hash->state ); return TRUE; } @@ -138,34 +107,27 @@ BOOL setup_key_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, DWORD dwKeyLen, break; case CALG_RC2: - rc2_setup_ex(abKeyValue, dwKeyLen + dwSaltLen, dwEffectiveKeyLen ? - dwEffectiveKeyLen : dwKeyLen << 3, 0, &pKeyContext->key); + SymCryptRc2ExpandKeyEx( &pKeyContext->rc2, abKeyValue, dwKeyLen + dwSaltLen, + dwEffectiveKeyLen ? dwEffectiveKeyLen : dwKeyLen << 3 ); break; - case CALG_3DES: - des3_setup(abKeyValue, 24, 0, &pKeyContext->key); + SymCrypt3DesExpandKey( &pKeyContext->des3, abKeyValue, 24 ); break; - case CALG_3DES_112: - memcpy(abKeyValue+16, abKeyValue, 8); - des3_setup(abKeyValue, 24, 0, &pKeyContext->key); + SymCrypt3DesExpandKey( &pKeyContext->des3, abKeyValue, 16 ); break; - case CALG_DES: - des_setup(abKeyValue, 8, 0, &pKeyContext->key); + SymCryptDesExpandKey( &pKeyContext->des, abKeyValue, 8 ); break; - case CALG_AES: case CALG_AES_128: - aes_setup(abKeyValue, 16, 0, &pKeyContext->key); + SymCryptAesExpandKey( &pKeyContext->aes, abKeyValue, 16 ); break; - case CALG_AES_192: - aes_setup(abKeyValue, 24, 0, &pKeyContext->key); + SymCryptAesExpandKey( &pKeyContext->aes, abKeyValue, 24 ); break; - case CALG_AES_256: - aes_setup(abKeyValue, 32, 0, &pKeyContext->key); + SymCryptAesExpandKey( &pKeyContext->aes, abKeyValue, 32 ); break; } @@ -227,23 +189,20 @@ BOOL encrypt_block_impl(ALG_ID aiAlgid, DWORD dwKeySpec, KEY_CONTEXT *pKeyContex switch (aiAlgid) { case CALG_RC2: - rc2_ecb_encrypt(in, out, &pKeyContext->key); + SymCryptRc2Encrypt( &pKeyContext->rc2, in, out ); break; - case CALG_3DES: case CALG_3DES_112: - des3_ecb_encrypt(in, out, &pKeyContext->key); + SymCrypt3DesEncrypt( &pKeyContext->des3, in, out ); break; - case CALG_DES: - des_ecb_encrypt(in, out, &pKeyContext->key); + SymCryptDesEncrypt( &pKeyContext->des, in, out ); break; - case CALG_AES: case CALG_AES_128: case CALG_AES_192: case CALG_AES_256: - aes_ecb_encrypt(in, out, &pKeyContext->key); + SymCryptAesEncrypt( &pKeyContext->aes, in, out ); break; case CALG_RSA_KEYX: @@ -273,23 +232,20 @@ BOOL decrypt_block_impl(ALG_ID aiAlgid, DWORD dwKeySpec, KEY_CONTEXT *pKeyContex switch (aiAlgid) { case CALG_RC2: - rc2_ecb_decrypt(in, out, &pKeyContext->key); + SymCryptRc2Decrypt( &pKeyContext->rc2, in, out ); break; - case CALG_3DES: case CALG_3DES_112: - des3_ecb_decrypt(in, out, &pKeyContext->key); + SymCrypt3DesDecrypt( &pKeyContext->des3, in, out ); break; - case CALG_DES: - des_ecb_decrypt(in, out, &pKeyContext->key); + SymCryptDesDecrypt( &pKeyContext->des, in, out ); break; - case CALG_AES: case CALG_AES_128: case CALG_AES_192: case CALG_AES_256: - aes_ecb_decrypt(in, out, &pKeyContext->key); + SymCryptAesDecrypt( &pKeyContext->aes, in, out ); break; case CALG_RSA_KEYX: diff --git a/dlls/rsaenh/implglue.h b/dlls/rsaenh/implglue.h index b0a518830ac..4ea65e3a973 100644 --- a/dlls/rsaenh/implglue.h +++ b/dlls/rsaenh/implglue.h @@ -25,11 +25,15 @@ #define __WINE_IMPLGLUE_H #include "tomcrypt.h" +#include "symcrypt.h" #define RSAENH_MAX_HASH_SIZE 104 typedef union tagKEY_CONTEXT { - symmetric_key key; + SYMCRYPT_DES_EXPANDED_KEY des; + SYMCRYPT_3DES_EXPANDED_KEY des3; + SYMCRYPT_RC2_EXPANDED_KEY rc2; + SYMCRYPT_AES_EXPANDED_KEY aes; prng_state prng; rsa_key rsa; } KEY_CONTEXT; @@ -39,13 +43,21 @@ extern int wprng; struct hash { - const struct ltc_hash_descriptor *desc; - hash_state state; + const SYMCRYPT_HASH *desc; + SYMCRYPT_HASH_STATE state; }; BOOL init_hash_impl(ALG_ID algid, struct hash *hash); -BOOL update_hash_impl(struct hash *hash, const BYTE *data, DWORD len); -BOOL finalize_hash_impl(struct hash *hash, BYTE *hash_value, DWORD hash_size); + +static inline void update_hash_impl(struct hash *hash, const BYTE *data, DWORD len) +{ + SymCryptHashAppend( hash->desc, &hash->state, data, len ); +} + +static inline void finalize_hash_impl(struct hash *hash, BYTE *hash_value, DWORD hash_size) +{ + SymCryptHashResult( hash->desc, &hash->state, hash_value, hash_size ); +} BOOL new_key_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, DWORD dwKeyLen); BOOL free_key_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext); diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c index fbd500b7c43..4eca3a6d9eb 100644 --- a/dlls/rsaenh/rsaenh.c +++ b/dlls/rsaenh/rsaenh.c @@ -354,6 +354,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID reserved) case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hInstance); init_handle_table(&handle_table); + SymCryptInit(); /* tomcrypt initialization */ init_LTM(); wprng = register_prng( &rc4_desc ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11025