[2/5] bcrypt: Use builtin MD5/SHA1 implementation.

Sebastian Lackner sebastian at fds-team.de
Tue Mar 7 16:14:36 CST 2017


From: Michael Müller <michael at fds-team.de>

Signed-off-by: Michael Müller <michael at fds-team.de>
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---

For MD5 and SHA1 we can just use advapi exports.

 dlls/bcrypt/bcrypt_internal.h |   53 +++++++++++++++++++++++++++++++++++++
 dlls/bcrypt/bcrypt_main.c     |   60 +++++++++++++++++++++++++++++++++++++-----
 2 files changed, 106 insertions(+), 7 deletions(-)

diff --git a/dlls/bcrypt/bcrypt_internal.h b/dlls/bcrypt/bcrypt_internal.h
new file mode 100644
index 00000000000..de6a37e9b5e
--- /dev/null
+++ b/dlls/bcrypt/bcrypt_internal.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2016 Michael Müller
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#ifndef __BCRYPT_INTERNAL_H
+#define __BCRYPT_INTERNAL_H
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+
+/* Definitions from advapi32 */
+typedef struct
+{
+    unsigned int i[2];
+    unsigned int buf[4];
+    unsigned char in[64];
+    unsigned char digest[16];
+} MD5_CTX;
+
+VOID WINAPI MD5Init(MD5_CTX *ctx);
+VOID WINAPI MD5Update(MD5_CTX *ctx, const unsigned char *buf, unsigned int len);
+VOID WINAPI MD5Final(MD5_CTX *ctx);
+
+typedef struct
+{
+   ULONG Unknown[6];
+   ULONG State[5];
+   ULONG Count[2];
+   UCHAR Buffer[64];
+} SHA_CTX;
+
+VOID WINAPI A_SHAInit(SHA_CTX *ctx);
+VOID WINAPI A_SHAUpdate(SHA_CTX *ctx, const UCHAR *buffer, UINT size);
+VOID WINAPI A_SHAFinal(SHA_CTX *ctx, PULONG result);
+
+#endif /* __BCRYPT_INTERNAL_H */
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c
index 849dc3e5c35..cef2b1bdd16 100644
--- a/dlls/bcrypt/bcrypt_main.c
+++ b/dlls/bcrypt/bcrypt_main.c
@@ -36,6 +36,8 @@
 #include "ntsecapi.h"
 #include "bcrypt.h"
 
+#include "bcrypt_internal.h"
+
 #include "wine/debug.h"
 #include "wine/library.h"
 #include "wine/unicode.h"
@@ -442,27 +444,71 @@ static NTSTATUS hash_finish( struct hash_impl *hash, enum alg_id alg_id,
 #else
 struct hash_impl
 {
-
+    union
+    {
+        MD5_CTX md5;
+        SHA_CTX sha1;
+    } u;
 };
 
 static NTSTATUS hash_init( struct hash_impl *hash, enum alg_id alg_id )
 {
-    ERR( "support for hashes not available at build time\n" );
-    return STATUS_NOT_IMPLEMENTED;
+    switch (alg_id)
+    {
+    case ALG_ID_MD5:
+        MD5Init( &hash->u.md5 );
+        break;
+
+    case ALG_ID_SHA1:
+        A_SHAInit( &hash->u.sha1 );
+        break;
+
+    default:
+        ERR( "unhandled id %u\n", alg_id );
+        return STATUS_NOT_IMPLEMENTED;
+    }
+    return STATUS_SUCCESS;
 }
 
 static NTSTATUS hash_update( struct hash_impl *hash, enum alg_id alg_id,
                              UCHAR *input, ULONG size )
 {
-    ERR( "support for hashes not available at build time\n" );
-    return STATUS_NOT_IMPLEMENTED;
+    switch (alg_id)
+    {
+    case ALG_ID_MD5:
+        MD5Update( &hash->u.md5, input, size );
+        break;
+
+    case ALG_ID_SHA1:
+        A_SHAUpdate( &hash->u.sha1, input, size );
+        break;
+
+    default:
+        ERR( "unhandled id %u\n", alg_id );
+        return STATUS_NOT_IMPLEMENTED;
+    }
+    return STATUS_SUCCESS;
 }
 
 static NTSTATUS hash_finish( struct hash_impl *hash, enum alg_id alg_id,
                              UCHAR *output, ULONG size )
 {
-    ERR( "support for hashes not available at build time\n" );
-    return STATUS_NOT_IMPLEMENTED;
+    switch (alg_id)
+    {
+    case ALG_ID_MD5:
+        MD5Final( &hash->u.md5 );
+        memcpy( output, hash->u.md5.digest, 16 );
+        break;
+
+    case ALG_ID_SHA1:
+        A_SHAFinal( &hash->u.sha1, (ULONG *)output );
+        break;
+
+    default:
+        ERR( "unhandled id %u\n", alg_id );
+        return STATUS_NOT_IMPLEMENTED;
+    }
+    return STATUS_SUCCESS;
 }
 #endif
 
-- 
2.11.0



More information about the wine-patches mailing list