Kai Blin : secur32: Implement RFC2104 (HMAC) with MD5 for NTLMv2.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Oct 16 05:28:41 CDT 2006


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

Author: Kai Blin <kai.blin at gmail.com>
Date:   Sat Oct 14 12:58:03 2006 +0200

secur32: Implement RFC2104 (HMAC) with MD5 for NTLMv2.

---

 dlls/secur32/Makefile.in |    1 +
 dlls/secur32/hmac_md5.c  |   77 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/secur32/hmac_md5.h  |   43 ++++++++++++++++++++++++++
 3 files changed, 121 insertions(+), 0 deletions(-)

diff --git a/dlls/secur32/Makefile.in b/dlls/secur32/Makefile.in
index 2a17991..45043d3 100644
--- a/dlls/secur32/Makefile.in
+++ b/dlls/secur32/Makefile.in
@@ -10,6 +10,7 @@ DELAYIMPORTS = crypt32
 C_SRCS = \
 	base64_codec.c \
 	dispatcher.c \
+	hmac_md5.c \
 	negotiate.c \
 	ntlm.c \
 	schannel.c \
diff --git a/dlls/secur32/hmac_md5.c b/dlls/secur32/hmac_md5.c
new file mode 100644
index 0000000..1b18659
--- /dev/null
+++ b/dlls/secur32/hmac_md5.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2006 Kai Blin
+ *
+ * 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
+ *
+ * This file implements RFC 2104 (HMAC) for the MD5 provider.
+ * It is needed for NTLMv2 signing and sealing.
+ */
+
+#include "hmac_md5.h"
+
+void HMACMD5Init(HMAC_MD5_CTX *ctx, unsigned char *key, unsigned int key_len)
+{
+    int i;
+    unsigned char inner_padding[64];
+    unsigned char temp_key[16];
+
+    if(key_len > 64)
+    {
+        MD5_CTX temp_ctx;
+
+        MD5Init(&temp_ctx);
+        MD5Update(&temp_ctx, key, key_len);
+        MD5Final(&temp_ctx);
+        memcpy(temp_key, temp_ctx.digest, 16);
+
+        key = temp_key;
+        key_len = 16;
+    }
+
+    memset(inner_padding, 0, 64);
+    memset(ctx->outer_padding, 0, 64);
+    memcpy(inner_padding, key, key_len);
+    memcpy(ctx->outer_padding, key, key_len);
+
+    for(i = 0; i < 64; ++i)
+    {
+        inner_padding[i] ^= 0x36;
+        ctx->outer_padding[i] ^= 0x5c;
+    }
+
+    MD5Init(&(ctx->ctx));
+    MD5Update(&(ctx->ctx), inner_padding, 64);
+}
+
+void HMACMD5Update(HMAC_MD5_CTX *ctx, unsigned char *data, unsigned int data_len)
+{
+    MD5Update(&(ctx->ctx), data, data_len);
+}
+
+void HMACMD5Final(HMAC_MD5_CTX *ctx, unsigned char *digest)
+{
+    MD5_CTX outer_ctx;
+    unsigned char inner_digest[16];
+
+    MD5Final(&(ctx->ctx));
+    memcpy(inner_digest, ctx->ctx.digest, 16);
+
+    MD5Init(&outer_ctx);
+    MD5Update(&outer_ctx, ctx->outer_padding, 64);
+    MD5Update(&outer_ctx, inner_digest, 16);
+    MD5Final(&outer_ctx);
+
+    memcpy(digest, outer_ctx.digest, 16);
+}
diff --git a/dlls/secur32/hmac_md5.h b/dlls/secur32/hmac_md5.h
new file mode 100644
index 0000000..81e4dd6
--- /dev/null
+++ b/dlls/secur32/hmac_md5.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2006 Kai Blin
+ *
+ * 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
+ *
+ * This file holds the declarations needed for HMAC-MD5.
+ */
+
+#include <string.h>
+
+typedef struct
+{
+    unsigned int i[2];
+    unsigned int buf[4];
+    unsigned char in[64];
+    unsigned char digest[16];
+} MD5_CTX;
+
+typedef struct
+{
+    MD5_CTX ctx;
+    unsigned char outer_padding[64];
+} HMAC_MD5_CTX;
+
+void MD5Init( MD5_CTX *ctx );
+void MD5Update( MD5_CTX *ctx, const unsigned char *buf, unsigned int len );
+void MD5Final( MD5_CTX *ctx );
+
+void HMACMD5Init(HMAC_MD5_CTX *ctx, unsigned char *key, unsigned int key_len);
+void HMACMD5Update(HMAC_MD5_CTX *ctx, unsigned char *data, unsigned int data_len);
+void HMACMD5Final(HMAC_MD5_CTX *ctx, unsigned char *digest);




More information about the wine-cvs mailing list