xref: /plan9/sys/src/cmd/unix/drawterm/libsec/hmac.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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