#include "hmac_md5.h" #include "byte.h" #include "global.h" #include "md5.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 */ }