summaryrefslogtreecommitdiff
path: root/src/hmac_md5.c
diff options
context:
space:
mode:
authorJannis Hoffmann <jannis@fehcom.de>2024-07-03 15:48:04 +0200
committerJannis Hoffmann <jannis@fehcom.de>2024-07-03 15:48:04 +0200
commit89b7b67a13ebb7965cc7f13ad0595e2194a2d34c (patch)
tree25efd77a90ae87236e6730d8ea3846bbe0fd126f /src/hmac_md5.c
add sqmail-4.2.29asqmail-4.2
Diffstat (limited to 'src/hmac_md5.c')
-rw-r--r--src/hmac_md5.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/hmac_md5.c b/src/hmac_md5.c
new file mode 100644
index 0000000..310f0ef
--- /dev/null
+++ b/src/hmac_md5.c
@@ -0,0 +1,52 @@
+#include "global.h"
+#include "md5.h"
+#include "str.h"
+#include "byte.h"
+
+/**
+@file hmac_md5
+@brief caculates HMAC digest from challenge + password (DJB version)
+@param input: unsigned char *text : pointer to challenge
+ int text_len : length of challenge
+ unsigned char *key : pointer to password
+ int key_len : length of password
+ output: unsigned char *digest: pointer to calculated digest
+*/
+
+void hmac_md5(unsigned char *text,int text_len,unsigned char * key,int key_len,unsigned char *digest)
+{
+ MD5_CTX context;
+ unsigned char k_ipad[65]; /* inner padding - key XORd with ipad */
+ unsigned char k_opad[65]; /* outer padding - key XORd with opad */
+ unsigned char tk[16];
+ int i;
+
+ if (key_len > 64) {
+ MD5_CTX tctx;
+ MD5Init(&tctx);
+ MD5Update(&tctx,key,key_len);
+ MD5Final(tk,&tctx);
+ key = tk;
+ key_len = 16;
+ }
+
+ byte_zero(k_ipad,sizeof(k_ipad));
+ byte_zero(k_opad,sizeof(k_opad));
+ byte_copy(k_ipad,key_len,key);
+ byte_copy(k_opad,key_len,key);
+
+ for (i = 0; i < 64; i++) {
+ k_ipad[i] ^= 0x36;
+ k_opad[i] ^= 0x5c;
+ }
+
+ MD5Init(&context); /* init context for 1st pass */
+ MD5Update(&context,k_ipad,64); /* start with inner pad */
+ MD5Update(&context,text,text_len); /* then text of datagram */
+ MD5Final(digest,&context); /* finish up 1st pass */
+
+ MD5Init(&context); /* init context for 2nd pass */
+ MD5Update(&context,k_opad,64); /* start with outer pad */
+ MD5Update(&context,digest,16); /* then results of 1st hash */
+ MD5Final(digest,&context); /* finish up 2nd pass */
+}