6 hmac_x(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s,
7 DigestState*(*x)(uchar*, ulong, uchar*, DigestState*), int xlen)
10 uchar pad[65], innerdigest[256];
12 if(xlen > sizeof(innerdigest))
18 /* first time through */
25 s = (*x)(pad, 64, nil, nil);
30 s = (*x)(p, len, nil, s);
34 /* last time through */
40 (*x)(nil, 0, innerdigest, s);
41 s = (*x)(pad, 64, nil, nil);
42 (*x)(innerdigest, xlen, digest, s);
47 hmac_sha1(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s)
49 return hmac_x(p, len, key, klen, digest, s, sha1, SHA1dlen);
53 hmac_md5(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s)
55 return hmac_x(p, len, key, klen, digest, s, md5, MD5dlen);