6 hmac_x(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s,
7 DigestState*(*x)(uchar*, ulong, uchar*, DigestState*), int xlen)
10 uchar pad[Hmacblksz+1], innerdigest[256];
12 if(xlen > sizeof(innerdigest))
17 (*x)(key, klen, innerdigest, nil);
22 /* first time through */
23 if(s == nil || s->seeded == 0){
24 memset(pad, 0x36, Hmacblksz);
26 for(i = 0; i < klen; i++)
28 s = (*x)(pad, Hmacblksz, nil, s);
33 s = (*x)(p, len, nil, s);
37 /* last time through */
38 memset(pad, 0x5c, Hmacblksz);
40 for(i = 0; i < klen; i++)
42 (*x)(nil, 0, innerdigest, s);
43 s = (*x)(pad, Hmacblksz, nil, nil);
44 (*x)(innerdigest, xlen, digest, s);