From 1d8d71cfb6cf6a9f3c76dfff5e4540634bdec138 Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 21 Nov 2016 21:13:13 -0500 Subject: [PATCH] 16-bytes alignment for IV for AES-CBC --- Crypto.cpp | 18 +++++++++--------- Crypto.h | 16 +++++++++------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Crypto.cpp b/Crypto.cpp index f9478646..54180677 100644 --- a/Crypto.cpp +++ b/Crypto.cpp @@ -595,16 +595,16 @@ namespace crypto "jnz 1b \n" "movups %%xmm1, (%[iv]) \n" : - : [iv]"r"(&m_LastBlock), [sched]"r"(m_ECBEncryption.GetKeySchedule ()), + : [iv]"r"((uint8_t *)m_LastBlock), [sched]"r"(m_ECBEncryption.GetKeySchedule ()), [in]"r"(in), [out]"r"(out), [num]"r"(numBlocks) : "%xmm0", "%xmm1", "cc", "memory" ); #else for (int i = 0; i < numBlocks; i++) { - m_LastBlock ^= in[i]; - m_ECBEncryption.Encrypt (&m_LastBlock, &m_LastBlock); - out[i] = m_LastBlock; + *m_LastBlock.GetChipherBlock () ^= in[i]; + m_ECBEncryption.Encrypt (m_LastBlock.GetChipherBlock (), m_LastBlock.GetChipherBlock ()); + out[i] = *m_LastBlock.GetChipherBlock (); } #endif } @@ -629,7 +629,7 @@ namespace crypto "movups %%xmm0, (%[out]) \n" "movups %%xmm0, (%[iv]) \n" : - : [iv]"r"(&m_LastBlock), [sched]"r"(m_ECBEncryption.GetKeySchedule ()), + : [iv]"r"((uint8_t *)m_LastBlock), [sched]"r"(m_ECBEncryption.GetKeySchedule ()), [in]"r"(in), [out]"r"(out) : "%xmm0", "%xmm1", "memory" ); @@ -657,7 +657,7 @@ namespace crypto "jnz 1b \n" "movups %%xmm1, (%[iv]) \n" : - : [iv]"r"(&m_IV), [sched]"r"(m_ECBDecryption.GetKeySchedule ()), + : [iv]"r"((uint8_t *)m_IV), [sched]"r"(m_ECBDecryption.GetKeySchedule ()), [in]"r"(in), [out]"r"(out), [num]"r"(numBlocks) : "%xmm0", "%xmm1", "%xmm2", "cc", "memory" ); @@ -666,8 +666,8 @@ namespace crypto { ChipherBlock tmp = in[i]; m_ECBDecryption.Decrypt (in + i, out + i); - out[i] ^= m_IV; - m_IV = tmp; + out[i] ^= *m_IV.GetChipherBlock (); + *m_IV.GetChipherBlock () = tmp; } #endif } @@ -691,7 +691,7 @@ namespace crypto "pxor %%xmm1, %%xmm0 \n" "movups %%xmm0, (%[out]) \n" : - : [iv]"r"(&m_IV), [sched]"r"(m_ECBDecryption.GetKeySchedule ()), + : [iv]"r"((uint8_t *)m_IV), [sched]"r"(m_ECBDecryption.GetKeySchedule ()), [in]"r"(in), [out]"r"(out) : "%xmm0", "%xmm1", "memory" ); diff --git a/Crypto.h b/Crypto.h index 0bc1e03c..b9d25216 100644 --- a/Crypto.h +++ b/Crypto.h @@ -112,7 +112,9 @@ namespace crypto operator uint8_t * () { return m_Buf; }; operator const uint8_t * () const { return m_Buf; }; - + ChipherBlock * GetChipherBlock () { return (ChipherBlock *)m_Buf; }; + const ChipherBlock * GetChipherBlock () const { return (const ChipherBlock *)m_Buf; }; + private: uint8_t m_UnalignedBuffer[sz + 15]; // up to 15 bytes alignment @@ -200,10 +202,10 @@ namespace crypto { public: - CBCEncryption () { memset (m_LastBlock.buf, 0, 16); }; + CBCEncryption () { memset ((uint8_t *)m_LastBlock, 0, 16); }; void SetKey (const AESKey& key) { m_ECBEncryption.SetKey (key); }; // 32 bytes - void SetIV (const uint8_t * iv) { memcpy (m_LastBlock.buf, iv, 16); }; // 16 bytes + void SetIV (const uint8_t * iv) { memcpy ((uint8_t *)m_LastBlock, iv, 16); }; // 16 bytes void Encrypt (int numBlocks, const ChipherBlock * in, ChipherBlock * out); void Encrypt (const uint8_t * in, std::size_t len, uint8_t * out); @@ -211,7 +213,7 @@ namespace crypto private: - ChipherBlock m_LastBlock; + AESAlignedBuffer<16> m_LastBlock; ECBEncryption m_ECBEncryption; }; @@ -220,10 +222,10 @@ namespace crypto { public: - CBCDecryption () { memset (m_IV.buf, 0, 16); }; + CBCDecryption () { memset ((uint8_t *)m_IV, 0, 16); }; void SetKey (const AESKey& key) { m_ECBDecryption.SetKey (key); }; // 32 bytes - void SetIV (const uint8_t * iv) { memcpy (m_IV.buf, iv, 16); }; // 16 bytes + void SetIV (const uint8_t * iv) { memcpy ((uint8_t *)m_IV, iv, 16); }; // 16 bytes void Decrypt (int numBlocks, const ChipherBlock * in, ChipherBlock * out); void Decrypt (const uint8_t * in, std::size_t len, uint8_t * out); @@ -231,7 +233,7 @@ namespace crypto private: - ChipherBlock m_IV; + AESAlignedBuffer<16> m_IV; ECBDecryption m_ECBDecryption; };