Merge pull request #8444 from Mbed-TLS/cvv-code-size

code size for mbedtls_cipher_validate_values
This commit is contained in:
Dave Rodgman 2023-11-06 12:50:37 +00:00 committed by GitHub
commit 4b67ac8adf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 111 additions and 41 deletions

View File

@ -294,18 +294,36 @@ static inline void mbedtls_xor_no_simd(unsigned char *r,
#define MBEDTLS_STATIC_ASSERT(expr, msg) #define MBEDTLS_STATIC_ASSERT(expr, msg)
#endif #endif
/* Define compiler branch hints */
#if defined(__has_builtin) #if defined(__has_builtin)
#if __has_builtin(__builtin_expect) #define MBEDTLS_HAS_BUILTIN(x) __has_builtin(x)
#else
#define MBEDTLS_HAS_BUILTIN(x) 0
#endif
/* Define compiler branch hints */
#if MBEDTLS_HAS_BUILTIN(__builtin_expect)
#define MBEDTLS_LIKELY(x) __builtin_expect(!!(x), 1) #define MBEDTLS_LIKELY(x) __builtin_expect(!!(x), 1)
#define MBEDTLS_UNLIKELY(x) __builtin_expect(!!(x), 0) #define MBEDTLS_UNLIKELY(x) __builtin_expect(!!(x), 0)
#endif #else
#endif
#if !defined(MBEDTLS_LIKELY)
#define MBEDTLS_LIKELY(x) x #define MBEDTLS_LIKELY(x) x
#define MBEDTLS_UNLIKELY(x) x #define MBEDTLS_UNLIKELY(x) x
#endif #endif
/* MBEDTLS_ASSUME may be used to provide additional information to the compiler
* which can result in smaller code-size. */
#if MBEDTLS_HAS_BUILTIN(__builtin_assume)
/* clang provides __builtin_assume */
#define MBEDTLS_ASSUME(x) __builtin_assume(x)
#elif MBEDTLS_HAS_BUILTIN(__builtin_unreachable)
/* gcc and IAR can use __builtin_unreachable */
#define MBEDTLS_ASSUME(x) do { if (!(x)) __builtin_unreachable(); } while (0)
#elif defined(_MSC_VER)
/* Supported by MSVC since VS 2005 */
#define MBEDTLS_ASSUME(x) __assume(x)
#else
#define MBEDTLS_ASSUME(x) do { } while (0)
#endif
#if defined(__GNUC__) && !defined(__ARMCC_VERSION) && !defined(__clang__) \ #if defined(__GNUC__) && !defined(__ARMCC_VERSION) && !defined(__clang__) \
&& !defined(__llvm__) && !defined(__INTEL_COMPILER) && !defined(__llvm__) && !defined(__INTEL_COMPILER)
/* Defined if the compiler really is gcc and not clang, etc */ /* Defined if the compiler really is gcc and not clang, etc */

View File

@ -30,45 +30,97 @@ static psa_status_t mbedtls_cipher_validate_values(
psa_algorithm_t alg, psa_algorithm_t alg,
psa_key_type_t key_type) psa_key_type_t key_type)
{ {
switch (alg) { /* Reduce code size - hinting to the compiler about what it can assume allows the compiler to
case PSA_ALG_STREAM_CIPHER: eliminate bits of the logic below. */
case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CHACHA20_POLY1305, 0): #if !defined(PSA_WANT_KEY_TYPE_AES)
if (key_type != PSA_KEY_TYPE_CHACHA20) { MBEDTLS_ASSUME(key_type != PSA_KEY_TYPE_AES);
return PSA_ERROR_NOT_SUPPORTED; #endif
} #if !defined(PSA_WANT_KEY_TYPE_ARIA)
break; MBEDTLS_ASSUME(key_type != PSA_KEY_TYPE_ARIA);
#endif
case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, 0): #if !defined(PSA_WANT_KEY_TYPE_CAMELLIA)
case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_GCM, 0): MBEDTLS_ASSUME(key_type != PSA_KEY_TYPE_CAMELLIA);
case PSA_ALG_CCM_STAR_NO_TAG: #endif
if ((key_type != PSA_KEY_TYPE_AES) && #if !defined(PSA_WANT_KEY_TYPE_CHACHA20)
(key_type != PSA_KEY_TYPE_ARIA) && MBEDTLS_ASSUME(key_type != PSA_KEY_TYPE_CHACHA20);
(key_type != PSA_KEY_TYPE_CAMELLIA)) { #endif
return PSA_ERROR_NOT_SUPPORTED; #if !defined(PSA_WANT_KEY_TYPE_DES)
} MBEDTLS_ASSUME(key_type != PSA_KEY_TYPE_DES);
break; #endif
#if !defined(PSA_WANT_ALG_CCM)
case PSA_ALG_CTR: MBEDTLS_ASSUME(alg != PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, 0));
case PSA_ALG_CFB: #endif
case PSA_ALG_OFB: #if !defined(PSA_WANT_ALG_GCM)
case PSA_ALG_XTS: MBEDTLS_ASSUME(alg != PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_GCM, 0));
case PSA_ALG_ECB_NO_PADDING: #endif
case PSA_ALG_CBC_NO_PADDING: #if !defined(PSA_WANT_ALG_STREAM_CIPHER)
case PSA_ALG_CBC_PKCS7: MBEDTLS_ASSUME(alg != PSA_ALG_STREAM_CIPHER);
case PSA_ALG_CMAC: #endif
if ((key_type != PSA_KEY_TYPE_AES) && #if !defined(PSA_WANT_ALG_CHACHA20_POLY1305)
(key_type != PSA_KEY_TYPE_ARIA) && MBEDTLS_ASSUME(alg != PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CHACHA20_POLY1305, 0));
(key_type != PSA_KEY_TYPE_DES) && #endif
(key_type != PSA_KEY_TYPE_CAMELLIA)) { #if !defined(PSA_WANT_ALG_CCM_STAR_NO_TAG)
return PSA_ERROR_NOT_SUPPORTED; MBEDTLS_ASSUME(alg != PSA_ALG_CCM_STAR_NO_TAG);
} #endif
break; #if !defined(PSA_WANT_ALG_CTR)
MBEDTLS_ASSUME(alg != PSA_ALG_CTR);
default: #endif
return PSA_ERROR_NOT_SUPPORTED; #if !defined(PSA_WANT_ALG_CFB)
} MBEDTLS_ASSUME(alg != PSA_ALG_CFB);
#endif
#if !defined(PSA_WANT_ALG_OFB)
MBEDTLS_ASSUME(alg != PSA_ALG_OFB);
#endif
#if !defined(PSA_WANT_ALG_XTS)
MBEDTLS_ASSUME(alg != PSA_ALG_XTS);
#endif
#if !defined(PSA_WANT_ALG_ECB_NO_PADDING)
MBEDTLS_ASSUME(alg != PSA_ALG_ECB_NO_PADDING);
#endif
#if !defined(PSA_WANT_ALG_CBC_NO_PADDING)
MBEDTLS_ASSUME(alg != PSA_ALG_CBC_NO_PADDING);
#endif
#if !defined(PSA_WANT_ALG_CBC_PKCS7)
MBEDTLS_ASSUME(alg != PSA_ALG_CBC_PKCS7);
#endif
#if !defined(PSA_WANT_ALG_CMAC)
MBEDTLS_ASSUME(alg != PSA_ALG_CMAC);
#endif
if (alg == PSA_ALG_STREAM_CIPHER ||
alg == PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CHACHA20_POLY1305, 0)) {
if (key_type == PSA_KEY_TYPE_CHACHA20) {
return PSA_SUCCESS; return PSA_SUCCESS;
}
}
if (alg == PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, 0) ||
alg == PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_GCM, 0) ||
alg == PSA_ALG_CCM_STAR_NO_TAG) {
if (key_type == PSA_KEY_TYPE_AES ||
key_type == PSA_KEY_TYPE_ARIA ||
key_type == PSA_KEY_TYPE_CAMELLIA) {
return PSA_SUCCESS;
}
}
if (alg == PSA_ALG_CTR ||
alg == PSA_ALG_CFB ||
alg == PSA_ALG_OFB ||
alg == PSA_ALG_XTS ||
alg == PSA_ALG_ECB_NO_PADDING ||
alg == PSA_ALG_CBC_NO_PADDING ||
alg == PSA_ALG_CBC_PKCS7 ||
alg == PSA_ALG_CMAC) {
if (key_type == PSA_KEY_TYPE_AES ||
key_type == PSA_KEY_TYPE_ARIA ||
key_type == PSA_KEY_TYPE_DES ||
key_type == PSA_KEY_TYPE_CAMELLIA) {
return PSA_SUCCESS;
}
}
return PSA_ERROR_NOT_SUPPORTED;
} }
psa_status_t mbedtls_cipher_values_from_psa( psa_status_t mbedtls_cipher_values_from_psa(