mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-08-08 17:42:09 +03:00
Merge branch 'development-restricted' into key_agreement_buffer_protection
Signed-off-by: tom-daubney-arm <74920390+tom-daubney-arm@users.noreply.github.com>
This commit is contained in:
@@ -234,6 +234,8 @@ mbedtls_psa_drbg_context_t *const mbedtls_psa_random_state =
|
|||||||
uint8_t *output_copy_name = NULL;
|
uint8_t *output_copy_name = NULL;
|
||||||
#define LOCAL_OUTPUT_ALLOC(output, length, output_copy) \
|
#define LOCAL_OUTPUT_ALLOC(output, length, output_copy) \
|
||||||
output_copy = output;
|
output_copy = output;
|
||||||
|
#define LOCAL_OUTPUT_ALLOC_WITH_COPY(output, length, output_copy) \
|
||||||
|
output_copy = output;
|
||||||
#define LOCAL_OUTPUT_FREE(output, output_copy) \
|
#define LOCAL_OUTPUT_FREE(output, output_copy) \
|
||||||
output_copy = NULL;
|
output_copy = NULL;
|
||||||
#endif /* MBEDTLS_PSA_COPY_CALLER_BUFFERS */
|
#endif /* MBEDTLS_PSA_COPY_CALLER_BUFFERS */
|
||||||
@@ -2705,35 +2707,48 @@ psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
|
|||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_mac_update(psa_mac_operation_t *operation,
|
psa_status_t psa_mac_update(psa_mac_operation_t *operation,
|
||||||
const uint8_t *input,
|
const uint8_t *input_external,
|
||||||
size_t input_length)
|
size_t input_length)
|
||||||
{
|
{
|
||||||
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
LOCAL_INPUT_DECLARE(input_external, input);
|
||||||
|
|
||||||
if (operation->id == 0) {
|
if (operation->id == 0) {
|
||||||
return PSA_ERROR_BAD_STATE;
|
status = PSA_ERROR_BAD_STATE;
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't require hash implementations to behave correctly on a
|
/* Don't require hash implementations to behave correctly on a
|
||||||
* zero-length input, which may have an invalid pointer. */
|
* zero-length input, which may have an invalid pointer. */
|
||||||
if (input_length == 0) {
|
if (input_length == 0) {
|
||||||
return PSA_SUCCESS;
|
status = PSA_SUCCESS;
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t status = psa_driver_wrapper_mac_update(operation,
|
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
||||||
input, input_length);
|
status = psa_driver_wrapper_mac_update(operation, input, input_length);
|
||||||
|
|
||||||
if (status != PSA_SUCCESS) {
|
if (status != PSA_SUCCESS) {
|
||||||
psa_mac_abort(operation);
|
psa_mac_abort(operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
exit:
|
||||||
|
#endif
|
||||||
|
LOCAL_INPUT_FREE(input_external, input);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
|
psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
|
||||||
uint8_t *mac,
|
uint8_t *mac_external,
|
||||||
size_t mac_size,
|
size_t mac_size,
|
||||||
size_t *mac_length)
|
size_t *mac_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
LOCAL_OUTPUT_DECLARE(mac_external, mac);
|
||||||
|
LOCAL_OUTPUT_ALLOC(mac_external, mac_size, mac);
|
||||||
|
|
||||||
if (operation->id == 0) {
|
if (operation->id == 0) {
|
||||||
status = PSA_ERROR_BAD_STATE;
|
status = PSA_ERROR_BAD_STATE;
|
||||||
@@ -2757,6 +2772,7 @@ psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status = psa_driver_wrapper_mac_sign_finish(operation,
|
status = psa_driver_wrapper_mac_sign_finish(operation,
|
||||||
mac, operation->mac_size,
|
mac, operation->mac_size,
|
||||||
mac_length);
|
mac_length);
|
||||||
@@ -2773,19 +2789,23 @@ exit:
|
|||||||
operation->mac_size = 0;
|
operation->mac_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mac != NULL) {
|
||||||
psa_wipe_tag_output_buffer(mac, status, mac_size, *mac_length);
|
psa_wipe_tag_output_buffer(mac, status, mac_size, *mac_length);
|
||||||
|
}
|
||||||
|
|
||||||
abort_status = psa_mac_abort(operation);
|
abort_status = psa_mac_abort(operation);
|
||||||
|
LOCAL_OUTPUT_FREE(mac_external, mac);
|
||||||
|
|
||||||
return status == PSA_SUCCESS ? abort_status : status;
|
return status == PSA_SUCCESS ? abort_status : status;
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
|
psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
|
||||||
const uint8_t *mac,
|
const uint8_t *mac_external,
|
||||||
size_t mac_length)
|
size_t mac_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
LOCAL_INPUT_DECLARE(mac_external, mac);
|
||||||
|
|
||||||
if (operation->id == 0) {
|
if (operation->id == 0) {
|
||||||
status = PSA_ERROR_BAD_STATE;
|
status = PSA_ERROR_BAD_STATE;
|
||||||
@@ -2802,11 +2822,13 @@ psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(mac_external, mac_length, mac);
|
||||||
status = psa_driver_wrapper_mac_verify_finish(operation,
|
status = psa_driver_wrapper_mac_verify_finish(operation,
|
||||||
mac, mac_length);
|
mac, mac_length);
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
abort_status = psa_mac_abort(operation);
|
abort_status = psa_mac_abort(operation);
|
||||||
|
LOCAL_INPUT_FREE(mac_external, mac);
|
||||||
|
|
||||||
return status == PSA_SUCCESS ? abort_status : status;
|
return status == PSA_SUCCESS ? abort_status : status;
|
||||||
}
|
}
|
||||||
@@ -2878,28 +2900,45 @@ exit:
|
|||||||
|
|
||||||
psa_status_t psa_mac_compute(mbedtls_svc_key_id_t key,
|
psa_status_t psa_mac_compute(mbedtls_svc_key_id_t key,
|
||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
const uint8_t *input,
|
const uint8_t *input_external,
|
||||||
size_t input_length,
|
size_t input_length,
|
||||||
uint8_t *mac,
|
uint8_t *mac_external,
|
||||||
size_t mac_size,
|
size_t mac_size,
|
||||||
size_t *mac_length)
|
size_t *mac_length)
|
||||||
{
|
{
|
||||||
return psa_mac_compute_internal(key, alg,
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
LOCAL_INPUT_DECLARE(input_external, input);
|
||||||
|
LOCAL_OUTPUT_DECLARE(mac_external, mac);
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
||||||
|
LOCAL_OUTPUT_ALLOC(mac_external, mac_size, mac);
|
||||||
|
status = psa_mac_compute_internal(key, alg,
|
||||||
input, input_length,
|
input, input_length,
|
||||||
mac, mac_size, mac_length, 1);
|
mac, mac_size, mac_length, 1);
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
exit:
|
||||||
|
#endif
|
||||||
|
LOCAL_INPUT_FREE(input_external, input);
|
||||||
|
LOCAL_OUTPUT_FREE(mac_external, mac);
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_mac_verify(mbedtls_svc_key_id_t key,
|
psa_status_t psa_mac_verify(mbedtls_svc_key_id_t key,
|
||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
const uint8_t *input,
|
const uint8_t *input_external,
|
||||||
size_t input_length,
|
size_t input_length,
|
||||||
const uint8_t *mac,
|
const uint8_t *mac_external,
|
||||||
size_t mac_length)
|
size_t mac_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
uint8_t actual_mac[PSA_MAC_MAX_SIZE];
|
uint8_t actual_mac[PSA_MAC_MAX_SIZE];
|
||||||
size_t actual_mac_length;
|
size_t actual_mac_length;
|
||||||
|
LOCAL_INPUT_DECLARE(input_external, input);
|
||||||
|
LOCAL_INPUT_DECLARE(mac_external, mac);
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
||||||
status = psa_mac_compute_internal(key, alg,
|
status = psa_mac_compute_internal(key, alg,
|
||||||
input, input_length,
|
input, input_length,
|
||||||
actual_mac, sizeof(actual_mac),
|
actual_mac, sizeof(actual_mac),
|
||||||
@@ -2912,6 +2951,8 @@ psa_status_t psa_mac_verify(mbedtls_svc_key_id_t key,
|
|||||||
status = PSA_ERROR_INVALID_SIGNATURE;
|
status = PSA_ERROR_INVALID_SIGNATURE;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(mac_external, mac_length, mac);
|
||||||
if (mbedtls_ct_memcmp(mac, actual_mac, actual_mac_length) != 0) {
|
if (mbedtls_ct_memcmp(mac, actual_mac, actual_mac_length) != 0) {
|
||||||
status = PSA_ERROR_INVALID_SIGNATURE;
|
status = PSA_ERROR_INVALID_SIGNATURE;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -2919,6 +2960,8 @@ psa_status_t psa_mac_verify(mbedtls_svc_key_id_t key,
|
|||||||
|
|
||||||
exit:
|
exit:
|
||||||
mbedtls_platform_zeroize(actual_mac, sizeof(actual_mac));
|
mbedtls_platform_zeroize(actual_mac, sizeof(actual_mac));
|
||||||
|
LOCAL_INPUT_FREE(input_external, input);
|
||||||
|
LOCAL_INPUT_FREE(mac_external, mac);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -3336,11 +3379,11 @@ exit:
|
|||||||
|
|
||||||
psa_status_t psa_asymmetric_encrypt(mbedtls_svc_key_id_t key,
|
psa_status_t psa_asymmetric_encrypt(mbedtls_svc_key_id_t key,
|
||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
const uint8_t *input,
|
const uint8_t *input_external,
|
||||||
size_t input_length,
|
size_t input_length,
|
||||||
const uint8_t *salt,
|
const uint8_t *salt_external,
|
||||||
size_t salt_length,
|
size_t salt_length,
|
||||||
uint8_t *output,
|
uint8_t *output_external,
|
||||||
size_t output_size,
|
size_t output_size,
|
||||||
size_t *output_length)
|
size_t *output_length)
|
||||||
{
|
{
|
||||||
@@ -3348,6 +3391,9 @@ psa_status_t psa_asymmetric_encrypt(mbedtls_svc_key_id_t key,
|
|||||||
psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
psa_key_slot_t *slot;
|
psa_key_slot_t *slot;
|
||||||
psa_key_attributes_t attributes;
|
psa_key_attributes_t attributes;
|
||||||
|
LOCAL_INPUT_DECLARE(input_external, input);
|
||||||
|
LOCAL_INPUT_DECLARE(salt_external, salt);
|
||||||
|
LOCAL_OUTPUT_DECLARE(output_external, output);
|
||||||
|
|
||||||
(void) input;
|
(void) input;
|
||||||
(void) input_length;
|
(void) input_length;
|
||||||
@@ -3376,6 +3422,9 @@ psa_status_t psa_asymmetric_encrypt(mbedtls_svc_key_id_t key,
|
|||||||
.core = slot->attr
|
.core = slot->attr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
||||||
|
LOCAL_INPUT_ALLOC(salt_external, salt_length, salt);
|
||||||
|
LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
|
||||||
status = psa_driver_wrapper_asymmetric_encrypt(
|
status = psa_driver_wrapper_asymmetric_encrypt(
|
||||||
&attributes, slot->key.data, slot->key.bytes,
|
&attributes, slot->key.data, slot->key.bytes,
|
||||||
alg, input, input_length, salt, salt_length,
|
alg, input, input_length, salt, salt_length,
|
||||||
@@ -3383,16 +3432,20 @@ psa_status_t psa_asymmetric_encrypt(mbedtls_svc_key_id_t key,
|
|||||||
exit:
|
exit:
|
||||||
unlock_status = psa_unregister_read(slot);
|
unlock_status = psa_unregister_read(slot);
|
||||||
|
|
||||||
|
LOCAL_INPUT_FREE(input_external, input);
|
||||||
|
LOCAL_INPUT_FREE(salt_external, salt);
|
||||||
|
LOCAL_OUTPUT_FREE(output_external, output);
|
||||||
|
|
||||||
return (status == PSA_SUCCESS) ? unlock_status : status;
|
return (status == PSA_SUCCESS) ? unlock_status : status;
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_asymmetric_decrypt(mbedtls_svc_key_id_t key,
|
psa_status_t psa_asymmetric_decrypt(mbedtls_svc_key_id_t key,
|
||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
const uint8_t *input,
|
const uint8_t *input_external,
|
||||||
size_t input_length,
|
size_t input_length,
|
||||||
const uint8_t *salt,
|
const uint8_t *salt_external,
|
||||||
size_t salt_length,
|
size_t salt_length,
|
||||||
uint8_t *output,
|
uint8_t *output_external,
|
||||||
size_t output_size,
|
size_t output_size,
|
||||||
size_t *output_length)
|
size_t *output_length)
|
||||||
{
|
{
|
||||||
@@ -3401,6 +3454,10 @@ psa_status_t psa_asymmetric_decrypt(mbedtls_svc_key_id_t key,
|
|||||||
psa_key_slot_t *slot;
|
psa_key_slot_t *slot;
|
||||||
psa_key_attributes_t attributes;
|
psa_key_attributes_t attributes;
|
||||||
|
|
||||||
|
LOCAL_INPUT_DECLARE(input_external, input);
|
||||||
|
LOCAL_INPUT_DECLARE(salt_external, salt);
|
||||||
|
LOCAL_OUTPUT_DECLARE(output_external, output);
|
||||||
|
|
||||||
(void) input;
|
(void) input;
|
||||||
(void) input_length;
|
(void) input_length;
|
||||||
(void) salt;
|
(void) salt;
|
||||||
@@ -3427,6 +3484,9 @@ psa_status_t psa_asymmetric_decrypt(mbedtls_svc_key_id_t key,
|
|||||||
.core = slot->attr
|
.core = slot->attr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
||||||
|
LOCAL_INPUT_ALLOC(salt_external, salt_length, salt);
|
||||||
|
LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
|
||||||
status = psa_driver_wrapper_asymmetric_decrypt(
|
status = psa_driver_wrapper_asymmetric_decrypt(
|
||||||
&attributes, slot->key.data, slot->key.bytes,
|
&attributes, slot->key.data, slot->key.bytes,
|
||||||
alg, input, input_length, salt, salt_length,
|
alg, input, input_length, salt, salt_length,
|
||||||
@@ -3435,6 +3495,10 @@ psa_status_t psa_asymmetric_decrypt(mbedtls_svc_key_id_t key,
|
|||||||
exit:
|
exit:
|
||||||
unlock_status = psa_unregister_read(slot);
|
unlock_status = psa_unregister_read(slot);
|
||||||
|
|
||||||
|
LOCAL_INPUT_FREE(input_external, input);
|
||||||
|
LOCAL_INPUT_FREE(salt_external, salt);
|
||||||
|
LOCAL_OUTPUT_FREE(output_external, output);
|
||||||
|
|
||||||
return (status == PSA_SUCCESS) ? unlock_status : status;
|
return (status == PSA_SUCCESS) ? unlock_status : status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4190,6 +4254,54 @@ psa_status_t mbedtls_psa_verify_hash_abort(
|
|||||||
* defined( MBEDTLS_ECP_RESTARTABLE ) */
|
* defined( MBEDTLS_ECP_RESTARTABLE ) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static psa_status_t psa_generate_random_internal(uint8_t *output,
|
||||||
|
size_t output_size)
|
||||||
|
{
|
||||||
|
GUARD_MODULE_INITIALIZED;
|
||||||
|
|
||||||
|
psa_status_t status;
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
|
||||||
|
|
||||||
|
size_t output_length = 0;
|
||||||
|
status = mbedtls_psa_external_get_random(&global_data.rng,
|
||||||
|
output, output_size,
|
||||||
|
&output_length);
|
||||||
|
if (status != PSA_SUCCESS) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
/* Breaking up a request into smaller chunks is currently not supported
|
||||||
|
* for the external RNG interface. */
|
||||||
|
if (output_length != output_size) {
|
||||||
|
status = PSA_ERROR_INSUFFICIENT_ENTROPY;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
status = PSA_SUCCESS;
|
||||||
|
|
||||||
|
#else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
|
||||||
|
|
||||||
|
while (output_size > 0) {
|
||||||
|
size_t request_size =
|
||||||
|
(output_size > MBEDTLS_PSA_RANDOM_MAX_REQUEST ?
|
||||||
|
MBEDTLS_PSA_RANDOM_MAX_REQUEST :
|
||||||
|
output_size);
|
||||||
|
int ret = mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE,
|
||||||
|
output, request_size);
|
||||||
|
if (ret != 0) {
|
||||||
|
status = mbedtls_to_psa_error(ret);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
output_size -= request_size;
|
||||||
|
output += request_size;
|
||||||
|
}
|
||||||
|
status = PSA_SUCCESS;
|
||||||
|
#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************/
|
/****************************************************************/
|
||||||
/* Symmetric cryptography */
|
/* Symmetric cryptography */
|
||||||
/****************************************************************/
|
/****************************************************************/
|
||||||
@@ -4279,14 +4391,15 @@ psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
|
|||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
|
psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
|
||||||
uint8_t *iv,
|
uint8_t *iv_external,
|
||||||
size_t iv_size,
|
size_t iv_size,
|
||||||
size_t *iv_length)
|
size_t *iv_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
uint8_t local_iv[PSA_CIPHER_IV_MAX_SIZE];
|
|
||||||
size_t default_iv_length = 0;
|
size_t default_iv_length = 0;
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_DECLARE(iv_external, iv);
|
||||||
|
|
||||||
if (operation->id == 0) {
|
if (operation->id == 0) {
|
||||||
status = PSA_ERROR_BAD_STATE;
|
status = PSA_ERROR_BAD_STATE;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -4308,33 +4421,40 @@ psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = psa_generate_random(local_iv, default_iv_length);
|
LOCAL_OUTPUT_ALLOC(iv_external, default_iv_length, iv);
|
||||||
|
|
||||||
|
status = psa_generate_random_internal(iv, default_iv_length);
|
||||||
if (status != PSA_SUCCESS) {
|
if (status != PSA_SUCCESS) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = psa_driver_wrapper_cipher_set_iv(operation,
|
status = psa_driver_wrapper_cipher_set_iv(operation,
|
||||||
local_iv, default_iv_length);
|
iv, default_iv_length);
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (status == PSA_SUCCESS) {
|
if (status == PSA_SUCCESS) {
|
||||||
memcpy(iv, local_iv, default_iv_length);
|
|
||||||
*iv_length = default_iv_length;
|
*iv_length = default_iv_length;
|
||||||
operation->iv_set = 1;
|
operation->iv_set = 1;
|
||||||
} else {
|
} else {
|
||||||
*iv_length = 0;
|
*iv_length = 0;
|
||||||
psa_cipher_abort(operation);
|
psa_cipher_abort(operation);
|
||||||
|
if (iv != NULL) {
|
||||||
|
mbedtls_platform_zeroize(iv, default_iv_length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_FREE(iv_external, iv);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
|
psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
|
||||||
const uint8_t *iv,
|
const uint8_t *iv_external,
|
||||||
size_t iv_length)
|
size_t iv_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
|
||||||
|
LOCAL_INPUT_DECLARE(iv_external, iv);
|
||||||
|
|
||||||
if (operation->id == 0) {
|
if (operation->id == 0) {
|
||||||
status = PSA_ERROR_BAD_STATE;
|
status = PSA_ERROR_BAD_STATE;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -4350,6 +4470,8 @@ psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(iv_external, iv_length, iv);
|
||||||
|
|
||||||
status = psa_driver_wrapper_cipher_set_iv(operation,
|
status = psa_driver_wrapper_cipher_set_iv(operation,
|
||||||
iv,
|
iv,
|
||||||
iv_length);
|
iv_length);
|
||||||
@@ -4360,18 +4482,24 @@ exit:
|
|||||||
} else {
|
} else {
|
||||||
psa_cipher_abort(operation);
|
psa_cipher_abort(operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_FREE(iv_external, iv);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
|
psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
|
||||||
const uint8_t *input,
|
const uint8_t *input_external,
|
||||||
size_t input_length,
|
size_t input_length,
|
||||||
uint8_t *output,
|
uint8_t *output_external,
|
||||||
size_t output_size,
|
size_t output_size,
|
||||||
size_t *output_length)
|
size_t *output_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
|
||||||
|
LOCAL_INPUT_DECLARE(input_external, input);
|
||||||
|
LOCAL_OUTPUT_DECLARE(output_external, output);
|
||||||
|
|
||||||
if (operation->id == 0) {
|
if (operation->id == 0) {
|
||||||
status = PSA_ERROR_BAD_STATE;
|
status = PSA_ERROR_BAD_STATE;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -4382,6 +4510,9 @@ psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
||||||
|
LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
|
||||||
|
|
||||||
status = psa_driver_wrapper_cipher_update(operation,
|
status = psa_driver_wrapper_cipher_update(operation,
|
||||||
input,
|
input,
|
||||||
input_length,
|
input_length,
|
||||||
@@ -4394,16 +4525,21 @@ exit:
|
|||||||
psa_cipher_abort(operation);
|
psa_cipher_abort(operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_FREE(input_external, input);
|
||||||
|
LOCAL_OUTPUT_FREE(output_external, output);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
|
psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
|
||||||
uint8_t *output,
|
uint8_t *output_external,
|
||||||
size_t output_size,
|
size_t output_size,
|
||||||
size_t *output_length)
|
size_t *output_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_GENERIC_ERROR;
|
psa_status_t status = PSA_ERROR_GENERIC_ERROR;
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_DECLARE(output_external, output);
|
||||||
|
|
||||||
if (operation->id == 0) {
|
if (operation->id == 0) {
|
||||||
status = PSA_ERROR_BAD_STATE;
|
status = PSA_ERROR_BAD_STATE;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -4414,6 +4550,8 @@ psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
|
||||||
|
|
||||||
status = psa_driver_wrapper_cipher_finish(operation,
|
status = psa_driver_wrapper_cipher_finish(operation,
|
||||||
output,
|
output,
|
||||||
output_size,
|
output_size,
|
||||||
@@ -4421,13 +4559,15 @@ psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
|
|||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (status == PSA_SUCCESS) {
|
if (status == PSA_SUCCESS) {
|
||||||
return psa_cipher_abort(operation);
|
status = psa_cipher_abort(operation);
|
||||||
} else {
|
} else {
|
||||||
*output_length = 0;
|
*output_length = 0;
|
||||||
(void) psa_cipher_abort(operation);
|
(void) psa_cipher_abort(operation);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_FREE(output_external, output);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
|
psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
|
||||||
@@ -4466,9 +4606,6 @@ psa_status_t psa_cipher_encrypt(mbedtls_svc_key_id_t key,
|
|||||||
LOCAL_INPUT_DECLARE(input_external, input);
|
LOCAL_INPUT_DECLARE(input_external, input);
|
||||||
LOCAL_OUTPUT_DECLARE(output_external, output);
|
LOCAL_OUTPUT_DECLARE(output_external, output);
|
||||||
|
|
||||||
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
|
||||||
LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
|
|
||||||
|
|
||||||
if (!PSA_ALG_IS_CIPHER(alg)) {
|
if (!PSA_ALG_IS_CIPHER(alg)) {
|
||||||
status = PSA_ERROR_INVALID_ARGUMENT;
|
status = PSA_ERROR_INVALID_ARGUMENT;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -4497,12 +4634,15 @@ psa_status_t psa_cipher_encrypt(mbedtls_svc_key_id_t key,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = psa_generate_random(local_iv, default_iv_length);
|
status = psa_generate_random_internal(local_iv, default_iv_length);
|
||||||
if (status != PSA_SUCCESS) {
|
if (status != PSA_SUCCESS) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
||||||
|
LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
|
||||||
|
|
||||||
status = psa_driver_wrapper_cipher_encrypt(
|
status = psa_driver_wrapper_cipher_encrypt(
|
||||||
&attributes, slot->key.data, slot->key.bytes,
|
&attributes, slot->key.data, slot->key.bytes,
|
||||||
alg, local_iv, default_iv_length, input, input_length,
|
alg, local_iv, default_iv_length, input, input_length,
|
||||||
@@ -4532,9 +4672,9 @@ exit:
|
|||||||
|
|
||||||
psa_status_t psa_cipher_decrypt(mbedtls_svc_key_id_t key,
|
psa_status_t psa_cipher_decrypt(mbedtls_svc_key_id_t key,
|
||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
const uint8_t *input,
|
const uint8_t *input_external,
|
||||||
size_t input_length,
|
size_t input_length,
|
||||||
uint8_t *output,
|
uint8_t *output_external,
|
||||||
size_t output_size,
|
size_t output_size,
|
||||||
size_t *output_length)
|
size_t *output_length)
|
||||||
{
|
{
|
||||||
@@ -4543,6 +4683,9 @@ psa_status_t psa_cipher_decrypt(mbedtls_svc_key_id_t key,
|
|||||||
psa_key_slot_t *slot = NULL;
|
psa_key_slot_t *slot = NULL;
|
||||||
psa_key_attributes_t attributes;
|
psa_key_attributes_t attributes;
|
||||||
|
|
||||||
|
LOCAL_INPUT_DECLARE(input_external, input);
|
||||||
|
LOCAL_OUTPUT_DECLARE(output_external, output);
|
||||||
|
|
||||||
if (!PSA_ALG_IS_CIPHER(alg)) {
|
if (!PSA_ALG_IS_CIPHER(alg)) {
|
||||||
status = PSA_ERROR_INVALID_ARGUMENT;
|
status = PSA_ERROR_INVALID_ARGUMENT;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -4568,6 +4711,9 @@ psa_status_t psa_cipher_decrypt(mbedtls_svc_key_id_t key,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
||||||
|
LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
|
||||||
|
|
||||||
status = psa_driver_wrapper_cipher_decrypt(
|
status = psa_driver_wrapper_cipher_decrypt(
|
||||||
&attributes, slot->key.data, slot->key.bytes,
|
&attributes, slot->key.data, slot->key.bytes,
|
||||||
alg, input, input_length,
|
alg, input, input_length,
|
||||||
@@ -4583,6 +4729,9 @@ exit:
|
|||||||
*output_length = 0;
|
*output_length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_FREE(input_external, input);
|
||||||
|
LOCAL_OUTPUT_FREE(output_external, output);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4652,19 +4801,24 @@ static psa_status_t psa_aead_check_algorithm(psa_algorithm_t alg)
|
|||||||
|
|
||||||
psa_status_t psa_aead_encrypt(mbedtls_svc_key_id_t key,
|
psa_status_t psa_aead_encrypt(mbedtls_svc_key_id_t key,
|
||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
const uint8_t *nonce,
|
const uint8_t *nonce_external,
|
||||||
size_t nonce_length,
|
size_t nonce_length,
|
||||||
const uint8_t *additional_data,
|
const uint8_t *additional_data_external,
|
||||||
size_t additional_data_length,
|
size_t additional_data_length,
|
||||||
const uint8_t *plaintext,
|
const uint8_t *plaintext_external,
|
||||||
size_t plaintext_length,
|
size_t plaintext_length,
|
||||||
uint8_t *ciphertext,
|
uint8_t *ciphertext_external,
|
||||||
size_t ciphertext_size,
|
size_t ciphertext_size,
|
||||||
size_t *ciphertext_length)
|
size_t *ciphertext_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
psa_key_slot_t *slot;
|
psa_key_slot_t *slot;
|
||||||
|
|
||||||
|
LOCAL_INPUT_DECLARE(nonce_external, nonce);
|
||||||
|
LOCAL_INPUT_DECLARE(additional_data_external, additional_data);
|
||||||
|
LOCAL_INPUT_DECLARE(plaintext_external, plaintext);
|
||||||
|
LOCAL_OUTPUT_DECLARE(ciphertext_external, ciphertext);
|
||||||
|
|
||||||
*ciphertext_length = 0;
|
*ciphertext_length = 0;
|
||||||
|
|
||||||
status = psa_aead_check_algorithm(alg);
|
status = psa_aead_check_algorithm(alg);
|
||||||
@@ -4682,6 +4836,11 @@ psa_status_t psa_aead_encrypt(mbedtls_svc_key_id_t key,
|
|||||||
.core = slot->attr
|
.core = slot->attr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(nonce_external, nonce_length, nonce);
|
||||||
|
LOCAL_INPUT_ALLOC(additional_data_external, additional_data_length, additional_data);
|
||||||
|
LOCAL_INPUT_ALLOC(plaintext_external, plaintext_length, plaintext);
|
||||||
|
LOCAL_OUTPUT_ALLOC(ciphertext_external, ciphertext_size, ciphertext);
|
||||||
|
|
||||||
status = psa_aead_check_nonce_length(alg, nonce_length);
|
status = psa_aead_check_nonce_length(alg, nonce_length);
|
||||||
if (status != PSA_SUCCESS) {
|
if (status != PSA_SUCCESS) {
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -4700,6 +4859,11 @@ psa_status_t psa_aead_encrypt(mbedtls_svc_key_id_t key,
|
|||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
LOCAL_INPUT_FREE(nonce_external, nonce);
|
||||||
|
LOCAL_INPUT_FREE(additional_data_external, additional_data);
|
||||||
|
LOCAL_INPUT_FREE(plaintext_external, plaintext);
|
||||||
|
LOCAL_OUTPUT_FREE(ciphertext_external, ciphertext);
|
||||||
|
|
||||||
psa_unregister_read(slot);
|
psa_unregister_read(slot);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
@@ -4707,19 +4871,24 @@ exit:
|
|||||||
|
|
||||||
psa_status_t psa_aead_decrypt(mbedtls_svc_key_id_t key,
|
psa_status_t psa_aead_decrypt(mbedtls_svc_key_id_t key,
|
||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
const uint8_t *nonce,
|
const uint8_t *nonce_external,
|
||||||
size_t nonce_length,
|
size_t nonce_length,
|
||||||
const uint8_t *additional_data,
|
const uint8_t *additional_data_external,
|
||||||
size_t additional_data_length,
|
size_t additional_data_length,
|
||||||
const uint8_t *ciphertext,
|
const uint8_t *ciphertext_external,
|
||||||
size_t ciphertext_length,
|
size_t ciphertext_length,
|
||||||
uint8_t *plaintext,
|
uint8_t *plaintext_external,
|
||||||
size_t plaintext_size,
|
size_t plaintext_size,
|
||||||
size_t *plaintext_length)
|
size_t *plaintext_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
psa_key_slot_t *slot;
|
psa_key_slot_t *slot;
|
||||||
|
|
||||||
|
LOCAL_INPUT_DECLARE(nonce_external, nonce);
|
||||||
|
LOCAL_INPUT_DECLARE(additional_data_external, additional_data);
|
||||||
|
LOCAL_INPUT_DECLARE(ciphertext_external, ciphertext);
|
||||||
|
LOCAL_OUTPUT_DECLARE(plaintext_external, plaintext);
|
||||||
|
|
||||||
*plaintext_length = 0;
|
*plaintext_length = 0;
|
||||||
|
|
||||||
status = psa_aead_check_algorithm(alg);
|
status = psa_aead_check_algorithm(alg);
|
||||||
@@ -4737,6 +4906,12 @@ psa_status_t psa_aead_decrypt(mbedtls_svc_key_id_t key,
|
|||||||
.core = slot->attr
|
.core = slot->attr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(nonce_external, nonce_length, nonce);
|
||||||
|
LOCAL_INPUT_ALLOC(additional_data_external, additional_data_length,
|
||||||
|
additional_data);
|
||||||
|
LOCAL_INPUT_ALLOC(ciphertext_external, ciphertext_length, ciphertext);
|
||||||
|
LOCAL_OUTPUT_ALLOC(plaintext_external, plaintext_size, plaintext);
|
||||||
|
|
||||||
status = psa_aead_check_nonce_length(alg, nonce_length);
|
status = psa_aead_check_nonce_length(alg, nonce_length);
|
||||||
if (status != PSA_SUCCESS) {
|
if (status != PSA_SUCCESS) {
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -4755,6 +4930,11 @@ psa_status_t psa_aead_decrypt(mbedtls_svc_key_id_t key,
|
|||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
LOCAL_INPUT_FREE(nonce_external, nonce);
|
||||||
|
LOCAL_INPUT_FREE(additional_data_external, additional_data);
|
||||||
|
LOCAL_INPUT_FREE(ciphertext_external, ciphertext);
|
||||||
|
LOCAL_OUTPUT_FREE(plaintext_external, plaintext);
|
||||||
|
|
||||||
psa_unregister_read(slot);
|
psa_unregister_read(slot);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
@@ -4896,65 +5076,7 @@ psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
|
|||||||
return psa_aead_setup(operation, 0, key, alg);
|
return psa_aead_setup(operation, 0, key, alg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate a random nonce / IV for multipart AEAD operation */
|
static psa_status_t psa_aead_set_nonce_internal(psa_aead_operation_t *operation,
|
||||||
psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
|
|
||||||
uint8_t *nonce,
|
|
||||||
size_t nonce_size,
|
|
||||||
size_t *nonce_length)
|
|
||||||
{
|
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
|
||||||
uint8_t local_nonce[PSA_AEAD_NONCE_MAX_SIZE];
|
|
||||||
size_t required_nonce_size = 0;
|
|
||||||
|
|
||||||
*nonce_length = 0;
|
|
||||||
|
|
||||||
if (operation->id == 0) {
|
|
||||||
status = PSA_ERROR_BAD_STATE;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (operation->nonce_set || !operation->is_encrypt) {
|
|
||||||
status = PSA_ERROR_BAD_STATE;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For CCM, this size may not be correct according to the PSA
|
|
||||||
* specification. The PSA Crypto 1.0.1 specification states:
|
|
||||||
*
|
|
||||||
* CCM encodes the plaintext length pLen in L octets, with L the smallest
|
|
||||||
* integer >= 2 where pLen < 2^(8L). The nonce length is then 15 - L bytes.
|
|
||||||
*
|
|
||||||
* However this restriction that L has to be the smallest integer is not
|
|
||||||
* applied in practice, and it is not implementable here since the
|
|
||||||
* plaintext length may or may not be known at this time. */
|
|
||||||
required_nonce_size = PSA_AEAD_NONCE_LENGTH(operation->key_type,
|
|
||||||
operation->alg);
|
|
||||||
if (nonce_size < required_nonce_size) {
|
|
||||||
status = PSA_ERROR_BUFFER_TOO_SMALL;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = psa_generate_random(local_nonce, required_nonce_size);
|
|
||||||
if (status != PSA_SUCCESS) {
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = psa_aead_set_nonce(operation, local_nonce, required_nonce_size);
|
|
||||||
|
|
||||||
exit:
|
|
||||||
if (status == PSA_SUCCESS) {
|
|
||||||
memcpy(nonce, local_nonce, required_nonce_size);
|
|
||||||
*nonce_length = required_nonce_size;
|
|
||||||
} else {
|
|
||||||
psa_aead_abort(operation);
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the nonce for a multipart authenticated encryption or decryption
|
|
||||||
operation.*/
|
|
||||||
psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
|
|
||||||
const uint8_t *nonce,
|
const uint8_t *nonce,
|
||||||
size_t nonce_length)
|
size_t nonce_length)
|
||||||
{
|
{
|
||||||
@@ -4989,6 +5111,91 @@ exit:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Generate a random nonce / IV for multipart AEAD operation */
|
||||||
|
psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
|
||||||
|
uint8_t *nonce_external,
|
||||||
|
size_t nonce_size,
|
||||||
|
size_t *nonce_length)
|
||||||
|
{
|
||||||
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
uint8_t local_nonce[PSA_AEAD_NONCE_MAX_SIZE];
|
||||||
|
size_t required_nonce_size = 0;
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_DECLARE(nonce_external, nonce);
|
||||||
|
LOCAL_OUTPUT_ALLOC(nonce_external, nonce_size, nonce);
|
||||||
|
|
||||||
|
*nonce_length = 0;
|
||||||
|
|
||||||
|
if (operation->id == 0) {
|
||||||
|
status = PSA_ERROR_BAD_STATE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (operation->nonce_set || !operation->is_encrypt) {
|
||||||
|
status = PSA_ERROR_BAD_STATE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For CCM, this size may not be correct according to the PSA
|
||||||
|
* specification. The PSA Crypto 1.0.1 specification states:
|
||||||
|
*
|
||||||
|
* CCM encodes the plaintext length pLen in L octets, with L the smallest
|
||||||
|
* integer >= 2 where pLen < 2^(8L). The nonce length is then 15 - L bytes.
|
||||||
|
*
|
||||||
|
* However this restriction that L has to be the smallest integer is not
|
||||||
|
* applied in practice, and it is not implementable here since the
|
||||||
|
* plaintext length may or may not be known at this time. */
|
||||||
|
required_nonce_size = PSA_AEAD_NONCE_LENGTH(operation->key_type,
|
||||||
|
operation->alg);
|
||||||
|
if (nonce_size < required_nonce_size) {
|
||||||
|
status = PSA_ERROR_BUFFER_TOO_SMALL;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = psa_generate_random_internal(local_nonce, required_nonce_size);
|
||||||
|
if (status != PSA_SUCCESS) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = psa_aead_set_nonce_internal(operation, local_nonce,
|
||||||
|
required_nonce_size);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (status == PSA_SUCCESS) {
|
||||||
|
memcpy(nonce, local_nonce, required_nonce_size);
|
||||||
|
*nonce_length = required_nonce_size;
|
||||||
|
} else {
|
||||||
|
psa_aead_abort(operation);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_FREE(nonce_external, nonce);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the nonce for a multipart authenticated encryption or decryption
|
||||||
|
operation.*/
|
||||||
|
psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
|
||||||
|
const uint8_t *nonce_external,
|
||||||
|
size_t nonce_length)
|
||||||
|
{
|
||||||
|
psa_status_t status;
|
||||||
|
|
||||||
|
LOCAL_INPUT_DECLARE(nonce_external, nonce);
|
||||||
|
LOCAL_INPUT_ALLOC(nonce_external, nonce_length, nonce);
|
||||||
|
|
||||||
|
status = psa_aead_set_nonce_internal(operation, nonce, nonce_length);
|
||||||
|
|
||||||
|
/* Exit label is only needed for buffer copying, prevent unused warnings. */
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
exit:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LOCAL_INPUT_FREE(nonce_external, nonce);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Declare the lengths of the message and additional data for multipart AEAD. */
|
/* Declare the lengths of the message and additional data for multipart AEAD. */
|
||||||
psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
|
psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
|
||||||
size_t ad_length,
|
size_t ad_length,
|
||||||
@@ -5056,11 +5263,14 @@ exit:
|
|||||||
|
|
||||||
/* Pass additional data to an active multipart AEAD operation. */
|
/* Pass additional data to an active multipart AEAD operation. */
|
||||||
psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
|
psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
|
||||||
const uint8_t *input,
|
const uint8_t *input_external,
|
||||||
size_t input_length)
|
size_t input_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
|
||||||
|
LOCAL_INPUT_DECLARE(input_external, input);
|
||||||
|
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
||||||
|
|
||||||
if (operation->id == 0) {
|
if (operation->id == 0) {
|
||||||
status = PSA_ERROR_BAD_STATE;
|
status = PSA_ERROR_BAD_STATE;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -5096,20 +5306,29 @@ exit:
|
|||||||
psa_aead_abort(operation);
|
psa_aead_abort(operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_FREE(input_external, input);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Encrypt or decrypt a message fragment in an active multipart AEAD
|
/* Encrypt or decrypt a message fragment in an active multipart AEAD
|
||||||
operation.*/
|
operation.*/
|
||||||
psa_status_t psa_aead_update(psa_aead_operation_t *operation,
|
psa_status_t psa_aead_update(psa_aead_operation_t *operation,
|
||||||
const uint8_t *input,
|
const uint8_t *input_external,
|
||||||
size_t input_length,
|
size_t input_length,
|
||||||
uint8_t *output,
|
uint8_t *output_external,
|
||||||
size_t output_size,
|
size_t output_size,
|
||||||
size_t *output_length)
|
size_t *output_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL_INPUT_DECLARE(input_external, input);
|
||||||
|
LOCAL_OUTPUT_DECLARE(output_external, output);
|
||||||
|
|
||||||
|
LOCAL_INPUT_ALLOC(input_external, input_length, input);
|
||||||
|
LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
|
||||||
|
|
||||||
*output_length = 0;
|
*output_length = 0;
|
||||||
|
|
||||||
if (operation->id == 0) {
|
if (operation->id == 0) {
|
||||||
@@ -5156,6 +5375,9 @@ exit:
|
|||||||
psa_aead_abort(operation);
|
psa_aead_abort(operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL_INPUT_FREE(input_external, input);
|
||||||
|
LOCAL_OUTPUT_FREE(output_external, output);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5175,15 +5397,21 @@ static psa_status_t psa_aead_final_checks(const psa_aead_operation_t *operation)
|
|||||||
|
|
||||||
/* Finish encrypting a message in a multipart AEAD operation. */
|
/* Finish encrypting a message in a multipart AEAD operation. */
|
||||||
psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
|
psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
|
||||||
uint8_t *ciphertext,
|
uint8_t *ciphertext_external,
|
||||||
size_t ciphertext_size,
|
size_t ciphertext_size,
|
||||||
size_t *ciphertext_length,
|
size_t *ciphertext_length,
|
||||||
uint8_t *tag,
|
uint8_t *tag_external,
|
||||||
size_t tag_size,
|
size_t tag_size,
|
||||||
size_t *tag_length)
|
size_t *tag_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_DECLARE(ciphertext_external, ciphertext);
|
||||||
|
LOCAL_OUTPUT_DECLARE(tag_external, tag);
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_ALLOC(ciphertext_external, ciphertext_size, ciphertext);
|
||||||
|
LOCAL_OUTPUT_ALLOC(tag_external, tag_size, tag);
|
||||||
|
|
||||||
*ciphertext_length = 0;
|
*ciphertext_length = 0;
|
||||||
*tag_length = tag_size;
|
*tag_length = tag_size;
|
||||||
|
|
||||||
@@ -5214,20 +5442,29 @@ exit:
|
|||||||
|
|
||||||
psa_aead_abort(operation);
|
psa_aead_abort(operation);
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_FREE(ciphertext_external, ciphertext);
|
||||||
|
LOCAL_OUTPUT_FREE(tag_external, tag);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finish authenticating and decrypting a message in a multipart AEAD
|
/* Finish authenticating and decrypting a message in a multipart AEAD
|
||||||
operation.*/
|
operation.*/
|
||||||
psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
|
psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
|
||||||
uint8_t *plaintext,
|
uint8_t *plaintext_external,
|
||||||
size_t plaintext_size,
|
size_t plaintext_size,
|
||||||
size_t *plaintext_length,
|
size_t *plaintext_length,
|
||||||
const uint8_t *tag,
|
const uint8_t *tag_external,
|
||||||
size_t tag_length)
|
size_t tag_length)
|
||||||
{
|
{
|
||||||
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_DECLARE(plaintext_external, plaintext);
|
||||||
|
LOCAL_INPUT_DECLARE(tag_external, tag);
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_ALLOC(plaintext_external, plaintext_size, plaintext);
|
||||||
|
LOCAL_INPUT_ALLOC(tag_external, tag_length, tag);
|
||||||
|
|
||||||
*plaintext_length = 0;
|
*plaintext_length = 0;
|
||||||
|
|
||||||
status = psa_aead_final_checks(operation);
|
status = psa_aead_final_checks(operation);
|
||||||
@@ -5248,6 +5485,9 @@ psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
|
|||||||
exit:
|
exit:
|
||||||
psa_aead_abort(operation);
|
psa_aead_abort(operation);
|
||||||
|
|
||||||
|
LOCAL_OUTPUT_FREE(plaintext_external, plaintext);
|
||||||
|
LOCAL_INPUT_FREE(tag_external, tag);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7439,7 +7679,7 @@ exit:
|
|||||||
* some constant data such as zeros, which would result in the data
|
* some constant data such as zeros, which would result in the data
|
||||||
* being protected with a reproducible, easily knowable key.
|
* being protected with a reproducible, easily knowable key.
|
||||||
*/
|
*/
|
||||||
psa_generate_random(output, output_size);
|
psa_generate_random_internal(output, output_size);
|
||||||
*output_length = output_size;
|
*output_length = output_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7456,7 +7696,6 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************/
|
/****************************************************************/
|
||||||
/* Random generation */
|
/* Random generation */
|
||||||
/****************************************************************/
|
/****************************************************************/
|
||||||
@@ -7525,44 +7764,21 @@ static psa_status_t mbedtls_psa_random_seed(mbedtls_psa_random_context_t *rng)
|
|||||||
#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
|
#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
|
||||||
}
|
}
|
||||||
|
|
||||||
psa_status_t psa_generate_random(uint8_t *output,
|
psa_status_t psa_generate_random(uint8_t *output_external,
|
||||||
size_t output_size)
|
size_t output_size)
|
||||||
{
|
{
|
||||||
GUARD_MODULE_INITIALIZED;
|
psa_status_t status;
|
||||||
|
|
||||||
#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
|
LOCAL_OUTPUT_DECLARE(output_external, output);
|
||||||
|
LOCAL_OUTPUT_ALLOC(output_external, output_size, output);
|
||||||
|
|
||||||
size_t output_length = 0;
|
status = psa_generate_random_internal(output, output_size);
|
||||||
psa_status_t status = mbedtls_psa_external_get_random(&global_data.rng,
|
|
||||||
output, output_size,
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
&output_length);
|
exit:
|
||||||
if (status != PSA_SUCCESS) {
|
#endif
|
||||||
|
LOCAL_OUTPUT_FREE(output_external, output);
|
||||||
return status;
|
return status;
|
||||||
}
|
|
||||||
/* Breaking up a request into smaller chunks is currently not supported
|
|
||||||
* for the external RNG interface. */
|
|
||||||
if (output_length != output_size) {
|
|
||||||
return PSA_ERROR_INSUFFICIENT_ENTROPY;
|
|
||||||
}
|
|
||||||
return PSA_SUCCESS;
|
|
||||||
|
|
||||||
#else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
|
|
||||||
|
|
||||||
while (output_size > 0) {
|
|
||||||
size_t request_size =
|
|
||||||
(output_size > MBEDTLS_PSA_RANDOM_MAX_REQUEST ?
|
|
||||||
MBEDTLS_PSA_RANDOM_MAX_REQUEST :
|
|
||||||
output_size);
|
|
||||||
int ret = mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE,
|
|
||||||
output, request_size);
|
|
||||||
if (ret != 0) {
|
|
||||||
return mbedtls_to_psa_error(ret);
|
|
||||||
}
|
|
||||||
output_size -= request_size;
|
|
||||||
output += request_size;
|
|
||||||
}
|
|
||||||
return PSA_SUCCESS;
|
|
||||||
#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wrapper function allowing the classic API to use the PSA RNG.
|
/* Wrapper function allowing the classic API to use the PSA RNG.
|
||||||
|
@@ -532,7 +532,11 @@ psa_status_t mbedtls_psa_cipher_update(
|
|||||||
output_length);
|
output_length);
|
||||||
} else
|
} else
|
||||||
#endif /* MBEDTLS_PSA_BUILTIN_ALG_ECB_NO_PADDING */
|
#endif /* MBEDTLS_PSA_BUILTIN_ALG_ECB_NO_PADDING */
|
||||||
{
|
if (input_length == 0) {
|
||||||
|
/* There is no input, nothing to be done */
|
||||||
|
*output_length = 0;
|
||||||
|
status = PSA_SUCCESS;
|
||||||
|
} else {
|
||||||
status = mbedtls_to_psa_error(
|
status = mbedtls_to_psa_error(
|
||||||
mbedtls_cipher_update(&operation->ctx.cipher, input,
|
mbedtls_cipher_update(&operation->ctx.cipher, input,
|
||||||
input_length, output, output_length));
|
input_length, output, output_length));
|
||||||
|
@@ -142,8 +142,12 @@ class PSAWrapperGenerator(c_wrapper_generator.Base):
|
|||||||
_buffer_name: Optional[str]) -> bool:
|
_buffer_name: Optional[str]) -> bool:
|
||||||
"""Whether the specified buffer argument to a PSA function should be copied.
|
"""Whether the specified buffer argument to a PSA function should be copied.
|
||||||
"""
|
"""
|
||||||
# Proof-of-concept: just instrument one function for now
|
#pylint: disable=too-many-return-statements
|
||||||
if function_name == 'psa_cipher_encrypt':
|
if function_name.startswith('psa_aead'):
|
||||||
|
return True
|
||||||
|
if function_name in {'psa_cipher_encrypt', 'psa_cipher_decrypt',
|
||||||
|
'psa_cipher_update', 'psa_cipher_finish',
|
||||||
|
'psa_cipher_generate_iv', 'psa_cipher_set_iv'}:
|
||||||
return True
|
return True
|
||||||
if function_name in ('psa_key_derivation_output_bytes',
|
if function_name in ('psa_key_derivation_output_bytes',
|
||||||
'psa_key_derivation_input_bytes'):
|
'psa_key_derivation_input_bytes'):
|
||||||
@@ -166,6 +170,17 @@ class PSAWrapperGenerator(c_wrapper_generator.Base):
|
|||||||
if function_name in ('psa_key_derivation_key_agreement',
|
if function_name in ('psa_key_derivation_key_agreement',
|
||||||
'psa_raw_key_agreement'):
|
'psa_raw_key_agreement'):
|
||||||
return True
|
return True
|
||||||
|
if function_name == 'psa_generate_random':
|
||||||
|
return True
|
||||||
|
if function_name in ('psa_mac_update',
|
||||||
|
'psa_mac_sign_finish',
|
||||||
|
'psa_mac_verify_finish',
|
||||||
|
'psa_mac_compute',
|
||||||
|
'psa_mac_verify'):
|
||||||
|
return True
|
||||||
|
if function_name in ('psa_asymmetric_encrypt',
|
||||||
|
'psa_asymmetric_decrypt'):
|
||||||
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _write_function_call(self, out: typing_util.Writable,
|
def _write_function_call(self, out: typing_util.Writable,
|
||||||
|
@@ -70,7 +70,19 @@ psa_status_t mbedtls_test_wrap_psa_aead_decrypt(
|
|||||||
size_t arg9_plaintext_size,
|
size_t arg9_plaintext_size,
|
||||||
size_t *arg10_plaintext_length)
|
size_t *arg10_plaintext_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg2_nonce, arg3_nonce_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg4_additional_data, arg5_additional_data_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg6_ciphertext, arg7_ciphertext_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg8_plaintext, arg9_plaintext_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_aead_decrypt)(arg0_key, arg1_alg, arg2_nonce, arg3_nonce_length, arg4_additional_data, arg5_additional_data_length, arg6_ciphertext, arg7_ciphertext_length, arg8_plaintext, arg9_plaintext_size, arg10_plaintext_length);
|
psa_status_t status = (psa_aead_decrypt)(arg0_key, arg1_alg, arg2_nonce, arg3_nonce_length, arg4_additional_data, arg5_additional_data_length, arg6_ciphertext, arg7_ciphertext_length, arg8_plaintext, arg9_plaintext_size, arg10_plaintext_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg2_nonce, arg3_nonce_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg4_additional_data, arg5_additional_data_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg6_ciphertext, arg7_ciphertext_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg8_plaintext, arg9_plaintext_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,7 +110,19 @@ psa_status_t mbedtls_test_wrap_psa_aead_encrypt(
|
|||||||
size_t arg9_ciphertext_size,
|
size_t arg9_ciphertext_size,
|
||||||
size_t *arg10_ciphertext_length)
|
size_t *arg10_ciphertext_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg2_nonce, arg3_nonce_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg4_additional_data, arg5_additional_data_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg6_plaintext, arg7_plaintext_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg8_ciphertext, arg9_ciphertext_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_aead_encrypt)(arg0_key, arg1_alg, arg2_nonce, arg3_nonce_length, arg4_additional_data, arg5_additional_data_length, arg6_plaintext, arg7_plaintext_length, arg8_ciphertext, arg9_ciphertext_size, arg10_ciphertext_length);
|
psa_status_t status = (psa_aead_encrypt)(arg0_key, arg1_alg, arg2_nonce, arg3_nonce_length, arg4_additional_data, arg5_additional_data_length, arg6_plaintext, arg7_plaintext_length, arg8_ciphertext, arg9_ciphertext_size, arg10_ciphertext_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg2_nonce, arg3_nonce_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg4_additional_data, arg5_additional_data_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg6_plaintext, arg7_plaintext_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg8_ciphertext, arg9_ciphertext_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,7 +146,15 @@ psa_status_t mbedtls_test_wrap_psa_aead_finish(
|
|||||||
size_t arg5_tag_size,
|
size_t arg5_tag_size,
|
||||||
size_t *arg6_tag_length)
|
size_t *arg6_tag_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_ciphertext, arg2_ciphertext_size);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg4_tag, arg5_tag_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_aead_finish)(arg0_operation, arg1_ciphertext, arg2_ciphertext_size, arg3_ciphertext_length, arg4_tag, arg5_tag_size, arg6_tag_length);
|
psa_status_t status = (psa_aead_finish)(arg0_operation, arg1_ciphertext, arg2_ciphertext_size, arg3_ciphertext_length, arg4_tag, arg5_tag_size, arg6_tag_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_ciphertext, arg2_ciphertext_size);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg4_tag, arg5_tag_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +165,13 @@ psa_status_t mbedtls_test_wrap_psa_aead_generate_nonce(
|
|||||||
size_t arg2_nonce_size,
|
size_t arg2_nonce_size,
|
||||||
size_t *arg3_nonce_length)
|
size_t *arg3_nonce_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_nonce, arg2_nonce_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_aead_generate_nonce)(arg0_operation, arg1_nonce, arg2_nonce_size, arg3_nonce_length);
|
psa_status_t status = (psa_aead_generate_nonce)(arg0_operation, arg1_nonce, arg2_nonce_size, arg3_nonce_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_nonce, arg2_nonce_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +191,13 @@ psa_status_t mbedtls_test_wrap_psa_aead_set_nonce(
|
|||||||
const uint8_t *arg1_nonce,
|
const uint8_t *arg1_nonce,
|
||||||
size_t arg2_nonce_length)
|
size_t arg2_nonce_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_nonce, arg2_nonce_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_aead_set_nonce)(arg0_operation, arg1_nonce, arg2_nonce_length);
|
psa_status_t status = (psa_aead_set_nonce)(arg0_operation, arg1_nonce, arg2_nonce_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_nonce, arg2_nonce_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,7 +210,15 @@ psa_status_t mbedtls_test_wrap_psa_aead_update(
|
|||||||
size_t arg4_output_size,
|
size_t arg4_output_size,
|
||||||
size_t *arg5_output_length)
|
size_t *arg5_output_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_input, arg2_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg3_output, arg4_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_aead_update)(arg0_operation, arg1_input, arg2_input_length, arg3_output, arg4_output_size, arg5_output_length);
|
psa_status_t status = (psa_aead_update)(arg0_operation, arg1_input, arg2_input_length, arg3_output, arg4_output_size, arg5_output_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_input, arg2_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg3_output, arg4_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +228,13 @@ psa_status_t mbedtls_test_wrap_psa_aead_update_ad(
|
|||||||
const uint8_t *arg1_input,
|
const uint8_t *arg1_input,
|
||||||
size_t arg2_input_length)
|
size_t arg2_input_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_input, arg2_input_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_aead_update_ad)(arg0_operation, arg1_input, arg2_input_length);
|
psa_status_t status = (psa_aead_update_ad)(arg0_operation, arg1_input, arg2_input_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_input, arg2_input_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,7 +247,15 @@ psa_status_t mbedtls_test_wrap_psa_aead_verify(
|
|||||||
const uint8_t *arg4_tag,
|
const uint8_t *arg4_tag,
|
||||||
size_t arg5_tag_length)
|
size_t arg5_tag_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_plaintext, arg2_plaintext_size);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg4_tag, arg5_tag_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_aead_verify)(arg0_operation, arg1_plaintext, arg2_plaintext_size, arg3_plaintext_length, arg4_tag, arg5_tag_length);
|
psa_status_t status = (psa_aead_verify)(arg0_operation, arg1_plaintext, arg2_plaintext_size, arg3_plaintext_length, arg4_tag, arg5_tag_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_plaintext, arg2_plaintext_size);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg4_tag, arg5_tag_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +271,17 @@ psa_status_t mbedtls_test_wrap_psa_asymmetric_decrypt(
|
|||||||
size_t arg7_output_size,
|
size_t arg7_output_size,
|
||||||
size_t *arg8_output_length)
|
size_t *arg8_output_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg2_input, arg3_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg4_salt, arg5_salt_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg6_output, arg7_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_asymmetric_decrypt)(arg0_key, arg1_alg, arg2_input, arg3_input_length, arg4_salt, arg5_salt_length, arg6_output, arg7_output_size, arg8_output_length);
|
psa_status_t status = (psa_asymmetric_decrypt)(arg0_key, arg1_alg, arg2_input, arg3_input_length, arg4_salt, arg5_salt_length, arg6_output, arg7_output_size, arg8_output_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg2_input, arg3_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg4_salt, arg5_salt_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg6_output, arg7_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,7 +297,17 @@ psa_status_t mbedtls_test_wrap_psa_asymmetric_encrypt(
|
|||||||
size_t arg7_output_size,
|
size_t arg7_output_size,
|
||||||
size_t *arg8_output_length)
|
size_t *arg8_output_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg2_input, arg3_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg4_salt, arg5_salt_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg6_output, arg7_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_asymmetric_encrypt)(arg0_key, arg1_alg, arg2_input, arg3_input_length, arg4_salt, arg5_salt_length, arg6_output, arg7_output_size, arg8_output_length);
|
psa_status_t status = (psa_asymmetric_encrypt)(arg0_key, arg1_alg, arg2_input, arg3_input_length, arg4_salt, arg5_salt_length, arg6_output, arg7_output_size, arg8_output_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg2_input, arg3_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg4_salt, arg5_salt_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg6_output, arg7_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,7 +329,15 @@ psa_status_t mbedtls_test_wrap_psa_cipher_decrypt(
|
|||||||
size_t arg5_output_size,
|
size_t arg5_output_size,
|
||||||
size_t *arg6_output_length)
|
size_t *arg6_output_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg2_input, arg3_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg4_output, arg5_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_cipher_decrypt)(arg0_key, arg1_alg, arg2_input, arg3_input_length, arg4_output, arg5_output_size, arg6_output_length);
|
psa_status_t status = (psa_cipher_decrypt)(arg0_key, arg1_alg, arg2_input, arg3_input_length, arg4_output, arg5_output_size, arg6_output_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg2_input, arg3_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg4_output, arg5_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -296,7 +390,13 @@ psa_status_t mbedtls_test_wrap_psa_cipher_finish(
|
|||||||
size_t arg2_output_size,
|
size_t arg2_output_size,
|
||||||
size_t *arg3_output_length)
|
size_t *arg3_output_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_output, arg2_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_cipher_finish)(arg0_operation, arg1_output, arg2_output_size, arg3_output_length);
|
psa_status_t status = (psa_cipher_finish)(arg0_operation, arg1_output, arg2_output_size, arg3_output_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_output, arg2_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,7 +407,13 @@ psa_status_t mbedtls_test_wrap_psa_cipher_generate_iv(
|
|||||||
size_t arg2_iv_size,
|
size_t arg2_iv_size,
|
||||||
size_t *arg3_iv_length)
|
size_t *arg3_iv_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_iv, arg2_iv_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_cipher_generate_iv)(arg0_operation, arg1_iv, arg2_iv_size, arg3_iv_length);
|
psa_status_t status = (psa_cipher_generate_iv)(arg0_operation, arg1_iv, arg2_iv_size, arg3_iv_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_iv, arg2_iv_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,7 +423,13 @@ psa_status_t mbedtls_test_wrap_psa_cipher_set_iv(
|
|||||||
const uint8_t *arg1_iv,
|
const uint8_t *arg1_iv,
|
||||||
size_t arg2_iv_length)
|
size_t arg2_iv_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_iv, arg2_iv_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_cipher_set_iv)(arg0_operation, arg1_iv, arg2_iv_length);
|
psa_status_t status = (psa_cipher_set_iv)(arg0_operation, arg1_iv, arg2_iv_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_iv, arg2_iv_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,7 +442,15 @@ psa_status_t mbedtls_test_wrap_psa_cipher_update(
|
|||||||
size_t arg4_output_size,
|
size_t arg4_output_size,
|
||||||
size_t *arg5_output_length)
|
size_t *arg5_output_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_input, arg2_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg3_output, arg4_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_cipher_update)(arg0_operation, arg1_input, arg2_input_length, arg3_output, arg4_output_size, arg5_output_length);
|
psa_status_t status = (psa_cipher_update)(arg0_operation, arg1_input, arg2_input_length, arg3_output, arg4_output_size, arg5_output_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_input, arg2_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg3_output, arg4_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,7 +596,13 @@ psa_status_t mbedtls_test_wrap_psa_generate_random(
|
|||||||
uint8_t *arg0_output,
|
uint8_t *arg0_output,
|
||||||
size_t arg1_output_size)
|
size_t arg1_output_size)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg0_output, arg1_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_generate_random)(arg0_output, arg1_output_size);
|
psa_status_t status = (psa_generate_random)(arg0_output, arg1_output_size);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg0_output, arg1_output_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -756,7 +882,15 @@ psa_status_t mbedtls_test_wrap_psa_mac_compute(
|
|||||||
size_t arg5_mac_size,
|
size_t arg5_mac_size,
|
||||||
size_t *arg6_mac_length)
|
size_t *arg6_mac_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg2_input, arg3_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg4_mac, arg5_mac_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_mac_compute)(arg0_key, arg1_alg, arg2_input, arg3_input_length, arg4_mac, arg5_mac_size, arg6_mac_length);
|
psa_status_t status = (psa_mac_compute)(arg0_key, arg1_alg, arg2_input, arg3_input_length, arg4_mac, arg5_mac_size, arg6_mac_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg2_input, arg3_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg4_mac, arg5_mac_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -767,7 +901,13 @@ psa_status_t mbedtls_test_wrap_psa_mac_sign_finish(
|
|||||||
size_t arg2_mac_size,
|
size_t arg2_mac_size,
|
||||||
size_t *arg3_mac_length)
|
size_t *arg3_mac_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_mac, arg2_mac_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_mac_sign_finish)(arg0_operation, arg1_mac, arg2_mac_size, arg3_mac_length);
|
psa_status_t status = (psa_mac_sign_finish)(arg0_operation, arg1_mac, arg2_mac_size, arg3_mac_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_mac, arg2_mac_size);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -787,7 +927,13 @@ psa_status_t mbedtls_test_wrap_psa_mac_update(
|
|||||||
const uint8_t *arg1_input,
|
const uint8_t *arg1_input,
|
||||||
size_t arg2_input_length)
|
size_t arg2_input_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_input, arg2_input_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_mac_update)(arg0_operation, arg1_input, arg2_input_length);
|
psa_status_t status = (psa_mac_update)(arg0_operation, arg1_input, arg2_input_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_input, arg2_input_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -800,7 +946,15 @@ psa_status_t mbedtls_test_wrap_psa_mac_verify(
|
|||||||
const uint8_t *arg4_mac,
|
const uint8_t *arg4_mac,
|
||||||
size_t arg5_mac_length)
|
size_t arg5_mac_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg2_input, arg3_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg4_mac, arg5_mac_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_mac_verify)(arg0_key, arg1_alg, arg2_input, arg3_input_length, arg4_mac, arg5_mac_length);
|
psa_status_t status = (psa_mac_verify)(arg0_key, arg1_alg, arg2_input, arg3_input_length, arg4_mac, arg5_mac_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg2_input, arg3_input_length);
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg4_mac, arg5_mac_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -810,7 +964,13 @@ psa_status_t mbedtls_test_wrap_psa_mac_verify_finish(
|
|||||||
const uint8_t *arg1_mac,
|
const uint8_t *arg1_mac,
|
||||||
size_t arg2_mac_length)
|
size_t arg2_mac_length)
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_POISON(arg1_mac, arg2_mac_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
psa_status_t status = (psa_mac_verify_finish)(arg0_operation, arg1_mac, arg2_mac_length);
|
psa_status_t status = (psa_mac_verify_finish)(arg0_operation, arg1_mac, arg2_mac_length);
|
||||||
|
#if defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS)
|
||||||
|
MBEDTLS_TEST_MEMORY_UNPOISON(arg1_mac, arg2_mac_length);
|
||||||
|
#endif /* defined(MBEDTLS_PSA_COPY_CALLER_BUFFERS) */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5131,7 +5131,9 @@ void aead_multipart_generate_nonce(int key_type_arg, data_t *key_data,
|
|||||||
psa_key_type_t key_type = key_type_arg;
|
psa_key_type_t key_type = key_type_arg;
|
||||||
psa_algorithm_t alg = alg_arg;
|
psa_algorithm_t alg = alg_arg;
|
||||||
psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT;
|
psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT;
|
||||||
uint8_t nonce_buffer[PSA_AEAD_NONCE_MAX_SIZE];
|
/* Some tests try to get more than the maximum nonce length,
|
||||||
|
* so allocate double. */
|
||||||
|
uint8_t nonce_buffer[PSA_AEAD_NONCE_MAX_SIZE * 2];
|
||||||
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
||||||
psa_status_t status = PSA_ERROR_GENERIC_ERROR;
|
psa_status_t status = PSA_ERROR_GENERIC_ERROR;
|
||||||
psa_status_t expected_status = expected_status_arg;
|
psa_status_t expected_status = expected_status_arg;
|
||||||
|
@@ -1559,14 +1559,6 @@ void cipher_entry_points(int alg_arg, int key_type_arg,
|
|||||||
TEST_EQUAL(mbedtls_test_driver_cipher_hooks.hits_set_iv, 1);
|
TEST_EQUAL(mbedtls_test_driver_cipher_hooks.hits_set_iv, 1);
|
||||||
TEST_EQUAL(status, mbedtls_test_driver_cipher_hooks.forced_status_set_iv);
|
TEST_EQUAL(status, mbedtls_test_driver_cipher_hooks.forced_status_set_iv);
|
||||||
mbedtls_test_driver_cipher_hooks.forced_status_set_iv = PSA_SUCCESS;
|
mbedtls_test_driver_cipher_hooks.forced_status_set_iv = PSA_SUCCESS;
|
||||||
/*
|
|
||||||
* Check that the output buffer is still in the same state.
|
|
||||||
* This will fail if the output buffer is used by the core to pass the IV
|
|
||||||
* it generated to the driver (and is not restored).
|
|
||||||
*/
|
|
||||||
for (size_t i = 0; i < 16; i++) {
|
|
||||||
TEST_EQUAL(output[i], 0xa5);
|
|
||||||
}
|
|
||||||
/* Failure should prevent further operations from executing on the driver */
|
/* Failure should prevent further operations from executing on the driver */
|
||||||
mbedtls_test_driver_cipher_hooks.hits = 0;
|
mbedtls_test_driver_cipher_hooks.hits = 0;
|
||||||
status = psa_cipher_update(&operation,
|
status = psa_cipher_update(&operation,
|
||||||
|
Reference in New Issue
Block a user