From 97de10533d3db17cd13d186a9968163e2e8a2500 Mon Sep 17 00:00:00 2001 From: Gilles Peskine Date: Wed, 5 Feb 2025 18:51:41 +0100 Subject: [PATCH] Complain about bad initialization of operation structures In every existing test driver entry point that is the setup for a multipart operation, check that the driver operation structure is all-bits-zero on entry, as guaranteed by the driver specification. There is a risk that this isn't the case, mostly, on platforms where initializing a union to `{0}` initializes only the default member and not all members. Signed-off-by: Gilles Peskine --- tests/include/test/drivers/test_driver_common.h | 6 ++++++ tests/src/drivers/test_driver_aead.c | 6 ++++++ tests/src/drivers/test_driver_cipher.c | 14 ++++++++------ tests/src/drivers/test_driver_mac.c | 12 ++++++++++++ tests/src/drivers/test_driver_pake.c | 3 +++ 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/tests/include/test/drivers/test_driver_common.h b/tests/include/test/drivers/test_driver_common.h index 73c692bd7..1cbd5a563 100644 --- a/tests/include/test/drivers/test_driver_common.h +++ b/tests/include/test/drivers/test_driver_common.h @@ -8,4 +8,10 @@ #include "mbedtls/build_info.h" +/** Error code that test drivers return when they detect that an input + * parameter was not initialized properly. This normally indicates a + * bug in the core. + */ +#define PSA_ERROR_TEST_DETECTED_BAD_INITIALIZATION ((psa_status_t)-0x0201) + #endif /* test_driver_common.h */ diff --git a/tests/src/drivers/test_driver_aead.c b/tests/src/drivers/test_driver_aead.c index 6992a066d..f653d89b9 100644 --- a/tests/src/drivers/test_driver_aead.c +++ b/tests/src/drivers/test_driver_aead.c @@ -149,6 +149,9 @@ psa_status_t mbedtls_test_transparent_aead_encrypt_setup( if (mbedtls_test_driver_aead_hooks.forced_status != PSA_SUCCESS) { mbedtls_test_driver_aead_hooks.driver_status = mbedtls_test_driver_aead_hooks.forced_status; + } else if (!MBEDTLS_TEST_OBJECT_IS_ALL_ZERO(operation)) { + mbedtls_test_driver_aead_hooks.driver_status = + PSA_ERROR_TEST_DETECTED_BAD_INITIALIZATION; } else { #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_AEAD) @@ -186,6 +189,9 @@ psa_status_t mbedtls_test_transparent_aead_decrypt_setup( if (mbedtls_test_driver_aead_hooks.forced_status != PSA_SUCCESS) { mbedtls_test_driver_aead_hooks.driver_status = mbedtls_test_driver_aead_hooks.forced_status; + } else if (!MBEDTLS_TEST_OBJECT_IS_ALL_ZERO(operation)) { + mbedtls_test_driver_aead_hooks.driver_status = + PSA_ERROR_TEST_DETECTED_BAD_INITIALIZATION; } else { #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_AEAD) diff --git a/tests/src/drivers/test_driver_cipher.c b/tests/src/drivers/test_driver_cipher.c index 90256fc4e..9a9a77c70 100644 --- a/tests/src/drivers/test_driver_cipher.c +++ b/tests/src/drivers/test_driver_cipher.c @@ -139,16 +139,14 @@ psa_status_t mbedtls_test_transparent_cipher_encrypt_setup( { mbedtls_test_driver_cipher_hooks.hits++; - /* Wiping the entire struct here, instead of member-by-member. This is - * useful for the test suite, since it gives a chance of catching memory - * corruption errors should the core not have allocated (enough) memory for - * our context struct. */ - memset(operation, 0, sizeof(*operation)); - if (mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS) { return mbedtls_test_driver_cipher_hooks.forced_status; } + if (!MBEDTLS_TEST_OBJECT_IS_ALL_ZERO(operation)) { + return PSA_ERROR_TEST_DETECTED_BAD_INITIALIZATION; + } + #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER) return libtestdriver1_mbedtls_psa_cipher_encrypt_setup( @@ -175,6 +173,10 @@ psa_status_t mbedtls_test_transparent_cipher_decrypt_setup( return mbedtls_test_driver_cipher_hooks.forced_status; } + if (!MBEDTLS_TEST_OBJECT_IS_ALL_ZERO(operation)) { + return PSA_ERROR_TEST_DETECTED_BAD_INITIALIZATION; + } + #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER) return libtestdriver1_mbedtls_psa_cipher_decrypt_setup( diff --git a/tests/src/drivers/test_driver_mac.c b/tests/src/drivers/test_driver_mac.c index f1cf50430..a123c2219 100644 --- a/tests/src/drivers/test_driver_mac.c +++ b/tests/src/drivers/test_driver_mac.c @@ -83,6 +83,9 @@ psa_status_t mbedtls_test_transparent_mac_sign_setup( if (mbedtls_test_driver_mac_hooks.forced_status != PSA_SUCCESS) { mbedtls_test_driver_mac_hooks.driver_status = mbedtls_test_driver_mac_hooks.forced_status; + } else if (!MBEDTLS_TEST_OBJECT_IS_ALL_ZERO(operation)) { + mbedtls_test_driver_mac_hooks.driver_status = + PSA_ERROR_TEST_DETECTED_BAD_INITIALIZATION; } else { #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_MAC) @@ -120,6 +123,9 @@ psa_status_t mbedtls_test_transparent_mac_verify_setup( if (mbedtls_test_driver_mac_hooks.forced_status != PSA_SUCCESS) { mbedtls_test_driver_mac_hooks.driver_status = mbedtls_test_driver_mac_hooks.forced_status; + } else if (!MBEDTLS_TEST_OBJECT_IS_ALL_ZERO(operation)) { + mbedtls_test_driver_mac_hooks.driver_status = + PSA_ERROR_TEST_DETECTED_BAD_INITIALIZATION; } else { #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_MAC) @@ -309,6 +315,9 @@ psa_status_t mbedtls_test_opaque_mac_sign_setup( if (mbedtls_test_driver_mac_hooks.forced_status != PSA_SUCCESS) { mbedtls_test_driver_mac_hooks.driver_status = mbedtls_test_driver_mac_hooks.forced_status; + } else if (!MBEDTLS_TEST_OBJECT_IS_ALL_ZERO(operation)) { + mbedtls_test_driver_mac_hooks.driver_status = + PSA_ERROR_TEST_DETECTED_BAD_INITIALIZATION; } else { (void) operation; (void) attributes; @@ -333,6 +342,9 @@ psa_status_t mbedtls_test_opaque_mac_verify_setup( if (mbedtls_test_driver_mac_hooks.forced_status != PSA_SUCCESS) { mbedtls_test_driver_mac_hooks.driver_status = mbedtls_test_driver_mac_hooks.forced_status; + } else if (!MBEDTLS_TEST_OBJECT_IS_ALL_ZERO(operation)) { + mbedtls_test_driver_mac_hooks.driver_status = + PSA_ERROR_TEST_DETECTED_BAD_INITIALIZATION; } else { (void) operation; (void) attributes; diff --git a/tests/src/drivers/test_driver_pake.c b/tests/src/drivers/test_driver_pake.c index c3ce326fe..07d697701 100644 --- a/tests/src/drivers/test_driver_pake.c +++ b/tests/src/drivers/test_driver_pake.c @@ -35,6 +35,9 @@ psa_status_t mbedtls_test_transparent_pake_setup( if (mbedtls_test_driver_pake_hooks.forced_setup_status != PSA_SUCCESS) { mbedtls_test_driver_pake_hooks.driver_status = mbedtls_test_driver_pake_hooks.forced_setup_status; + } else if (!MBEDTLS_TEST_OBJECT_IS_ALL_ZERO(operation)) { + mbedtls_test_driver_pake_hooks.driver_status = + PSA_ERROR_TEST_DETECTED_BAD_INITIALIZATION; } else { #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_PAKE)