Add pbkdf2 function to key_derivation_output_bytes
Signed-off-by: Kusumit Ghoderao <Kusumit.Ghoderao@silabs.com>
This commit is contained in:
parent
a4346cdc50
commit
f6a0d57e4d
1 changed files with 62 additions and 5 deletions
|
@ -5529,6 +5529,66 @@ cleanup:
|
|||
mbedtls_free(input);
|
||||
return status;
|
||||
}
|
||||
|
||||
static psa_status_t psa_key_derivation_pbkdf2_read(
|
||||
psa_pbkdf2_key_derivation_t *pbkdf2,
|
||||
psa_algorithm_t kdf_alg,
|
||||
uint8_t *output,
|
||||
size_t output_length)
|
||||
{
|
||||
psa_status_t status;
|
||||
psa_algorithm_t prf_alg;
|
||||
uint8_t prf_output_length;
|
||||
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
||||
psa_set_key_bits(&attributes, PSA_BYTES_TO_BITS(pbkdf2->password_length));
|
||||
psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_MESSAGE);
|
||||
|
||||
if (PSA_ALG_IS_PBKDF2_HMAC(kdf_alg)) {
|
||||
prf_alg = PSA_ALG_HMAC(PSA_ALG_PBKDF2_HMAC_GET_HASH(kdf_alg));
|
||||
prf_output_length = PSA_HASH_LENGTH(prf_alg);
|
||||
psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC);
|
||||
}
|
||||
|
||||
switch (pbkdf2->state) {
|
||||
case PSA_PBKDF2_STATE_PASSWORD_SET:
|
||||
/* Initially we need a new block so bytes_used is equal to block size*/
|
||||
pbkdf2->bytes_used = prf_output_length;
|
||||
pbkdf2->state = PSA_PBKDF2_STATE_OUTPUT;
|
||||
break;
|
||||
case PSA_PBKDF2_STATE_OUTPUT:
|
||||
break;
|
||||
default:
|
||||
return PSA_ERROR_BAD_STATE;
|
||||
}
|
||||
|
||||
while (output_length != 0) {
|
||||
uint8_t n = prf_output_length - pbkdf2->bytes_used;
|
||||
if (n > output_length) {
|
||||
n = (uint8_t) output_length;
|
||||
}
|
||||
memcpy(output, pbkdf2->output_block + pbkdf2->bytes_used, n);
|
||||
output += n;
|
||||
output_length -= n;
|
||||
pbkdf2->bytes_used += n;
|
||||
|
||||
if (output_length == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* We need a new block */
|
||||
pbkdf2->bytes_used = 0;
|
||||
pbkdf2->block_number++;
|
||||
|
||||
status = psa_key_derivation_pbkdf2_generate_block(pbkdf2, prf_alg,
|
||||
prf_output_length,
|
||||
&attributes);
|
||||
if (status != PSA_SUCCESS) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
return PSA_SUCCESS;
|
||||
}
|
||||
#endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
|
||||
|
||||
psa_status_t psa_key_derivation_output_bytes(
|
||||
|
@ -5586,11 +5646,8 @@ psa_status_t psa_key_derivation_output_bytes(
|
|||
#endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS */
|
||||
#if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC)
|
||||
if (PSA_ALG_IS_PBKDF2_HMAC(kdf_alg)) {
|
||||
/* As output functionality is not added yet return
|
||||
* PSA_ERROR_NOT_SUPPORTED for now if inputs are passed correctly.
|
||||
* If input validation fails operation is aborted and output_bytes
|
||||
* will return PSA_ERROR_BAD_STATE */
|
||||
status = PSA_ERROR_NOT_SUPPORTED;
|
||||
status = psa_key_derivation_pbkdf2_read(&operation->ctx.pbkdf2, kdf_alg,
|
||||
output, output_length);
|
||||
} else
|
||||
#endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
|
||||
|
||||
|
|
Loading…
Reference in a new issue