Latest update.
This commit is contained in:
+42
-3
@@ -66,10 +66,16 @@ static const unsigned char kmac_custom_str[] = { 0x4B, 0x44, 0x46 };
|
||||
/*
|
||||
* Refer to https://csrc.nist.gov/publications/detail/sp/800-56c/rev-1/final
|
||||
* Section 4. One-Step Key Derivation using H(x) = hash(x)
|
||||
* Note: X9.63 also uses this code with the only difference being that the
|
||||
* counter is appended to the secret 'z'.
|
||||
* i.e.
|
||||
* result[i] = Hash(counter || z || info) for One Step OR
|
||||
* result[i] = Hash(z || counter || info) for X9.63.
|
||||
*/
|
||||
static int SSKDF_hash_kdm(const EVP_MD *kdf_md,
|
||||
const unsigned char *z, size_t z_len,
|
||||
const unsigned char *info, size_t info_len,
|
||||
unsigned int append_ctr,
|
||||
unsigned char *derived_key, size_t derived_key_len)
|
||||
{
|
||||
int ret = 0, hlen;
|
||||
@@ -104,8 +110,9 @@ static int SSKDF_hash_kdm(const EVP_MD *kdf_md,
|
||||
c[3] = (unsigned char)(counter & 0xff);
|
||||
|
||||
if (!(EVP_MD_CTX_copy_ex(ctx, ctx_init)
|
||||
&& EVP_DigestUpdate(ctx, c, sizeof(c))
|
||||
&& (append_ctr || EVP_DigestUpdate(ctx, c, sizeof(c)))
|
||||
&& EVP_DigestUpdate(ctx, z, z_len)
|
||||
&& (!append_ctr || EVP_DigestUpdate(ctx, c, sizeof(c)))
|
||||
&& EVP_DigestUpdate(ctx, info, info_len)))
|
||||
goto end;
|
||||
if (len >= out_len) {
|
||||
@@ -468,11 +475,32 @@ static int sskdf_derive(EVP_KDF_IMPL *impl, unsigned char *key, size_t keylen)
|
||||
return 0;
|
||||
}
|
||||
return SSKDF_hash_kdm(impl->md, impl->secret, impl->secret_len,
|
||||
impl->info, impl->info_len, key, keylen);
|
||||
impl->info, impl->info_len, 0, key, keylen);
|
||||
}
|
||||
}
|
||||
|
||||
const EVP_KDF_METHOD ss_kdf_meth = {
|
||||
static int x963kdf_derive(EVP_KDF_IMPL *impl, unsigned char *key, size_t keylen)
|
||||
{
|
||||
if (impl->secret == NULL) {
|
||||
KDFerr(KDF_F_X963KDF_DERIVE, KDF_R_MISSING_SECRET);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (impl->mac != NULL) {
|
||||
KDFerr(KDF_F_X963KDF_DERIVE, KDF_R_NOT_SUPPORTED);
|
||||
return 0;
|
||||
} else {
|
||||
/* H(x) = hash */
|
||||
if (impl->md == NULL) {
|
||||
KDFerr(KDF_F_X963KDF_DERIVE, KDF_R_MISSING_MESSAGE_DIGEST);
|
||||
return 0;
|
||||
}
|
||||
return SSKDF_hash_kdm(impl->md, impl->secret, impl->secret_len,
|
||||
impl->info, impl->info_len, 1, key, keylen);
|
||||
}
|
||||
}
|
||||
|
||||
const EVP_KDF ss_kdf_meth = {
|
||||
EVP_KDF_SS,
|
||||
sskdf_new,
|
||||
sskdf_free,
|
||||
@@ -482,3 +510,14 @@ const EVP_KDF_METHOD ss_kdf_meth = {
|
||||
sskdf_size,
|
||||
sskdf_derive
|
||||
};
|
||||
|
||||
const EVP_KDF x963_kdf_meth = {
|
||||
EVP_KDF_X963,
|
||||
sskdf_new,
|
||||
sskdf_free,
|
||||
sskdf_reset,
|
||||
sskdf_ctrl,
|
||||
sskdf_ctrl_str,
|
||||
sskdf_size,
|
||||
x963kdf_derive
|
||||
};
|
||||
Reference in New Issue
Block a user