diff --git a/tests/suites/test_suite_psa_crypto.data b/tests/suites/test_suite_psa_crypto.data index 1d3169468..89d2e28cc 100644 --- a/tests/suites/test_suite_psa_crypto.data +++ b/tests/suites/test_suite_psa_crypto.data @@ -4107,3 +4107,6 @@ psa_crypto_copy_and_free:0:0:0:20:0:PSA_ERROR_INVALID_ARGUMENT PSA buffers copy and free, zero-length output psa_crypto_copy_and_free:20:0:0:0:0:PSA_ERROR_INVALID_ARGUMENT + +PSA buffers round-trip +psa_crypto_buffer_copy_round_trip diff --git a/tests/suites/test_suite_psa_crypto.function b/tests/suites/test_suite_psa_crypto.function index 5cdb55300..7bca4b37f 100644 --- a/tests/suites/test_suite_psa_crypto.function +++ b/tests/suites/test_suite_psa_crypto.function @@ -5956,3 +5956,47 @@ exit: mbedtls_free(orig_output); } /* END_CASE */ + +/* BEGIN_CASE */ +void psa_crypto_buffer_copy_round_trip() +{ + uint8_t data[] = {0x12, 0x34, 0x56, 0x78}; + uint8_t input[100]; + uint8_t output[100]; + uint8_t output_for_comparison[100]; + psa_crypto_buffer_copy_t buffer_copies = { 0 }; + psa_status_t ret; + + for (size_t i = 0; i < sizeof(input); i++) { + input[i] = data[i % sizeof(data)]; + } + + ret = psa_crypto_alloc_and_copy(input, sizeof(input), + output, sizeof(output), + &buffer_copies); + + TEST_ASSERT(ret == PSA_SUCCESS); + TEST_MEMORY_COMPARE(input, sizeof(input), + buffer_copies.input, buffer_copies.input_len); + TEST_EQUAL(sizeof(output), buffer_copies.output_len); + + /* Simulate the PSA function filling the (internal) output buffer. */ + for (size_t i = 0; i < buffer_copies.output_len; i++) { + buffer_copies.output[i] = data[i % sizeof(data)]; + } + /* Make a copy of output to compare the copy-back */ + memcpy(output_for_comparison, buffer_copies.output, + sizeof(output_for_comparison)); + + ret = psa_crypto_copy_and_free(&buffer_copies); + + TEST_EQUAL(ret, PSA_SUCCESS); + /* Check that the output was copied back correctly. */ + TEST_MEMORY_COMPARE(output_for_comparison, sizeof(output_for_comparison), + output, sizeof(output)); + +exit: + mbedtls_free(buffer_copies.input); + mbedtls_free(buffer_copies.output); +} +/* END_CASE */