Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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