diff --git a/include/polarssl/aesni.h b/include/polarssl/aesni.h index d6684fc6c..b53c0c0c2 100644 --- a/include/polarssl/aesni.h +++ b/include/polarssl/aesni.h @@ -29,6 +29,9 @@ #include "aes.h" +#define POLARSSL_AESNI_AES 0x02000000u +#define POLARSSL_AESNI_CLMUL 0x00000002u + #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && \ ( defined(__amd64__) || defined(__x86_64__) ) && \ ! defined(POLARSSL_HAVE_X86_64) @@ -38,11 +41,14 @@ #if defined(POLARSSL_HAVE_X86_64) /** - * \brief AES-NI detection routine + * \brief AES-NI features detection routine * - * \return 1 if CPU supports AES-NI, 0 otherwise + * \param what The feature to detect + * (POLARSSL_AESNI_AES or POLARSSL_AESNI_CLMUL) + * + * \return 1 if CPU has support for the feature, 0 otherwise */ -int aesni_supported( void ); +int aesni_supports( unsigned int what ); /** * \brief AES-NI AES-ECB block en(de)cryption diff --git a/library/aes.c b/library/aes.c index 6d090a11d..d2d1c0c43 100644 --- a/library/aes.c +++ b/library/aes.c @@ -677,7 +677,7 @@ int aes_crypt_ecb( aes_context *ctx, uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; #if defined(POLARSSL_AESNI_C) && defined(POLARSSL_HAVE_X86_64) - if( aesni_supported() ) + if( aesni_supports( POLARSSL_AESNI_AES ) ) return( aesni_crypt_ecb( ctx, mode, input, output ) ); #endif diff --git a/library/aesni.c b/library/aesni.c index 7628a0362..9b41c36ff 100644 --- a/library/aesni.c +++ b/library/aesni.c @@ -37,24 +37,24 @@ #if defined(POLARSSL_HAVE_X86_64) /* - * AES-NI support detection routine, [AES-WP] figure 23 + * AES-NI support detection routine */ -int aesni_supported( void ) +int aesni_supports( unsigned int what ) { - static int supported = -1; - unsigned int c; + static int done = 0; + static unsigned int c = 0; - if( supported == -1 ) + if( ! done ) { asm( "movl $1, %%eax \n" "cpuid \n" : "=c" (c) : : "eax", "ebx", "edx" ); - supported = ( ( c & 0x02000000 ) != 0 ); + done = 1; } - return( supported ); + return( ( c & what ) != 0 ); } /*