From f5d7eef11ff08603acaa5eea51a23385204de23c Mon Sep 17 00:00:00 2001 From: Gilles Peskine Date: Mon, 8 Nov 2021 22:12:47 +0100 Subject: [PATCH] PSA operation structures: move less-used fields to the end Move fields around to have fewer accesses outside the 128-element Thumb direct access window. In psa_hkdf_key_derivation_t, move the large fields (output_block, prk, hmac) after the state bit-fields. Experimentally, it's slightly better to put hmac last. In aead_operation_t, tag_length was outside the window. The details depend on the sizes of contexts included in ctx. Make the large ctx be the last field. In mbedtls_psa_hmac_operation_t, the opad field is outside the window when SHA-512 is enabled. Moving opad before hash_ctx only saves 4 bytes and made the structure clumsy, so I left it alone. Results (arm-none-eabi-gcc 7.3.1, build_arm_none_eabi_gcc_m0plus build): library/psa_crypto.o: 16246 -> 16166 (diff: 80) library/psa_crypto_aead.o: 952 -> 928 (diff: 24) Signed-off-by: Gilles Peskine --- include/psa/crypto_struct.h | 6 +++--- library/psa_crypto_aead.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/psa/crypto_struct.h b/include/psa/crypto_struct.h index 94242f897..f08fdc8bd 100644 --- a/include/psa/crypto_struct.h +++ b/include/psa/crypto_struct.h @@ -175,9 +175,6 @@ typedef struct { uint8_t *info; size_t info_length; - psa_mac_operation_t hmac; - uint8_t prk[PSA_HASH_MAX_SIZE]; - uint8_t output_block[PSA_HASH_MAX_SIZE]; #if PSA_HASH_MAX_SIZE > 0xff #error "PSA_HASH_MAX_SIZE does not fit in uint8_t" #endif @@ -185,6 +182,9 @@ typedef struct uint8_t block_number; unsigned int state : 2; unsigned int info_set : 1; + uint8_t output_block[PSA_HASH_MAX_SIZE]; + uint8_t prk[PSA_HASH_MAX_SIZE]; + psa_mac_operation_t hmac; } psa_hkdf_key_derivation_t; #endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF */ diff --git a/library/psa_crypto_aead.c b/library/psa_crypto_aead.c index 356679c38..2769028d0 100644 --- a/library/psa_crypto_aead.c +++ b/library/psa_crypto_aead.c @@ -32,6 +32,8 @@ typedef struct { + psa_algorithm_t core_alg; + uint8_t tag_length; union { unsigned dummy; /* Make the union non-empty even with no supported algorithms. */ @@ -45,11 +47,9 @@ typedef struct mbedtls_chachapoly_context chachapoly; #endif /* MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305 */ } ctx; - psa_algorithm_t core_alg; - uint8_t tag_length; } aead_operation_t; -#define AEAD_OPERATION_INIT {{0}, 0, 0} +#define AEAD_OPERATION_INIT {0, 0, {0}} static void psa_aead_abort_internal( aead_operation_t *operation ) {