]>
jfr.im git - irc/quakenet/newserv.git/blob - lib/hmac.c
5 void hmacsha256_init(hmacsha256
*c
, unsigned char *key
, int keylen
) {
6 unsigned char realkey
[64], outerkey
[64], innerkey
[64];
10 memset(realkey
, 0, sizeof(realkey
));
13 SHA256_Update(&keyc
, key
, keylen
);
14 SHA256_Final(realkey
, &keyc
);
17 memcpy(realkey
, key
, keylen
);
20 /* abusing the cache here, if we do sha256 in between that'll erase it */
23 innerkey
[i
] = r
^ 0x36;
24 outerkey
[i
] = r
^ 0x5c;
27 SHA256_Init(&c
->outer
);
28 SHA256_Init(&c
->inner
);
29 SHA256_Update(&c
->outer
, outerkey
, 64);
30 SHA256_Update(&c
->inner
, innerkey
, 64);
33 void hmacsha256_update(hmacsha256
*c
, unsigned char *message
, int messagelen
) {
34 SHA256_Update(&c
->inner
, message
, messagelen
);
37 void hmacsha256_final(hmacsha256
*c
, unsigned char *digest
) {
38 SHA256_Final(digest
, &c
->inner
);
39 SHA256_Update(&c
->outer
, digest
, 32);
40 SHA256_Final(digest
, &c
->outer
);
43 void hmacsha1_init(hmacsha1
*c
, unsigned char *key
, int keylen
) {
44 unsigned char realkey
[64], outerkey
[64], innerkey
[64];
48 memset(realkey
, 0, sizeof(realkey
));
51 SHA1Update(&keyc
, key
, keylen
);
52 SHA1Final(realkey
, &keyc
);
54 memcpy(realkey
, key
, keylen
);
57 /* abusing the cache here, if we do sha1 in between that'll erase it */
60 innerkey
[i
] = r
^ 0x36;
61 outerkey
[i
] = r
^ 0x5c;
66 SHA1Update(&c
->outer
, outerkey
, 64);
67 SHA1Update(&c
->inner
, innerkey
, 64);
70 void hmacsha1_update(hmacsha1
*c
, unsigned char *message
, int messagelen
) {
71 SHA1Update(&c
->inner
, message
, messagelen
);
74 void hmacsha1_final(hmacsha1
*c
, unsigned char *digest
) {
75 SHA1Final(digest
, &c
->inner
);
76 SHA1Update(&c
->outer
, digest
, 20);
77 SHA1Final(digest
, &c
->outer
);
80 void hmacmd5_init(hmacmd5
*c
, unsigned char *key
, int keylen
) {
81 unsigned char realkey
[64], outerkey
[64], innerkey
[64];
85 memset(realkey
, 0, sizeof(realkey
));
88 MD5Update(&keyc
, key
, keylen
);
89 MD5Final(realkey
, &keyc
);
91 memcpy(realkey
, key
, keylen
);
94 /* abusing the cache here, if we do sha1 in between that'll erase it */
97 innerkey
[i
] = r
^ 0x36;
98 outerkey
[i
] = r
^ 0x5c;
103 MD5Update(&c
->outer
, outerkey
, 64);
104 MD5Update(&c
->inner
, innerkey
, 64);
107 void hmacmd5_update(hmacmd5
*c
, unsigned char *message
, int messagelen
) {
108 MD5Update(&c
->inner
, message
, messagelen
);
111 void hmacmd5_final(hmacmd5
*c
, unsigned char *digest
) {
112 MD5Final(digest
, &c
->inner
);
113 MD5Update(&c
->outer
, digest
, 16);
114 MD5Final(digest
, &c
->outer
);
117 static const char *hexdigits
= "0123456789abcdef";
119 char *hmac_printhex(unsigned char *data
, char *out
, size_t len
) {
121 unsigned char *o
= (unsigned char *)out
;
124 *o
++ = hexdigits
[(*data
& 0xf0) >> 4];
125 *o
++ = hexdigits
[*data
& 0x0f];
133 int hmac_strcmp(const char *a
, const char *b
) {
139 if(strlen(a
) != strlen(b
))
143 result
&=(tolower(*a
++) == tolower(*b
++));