You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.3 KiB
68 lines
1.3 KiB
|
|
#include <memory.h>
|
|
#include <openssl/evp.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;
|
|
}
|
|
|
|
// ----- KDF FUNCTIONS END -----
|