mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-08-01 10:06:53 +03:00
AESNI: Overhaul implementation selection
Have clearly separated code to: * determine whether the assembly-based implementation is available; * determine whether the intrinsics-based implementation is available; * select one of the available implementations if any. Now MBEDTLS_AESNI_HAVE_CODE can be the single interface for aes.c and aesni.c to determine which AESNI is built. Change the implementation selection: now, if both implementations are available, always prefer assembly. Before, the intrinsics were used if available. This preference is to minimize disruption, and will likely be revised in a later minor release. Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
This commit is contained in:
committed by
Tom Cosgrove
parent
b71d40228d
commit
6dec541e68
@ -518,7 +518,7 @@ void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
|
||||
* i.e. an offset of 1 means 4 bytes and so on.
|
||||
*/
|
||||
#if (defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)) || \
|
||||
defined(MBEDTLS_HAVE_AESNI_INTRINSICS)
|
||||
(defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2)
|
||||
#define MAY_NEED_TO_ALIGN
|
||||
#endif
|
||||
static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
|
||||
@ -535,7 +535,7 @@ static unsigned mbedtls_aes_rk_offset(uint32_t *buf)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_AESNI_INTRINSICS)
|
||||
#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2
|
||||
if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) {
|
||||
align_16_bytes = 1;
|
||||
}
|
||||
|
@ -36,9 +36,9 @@
|
||||
#endif
|
||||
/* *INDENT-ON* */
|
||||
|
||||
#if defined(MBEDTLS_HAVE_AESNI_INTRINSICS) || defined(MBEDTLS_HAVE_X86_64)
|
||||
#if defined(MBEDTLS_AESNI_HAVE_CODE)
|
||||
|
||||
#if defined(MBEDTLS_HAVE_AESNI_INTRINSICS)
|
||||
#if MBEDTLS_AESNI_HAVE_CODE == 2
|
||||
#if !defined(_WIN32)
|
||||
#include <cpuid.h>
|
||||
#endif
|
||||
@ -54,7 +54,7 @@ int mbedtls_aesni_has_support(unsigned int what)
|
||||
static unsigned int c = 0;
|
||||
|
||||
if (!done) {
|
||||
#if defined(MBEDTLS_HAVE_AESNI_INTRINSICS)
|
||||
#if MBEDTLS_AESNI_HAVE_CODE == 2
|
||||
static unsigned info[4] = { 0, 0, 0, 0 };
|
||||
#if defined(_MSC_VER)
|
||||
__cpuid(info, 1);
|
||||
@ -62,20 +62,20 @@ int mbedtls_aesni_has_support(unsigned int what)
|
||||
__cpuid(1, info[0], info[1], info[2], info[3]);
|
||||
#endif
|
||||
c = info[2];
|
||||
#else
|
||||
#else /* AESNI using asm */
|
||||
asm ("movl $1, %%eax \n\t"
|
||||
"cpuid \n\t"
|
||||
: "=c" (c)
|
||||
:
|
||||
: "eax", "ebx", "edx");
|
||||
#endif
|
||||
#endif /* MBEDTLS_AESNI_HAVE_CODE */
|
||||
done = 1;
|
||||
}
|
||||
|
||||
return (c & what) != 0;
|
||||
}
|
||||
|
||||
#if defined(MBEDTLS_HAVE_AESNI_INTRINSICS)
|
||||
#if MBEDTLS_AESNI_HAVE_CODE == 2
|
||||
|
||||
/*
|
||||
* AES-NI AES-ECB block en(de)cryption
|
||||
@ -394,7 +394,7 @@ static void aesni_setkey_enc_256(unsigned char *rk_bytes,
|
||||
aesni_set_rk_256(rk[12], rk[13], _mm_aeskeygenassist_si128(rk[13], 0x40), &rk[14], &rk[15]);
|
||||
}
|
||||
|
||||
#else /* MBEDTLS_HAVE_AESNI_INTRINSICS */
|
||||
#else /* MBEDTLS_AESNI_HAVE_CODE == 1 */
|
||||
|
||||
#if defined(__has_feature)
|
||||
#if __has_feature(memory_sanitizer)
|
||||
@ -782,7 +782,7 @@ static void aesni_setkey_enc_256(unsigned char *rk,
|
||||
: "memory", "cc", "0");
|
||||
}
|
||||
|
||||
#endif /* MBEDTLS_HAVE_AESNI_INTRINSICS */
|
||||
#endif /* MBEDTLS_AESNI_HAVE_CODE */
|
||||
|
||||
/*
|
||||
* Key expansion, wrapper
|
||||
@ -801,6 +801,6 @@ int mbedtls_aesni_setkey_enc(unsigned char *rk,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* MBEDTLS_HAVE_X86_64 */
|
||||
#endif /* MBEDTLS_AESNI_HAVE_CODE */
|
||||
|
||||
#endif /* MBEDTLS_AESNI_C */
|
||||
|
Reference in New Issue
Block a user