hmac.c 1.2 KB

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