1*8ccd4a63SDavid du Colombier #include "os.h"
2*8ccd4a63SDavid du Colombier #include <libsec.h>
3*8ccd4a63SDavid du Colombier
4*8ccd4a63SDavid du Colombier /* rfc2104 */
5*8ccd4a63SDavid du Colombier static DigestState*
hmac_x(uchar * p,ulong len,uchar * key,ulong klen,uchar * digest,DigestState * s,DigestState * (* x)(uchar *,ulong,uchar *,DigestState *),int xlen)6*8ccd4a63SDavid du Colombier hmac_x(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s,
7*8ccd4a63SDavid du Colombier DigestState*(*x)(uchar*, ulong, uchar*, DigestState*), int xlen)
8*8ccd4a63SDavid du Colombier {
9*8ccd4a63SDavid du Colombier int i;
10*8ccd4a63SDavid du Colombier uchar pad[65], innerdigest[256];
11*8ccd4a63SDavid du Colombier
12*8ccd4a63SDavid du Colombier if(xlen > sizeof(innerdigest))
13*8ccd4a63SDavid du Colombier return nil;
14*8ccd4a63SDavid du Colombier
15*8ccd4a63SDavid du Colombier if(klen>64)
16*8ccd4a63SDavid du Colombier return nil;
17*8ccd4a63SDavid du Colombier
18*8ccd4a63SDavid du Colombier /* first time through */
19*8ccd4a63SDavid du Colombier if(s == nil){
20*8ccd4a63SDavid du Colombier for(i=0; i<64; i++)
21*8ccd4a63SDavid du Colombier pad[i] = 0x36;
22*8ccd4a63SDavid du Colombier pad[64] = 0;
23*8ccd4a63SDavid du Colombier for(i=0; i<klen; i++)
24*8ccd4a63SDavid du Colombier pad[i] ^= key[i];
25*8ccd4a63SDavid du Colombier s = (*x)(pad, 64, nil, nil);
26*8ccd4a63SDavid du Colombier if(s == nil)
27*8ccd4a63SDavid du Colombier return nil;
28*8ccd4a63SDavid du Colombier }
29*8ccd4a63SDavid du Colombier
30*8ccd4a63SDavid du Colombier s = (*x)(p, len, nil, s);
31*8ccd4a63SDavid du Colombier if(digest == nil)
32*8ccd4a63SDavid du Colombier return s;
33*8ccd4a63SDavid du Colombier
34*8ccd4a63SDavid du Colombier /* last time through */
35*8ccd4a63SDavid du Colombier for(i=0; i<64; i++)
36*8ccd4a63SDavid du Colombier pad[i] = 0x5c;
37*8ccd4a63SDavid du Colombier pad[64] = 0;
38*8ccd4a63SDavid du Colombier for(i=0; i<klen; i++)
39*8ccd4a63SDavid du Colombier pad[i] ^= key[i];
40*8ccd4a63SDavid du Colombier (*x)(nil, 0, innerdigest, s);
41*8ccd4a63SDavid du Colombier s = (*x)(pad, 64, nil, nil);
42*8ccd4a63SDavid du Colombier (*x)(innerdigest, xlen, digest, s);
43*8ccd4a63SDavid du Colombier return nil;
44*8ccd4a63SDavid du Colombier }
45*8ccd4a63SDavid du Colombier
46*8ccd4a63SDavid du Colombier DigestState*
hmac_sha1(uchar * p,ulong len,uchar * key,ulong klen,uchar * digest,DigestState * s)47*8ccd4a63SDavid du Colombier hmac_sha1(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s)
48*8ccd4a63SDavid du Colombier {
49*8ccd4a63SDavid du Colombier return hmac_x(p, len, key, klen, digest, s, sha1, SHA1dlen);
50*8ccd4a63SDavid du Colombier }
51*8ccd4a63SDavid du Colombier
52*8ccd4a63SDavid du Colombier DigestState*
hmac_md5(uchar * p,ulong len,uchar * key,ulong klen,uchar * digest,DigestState * s)53*8ccd4a63SDavid du Colombier hmac_md5(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s)
54*8ccd4a63SDavid du Colombier {
55*8ccd4a63SDavid du Colombier return hmac_x(p, len, key, klen, digest, s, md5, MD5dlen);
56*8ccd4a63SDavid du Colombier }
57