add helper to compute the md5 hmac
authorsahlberg <sahlberg@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 9 Mar 2005 07:29:52 +0000 (07:29 +0000)
committersahlberg <sahlberg@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 9 Mar 2005 07:29:52 +0000 (07:29 +0000)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@13673 f5534014-38df-0310-8fa8-9805f1628bb7

epan/crypt-md5.c
epan/crypt-md5.h

index 42df1b920d3a601ae3b0140a729a0cafde4fd9a9..01931fdc4c620e25e4d136533b32618fd1badb27 100644 (file)
@@ -56,6 +56,7 @@
 #endif
 
 #include <string.h>
+#include <glib.h>  /* for g_malloc() */
 
 #include <epan/crypt-md5.h>
 
@@ -384,3 +385,65 @@ md5_finish(md5_state_t *pms, md5_byte_t digest[16])
     for (i = 0; i < 16; ++i)
        digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
 }
+
+static void
+md5_checksum(const md5_byte_t *data,
+                int len,
+                md5_byte_t digest[16])
+{
+       md5_state_t ms;
+
+       md5_init(&ms);
+       md5_append(&ms, data, len);
+       md5_finish(&ms, digest);
+}
+
+void
+md5_hmac(const md5_byte_t *data, 
+     int len, 
+     md5_byte_t *key_data,
+     int key_length,
+     md5_byte_t digest[16])
+{
+    md5_byte_t *ipad;
+    md5_byte_t *key;
+    md5_byte_t opad[80];
+    int key_len;
+    int i;
+    
+    ipad = g_malloc(64 + len);
+    if (ipad == NULL)
+       g_assert_not_reached();
+
+    memset(ipad, 0x36, 64);
+    memset(opad, 0x5c, 64);
+
+    if(key_length > 65){
+       md5_checksum(
+               key_data,
+               key_length,
+               digest);
+       key = digest;
+       key_len = 16;
+    } else {
+       key = key_data;
+       key_len = key_length;
+    }
+    for(i = 0; i < key_len; i++){
+       ipad[i] ^= key[i];
+       opad[i] ^= key[i];
+    }
+    memcpy(ipad + 64, data, len);
+    md5_checksum(
+               ipad,
+               64+len,
+               digest);
+    memcpy(opad + 64, digest, 
+          16);
+    md5_checksum(
+               opad,
+               64+16,
+               digest);
+    g_free(ipad);
+}
+
index 5eb6d6c469c556900e2a07f23e6e2320a5a2d640..8581c90f0abc9be792a41cd23e33702bd557b13f 100644 (file)
@@ -84,6 +84,9 @@ void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
 /* Finish the message and return the digest. */
 void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
 
+  /* compute the MD5 HMAC */
+void md5_hmac(const md5_byte_t *data, int len,  md5_byte_t *key_data, int key_length, md5_byte_t digest[16]);
+
 #ifdef __cplusplus
 }  /* end extern "C" */
 #endif