diff --git a/tests/suites/test_suite_psa_crypto_memory.data b/tests/suites/test_suite_psa_crypto_memory.data index fcd60fb803..2ca7e15abf 100644 --- a/tests/suites/test_suite_psa_crypto_memory.data +++ b/tests/suites/test_suite_psa_crypto_memory.data @@ -45,3 +45,12 @@ output_copy_alloc:200:PSA_SUCCESS PSA crypto output copy alloc, NULL buffer output_copy_alloc:0:PSA_SUCCESS + +PSA crypto output copy free +output_copy_free:200:0:PSA_SUCCESS + +PSA crypto output copy free, NULL buffer +output_copy_free:0:0:PSA_SUCCESS + +PSA crypto output copy free, NULL original buffer +output_copy_free:200:1:PSA_ERROR_CORRUPTION_DETECTED diff --git a/tests/suites/test_suite_psa_crypto_memory.function b/tests/suites/test_suite_psa_crypto_memory.function index 6fd58cd0af..57a10ae791 100644 --- a/tests/suites/test_suite_psa_crypto_memory.function +++ b/tests/suites/test_suite_psa_crypto_memory.function @@ -163,3 +163,48 @@ exit: output = NULL; } /* END_CASE */ + +/* BEGIN_CASE */ +void output_copy_free(int output_len, int original_is_null, + psa_status_t exp_status) +{ + uint8_t *output = NULL; + uint8_t *buffer_copy_for_comparison = NULL; + psa_crypto_output_copy_t output_copy; + psa_status_t status; + + output_copy.buffer = NULL; + output_copy.len = 0; + + if (!original_is_null) { + TEST_CALLOC(output, output_len); + } + TEST_CALLOC(buffer_copy_for_comparison, output_len); + TEST_CALLOC(output_copy.buffer, output_len); + output_copy.len = output_len; + output_copy.original = output; + + if (output_copy.buffer != NULL) { + fill_buffer_pattern(output_copy.buffer, output_copy.len); + memcpy(buffer_copy_for_comparison, output_copy.buffer, output_copy.len); + } + + status = psa_crypto_output_copy_free(&output_copy); + TEST_EQUAL(status, exp_status); + + if (exp_status == PSA_SUCCESS) { + TEST_ASSERT(output_copy.buffer == NULL); + TEST_EQUAL(output_copy.len, 0); + if (output != NULL) { + TEST_MEMORY_COMPARE(buffer_copy_for_comparison, output_len, + output, output_len); + } + } + +exit: + mbedtls_free(output); + mbedtls_free(buffer_copy_for_comparison); + mbedtls_free(output_copy.buffer); + output_copy.len = 0; +} +/* END_CASE */