From 89b7b67a13ebb7965cc7f13ad0595e2194a2d34c Mon Sep 17 00:00:00 2001 From: Jannis Hoffmann Date: Wed, 3 Jul 2024 15:48:04 +0200 Subject: add sqmail-4.2.29a --- src/hmac_md5.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/hmac_md5.c (limited to 'src/hmac_md5.c') 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 */ +} -- cgit v1.2.3