kdf.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include <memory.h>
  2. #include <openssl/evp.h>
  3. // ----- KDF FUNCTIONS START -----
  4. //typedef void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen);
  5. int x9_63_kdf(const EVP_MD *md, const unsigned char *share, size_t sharelen, size_t keylen, unsigned char *outkey)
  6. {
  7. int ret = 0;
  8. EVP_MD_CTX ctx;
  9. unsigned char counter[4] = {0, 0, 0, 1};
  10. unsigned char dgst[EVP_MAX_MD_SIZE];
  11. unsigned int dgstlen;
  12. int rlen = (int)keylen;
  13. unsigned char * pp;
  14. pp = outkey;
  15. if (keylen > (size_t)EVP_MD_size(md)*255)
  16. {
  17. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  18. goto end;
  19. }
  20. while (rlen > 0)
  21. {
  22. EVP_MD_CTX_init(&ctx);
  23. if (!EVP_DigestInit(&ctx, md))
  24. {
  25. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  26. goto end;
  27. }
  28. if (!EVP_DigestUpdate(&ctx, share, sharelen))
  29. {
  30. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  31. goto end;
  32. }
  33. if (!EVP_DigestUpdate(&ctx, counter, 4))
  34. {
  35. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  36. goto end;
  37. }
  38. if (!EVP_DigestFinal(&ctx, dgst, &dgstlen))
  39. {
  40. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  41. goto end;
  42. }
  43. EVP_MD_CTX_cleanup(&ctx);
  44. memcpy(pp, dgst, keylen>=dgstlen ? dgstlen:keylen);
  45. rlen -= dgstlen;
  46. pp += dgstlen;
  47. counter[3]++;
  48. }
  49. ret = 1;
  50. end:
  51. return ret;
  52. }
  53. // ----- KDF FUNCTIONS END -----