URI:
       thmac.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       thmac.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 }