Jacek Caban : rsaenh: Use bcrypt for SHA512 hashes.

Alexandre Julliard julliard at winehq.org
Wed Jun 28 15:10:26 CDT 2017


Module: wine
Branch: master
Commit: 6aa5fdf9527620c46220050ccb2d6fe0e9c113ab
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6aa5fdf9527620c46220050ccb2d6fe0e9c113ab

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Jun 28 18:22:12 2017 +0200

rsaenh: Use bcrypt for SHA512 hashes.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/rsaenh/Makefile.in |  2 +-
 dlls/rsaenh/implglue.c  | 32 +++++++++++++---------
 dlls/rsaenh/implglue.h  |  5 +++-
 dlls/rsaenh/rsaenh.c    |  1 -
 dlls/rsaenh/sha2.c      | 71 -------------------------------------------------
 dlls/rsaenh/sha2.h      |  6 -----
 6 files changed, 24 insertions(+), 93 deletions(-)

diff --git a/dlls/rsaenh/Makefile.in b/dlls/rsaenh/Makefile.in
index 5b6e2fe..0fdae10 100644
--- a/dlls/rsaenh/Makefile.in
+++ b/dlls/rsaenh/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = rsaenh.dll
 IMPORTLIB = rsaenh
-IMPORTS   = crypt32 advapi32
+IMPORTS   = bcrypt crypt32 advapi32
 
 C_SRCS = \
 	aes.c \
diff --git a/dlls/rsaenh/implglue.c b/dlls/rsaenh/implglue.c
index 77a0085..20ebddc 100644
--- a/dlls/rsaenh/implglue.c
+++ b/dlls/rsaenh/implglue.c
@@ -50,6 +50,8 @@ BOOL WINAPI SystemFunction036(PVOID pbBuffer, ULONG dwLen);
         
 BOOL init_hash_impl(ALG_ID aiAlgid, HASH_CONTEXT *pHashContext) 
 {
+    const WCHAR *algid = NULL;
+
     switch (aiAlgid) 
     {
         case CALG_MD2:
@@ -77,10 +79,22 @@ BOOL init_hash_impl(ALG_ID aiAlgid, HASH_CONTEXT *pHashContext)
             break;
 
         case CALG_SHA_512:
-            SHA512_Init(&pHashContext->sha512);
+            algid = BCRYPT_SHA512_ALGORITHM;
             break;
     }
 
+    if (algid)
+    {
+        BCRYPT_ALG_HANDLE provider;
+        NTSTATUS status;
+
+        status = BCryptOpenAlgorithmProvider(&provider, algid, MS_PRIMITIVE_PROVIDER, 0);
+        if (status) return FALSE;
+
+        status = BCryptCreateHash(provider, &pHashContext->bcrypt_hash, NULL, 0, NULL, 0, 0);
+        BCryptCloseAlgorithmProvider(provider, 0);
+        if (status) return FALSE;
+    }
     return TRUE;
 }
 
@@ -113,13 +127,8 @@ BOOL update_hash_impl(ALG_ID aiAlgid, HASH_CONTEXT *pHashContext, const BYTE *pb
             SHA384_Update(&pHashContext->sha384, pbData, dwDataLen);
             break;
 
-        case CALG_SHA_512:
-            SHA512_Update(&pHashContext->sha512, pbData, dwDataLen);
-            break;
-
         default:
-            SetLastError(NTE_BAD_ALGID);
-            return FALSE;
+            BCryptHashData(pHashContext->bcrypt_hash, (UCHAR*)pbData, dwDataLen, 0);
     }
 
     return TRUE;
@@ -155,13 +164,10 @@ BOOL finalize_hash_impl(ALG_ID aiAlgid, HASH_CONTEXT *pHashContext, BYTE *pbHash
             SHA384_Final(pbHashValue, &pHashContext->sha384);
             break;
 
-        case CALG_SHA_512:
-            SHA512_Final(pbHashValue, &pHashContext->sha512);
-            break;
-
         default:
-            SetLastError(NTE_BAD_ALGID);
-            return FALSE;
+            BCryptFinishHash(pHashContext->bcrypt_hash, pbHashValue, RSAENH_MAX_HASH_SIZE, 0);
+            BCryptDestroyHash(pHashContext->bcrypt_hash);
+            break;
     }
 
     return TRUE;
diff --git a/dlls/rsaenh/implglue.h b/dlls/rsaenh/implglue.h
index 3ac7eef..4f53101 100644
--- a/dlls/rsaenh/implglue.h
+++ b/dlls/rsaenh/implglue.h
@@ -24,9 +24,12 @@
 #ifndef __WINE_IMPLGLUE_H
 #define __WINE_IMPLGLUE_H
 
+#include "bcrypt.h"
 #include "tomcrypt.h"
 #include "sha2.h"
 
+#define RSAENH_MAX_HASH_SIZE        104
+
 /* Next typedef copied from dlls/advapi32/crypt_md4.c */
 typedef struct tagMD4_CTX {
     unsigned int buf[4];
@@ -60,7 +63,7 @@ typedef union tagHASH_CONTEXT {
     SHA_CTX sha;
     SHA256_CTX sha256;
     SHA384_CTX sha384;
-    SHA512_CTX sha512;
+    BCRYPT_HASH_HANDLE bcrypt_hash;
 } HASH_CONTEXT;
 
 typedef union tagKEY_CONTEXT {
diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index 9af770d..98bba16 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -48,7 +48,6 @@ static HINSTANCE instance;
  * CRYPTHASH - hash objects
  */
 #define RSAENH_MAGIC_HASH           0x85938417u
-#define RSAENH_MAX_HASH_SIZE        104
 #define RSAENH_HASHSTATE_HASHING    1
 #define RSAENH_HASHSTATE_FINISHED   2
 typedef struct _RSAENH_TLS1PRF_PARAMS
diff --git a/dlls/rsaenh/sha2.c b/dlls/rsaenh/sha2.c
index 76e7184..67933ce 100644
--- a/dlls/rsaenh/sha2.c
+++ b/dlls/rsaenh/sha2.c
@@ -599,16 +599,6 @@ char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_S
 }
 
 
-/*** SHA-512: *********************************************************/
-void SHA512_Init(SHA512_CTX* context) {
-	if (context == NULL) {
-		return;
-	}
-	MEMCPY_BCOPY(context->state, sha512_initial_hash_value, SHA512_DIGEST_LENGTH);
-	MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH);
-	context->bitcount[0] = context->bitcount[1] =  0;
-}
-
 #ifdef SHA2_UNROLL_TRANSFORM
 
 /* Unrolled SHA-512 round macros: */
@@ -867,67 +857,6 @@ void SHA512_Last(SHA512_CTX* context) {
 	SHA512_Transform(context, (sha2_word64*)context->buffer);
 }
 
-void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) {
-	sha2_word64	*d = (sha2_word64*)digest;
-
-	/* Sanity check: */
-	assert(context != NULL);
-
-	/* If no digest buffer is passed, we don't bother doing this: */
-	if (digest != NULL) {
-		SHA512_Last(context);
-
-		/* Save the hash data for output: */
-#ifndef WORDS_BIGENDIAN
-		{
-			/* Convert TO host byte order */
-			int	j;
-			for (j = 0; j < 8; j++) {
-				REVERSE64(context->state[j],context->state[j]);
-				*d++ = context->state[j];
-			}
-		}
-#else
-		MEMCPY_BCOPY(d, context->state, SHA512_DIGEST_LENGTH);
-#endif
-	}
-
-	/* Zero out state data */
-	MEMSET_BZERO(context, sizeof(*context));
-}
-
-char *SHA512_End(SHA512_CTX* context, char buffer[]) {
-	sha2_byte	digest[SHA512_DIGEST_LENGTH], *d = digest;
-	int		i;
-
-	/* Sanity check: */
-	assert(context != NULL);
-
-	if (buffer != NULL) {
-		SHA512_Final(digest, context);
-
-		for (i = 0; i < SHA512_DIGEST_LENGTH; i++) {
-			*buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
-			*buffer++ = sha2_hex_digits[*d & 0x0f];
-			d++;
-		}
-		*buffer = 0;
-	} else {
-		MEMSET_BZERO(context, sizeof(*context));
-	}
-	MEMSET_BZERO(digest, SHA512_DIGEST_LENGTH);
-	return buffer;
-}
-
-char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_STRING_LENGTH]) {
-	SHA512_CTX	context;
-
-	SHA512_Init(&context);
-	SHA512_Update(&context, data, len);
-	return SHA512_End(&context, digest);
-}
-
-
 /*** SHA-384: *********************************************************/
 void SHA384_Init(SHA384_CTX* context) {
 	if (context == NULL) {
diff --git a/dlls/rsaenh/sha2.h b/dlls/rsaenh/sha2.h
index 2dda412..342e838 100644
--- a/dlls/rsaenh/sha2.h
+++ b/dlls/rsaenh/sha2.h
@@ -80,10 +80,4 @@ void SHA384_Final(sha2_byte[SHA384_DIGEST_LENGTH], SHA384_CTX*);
 char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]);
 char* SHA384_Data(const sha2_byte*, size_t, char[SHA384_DIGEST_STRING_LENGTH]);
 
-void SHA512_Init(SHA512_CTX*);
-void SHA512_Update(SHA512_CTX*, const sha2_byte*, size_t);
-void SHA512_Final(sha2_byte[SHA512_DIGEST_LENGTH], SHA512_CTX*);
-char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]);
-char* SHA512_Data(const sha2_byte*, size_t, char[SHA512_DIGEST_STRING_LENGTH]);
-
 #endif /* __SHA2_H__ */




More information about the wine-cvs mailing list