hmac.c 885 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #include "os.h"
  2. #include <libsec.h>
  3. /* rfc2104 */
  4. DigestState*
  5. hmac_x(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s,
  6. DigestState*(*x)(uchar*, ulong, uchar*, DigestState*), int xlen)
  7. {
  8. int i;
  9. uchar pad[Hmacblksz+1], innerdigest[256];
  10. if(xlen > sizeof(innerdigest))
  11. return nil;
  12. if(klen > Hmacblksz)
  13. return nil;
  14. /* first time through */
  15. if(s == nil || s->seeded == 0){
  16. memset(pad, 0x36, Hmacblksz);
  17. pad[Hmacblksz] = 0;
  18. for(i = 0; i < klen; i++)
  19. pad[i] ^= key[i];
  20. s = (*x)(pad, Hmacblksz, nil, s);
  21. if(s == nil)
  22. return nil;
  23. }
  24. s = (*x)(p, len, nil, s);
  25. if(digest == nil)
  26. return s;
  27. /* last time through */
  28. memset(pad, 0x5c, Hmacblksz);
  29. pad[Hmacblksz] = 0;
  30. for(i = 0; i < klen; i++)
  31. pad[i] ^= key[i];
  32. (*x)(nil, 0, innerdigest, s);
  33. s = (*x)(pad, Hmacblksz, nil, nil);
  34. (*x)(innerdigest, xlen, digest, s);
  35. return nil;
  36. }