kdf.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include <memory.h>
  2. #include <openssl/evp.h>
  3. #include "sm3.h"
  4. // ----- KDF FUNCTIONS START -----
  5. //typedef void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen);
  6. int x9_63_kdf(const EVP_MD *md, const unsigned char *share, size_t sharelen, size_t keylen, unsigned char *outkey)
  7. {
  8. int ret = 0;
  9. EVP_MD_CTX ctx;
  10. unsigned char counter[4] = {0, 0, 0, 1};
  11. unsigned char dgst[EVP_MAX_MD_SIZE];
  12. unsigned int dgstlen;
  13. int rlen = (int)keylen;
  14. unsigned char * pp;
  15. pp = outkey;
  16. if (keylen > (size_t)EVP_MD_size(md)*255)
  17. {
  18. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  19. goto end;
  20. }
  21. while (rlen > 0)
  22. {
  23. EVP_MD_CTX_init(&ctx);
  24. if (!EVP_DigestInit(&ctx, md))
  25. {
  26. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  27. goto end;
  28. }
  29. if (!EVP_DigestUpdate(&ctx, share, sharelen))
  30. {
  31. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  32. goto end;
  33. }
  34. if (!EVP_DigestUpdate(&ctx, counter, 4))
  35. {
  36. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  37. goto end;
  38. }
  39. if (!EVP_DigestFinal(&ctx, dgst, &dgstlen))
  40. {
  41. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  42. goto end;
  43. }
  44. EVP_MD_CTX_cleanup(&ctx);
  45. memcpy(pp, dgst, keylen>=dgstlen ? dgstlen:keylen);
  46. rlen -= dgstlen;
  47. pp += dgstlen;
  48. counter[3]++;
  49. }
  50. ret = 1;
  51. end:
  52. return ret;
  53. }
  54. int sm3_kdf(unsigned char *share, size_t sharelen, size_t keylen, unsigned char *outkey)
  55. {
  56. int ret = 0;
  57. unsigned char counter[4] = {0, 0, 0, 1};
  58. unsigned char dgst[EVP_MAX_MD_SIZE];
  59. // unsigned char ZA[33] = "\x3B\x85\xA5\x71\x79\xE1\x1E\x7E\x51\x3A\xA6\x22\x99\x1F\x2C\xA7\x4D\x18\x07\xA0\xBD\x4D\x4B\x38\xF9\x09\x87\xA1\x7A\xC2\x45\xB1";
  60. // unsigned char ZB[33] = "\x79\xC9\x88\xD6\x32\x29\xD9\x7E\xF1\x9F\xE0\x2C\xA1\x05\x6E\x01\xE6\xA7\x41\x1E\xD2\x46\x94\xAA\x8F\x83\x4F\x4A\x4A\xB0\x22\xF7";
  61. unsigned int dgstlen;
  62. int rlen = (int)keylen;
  63. unsigned char * pp;
  64. sm3_context sm3_ctx;
  65. pp = outkey;
  66. if (keylen > 16*255)
  67. {
  68. fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
  69. goto end;
  70. }
  71. while (rlen > 0)
  72. {
  73. sm3_starts(&sm3_ctx);
  74. sm3_update(&sm3_ctx,share,sharelen);
  75. sm3_update(&sm3_ctx,counter,4);
  76. sm3_finish(&sm3_ctx,dgst);
  77. dgstlen = 32;
  78. memcpy(pp, dgst, keylen>=dgstlen ? dgstlen:keylen);
  79. rlen -= dgstlen;
  80. pp += dgstlen;
  81. counter[3]++;
  82. }
  83. ret = 1;
  84. end:
  85. return ret;
  86. }
  87. // ----- KDF FUNCTIONS END -----