mirror of
https://github.com/espressif/mbedtls.git
synced 2025-06-15 13:32:52 +08:00
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
@ -5529,6 +5529,66 @@ cleanup:
|
|||||||
mbedtls_free(input);
|
mbedtls_free(input);
|
||||||
return status;
|
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 */
|
#endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
|
||||||
|
|
||||||
psa_status_t psa_key_derivation_output_bytes(
|
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 */
|
#endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS */
|
||||||
#if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC)
|
#if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC)
|
||||||
if (PSA_ALG_IS_PBKDF2_HMAC(kdf_alg)) {
|
if (PSA_ALG_IS_PBKDF2_HMAC(kdf_alg)) {
|
||||||
/* As output functionality is not added yet return
|
status = psa_key_derivation_pbkdf2_read(&operation->ctx.pbkdf2, kdf_alg,
|
||||||
* PSA_ERROR_NOT_SUPPORTED for now if inputs are passed correctly.
|
output, output_length);
|
||||||
* If input validation fails operation is aborted and output_bytes
|
|
||||||
* will return PSA_ERROR_BAD_STATE */
|
|
||||||
status = PSA_ERROR_NOT_SUPPORTED;
|
|
||||||
} else
|
} else
|
||||||
#endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
|
#endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user