Add support for key inversion using AES-NI
diff --git a/library/aesni.c b/library/aesni.c
index 0431f78..488731c 100644
--- a/library/aesni.c
+++ b/library/aesni.c
@@ -215,6 +215,28 @@
return( 0 );
}
+/*
+ * Compute decryption round keys from encryption round keys
+ */
+void aesni_inverse_key( unsigned char *invkey,
+ const unsigned char *fwdkey, int nr )
+{
+ unsigned char *ik = invkey;
+ const unsigned char *fk = fwdkey + 16 * nr;
+
+ memcpy( ik, fk, 16 );
+
+ for( fk -= 16, ik += 16; fk > fwdkey; fk -= 16, ik += 16 )
+ asm( "movdqu (%0), %%xmm0 \n"
+ "aesimc %%xmm0, %%xmm0 \n"
+ "movdqu %%xmm0, (%1) \n"
+ :
+ : "r" (fk), "r" (ik)
+ : "memory", "xmm0" );
+
+ memcpy( ik, fk, 16 );
+}
+
#endif /* POLARSSL_HAVE_X86_64 */
#endif /* POLARSSL_AESNI_C */