123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #include <memory.h>
- #include <openssl/evp.h>
- #include "sm3.h"
- // ----- KDF FUNCTIONS START -----
- //typedef void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen);
- int x9_63_kdf(const EVP_MD *md, const unsigned char *share, size_t sharelen, size_t keylen, unsigned char *outkey)
- {
- int ret = 0;
- EVP_MD_CTX ctx;
- unsigned char counter[4] = {0, 0, 0, 1};
- unsigned char dgst[EVP_MAX_MD_SIZE];
- unsigned int dgstlen;
- int rlen = (int)keylen;
- unsigned char * pp;
- pp = outkey;
- if (keylen > (size_t)EVP_MD_size(md)*255)
- {
- fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
- goto end;
- }
- while (rlen > 0)
- {
- EVP_MD_CTX_init(&ctx);
- if (!EVP_DigestInit(&ctx, md))
- {
- fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
- goto end;
- }
- if (!EVP_DigestUpdate(&ctx, share, sharelen))
- {
- fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
- goto end;
- }
- if (!EVP_DigestUpdate(&ctx, counter, 4))
- {
- fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
- goto end;
- }
- if (!EVP_DigestFinal(&ctx, dgst, &dgstlen))
- {
- fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
- goto end;
- }
- EVP_MD_CTX_cleanup(&ctx);
- memcpy(pp, dgst, keylen>=dgstlen ? dgstlen:keylen);
- rlen -= dgstlen;
- pp += dgstlen;
- counter[3]++;
- }
- ret = 1;
- end:
- return ret;
- }
- int sm3_kdf(unsigned char *share, size_t sharelen, size_t keylen, unsigned char *outkey)
- {
- int ret = 0;
-
- unsigned char counter[4] = {0, 0, 0, 1};
- unsigned char dgst[EVP_MAX_MD_SIZE];
- // 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";
- // 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";
- unsigned int dgstlen;
- int rlen = (int)keylen;
- unsigned char * pp;
- sm3_context sm3_ctx;
- pp = outkey;
-
- if (keylen > 16*255)
- {
- fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
- goto end;
- }
-
- while (rlen > 0)
- {
- sm3_starts(&sm3_ctx);
- sm3_update(&sm3_ctx,share,sharelen);
- sm3_update(&sm3_ctx,counter,4);
- sm3_finish(&sm3_ctx,dgst);
- dgstlen = 32;
- memcpy(pp, dgst, keylen>=dgstlen ? dgstlen:keylen);
-
- rlen -= dgstlen;
- pp += dgstlen;
- counter[3]++;
- }
-
- ret = 1;
-
- end:
- return ret;
- }
- // ----- KDF FUNCTIONS END -----
|