10 #if CRYPTOPP_SSE2_INTRIN_AVAILABLE 11 # define CRYPTOPP_ENABLE_ARIA_SSE2_INTRINSICS 1 14 #if CRYPTOPP_SSSE3_AVAILABLE 15 # define CRYPTOPP_ENABLE_ARIA_SSSE3_INTRINSICS 1 19 #define UINT32_CAST(x) ((uint32_t *)(void *)(x)) 20 #define CONST_UINT32_CAST(x) ((const uint32_t *)(const void *)(x)) 23 NAMESPACE_BEGIN(ARIATab)
25 extern const word32 S1[256];
26 extern const word32 S2[256];
27 extern const word32 X1[256];
28 extern const word32 X2[256];
29 extern const word32 KRK[3][4];
36 using CryptoPP::ARIATab::S1;
37 using CryptoPP::ARIATab::S2;
38 using CryptoPP::ARIATab::X1;
39 using CryptoPP::ARIATab::X2;
40 using CryptoPP::ARIATab::KRK;
45 inline byte ARIA_BRF(
const word32 x,
const int y) {
51 NativeEndianBlock::Put(rk, t)(t[0])(t[1])(t[2])(t[3]); \ 55 #define SBL1_M(T0,T1,T2,T3) { \ 56 T0=S1[ARIA_BRF(T0,3)]^S2[ARIA_BRF(T0,2)]^X1[ARIA_BRF(T0,1)]^X2[ARIA_BRF(T0,0)]; \ 57 T1=S1[ARIA_BRF(T1,3)]^S2[ARIA_BRF(T1,2)]^X1[ARIA_BRF(T1,1)]^X2[ARIA_BRF(T1,0)]; \ 58 T2=S1[ARIA_BRF(T2,3)]^S2[ARIA_BRF(T2,2)]^X1[ARIA_BRF(T2,1)]^X2[ARIA_BRF(T2,0)]; \ 59 T3=S1[ARIA_BRF(T3,3)]^S2[ARIA_BRF(T3,2)]^X1[ARIA_BRF(T3,1)]^X2[ARIA_BRF(T3,0)]; \ 63 #define SBL2_M(T0,T1,T2,T3) { \ 64 T0=X1[ARIA_BRF(T0,3)]^X2[ARIA_BRF(T0,2)]^S1[ARIA_BRF(T0,1)]^S2[ARIA_BRF(T0,0)]; \ 65 T1=X1[ARIA_BRF(T1,3)]^X2[ARIA_BRF(T1,2)]^S1[ARIA_BRF(T1,1)]^S2[ARIA_BRF(T1,0)]; \ 66 T2=X1[ARIA_BRF(T2,3)]^X2[ARIA_BRF(T2,2)]^S1[ARIA_BRF(T2,1)]^S2[ARIA_BRF(T2,0)]; \ 67 T3=X1[ARIA_BRF(T3,3)]^X2[ARIA_BRF(T3,2)]^S1[ARIA_BRF(T3,1)]^S2[ARIA_BRF(T3,0)]; \ 70 #define ARIA_P(T0,T1,T2,T3) { \ 71 (T1) = (((T1)<< 8)&0xff00ff00) ^ (((T1)>> 8)&0x00ff00ff); \ 72 (T2) = rotrConstant<16>(T2); \ 73 (T3) = ByteReverse((T3)); \ 76 #define ARIA_M(X,Y) { \ 77 Y=(X)<<8 ^ (X)>>8 ^ (X)<<16 ^ (X)>>16 ^ (X)<<24 ^ (X)>>24; \ 80 #define ARIA_MM(T0,T1,T2,T3) { \ 81 (T1)^=(T2); (T2)^=(T3); (T0)^=(T1); \ 82 (T3)^=(T1); (T2)^=(T0); (T1)^=(T2); \ 85 #define ARIA_FO {SBL1_M(t[0],t[1],t[2],t[3]) ARIA_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])} 86 #define ARIA_FE {SBL2_M(t[0],t[1],t[2],t[3]) ARIA_MM(t[0],t[1],t[2],t[3]) ARIA_P(t[2],t[3],t[0],t[1]) ARIA_MM(t[0],t[1],t[2],t[3])} 88 #if (CRYPTOPP_ARM_NEON_AVAILABLE) 89 extern void ARIA_UncheckedSetKey_Schedule_NEON(byte* rk, word32* ws,
unsigned int keylen);
90 extern void ARIA_ProcessAndXorBlock_Xor_NEON(
const byte* xorBlock, byte* outblock);
93 #if (CRYPTOPP_SSSE3_AVAILABLE) 94 extern void ARIA_ProcessAndXorBlock_Xor_SSSE3(
const byte* xorBlock, byte* outBlock,
const byte *rk, word32 *t);
98 template <
unsigned int N>
99 inline void ARIA_GSRK(
const word32 X[4],
const word32 Y[4], byte RK[16])
102 static const unsigned int Q = 4-(N/32);
103 static const unsigned int R = N % 32;
104 UINT32_CAST(RK)[0] = (X[0]) ^ ((Y[(Q )%4])>>R) ^ ((Y[(Q+3)%4])<<(32-R));
105 UINT32_CAST(RK)[1] = (X[1]) ^ ((Y[(Q+1)%4])>>R) ^ ((Y[(Q )%4])<<(32-R));
106 UINT32_CAST(RK)[2] = (X[2]) ^ ((Y[(Q+2)%4])>>R) ^ ((Y[(Q+1)%4])<<(32-R));
107 UINT32_CAST(RK)[3] = (X[3]) ^ ((Y[(Q+3)%4])>>R) ^ ((Y[(Q+2)%4])<<(32-R));
110 void ARIA::Base::UncheckedSetKey(
const byte *key,
unsigned int keylen,
const NameValuePairs ¶ms)
112 CRYPTOPP_UNUSED(params);
117 const byte *mk = key;
118 byte *rk = m_rk.
data();
124 R = r = m_rounds = 12;
128 R = r = m_rounds = 16;
132 R = r = m_rounds = 14;
136 Q = q = R = r = m_rounds = 0;
141 word32 *w0 = m_w.
data(), *w1 = m_w.
data()+8, *w2 = m_w.
data()+12, *w3 = m_w.
data()+16, *t = m_w.
data()+20;
143 BigEndianBlock::Get(mk)(w0[0])(w0[1])(w0[2])(w0[3]);
144 t[0]=w0[0]^KRK[q][0]; t[1]=w0[1]^KRK[q][1];
145 t[2]=w0[2]^KRK[q][2]; t[3]=w0[3]^KRK[q][3];
151 BigEndianBlock::Get(mk+16)(w1[0])(w1[1])(w1[2])(w1[3]);
153 else if (keylen == 24)
155 BigEndianBlock::Get(mk+16)(w1[0])(w1[1]);
160 w1[0]=w1[1]=w1[2]=w1[3]=0;
163 w1[0]^=t[0]; w1[1]^=t[1]; w1[2]^=t[2]; w1[3]^=t[3];
166 q = (q==2) ? 0 : (q+1);
167 t[0]^=KRK[q][0]; t[1]^=KRK[q][1]; t[2]^=KRK[q][2]; t[3]^=KRK[q][3];
171 t[0]^=w0[0]; t[1]^=w0[1]; t[2]^=w0[2]; t[3]^=w0[3];
174 q = (q==2) ? 0 : (q+1);
175 t[0]^=KRK[q][0]; t[1]^=KRK[q][1]; t[2]^=KRK[q][2]; t[3]^=KRK[q][3];
179 w3[0]=t[0]^w1[0]; w3[1]=t[1]^w1[1]; w3[2]=t[2]^w1[2]; w3[3]=t[3]^w1[3];
181 #if CRYPTOPP_ARM_NEON_AVAILABLE 184 ARIA_UncheckedSetKey_Schedule_NEON(rk, m_w, keylen);
187 #endif // CRYPTOPP_ARM_NEON_AVAILABLE 189 ARIA_GSRK<19>(w0, w1, rk + 0);
190 ARIA_GSRK<19>(w1, w2, rk + 16);
191 ARIA_GSRK<19>(w2, w3, rk + 32);
192 ARIA_GSRK<19>(w3, w0, rk + 48);
193 ARIA_GSRK<31>(w0, w1, rk + 64);
194 ARIA_GSRK<31>(w1, w2, rk + 80);
195 ARIA_GSRK<31>(w2, w3, rk + 96);
196 ARIA_GSRK<31>(w3, w0, rk + 112);
197 ARIA_GSRK<67>(w0, w1, rk + 128);
198 ARIA_GSRK<67>(w1, w2, rk + 144);
199 ARIA_GSRK<67>(w2, w3, rk + 160);
200 ARIA_GSRK<67>(w3, w0, rk + 176);
201 ARIA_GSRK<97>(w0, w1, rk + 192);
205 ARIA_GSRK<97>(w1, w2, rk + 208);
206 ARIA_GSRK<97>(w2, w3, rk + 224);
210 ARIA_GSRK< 97>(w3, w0, rk + 240);
211 ARIA_GSRK<109>(w0, w1, rk + 256);
217 if (!IsForwardTransformation())
223 a=UINT32_CAST(rk); s=m_w.
data()+24; z=a+r*4;
224 ::memcpy(t, a, 16); ::memcpy(a, z, 16); ::memcpy(z, t, 16);
227 for (; a<z; a+=4, z-=4)
229 ARIA_M(a[0],t[0]); ARIA_M(a[1],t[1]); ARIA_M(a[2],t[2]); ARIA_M(a[3],t[3]);
230 ARIA_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]);
233 ARIA_M(z[0],t[0]); ARIA_M(z[1],t[1]); ARIA_M(z[2],t[2]); ARIA_M(z[3],t[3]);
234 ARIA_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]);
235 ::memcpy(a, t, 16); ::memcpy(z, s, 16);
238 ARIA_M(a[0],t[0]); ARIA_M(a[1],t[1]); ARIA_M(a[2],t[2]); ARIA_M(a[3],t[3]);
239 ARIA_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]);
244 CRYPTOPP_UNUSED(Q); CRYPTOPP_UNUSED(R);
245 CRYPTOPP_UNUSED(q); CRYPTOPP_UNUSED(r);
248 void ARIA::Base::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const 250 const byte *rk =
reinterpret_cast<const byte*
>(m_rk.data());
251 word32 *t =
const_cast<word32*
>(m_w.data()+20);
257 volatile word32 _u = 0;
260 for (i=0; i<
COUNTOF(S1); i+=cacheLineSize/(
sizeof(S1[0])))
264 BigEndianBlock::Get(inBlock)(t[0])(t[1])(t[2])(t[3]);
267 ARIA_KXL; rk+= 16; ARIA_FO;
268 ARIA_KXL; rk+= 16; ARIA_FE;
272 ARIA_KXL; rk+= 16; ARIA_FO;
273 ARIA_KXL; rk+= 16; ARIA_FE;
276 ARIA_KXL; rk+= 16; ARIA_FO; ARIA_KXL; rk+= 16; ARIA_FE;
277 ARIA_KXL; rk+= 16; ARIA_FO; ARIA_KXL; rk+= 16; ARIA_FE;
278 ARIA_KXL; rk+= 16; ARIA_FO; ARIA_KXL; rk+= 16; ARIA_FE;
279 ARIA_KXL; rk+= 16; ARIA_FO; ARIA_KXL; rk+= 16; ARIA_FE;
280 ARIA_KXL; rk+= 16; ARIA_FO; ARIA_KXL; rk+= 16; ARIA_FE;
281 ARIA_KXL; rk+= 16; ARIA_FO; ARIA_KXL; rk+= 16;
283 #ifdef CRYPTOPP_LITTLE_ENDIAN 284 # if CRYPTOPP_ENABLE_ARIA_SSSE3_INTRINSICS 287 ARIA_ProcessAndXorBlock_Xor_SSSE3(xorBlock, outBlock, rk, t);
291 # endif // CRYPTOPP_ENABLE_ARIA_SSSE3_INTRINSICS 293 outBlock[ 0] = (byte)(X1[ARIA_BRF(t[0],3)] ) ^ rk[ 3];
294 outBlock[ 1] = (byte)(X2[ARIA_BRF(t[0],2)]>>8) ^ rk[ 2];
295 outBlock[ 2] = (byte)(S1[ARIA_BRF(t[0],1)] ) ^ rk[ 1];
296 outBlock[ 3] = (byte)(S2[ARIA_BRF(t[0],0)] ) ^ rk[ 0];
297 outBlock[ 4] = (byte)(X1[ARIA_BRF(t[1],3)] ) ^ rk[ 7];
298 outBlock[ 5] = (byte)(X2[ARIA_BRF(t[1],2)]>>8) ^ rk[ 6];
299 outBlock[ 6] = (byte)(S1[ARIA_BRF(t[1],1)] ) ^ rk[ 5];
300 outBlock[ 7] = (byte)(S2[ARIA_BRF(t[1],0)] ) ^ rk[ 4];
301 outBlock[ 8] = (byte)(X1[ARIA_BRF(t[2],3)] ) ^ rk[11];
302 outBlock[ 9] = (byte)(X2[ARIA_BRF(t[2],2)]>>8) ^ rk[10];
303 outBlock[10] = (byte)(S1[ARIA_BRF(t[2],1)] ) ^ rk[ 9];
304 outBlock[11] = (byte)(S2[ARIA_BRF(t[2],0)] ) ^ rk[ 8];
305 outBlock[12] = (byte)(X1[ARIA_BRF(t[3],3)] ) ^ rk[15];
306 outBlock[13] = (byte)(X2[ARIA_BRF(t[3],2)]>>8) ^ rk[14];
307 outBlock[14] = (byte)(S1[ARIA_BRF(t[3],1)] ) ^ rk[13];
308 outBlock[15] = (byte)(S2[ARIA_BRF(t[3],0)] ) ^ rk[12];
311 outBlock[ 0] = (byte)(X1[ARIA_BRF(t[0],3)] );
312 outBlock[ 1] = (byte)(X2[ARIA_BRF(t[0],2)]>>8);
313 outBlock[ 2] = (byte)(S1[ARIA_BRF(t[0],1)] );
314 outBlock[ 3] = (byte)(S2[ARIA_BRF(t[0],0)] );
315 outBlock[ 4] = (byte)(X1[ARIA_BRF(t[1],3)] );
316 outBlock[ 5] = (byte)(X2[ARIA_BRF(t[1],2)]>>8);
317 outBlock[ 6] = (byte)(S1[ARIA_BRF(t[1],1)] );
318 outBlock[ 7] = (byte)(S2[ARIA_BRF(t[1],0)] );
319 outBlock[ 8] = (byte)(X1[ARIA_BRF(t[2],3)] );
320 outBlock[ 9] = (byte)(X2[ARIA_BRF(t[2],2)]>>8);
321 outBlock[10] = (byte)(S1[ARIA_BRF(t[2],1)] );
322 outBlock[11] = (byte)(S2[ARIA_BRF(t[2],0)] );
323 outBlock[12] = (byte)(X1[ARIA_BRF(t[3],3)] );
324 outBlock[13] = (byte)(X2[ARIA_BRF(t[3],2)]>>8);
325 outBlock[14] = (byte)(S1[ARIA_BRF(t[3],1)] );
326 outBlock[15] = (byte)(S2[ARIA_BRF(t[3],0)] );
328 t = UINT32_CAST(outBlock);
330 #endif // CRYPTOPP_LITTLE_ENDIAN 332 #if CRYPTOPP_ARM_NEON_AVAILABLE 335 if (xorBlock != NULLPTR)
336 ARIA_ProcessAndXorBlock_Xor_NEON(xorBlock, outBlock);
339 #endif // CRYPTOPP_ARM_NEON_AVAILABLE 341 if (xorBlock != NULLPTR)
343 outBlock[n] ^= xorBlock[n];
Utility functions for the Crypto++ library.
bool HasSSSE3()
Determines SSSE3 availability.
Library configuration file.
int GetCacheLineSize()
Provides the cache line size.
void New(size_type newSize)
Change size without preserving contents.
Access a block of memory.
A::pointer data()
Provides a pointer to the first element in the memory block.
#define COUNTOF(arr)
Counts elements in an array.
Classes for the ARIA block cipher.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
Functions for CPU features and intrinsics.
Access a block of memory.
Crypto++ library namespace.
static const int BLOCKSIZE
The block size of the algorithm provided as a constant.
bool HasNEON()
Determine if an ARM processor has Advanced SIMD available.
Interface for retrieving values given their names.