Add aesni_crypt_ecb() and use it
diff --git a/library/aesni.c b/library/aesni.c
index 2882298..7628a03 100644
--- a/library/aesni.c
+++ b/library/aesni.c
@@ -32,6 +32,7 @@
#if defined(POLARSSL_AESNI_C)
#include "polarssl/aesni.h"
+#include <stdio.h>
#if defined(POLARSSL_HAVE_X86_64)
@@ -56,6 +57,50 @@
return( supported );
}
+/*
+ * AES-NI AES-ECB block en(de)cryption
+ */
+int aesni_crypt_ecb( aes_context *ctx,
+ int mode,
+ const unsigned char input[16],
+ unsigned char output[16] )
+{
+ asm( "movdqu (%3), %%xmm0 \n" // load input
+ "movdqu (%1), %%xmm1 \n" // load round key 0
+ "pxor %%xmm1, %%xmm0 \n" // round 0
+ "addq $16, %1 \n" // point to next round key
+ "subl $1, %0 \n" // normal rounds = nr - 1
+ "test %2, %2 \n" // mode?
+ "jz 2f \n" // 0 = decrypt
+
+ "1: \n" // encryption loop
+ "movdqu (%1), %%xmm1 \n" // load round key
+ "aesenc %%xmm1, %%xmm0 \n" // do round
+ "addq $16, %1 \n" // point to next round key
+ "subl $1, %0 \n" // loop
+ "jnz 1b \n"
+ "movdqu (%1), %%xmm1 \n" // load round key
+ "aesenclast %%xmm1, %%xmm0 \n" // last round
+ "jmp 3f \n"
+
+ "2: \n" // decryption loop
+ "movdqu (%1), %%xmm1 \n"
+ "aesdec %%xmm1, %%xmm0 \n"
+ "addq $16, %1 \n"
+ "subl $1, %0 \n"
+ "jnz 2b \n"
+ "movdqu (%1), %%xmm1 \n" // load round key
+ "aesdeclast %%xmm1, %%xmm0 \n" // last round
+
+ "3: \n"
+ "movdqu %%xmm0, (%4) \n" // export output
+ :
+ : "r" (ctx->nr), "r" (ctx->rk), "r" (mode), "r" (input), "r" (output)
+ : "memory", "cc", "xmm0", "xmm1" );
+
+
+ return( 0 );
+}
#endif /* POLARSSL_HAVE_X86_64 */
#endif /* POLARSSL_AESNI_C */