diff --git a/include/polarssl/aesni.h b/include/polarssl/aesni.h new file mode 100644 index 000000000..9aaeff196 --- /dev/null +++ b/include/polarssl/aesni.h @@ -0,0 +1,49 @@ +/** + * \file aesni.h + * + * \brief AES-NI for hardware AES acceleration on some Intel processors + * + * Copyright (C) 2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_AESNI_H +#define POLARSSL_AESNI_H + +#include "aes.h" + +#if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && \ + ( defined(__amd64__) || defined(__x86_64__) ) && \ + ! defined(POLARSSL_HAVE_X86_64) +#define POLARSSL_HAVE_X86_64 +#endif + +#if defined(POLARSSL_HAVE_X86_64) + +/** + * \brief AES_NI detection routine + * + * \return 1 if CPU supports AES-NI, 0 otherwise + */ +int aesni_supported( void ); + +#endif /* POLARSSL_HAVE_X86_64 */ + +#endif /* POLARSSL_AESNI_H */ diff --git a/include/polarssl/config.h b/include/polarssl/config.h index d98bdb34f..283e294a7 100644 --- a/include/polarssl/config.h +++ b/include/polarssl/config.h @@ -874,6 +874,20 @@ * \{ */ +/** + * \def POLARSSL_AESNI_C + * + * Enable AES-NI support on x86-64. + * + * Module: library/aesni.c + * Caller: library/aes.c + * + * Requires: POLARSSL_HAVE_ASM + * + * This modules adds support for the AES-NI instructions on x86-64 + */ +#define POLARSSL_AESNI_C + /** * \def POLARSSL_AES_C * @@ -1414,6 +1428,8 @@ * Module: library/padlock.c * Caller: library/aes.c * + * Requires: POLARSSL_HAVE_ASM + * * This modules adds support for the VIA PadLock on x86. */ #define POLARSSL_PADLOCK_C @@ -1902,6 +1918,10 @@ /* * Sanity checks on defines and dependencies */ +#if defined(POLARSSL_AESNI_C) && !defined(POLARSSL_HAVE_ASM) +#error "POLARSSL_AESNI_C defined, but not all prerequisites" +#endif + #if defined(POLARSSL_CERTS_C) && !defined(POLARSSL_PEM_PARSE_C) #error "POLARSSL_CERTS_C defined, but not all prerequisites" #endif @@ -2012,6 +2032,10 @@ #error "POLARSSL_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites" #endif +#if defined(POLARSSL_PADLOCK_C) && !defined(POLARSSL_HAVE_ASM) +#error "POLARSSL_PADLOCK_C defined, but not all prerequisites" +#endif + #if defined(POLARSSL_PBKDF2_C) && !defined(POLARSSL_MD_C) #error "POLARSSL_PBKDF2_C defined, but not all prerequisites" #endif diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 411c07d80..1a5efde1f 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -2,6 +2,7 @@ option(USE_SHARED_POLARSSL_LIBRARY "Build PolarSSL as a shared library." OFF) set(src aes.c + aesni.c arc4.c asn1parse.c asn1write.c diff --git a/library/Makefile b/library/Makefile index a9c86f84c..3f80162b5 100644 --- a/library/Makefile +++ b/library/Makefile @@ -34,7 +34,8 @@ DLEXT=dll LDFLAGS += -lws2_32 endif -OBJS= aes.o arc4.o asn1parse.o \ +OBJS= aes.o aesni.o arc4.o \ + asn1parse.o \ asn1write.o base64.o bignum.o \ blowfish.o camellia.o \ certs.o cipher.o cipher_wrap.o \ diff --git a/library/aesni.c b/library/aesni.c new file mode 100644 index 000000000..2882298e0 --- /dev/null +++ b/library/aesni.c @@ -0,0 +1,61 @@ +/* + * AES-NI support functions + * + * Copyright (C) 2013, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* + * [AES-WP] http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-aes-instructions-set + */ + +#include "polarssl/config.h" + +#if defined(POLARSSL_AESNI_C) + +#include "polarssl/aesni.h" + +#if defined(POLARSSL_HAVE_X86_64) + +/* + * AES-NI support detection routine, [AES-WP] figure 23 + */ +int aesni_supported( void ) +{ + static int supported = -1; + unsigned int c; + + if( supported == -1 ) + { + asm( "movl $1, %%eax \n" + "cpuid \n" + : "=c" (c) + : + : "eax", "ebx", "edx" ); + supported = ( ( c & 0x02000000 ) != 0 ); + } + + return( supported ); +} + +#endif /* POLARSSL_HAVE_X86_64 */ + +#endif /* POLARSSL_AESNI_C */ diff --git a/visualc/VS2010/PolarSSL.vcxproj b/visualc/VS2010/PolarSSL.vcxproj index 33f00312b..4c067beda 100644 --- a/visualc/VS2010/PolarSSL.vcxproj +++ b/visualc/VS2010/PolarSSL.vcxproj @@ -143,6 +143,7 @@ + @@ -201,6 +202,7 @@ + diff --git a/visualc/VS6/polarssl.dsp b/visualc/VS6/polarssl.dsp index c40b75b18..b6a82c0b9 100644 --- a/visualc/VS6/polarssl.dsp +++ b/visualc/VS6/polarssl.dsp @@ -89,6 +89,10 @@ SOURCE=..\..\library\aes.c # End Source File # Begin Source File +SOURCE=..\..\library\aesni.c +# End Source File +# Begin Source File + SOURCE=..\..\library\arc4.c # End Source File # Begin Source File @@ -349,6 +353,10 @@ SOURCE=..\..\include\polarssl\aes.h # End Source File # Begin Source File +SOURCE=..\..\include\polarssl\aesni.h +# End Source File +# Begin Source File + SOURCE=..\..\include\polarssl\arc4.h # End Source File # Begin Source File