From d2f9f53f7fc2172fa0100843bdff5d67c3083633 Mon Sep 17 00:00:00 2001 From: Hanno Becker Date: Tue, 12 Jan 2021 07:11:11 +0000 Subject: [PATCH] Add typedef's for MPS buffer size types Most buffers that MPS deals with are small and representable with integer types of width 16-bit or more. For highly memory constrained systems, it is therefore a potential for significant memory savings to use 16-bit types for buffer sizes throughout MPS. In prepraration for this, this commit introduces typdefs ``` mbedtls_mps_size_t mbedtls_mps_stored_size_t ``` for buffer sizes in the MPS implementation and the MPS structures, respectively. So far, those MUST be defined as `size_t`: While an effort has been made to write most of MPS code in terms of `mbedtls_mps_[stored_]size_t` in a way that would allow narrower types, those aren't yet supported. Still, we retain the typedefs in order to avoid unnecessary rewriting of a large body of the MPS codebase. Signed-off-by: Hanno Becker --- library/mps/common.h | 53 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/library/mps/common.h b/library/mps/common.h index 84c584105..1ea33f9b1 100644 --- a/library/mps/common.h +++ b/library/mps/common.h @@ -26,6 +26,8 @@ #ifndef MBEDTLS_MPS_COMMON_H #define MBEDTLS_MPS_COMMON_H +#include + /** * \name SECTION: MPS Configuration * @@ -52,4 +54,55 @@ /* \} name SECTION: MPS Configuration */ +/** + * \name SECTION: Common types + * + * Various common types used throughout MPS. + * \{ + */ + +/** \brief The type of buffer sizes and offsets used in MPS structures. + * + * This is an unsigned integer type that should be large enough to + * hold the length of any buffer resp. message processed by MPS. + * + * The reason to pick a value as small as possible here is + * to reduce the size of MPS structures. + * + * \warning Care has to be taken when using a narrower type + * than ::mbedtls_mps_size_t here because of + * potential truncation during conversion. + * + * \warning Handshake messages in TLS may be up to 2^24 ~ 16Mb in size. + * If mbedtls_mps_[opt_]stored_size_t is smaller than that, the + * maximum handshake message is restricted accordingly. + * + * For now, we use the default type of size_t throughout, and the use of + * smaller types or different types for ::mbedtls_mps_size_t and + * ::mbedtls_mps_stored_size_t is not yet supported. + * + */ +typedef size_t mbedtls_mps_stored_size_t; +#define MBEDTLS_MPS_SIZE_MAX ( (mbedtls_mps_size_t) -1 ) + +/** \brief The type of buffer sizes and offsets used in the MPS API + * and implementation. + * + * This must be at least as wide as ::mbedtls_stored_size_t but + * may be chosen to be strictly larger if more suitable for the + * target architecture. + * + * For example, in a test build for ARM Thumb, using uint_fast16_t + * instead of uint16_t reduced the code size from 1060 Byte to 962 Byte, + * so almost 10%. + */ +typedef size_t mbedtls_mps_size_t; + +#if (mbedtls_mps_size_t) -1 > (mbedtls_mps_stored_size_t) -1 +#error "Misconfiguration of mbedtls_mps_size_t and mbedtls_mps_stored_size_t." +#endif + +/* \} SECTION: Common types */ + + #endif /* MBEDTLS_MPS_COMMON_H */