Path: blob/a-new-beginning/SharedDependencies/Sources/cryptopp/aria.cpp
2 views
// aria.cpp - written and placed in the public domain by Jeffrey Walton12#include "pch.h"3#include "config.h"45#include "aria.h"6#include "misc.h"7#include "cpu.h"89NAMESPACE_BEGIN(CryptoPP)10NAMESPACE_BEGIN(ARIATab)1112extern const word32 S1[256];13extern const word32 S2[256];14extern const word32 X1[256];15extern const word32 X2[256];16extern const word32 KRK[3][4];1718NAMESPACE_END19NAMESPACE_END2021NAMESPACE_BEGIN(CryptoPP)2223using CryptoPP::ARIATab::S1;24using CryptoPP::ARIATab::S2;25using CryptoPP::ARIATab::X1;26using CryptoPP::ARIATab::X2;27using CryptoPP::ARIATab::KRK;2829inline byte ARIA_BRF(const word32 x, const int y) {30return static_cast<byte>(GETBYTE(x, y));31}3233// Key XOR Layer. Bumps the round key pointer.34inline const byte* ARIA_KXL(const byte rk[16], word32 t[4]) {35typedef BlockGetAndPut<word32, NativeByteOrder, true, true> NativeBlock;36NativeBlock::Put(rk, t)(t[0])(t[1])(t[2])(t[3]);37return rk+16;38}3940// S-Box Layer 1 + M41inline void SBL1_M(word32& T0, word32& T1, word32& T2, word32& T3) {42T0=S1[ARIA_BRF(T0,3)]^S2[ARIA_BRF(T0,2)]^X1[ARIA_BRF(T0,1)]^X2[ARIA_BRF(T0,0)];43T1=S1[ARIA_BRF(T1,3)]^S2[ARIA_BRF(T1,2)]^X1[ARIA_BRF(T1,1)]^X2[ARIA_BRF(T1,0)];44T2=S1[ARIA_BRF(T2,3)]^S2[ARIA_BRF(T2,2)]^X1[ARIA_BRF(T2,1)]^X2[ARIA_BRF(T2,0)];45T3=S1[ARIA_BRF(T3,3)]^S2[ARIA_BRF(T3,2)]^X1[ARIA_BRF(T3,1)]^X2[ARIA_BRF(T3,0)];46}4748// S-Box Layer 2 + M49inline void SBL2_M(word32& T0, word32& T1, word32& T2, word32& T3) {50T0=X1[ARIA_BRF(T0,3)]^X2[ARIA_BRF(T0,2)]^S1[ARIA_BRF(T0,1)]^S2[ARIA_BRF(T0,0)];51T1=X1[ARIA_BRF(T1,3)]^X2[ARIA_BRF(T1,2)]^S1[ARIA_BRF(T1,1)]^S2[ARIA_BRF(T1,0)];52T2=X1[ARIA_BRF(T2,3)]^X2[ARIA_BRF(T2,2)]^S1[ARIA_BRF(T2,1)]^S2[ARIA_BRF(T2,0)];53T3=X1[ARIA_BRF(T3,3)]^X2[ARIA_BRF(T3,2)]^S1[ARIA_BRF(T3,1)]^S2[ARIA_BRF(T3,0)];54}5556inline void ARIA_P(word32& T0, word32& T1, word32& T2, word32& T3) {57CRYPTOPP_UNUSED(T0);58T1 = ((T1<< 8)&0xff00ff00) ^ ((T1>> 8)&0x00ff00ff);59T2 = rotrConstant<16>(T2);60T3 = ByteReverse((T3));61}6263inline void ARIA_M(word32& X, word32& Y) {64Y=X<<8 ^ X>>8 ^ X<<16 ^ X>>16 ^ X<<24 ^ X>>24;65}666768inline void ARIA_MM(word32& T0, word32& T1, word32& T2, word32& T3) {69T1^=T2; T2^=T3; T0^=T1;70T3^=T1; T2^=T0; T1^=T2;71}7273inline void ARIA_FO(word32 t[4]) {74SBL1_M(t[0],t[1],t[2],t[3]);75ARIA_MM(t[0],t[1],t[2],t[3]);76ARIA_P(t[0],t[1],t[2],t[3]);77ARIA_MM(t[0],t[1],t[2],t[3]);78}7980inline void ARIA_FE(word32 t[4]) {81SBL2_M(t[0],t[1],t[2],t[3]);82ARIA_MM(t[0],t[1],t[2],t[3]);83ARIA_P(t[2],t[3],t[0],t[1]);84ARIA_MM(t[0],t[1],t[2],t[3]);85}8687// n-bit right shift of Y XORed to X88template <unsigned int N>89inline void ARIA_GSRK(const word32 X[4], const word32 Y[4], word32 RK[4])90{91// MSVC is not generating a "rotate immediate". Constify to help it along.92static const unsigned int Q = 4-(N/32);93static const unsigned int R = N % 32;9495RK[0] = (X[0]) ^ ((Y[(Q )%4])>>R) ^ ((Y[(Q+3)%4])<<(32-R));96RK[1] = (X[1]) ^ ((Y[(Q+1)%4])>>R) ^ ((Y[(Q )%4])<<(32-R));97RK[2] = (X[2]) ^ ((Y[(Q+2)%4])>>R) ^ ((Y[(Q+1)%4])<<(32-R));98RK[3] = (X[3]) ^ ((Y[(Q+3)%4])>>R) ^ ((Y[(Q+2)%4])<<(32-R));99}100101void ARIA::Base::UncheckedSetKey(const byte *key, unsigned int keylen, const NameValuePairs ¶ms)102{103CRYPTOPP_UNUSED(params);104105m_rk.New(4*17); // round keys106m_w.New(4*24); // w0, w1, w2, w3, t and u107108int Q, q, R, r;109110switch (keylen)111{112case 16:113R = r = m_rounds = 12;114Q = q = 0;115break;116case 32:117R = r = m_rounds = 16;118Q = q = 2;119break;120case 24:121R = r = m_rounds = 14;122Q = q = 1;123break;124default:125Q = q = R = r = m_rounds = 0;126CRYPTOPP_ASSERT(0);127}128129// w0-w3 each has room for 4 words (16 bytes). t and u are each 4 words (16 bytes) temp areas.130// The storage requrements for w0-w3, t and u are 96 bytes or 24 words.131word32 *w0 = m_w.data(), *w1 = m_w.data()+4, *w2 = m_w.data()+8, *w3 = m_w.data()+12, *t = m_w.data()+16;132133GetBlock<word32, BigEndian, false>block(key);134block(w0[0])(w0[1])(w0[2])(w0[3]);135136t[0]=w0[0]^KRK[q][0]; t[1]=w0[1]^KRK[q][1];137t[2]=w0[2]^KRK[q][2]; t[3]=w0[3]^KRK[q][3];138139ARIA_FO(t);140141if (keylen == 32)142{143block(w1[0])(w1[1])(w1[2])(w1[3]);144}145else if (keylen == 24)146{147block(w1[0])(w1[1]); w1[2] = w1[3] = 0;148}149else150{151w1[0]=w1[1]=w1[2]=w1[3]=0;152}153154w1[0]^=t[0]; w1[1]^=t[1]; w1[2]^=t[2]; w1[3]^=t[3];155std::memcpy(t, w1, 16);156157q = (q==2) ? 0 : (q+1);158t[0]^=KRK[q][0]; t[1]^=KRK[q][1]; t[2]^=KRK[q][2]; t[3]^=KRK[q][3];159160ARIA_FE(t);161162t[0]^=w0[0]; t[1]^=w0[1]; t[2]^=w0[2]; t[3]^=w0[3];163std::memcpy(w2, t, 16);164165q = (q==2) ? 0 : (q+1);166t[0]^=KRK[q][0]; t[1]^=KRK[q][1]; t[2]^=KRK[q][2]; t[3]^=KRK[q][3];167168ARIA_FO(t);169170w3[0]=t[0]^w1[0]; w3[1]=t[1]^w1[1]; w3[2]=t[2]^w1[2]; w3[3]=t[3]^w1[3];171172ARIA_GSRK<19>(w0, w1, m_rk + 0);173ARIA_GSRK<19>(w1, w2, m_rk + 4);174ARIA_GSRK<19>(w2, w3, m_rk + 8);175ARIA_GSRK<19>(w3, w0, m_rk + 12);176ARIA_GSRK<31>(w0, w1, m_rk + 16);177ARIA_GSRK<31>(w1, w2, m_rk + 20);178ARIA_GSRK<31>(w2, w3, m_rk + 24);179ARIA_GSRK<31>(w3, w0, m_rk + 28);180ARIA_GSRK<67>(w0, w1, m_rk + 32);181ARIA_GSRK<67>(w1, w2, m_rk + 36);182ARIA_GSRK<67>(w2, w3, m_rk + 40);183ARIA_GSRK<67>(w3, w0, m_rk + 44);184ARIA_GSRK<97>(w0, w1, m_rk + 48);185186if (keylen > 16)187{188ARIA_GSRK<97>(w1, w2, m_rk + 52);189ARIA_GSRK<97>(w2, w3, m_rk + 56);190191if (keylen > 24)192{193ARIA_GSRK< 97>(w3, w0, m_rk + 60);194ARIA_GSRK<109>(w0, w1, m_rk + 64);195}196}197198// Decryption operation199if (!IsForwardTransformation())200{201word32 *a, *z, *s;202r = R; q = Q;203204// s reuses w0 temp area205a=m_rk.data(); s=m_w.data()+0; z=a+r*4;206std::memcpy(t, a, 16); std::memcpy(a, z, 16); std::memcpy(z, t, 16);207208a+=4; z-=4;209for (; a<z; a+=4, z-=4)210{211ARIA_M(a[0],t[0]); ARIA_M(a[1],t[1]); ARIA_M(a[2],t[2]); ARIA_M(a[3],t[3]);212ARIA_MM(t[0],t[1],t[2],t[3]); ARIA_P(t[0],t[1],t[2],t[3]); ARIA_MM(t[0],t[1],t[2],t[3]);213std::memcpy(s, t, 16);214215ARIA_M(z[0],t[0]); ARIA_M(z[1],t[1]); ARIA_M(z[2],t[2]); ARIA_M(z[3],t[3]);216ARIA_MM(t[0],t[1],t[2],t[3]); ARIA_P(t[0],t[1],t[2],t[3]); ARIA_MM(t[0],t[1],t[2],t[3]);217std::memcpy(a, t, 16); std::memcpy(z, s, 16);218}219220ARIA_M(a[0],t[0]); ARIA_M(a[1],t[1]); ARIA_M(a[2],t[2]); ARIA_M(a[3],t[3]);221ARIA_MM(t[0],t[1],t[2],t[3]); ARIA_P(t[0],t[1],t[2],t[3]); ARIA_MM(t[0],t[1],t[2],t[3]);222std::memcpy(z, t, 16);223}224225// Silence warnings226CRYPTOPP_UNUSED(Q); CRYPTOPP_UNUSED(R);227CRYPTOPP_UNUSED(q); CRYPTOPP_UNUSED(r);228}229230void ARIA::Base::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const231{232const byte *rk = reinterpret_cast<const byte*>(m_rk.data());233word32 *t = const_cast<word32*>(m_w.data()+16);234235// Timing attack countermeasure. See comments in Rijndael for more details.236// We used Yun's 32-bit implementation, so we use words rather than bytes.237const int cacheLineSize = GetCacheLineSize();238unsigned int i;239volatile word32 _u = 0;240word32 u = _u;241242for (i=0; i<COUNTOF(S1); i+=cacheLineSize/(sizeof(S1[0])))243u |= *(S1+i);244t[0] |= u;245246GetBlock<word32, BigEndian>block(inBlock);247block(t[0])(t[1])(t[2])(t[3]);248249if (m_rounds > 12) {250rk = ARIA_KXL(rk, t); ARIA_FO(t);251rk = ARIA_KXL(rk, t); ARIA_FE(t);252}253254if (m_rounds > 14) {255rk = ARIA_KXL(rk, t); ARIA_FO(t);256rk = ARIA_KXL(rk, t); ARIA_FE(t);257}258259rk = ARIA_KXL(rk, t); ARIA_FO(t); rk = ARIA_KXL(rk, t); ARIA_FE(t);260rk = ARIA_KXL(rk, t); ARIA_FO(t); rk = ARIA_KXL(rk, t); ARIA_FE(t);261rk = ARIA_KXL(rk, t); ARIA_FO(t); rk = ARIA_KXL(rk, t); ARIA_FE(t);262rk = ARIA_KXL(rk, t); ARIA_FO(t); rk = ARIA_KXL(rk, t); ARIA_FE(t);263rk = ARIA_KXL(rk, t); ARIA_FO(t); rk = ARIA_KXL(rk, t); ARIA_FE(t);264rk = ARIA_KXL(rk, t); ARIA_FO(t); rk = ARIA_KXL(rk, t);265266#if (CRYPTOPP_LITTLE_ENDIAN)267if (xorBlock)268{269outBlock[ 0] = static_cast<byte>(X1[ARIA_BRF(t[0],3)] ) ^ rk[ 3] ^ xorBlock[ 0];270outBlock[ 1] = static_cast<byte>(X2[ARIA_BRF(t[0],2)]>>8) ^ rk[ 2] ^ xorBlock[ 1];271outBlock[ 2] = static_cast<byte>(S1[ARIA_BRF(t[0],1)] ) ^ rk[ 1] ^ xorBlock[ 2];272outBlock[ 3] = static_cast<byte>(S2[ARIA_BRF(t[0],0)] ) ^ rk[ 0] ^ xorBlock[ 3];273outBlock[ 4] = static_cast<byte>(X1[ARIA_BRF(t[1],3)] ) ^ rk[ 7] ^ xorBlock[ 4];274outBlock[ 5] = static_cast<byte>(X2[ARIA_BRF(t[1],2)]>>8) ^ rk[ 6] ^ xorBlock[ 5];275outBlock[ 6] = static_cast<byte>(S1[ARIA_BRF(t[1],1)] ) ^ rk[ 5] ^ xorBlock[ 6];276outBlock[ 7] = static_cast<byte>(S2[ARIA_BRF(t[1],0)] ) ^ rk[ 4] ^ xorBlock[ 7];277outBlock[ 8] = static_cast<byte>(X1[ARIA_BRF(t[2],3)] ) ^ rk[11] ^ xorBlock[ 8];278outBlock[ 9] = static_cast<byte>(X2[ARIA_BRF(t[2],2)]>>8) ^ rk[10] ^ xorBlock[ 9];279outBlock[10] = static_cast<byte>(S1[ARIA_BRF(t[2],1)] ) ^ rk[ 9] ^ xorBlock[10];280outBlock[11] = static_cast<byte>(S2[ARIA_BRF(t[2],0)] ) ^ rk[ 8] ^ xorBlock[11];281outBlock[12] = static_cast<byte>(X1[ARIA_BRF(t[3],3)] ) ^ rk[15] ^ xorBlock[12];282outBlock[13] = static_cast<byte>(X2[ARIA_BRF(t[3],2)]>>8) ^ rk[14] ^ xorBlock[13];283outBlock[14] = static_cast<byte>(S1[ARIA_BRF(t[3],1)] ) ^ rk[13] ^ xorBlock[14];284outBlock[15] = static_cast<byte>(S2[ARIA_BRF(t[3],0)] ) ^ rk[12] ^ xorBlock[15];285}286else287{288outBlock[ 0] = static_cast<byte>(X1[ARIA_BRF(t[0],3)] ) ^ rk[ 3];289outBlock[ 1] = static_cast<byte>(X2[ARIA_BRF(t[0],2)]>>8) ^ rk[ 2];290outBlock[ 2] = static_cast<byte>(S1[ARIA_BRF(t[0],1)] ) ^ rk[ 1];291outBlock[ 3] = static_cast<byte>(S2[ARIA_BRF(t[0],0)] ) ^ rk[ 0];292outBlock[ 4] = static_cast<byte>(X1[ARIA_BRF(t[1],3)] ) ^ rk[ 7];293outBlock[ 5] = static_cast<byte>(X2[ARIA_BRF(t[1],2)]>>8) ^ rk[ 6];294outBlock[ 6] = static_cast<byte>(S1[ARIA_BRF(t[1],1)] ) ^ rk[ 5];295outBlock[ 7] = static_cast<byte>(S2[ARIA_BRF(t[1],0)] ) ^ rk[ 4];296outBlock[ 8] = static_cast<byte>(X1[ARIA_BRF(t[2],3)] ) ^ rk[11];297outBlock[ 9] = static_cast<byte>(X2[ARIA_BRF(t[2],2)]>>8) ^ rk[10];298outBlock[10] = static_cast<byte>(S1[ARIA_BRF(t[2],1)] ) ^ rk[ 9];299outBlock[11] = static_cast<byte>(S2[ARIA_BRF(t[2],0)] ) ^ rk[ 8];300outBlock[12] = static_cast<byte>(X1[ARIA_BRF(t[3],3)] ) ^ rk[15];301outBlock[13] = static_cast<byte>(X2[ARIA_BRF(t[3],2)]>>8) ^ rk[14];302outBlock[14] = static_cast<byte>(S1[ARIA_BRF(t[3],1)] ) ^ rk[13];303outBlock[15] = static_cast<byte>(S2[ARIA_BRF(t[3],0)] ) ^ rk[12];304}305#else306if (xorBlock)307{308outBlock[ 0] = static_cast<byte>(X1[ARIA_BRF(t[0],3)] ) ^ rk[ 0] ^ xorBlock[ 0];309outBlock[ 1] = static_cast<byte>(X2[ARIA_BRF(t[0],2)]>>8) ^ rk[ 1] ^ xorBlock[ 1];310outBlock[ 2] = static_cast<byte>(S1[ARIA_BRF(t[0],1)] ) ^ rk[ 2] ^ xorBlock[ 2];311outBlock[ 3] = static_cast<byte>(S2[ARIA_BRF(t[0],0)] ) ^ rk[ 3] ^ xorBlock[ 3];312outBlock[ 4] = static_cast<byte>(X1[ARIA_BRF(t[1],3)] ) ^ rk[ 4] ^ xorBlock[ 4];313outBlock[ 5] = static_cast<byte>(X2[ARIA_BRF(t[1],2)]>>8) ^ rk[ 5] ^ xorBlock[ 5];314outBlock[ 6] = static_cast<byte>(S1[ARIA_BRF(t[1],1)] ) ^ rk[ 6] ^ xorBlock[ 6];315outBlock[ 7] = static_cast<byte>(S2[ARIA_BRF(t[1],0)] ) ^ rk[ 7] ^ xorBlock[ 7];316outBlock[ 8] = static_cast<byte>(X1[ARIA_BRF(t[2],3)] ) ^ rk[ 8] ^ xorBlock[ 8];317outBlock[ 9] = static_cast<byte>(X2[ARIA_BRF(t[2],2)]>>8) ^ rk[ 9] ^ xorBlock[ 9];318outBlock[10] = static_cast<byte>(S1[ARIA_BRF(t[2],1)] ) ^ rk[10] ^ xorBlock[10];319outBlock[11] = static_cast<byte>(S2[ARIA_BRF(t[2],0)] ) ^ rk[11] ^ xorBlock[11];320outBlock[12] = static_cast<byte>(X1[ARIA_BRF(t[3],3)] ) ^ rk[12] ^ xorBlock[12];321outBlock[13] = static_cast<byte>(X2[ARIA_BRF(t[3],2)]>>8) ^ rk[13] ^ xorBlock[13];322outBlock[14] = static_cast<byte>(S1[ARIA_BRF(t[3],1)] ) ^ rk[14] ^ xorBlock[14];323outBlock[15] = static_cast<byte>(S2[ARIA_BRF(t[3],0)] ) ^ rk[15] ^ xorBlock[15];324}325else326{327outBlock[ 0] = static_cast<byte>(X1[ARIA_BRF(t[0],3)] ) ^ rk[ 0];328outBlock[ 1] = static_cast<byte>(X2[ARIA_BRF(t[0],2)]>>8) ^ rk[ 1];329outBlock[ 2] = static_cast<byte>(S1[ARIA_BRF(t[0],1)] ) ^ rk[ 2];330outBlock[ 3] = static_cast<byte>(S2[ARIA_BRF(t[0],0)] ) ^ rk[ 3];331outBlock[ 4] = static_cast<byte>(X1[ARIA_BRF(t[1],3)] ) ^ rk[ 4];332outBlock[ 5] = static_cast<byte>(X2[ARIA_BRF(t[1],2)]>>8) ^ rk[ 5];333outBlock[ 6] = static_cast<byte>(S1[ARIA_BRF(t[1],1)] ) ^ rk[ 6];334outBlock[ 7] = static_cast<byte>(S2[ARIA_BRF(t[1],0)] ) ^ rk[ 7];335outBlock[ 8] = static_cast<byte>(X1[ARIA_BRF(t[2],3)] ) ^ rk[ 8];336outBlock[ 9] = static_cast<byte>(X2[ARIA_BRF(t[2],2)]>>8) ^ rk[ 9];337outBlock[10] = static_cast<byte>(S1[ARIA_BRF(t[2],1)] ) ^ rk[10];338outBlock[11] = static_cast<byte>(S2[ARIA_BRF(t[2],0)] ) ^ rk[11];339outBlock[12] = static_cast<byte>(X1[ARIA_BRF(t[3],3)] ) ^ rk[12];340outBlock[13] = static_cast<byte>(X2[ARIA_BRF(t[3],2)]>>8) ^ rk[13];341outBlock[14] = static_cast<byte>(S1[ARIA_BRF(t[3],1)] ) ^ rk[14];342outBlock[15] = static_cast<byte>(S2[ARIA_BRF(t[3],0)] ) ^ rk[15];343}344#endif // CRYPTOPP_LITTLE_ENDIAN345}346347NAMESPACE_END348349350