mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-13 19:37:51 +00:00
AES buffer aligned to 16 bytes
This commit is contained in:
parent
96387aecbd
commit
dd1a798128
16
aes.cpp
16
aes.cpp
@ -8,14 +8,6 @@ namespace crypto
|
||||
{
|
||||
|
||||
#ifdef AESNI
|
||||
|
||||
ECBCryptoAESNI::ECBCryptoAESNI ()
|
||||
{
|
||||
m_KeySchedule = m_UnalignedBuffer;
|
||||
uint8_t rem = ((uint64_t)m_KeySchedule) & 0x0f;
|
||||
if (rem)
|
||||
m_KeySchedule += (16 - rem);
|
||||
}
|
||||
|
||||
#define KeyExpansion256(round0,round1) \
|
||||
"pshufd $0xff, %%xmm2, %%xmm2 \n" \
|
||||
@ -73,7 +65,7 @@ namespace crypto
|
||||
"pxor %%xmm2, %%xmm1 \n"
|
||||
"movups %%xmm1, 224(%[sched]) \n"
|
||||
: // output
|
||||
: [key]"r"((const uint8_t *)key), [sched]"r"(m_KeySchedule) // input
|
||||
: [key]"r"((const uint8_t *)key), [sched]"r"(GetKeySchedule ()) // input
|
||||
: "%xmm1", "%xmm2", "%xmm3", "%xmm4" // clogged
|
||||
);
|
||||
}
|
||||
@ -102,7 +94,7 @@ namespace crypto
|
||||
"movups (%[in]), %%xmm0 \n"
|
||||
EncryptAES256(sched)
|
||||
"movups %%xmm0, (%[out]) \n"
|
||||
: : [sched]"r"(m_KeySchedule), [in]"r"(in), [out]"r"(out) : "%xmm0"
|
||||
: : [sched]"r"(GetKeySchedule ()), [in]"r"(in), [out]"r"(out) : "%xmm0"
|
||||
);
|
||||
}
|
||||
|
||||
@ -130,7 +122,7 @@ namespace crypto
|
||||
"movups (%[in]), %%xmm0 \n"
|
||||
DecryptAES256(sched)
|
||||
"movups %%xmm0, (%[out]) \n"
|
||||
: : [sched]"r"(m_KeySchedule), [in]"r"(in), [out]"r"(out) : "%xmm0"
|
||||
: : [sched]"r"(GetKeySchedule ()), [in]"r"(in), [out]"r"(out) : "%xmm0"
|
||||
);
|
||||
}
|
||||
|
||||
@ -158,7 +150,7 @@ namespace crypto
|
||||
CallAESIMC(176)
|
||||
CallAESIMC(192)
|
||||
CallAESIMC(208)
|
||||
: : [shed]"r"(m_KeySchedule) : "%xmm0"
|
||||
: : [shed]"r"(GetKeySchedule ()) : "%xmm0"
|
||||
);
|
||||
}
|
||||
|
||||
|
31
aes.h
31
aes.h
@ -24,22 +24,43 @@ namespace crypto
|
||||
|
||||
typedef i2p::data::Tag<32> AESKey;
|
||||
|
||||
template<size_t sz>
|
||||
class AESAlignedBuffer // 16 bytes alignment
|
||||
{
|
||||
public:
|
||||
|
||||
AESAlignedBuffer ()
|
||||
{
|
||||
m_Buf = m_UnalignedBuffer;
|
||||
uint8_t rem = ((uint64_t)m_Buf) & 0x0f;
|
||||
if (rem)
|
||||
m_Buf += (16 - rem);
|
||||
}
|
||||
|
||||
operator uint8_t * () { return m_Buf; };
|
||||
operator const uint8_t * () const { return m_Buf; };
|
||||
|
||||
private:
|
||||
|
||||
uint8_t m_UnalignedBuffer[sz + 15]; // up to 15 bytes alignment
|
||||
uint8_t * m_Buf;
|
||||
};
|
||||
|
||||
|
||||
#ifdef AESNI
|
||||
class ECBCryptoAESNI
|
||||
{
|
||||
public:
|
||||
|
||||
ECBCryptoAESNI ();
|
||||
uint8_t * GetKeySchedule () { return m_KeySchedule; };
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
void ExpandKey (const AESKey& key);
|
||||
|
||||
protected:
|
||||
private:
|
||||
|
||||
uint8_t * m_KeySchedule; // start of 16 bytes boundary of m_UnalignedBuffer
|
||||
uint8_t m_UnalignedBuffer[256]; // 14 rounds for AES-256, 240 + 16 bytes
|
||||
AESAlignedBuffer<240> m_KeySchedule; // 14 rounds for AES-256, 240 bytes
|
||||
};
|
||||
|
||||
class ECBEncryptionAESNI: public ECBCryptoAESNI
|
||||
|
Loading…
Reference in New Issue
Block a user