39static void init_pad(
struct padding * pad,
const uint8_t *key,
size_t key_len)
48 MD5Update(&tmpctx, key, key_len);
49 MD5Final(tmpkey, &tmpctx);
54 memset(pad, 0,
sizeof(*pad));
55 memcpy(pad->inner, key, key_len);
56 memcpy(pad->outer, key, key_len);
58 for (i = 0; i < 64; i++)
60 pad->inner[i] ^= 0x36;
61 pad->outer[i] ^= 0x5c;
76void hmac_md5(uint8_t *data,
size_t data_len,
77 uint8_t *key,
size_t key_len, uint8_t *digest)
82 init_pad(&pad, key, key_len);
86 MD5Update(&context, pad.inner, 64);
87 MD5Update(&context, data, data_len);
88 MD5Final(digest, &context);
92 MD5Update(&context, pad.outer, 64);
93 MD5Update(&context, digest, 16);
94 MD5Final(digest, &context);