Module: wine
Branch: master
Commit: b629b6defdba677c4da6c88d441e716d5d008e76
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b629b6defdba677c4da6c88d4…
Author: Kai Blin <kai.blin(a)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);