hmac.c (1167B)
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 }