From 236c6065784c4ed5d8e7d6d6696358bc4247dc5a Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 7 May 2014 15:39:30 -0400 Subject: [PATCH] AES-NI encrypt and decrypt --- aes.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- aes.h | 6 ++++-- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/aes.cpp b/aes.cpp index 2eedf0ad..7c2ff36c 100644 --- a/aes.cpp +++ b/aes.cpp @@ -33,7 +33,7 @@ namespace crypto "add $32, %%rcx \n" - void ECNEncryptionAESNI::SetKey (const uint8_t * key) + void ECNCryptoAESNI::SetKey (const uint8_t * key) { __asm__ ( @@ -72,6 +72,60 @@ namespace crypto ); } + void ECNCryptoAESNI::Encrypt (const ChipherBlock * in, ChipherBlock * out) + { + __asm__ + ( + "movq %0, %%rdx \n" + "movups (%%rsi), %%xmm0 \n" + "pxor (%%rdx), %%xmm0 \n" + "aesenc 16(%%rdx), %%xmm0 \n" + "aesenc 32(%%rdx), %%xmm0 \n" + "aesenc 64(%%rdx), %%xmm0 \n" + "aesenc 80(%%rdx), %%xmm0 \n" + "aesenc 96(%%rdx), %%xmm0 \n" + "aesenc 112(%%rdx), %%xmm0 \n" + "aesenc 128(%%rdx), %%xmm0 \n" + "aesenc 144(%%rdx), %%xmm0 \n" + "aesenc 160(%%rdx), %%xmm0 \n" + "aesenc 176(%%rdx), %%xmm0 \n" + "aesenc 192(%%rdx), %%xmm0 \n" + "aesenc 208(%%rdx), %%xmm0 \n" + "aesenclast 224(%%rdx), %%xmm0 \n" + "movups %%xmm0, (%%rdi) \n" + : + : "S" (in), "D" (out), "r" ((uint64_t)m_KeySchedule) + : "%rdx" + ); + } + + void ECNCryptoAESNI::Decrypt (const ChipherBlock * in, ChipherBlock * out) + { + __asm__ + ( + "movq %0, %%rdx \n" + "movups (%%rsi), %%xmm0 \n" + "pxor 224(%%rdx), %%xmm0 \n" + "aesdec 208(%%rdx), %%xmm0 \n" + "aesdec 192(%%rdx), %%xmm0 \n" + "aesdec 176(%%rdx), %%xmm0 \n" + "aesdec 160(%%rdx), %%xmm0 \n" + "aesdec 144(%%rdx), %%xmm0 \n" + "aesdec 128(%%rdx), %%xmm0 \n" + "aesdec 112(%%rdx), %%xmm0 \n" + "aesdec 96(%%rdx), %%xmm0 \n" + "aesdec 80(%%rdx), %%xmm0 \n" + "aesdec 64(%%rdx), %%xmm0 \n" + "aesdec 32(%%rdx), %%xmm0 \n" + "aesdec 16(%%rdx), %%xmm0 \n" + "aesdeclast (%%rdx), %%xmm0 \n" + "movups %%xmm0, (%%rdi) \n" + : + : "S" (in), "D" (out), "r" ((uint64_t)m_KeySchedule) + : "%rdx" + ); + } + #endif diff --git a/aes.h b/aes.h index 365c01fd..24533eeb 100644 --- a/aes.h +++ b/aes.h @@ -17,12 +17,14 @@ namespace crypto #ifdef __x86_64__ // AES-NI assumed - class ECNEncryptionAESNI + class ECNCryptoAESNI { public: void SetKey (const uint8_t * key); - + void Encrypt (const ChipherBlock * in, ChipherBlock * out); + void Decrypt (const ChipherBlock * in, ChipherBlock * out); + private: uint32_t m_KeySchedule[4*(14+1)]; // 14 rounds for AES-256