Allow detection of CLMUL

This commit is contained in:
Manuel Pégourié-Gonnard 2013-12-18 19:14:53 +01:00
parent 5b685653ef
commit 8eaf20b18d
3 changed files with 17 additions and 11 deletions

View file

@ -29,6 +29,9 @@
#include "aes.h" #include "aes.h"
#define POLARSSL_AESNI_AES 0x02000000u
#define POLARSSL_AESNI_CLMUL 0x00000002u
#if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && \ #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && \
( defined(__amd64__) || defined(__x86_64__) ) && \ ( defined(__amd64__) || defined(__x86_64__) ) && \
! defined(POLARSSL_HAVE_X86_64) ! defined(POLARSSL_HAVE_X86_64)
@ -38,11 +41,14 @@
#if defined(POLARSSL_HAVE_X86_64) #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 * \brief AES-NI AES-ECB block en(de)cryption

View file

@ -677,7 +677,7 @@ int aes_crypt_ecb( aes_context *ctx,
uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
#if defined(POLARSSL_AESNI_C) && defined(POLARSSL_HAVE_X86_64) #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 ) ); return( aesni_crypt_ecb( ctx, mode, input, output ) );
#endif #endif

View file

@ -37,24 +37,24 @@
#if defined(POLARSSL_HAVE_X86_64) #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; static int done = 0;
unsigned int c; static unsigned int c = 0;
if( supported == -1 ) if( ! done )
{ {
asm( "movl $1, %%eax \n" asm( "movl $1, %%eax \n"
"cpuid \n" "cpuid \n"
: "=c" (c) : "=c" (c)
: :
: "eax", "ebx", "edx" ); : "eax", "ebx", "edx" );
supported = ( ( c & 0x02000000 ) != 0 ); done = 1;
} }
return( supported ); return( ( c & what ) != 0 );
} }
/* /*