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