Add files for (upcoming) AES-NI support
diff --git a/include/polarssl/aesni.h b/include/polarssl/aesni.h
new file mode 100644
index 0000000..9aaeff1
--- /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 <polarssl_maintainer at polarssl.org>
+ *
+ *  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 d98bdb3..283e294 100644
--- a/include/polarssl/config.h
+++ b/include/polarssl/config.h
@@ -875,6 +875,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
  *
  * Enable the AES block cipher.
@@ -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 411c07d..1a5efde 100644
--- a/library/CMakeLists.txt
+++ b/library/CMakeLists.txt
@@ -2,6 +2,7 @@
 
 set(src
      aes.c
+     aesni.c
      arc4.c
      asn1parse.c
      asn1write.c
diff --git a/library/Makefile b/library/Makefile
index a9c86f8..3f80162 100644
--- a/library/Makefile
+++ b/library/Makefile
@@ -34,7 +34,8 @@
 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 0000000..2882298
--- /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 <polarssl_maintainer at polarssl.org>
+ *
+ *  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 33f0031..4c067be 100644
--- a/visualc/VS2010/PolarSSL.vcxproj
+++ b/visualc/VS2010/PolarSSL.vcxproj
@@ -143,6 +143,7 @@
   </ItemDefinitionGroup>

   <ItemGroup>

     <ClInclude Include="..\..\include\polarssl\aes.h" />

+    <ClInclude Include="..\..\include\polarssl\aesni.h" />
     <ClInclude Include="..\..\include\polarssl\arc4.h" />

     <ClInclude Include="..\..\include\polarssl\asn1.h" />

     <ClInclude Include="..\..\include\polarssl\asn1write.h" />

@@ -201,6 +202,7 @@
   </ItemGroup>

   <ItemGroup>

     <ClCompile Include="..\..\library\aes.c" />

+    <ClCompile Include="..\..\library\aesni.c" />
     <ClCompile Include="..\..\library\arc4.c" />

     <ClCompile Include="..\..\library\asn1parse.c" />

     <ClCompile Include="..\..\library\asn1write.c" />

diff --git a/visualc/VS6/polarssl.dsp b/visualc/VS6/polarssl.dsp
index c40b75b..b6a82c0 100644
--- a/visualc/VS6/polarssl.dsp
+++ b/visualc/VS6/polarssl.dsp
@@ -89,6 +89,10 @@
 # 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 @@
 # 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