Radcli library 1.4.0
A simple radius library
Loading...
Searching...
No Matches
hmac.c
1
29#include <string.h> /* memset(), memcpy() */
30#include "md5.h"
31#include "hmac.h"
32
33struct padding
34{
35 uint8_t inner[65]; /* inner padding - key XORd with ipad */
36 uint8_t outer[65]; /* outer padding - key XORd with opad */
37};
38
39static void init_pad(struct padding * pad, const uint8_t *key, size_t key_len)
40{
41 size_t i;
42 uint8_t tmpkey[16];
43
44 if (key_len > 64)
45 {
46 MD5_CTX tmpctx;
47 MD5Init(&tmpctx);
48 MD5Update(&tmpctx, key, key_len);
49 MD5Final(tmpkey, &tmpctx);
50 key = tmpkey;
51 key_len = 16;
52 }
53
54 memset(pad, 0, sizeof(*pad));
55 memcpy(pad->inner, key, key_len);
56 memcpy(pad->outer, key, key_len);
57
58 for (i = 0; i < 64; i++)
59 {
60 pad->inner[i] ^= 0x36;
61 pad->outer[i] ^= 0x5c;
62 }
63}
64
76void hmac_md5(uint8_t *data, size_t data_len,
77 uint8_t *key, size_t key_len, uint8_t *digest)
78{
79 MD5_CTX context;
80 struct padding pad;
81
82 init_pad(&pad, key, key_len);
83
84 /* inner MD5 */
85 MD5Init(&context);
86 MD5Update(&context, pad.inner, 64);
87 MD5Update(&context, data, data_len);
88 MD5Final(digest, &context);
89
90 /* outer MD5 */
91 MD5Init(&context);
92 MD5Update(&context, pad.outer, 64);
93 MD5Update(&context, digest, 16);
94 MD5Final(digest, &context);
95}
96