10 #ifndef CRYPTOPP_INLINE 11 # if defined(CRYPTOPP_DEBUG) 12 # define CRYPTOPP_INLINE static 14 # define CRYPTOPP_INLINE inline 24 ANONYMOUS_NAMESPACE_BEGIN
26 using CryptoPP::word32;
27 using CryptoPP::word64;
39 CRYPTOPP_INLINE
void TF83(W& x, W& y,
const W k)
41 x = rotrConstant<8>(x);
43 y = rotlConstant<3>(y);
55 CRYPTOPP_INLINE
void TR83(W& x, W& y,
const W k)
58 y = rotrConstant<3>(y);
60 x = rotlConstant<8>(x);
69 template <
class W,
unsigned int R>
70 CRYPTOPP_INLINE
void SPECK_Encrypt(W c[2],
const W p[2],
const W k[R])
75 for (
int i = 0; i < static_cast<int>(R); ++i)
76 TF83(c[0], c[1], k[i]);
85 template <
class W,
unsigned int R>
86 CRYPTOPP_INLINE
void SPECK_Decrypt(W p[2],
const W c[2],
const W k[R])
91 for (
int i = static_cast<int>(R-1); i >= 0; --i)
92 TR83(p[0], p[1], k[i]);
101 template <
class W,
unsigned int R>
102 CRYPTOPP_INLINE
void SPECK_ExpandKey_2W(W key[R],
const W k[2])
105 W i=0, B=k[0], A=k[1];
109 key[i]=A; TF83(B, A, i);
121 template <
class W,
unsigned int R>
122 CRYPTOPP_INLINE
void SPECK_ExpandKey_3W(W key[R],
const W k[3])
125 W i=0, C=k[0], B=k[1], A=k[2];
127 unsigned int blocks = R/2;
130 key[i+0]=A; TF83(B, A, i+0);
131 key[i+1]=A; TF83(C, A, i+1);
148 template <
class W,
unsigned int R>
149 CRYPTOPP_INLINE
void SPECK_ExpandKey_4W(W key[R],
const W k[4])
152 W i=0, D=k[0], C=k[1], B=k[2], A=k[3];
154 unsigned int blocks = R/3;
157 key[i+0]=A; TF83(B, A, i+0);
158 key[i+1]=A; TF83(C, A, i+1);
159 key[i+2]=A; TF83(D, A, i+2);
170 key[R-2]=A; TF83(B, A, W(R-2));
175 ANONYMOUS_NAMESPACE_END
181 #if (CRYPTOPP_ARM_NEON_AVAILABLE) 182 extern size_t SPECK64_Enc_AdvancedProcessBlocks_NEON(
const word32* subKeys,
size_t rounds,
183 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
185 extern size_t SPECK64_Dec_AdvancedProcessBlocks_NEON(
const word32* subKeys,
size_t rounds,
186 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
188 extern size_t SPECK128_Enc_AdvancedProcessBlocks_NEON(
const word64* subKeys,
size_t rounds,
189 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
191 extern size_t SPECK128_Dec_AdvancedProcessBlocks_NEON(
const word64* subKeys,
size_t rounds,
192 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
195 #if defined(CRYPTOPP_SSE41_AVAILABLE) 196 extern size_t SPECK64_Enc_AdvancedProcessBlocks_SSE41(
const word32* subKeys,
size_t rounds,
197 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
199 extern size_t SPECK64_Dec_AdvancedProcessBlocks_SSE41(
const word32* subKeys,
size_t rounds,
200 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
203 #if defined(CRYPTOPP_SSSE3_AVAILABLE) 204 extern size_t SPECK128_Enc_AdvancedProcessBlocks_SSSE3(
const word64* subKeys,
size_t rounds,
205 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
207 extern size_t SPECK128_Dec_AdvancedProcessBlocks_SSSE3(
const word64* subKeys,
size_t rounds,
208 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
211 #if defined(CRYPTOPP_ALTIVEC_AVAILABLE) 212 extern size_t SPECK64_Enc_AdvancedProcessBlocks_ALTIVEC(
const word32* subKeys,
size_t rounds,
213 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
215 extern size_t SPECK64_Dec_AdvancedProcessBlocks_ALTIVEC(
const word32* subKeys,
size_t rounds,
216 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
219 #if defined(CRYPTOPP_POWER8_AVAILABLE) 220 extern size_t SPECK128_Enc_AdvancedProcessBlocks_POWER8(
const word64* subKeys,
size_t rounds,
221 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
223 extern size_t SPECK128_Dec_AdvancedProcessBlocks_POWER8(
const word64* subKeys,
size_t rounds,
224 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
227 std::string SPECK64::Base::AlgorithmProvider()
const 229 #if (CRYPTOPP_SPECK64_ADVANCED_PROCESS_BLOCKS) 230 # if (CRYPTOPP_SSE41_AVAILABLE) 234 # if (CRYPTOPP_ARM_NEON_AVAILABLE) 238 # if (CRYPTOPP_POWER8_AVAILABLE) 242 # if (CRYPTOPP_ALTIVEC_AVAILABLE) 250 void SPECK64::Base::UncheckedSetKey(
const byte *userKey,
unsigned int keyLength,
const NameValuePairs ¶ms)
253 CRYPTOPP_UNUSED(params);
257 m_kwords = keyLength/
sizeof(word32);
262 KeyBlock kblk(userKey);
267 m_rkeys.New((m_rounds = 26));
268 kblk(m_wspace[2])(m_wspace[1])(m_wspace[0]);
269 SPECK_ExpandKey_3W<word32, 26>(m_rkeys, m_wspace);
272 m_rkeys.New((m_rounds = 27));
273 kblk(m_wspace[3])(m_wspace[2])(m_wspace[1])(m_wspace[0]);
274 SPECK_ExpandKey_4W<word32, 27>(m_rkeys, m_wspace);
282 #if CRYPTOPP_ALTIVEC_AVAILABLE 283 m_rkeys.Grow(m_rkeys.size()+4);
287 void SPECK64::Enc::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const 291 InBlock iblk(inBlock); iblk(m_wspace[1])(m_wspace[0]);
296 SPECK_Encrypt<word32, 26>(m_wspace+2, m_wspace+0, m_rkeys);
299 SPECK_Encrypt<word32, 27>(m_wspace+2, m_wspace+0, m_rkeys);
307 OutBlock oblk(xorBlock, outBlock); oblk(m_wspace[3])(m_wspace[2]);
310 void SPECK64::Dec::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const 314 InBlock iblk(inBlock); iblk(m_wspace[1])(m_wspace[0]);
319 SPECK_Decrypt<word32, 26>(m_wspace+2, m_wspace+0, m_rkeys);
322 SPECK_Decrypt<word32, 27>(m_wspace+2, m_wspace+0, m_rkeys);
330 OutBlock oblk(xorBlock, outBlock); oblk(m_wspace[3])(m_wspace[2]);
335 std::string SPECK128::Base::AlgorithmProvider()
const 337 #if (CRYPTOPP_SPECK128_ADVANCED_PROCESS_BLOCKS) 338 # if (CRYPTOPP_SSSE3_AVAILABLE) 342 # if (CRYPTOPP_ARM_NEON_AVAILABLE) 346 # if (CRYPTOPP_POWER8_AVAILABLE) 354 void SPECK128::Base::UncheckedSetKey(
const byte *userKey,
unsigned int keyLength,
const NameValuePairs ¶ms)
356 CRYPTOPP_ASSERT(keyLength == 16 || keyLength == 24 || keyLength == 32);
357 CRYPTOPP_UNUSED(params);
361 m_kwords = keyLength/
sizeof(word64);
366 KeyBlock kblk(userKey);
371 m_rkeys.New((m_rounds = 32));
372 kblk(m_wspace[1])(m_wspace[0]);
373 SPECK_ExpandKey_2W<word64, 32>(m_rkeys, m_wspace);
376 m_rkeys.New((m_rounds = 33));
377 kblk(m_wspace[2])(m_wspace[1])(m_wspace[0]);
378 SPECK_ExpandKey_3W<word64, 33>(m_rkeys, m_wspace);
381 m_rkeys.New((m_rounds = 34));
382 kblk(m_wspace[3])(m_wspace[2])(m_wspace[1])(m_wspace[0]);
383 SPECK_ExpandKey_4W<word64, 34>(m_rkeys, m_wspace);
390 void SPECK128::Enc::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const 394 InBlock iblk(inBlock); iblk(m_wspace[1])(m_wspace[0]);
399 SPECK_Encrypt<word64, 32>(m_wspace+2, m_wspace+0, m_rkeys);
402 SPECK_Encrypt<word64, 33>(m_wspace+2, m_wspace+0, m_rkeys);
405 SPECK_Encrypt<word64, 34>(m_wspace+2, m_wspace+0, m_rkeys);
413 OutBlock oblk(xorBlock, outBlock); oblk(m_wspace[3])(m_wspace[2]);
416 void SPECK128::Dec::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const 420 InBlock iblk(inBlock); iblk(m_wspace[1])(m_wspace[0]);
425 SPECK_Decrypt<word64, 32>(m_wspace+2, m_wspace+0, m_rkeys);
428 SPECK_Decrypt<word64, 33>(m_wspace+2, m_wspace+0, m_rkeys);
431 SPECK_Decrypt<word64, 34>(m_wspace+2, m_wspace+0, m_rkeys);
439 OutBlock oblk(xorBlock, outBlock); oblk(m_wspace[3])(m_wspace[2]);
442 #if defined(CRYPTOPP_SPECK64_ADVANCED_PROCESS_BLOCKS) 443 size_t SPECK64::Enc::AdvancedProcessBlocks(
const byte *inBlocks,
const byte *xorBlocks,
444 byte *outBlocks,
size_t length, word32 flags)
const 446 #if defined(CRYPTOPP_SSE41_AVAILABLE) 448 return SPECK64_Enc_AdvancedProcessBlocks_SSE41(m_rkeys, (
size_t)m_rounds,
449 inBlocks, xorBlocks, outBlocks, length, flags);
451 #if (CRYPTOPP_ARM_NEON_AVAILABLE) 453 return SPECK64_Enc_AdvancedProcessBlocks_NEON(m_rkeys, (
size_t)m_rounds,
454 inBlocks, xorBlocks, outBlocks, length, flags);
456 #if (CRYPTOPP_ALTIVEC_AVAILABLE) 458 return SPECK64_Enc_AdvancedProcessBlocks_ALTIVEC(m_rkeys, (
size_t)m_rounds,
459 inBlocks, xorBlocks, outBlocks, length, flags);
464 size_t SPECK64::Dec::AdvancedProcessBlocks(
const byte *inBlocks,
const byte *xorBlocks,
465 byte *outBlocks,
size_t length, word32 flags)
const 467 #if defined(CRYPTOPP_SSE41_AVAILABLE) 469 return SPECK64_Dec_AdvancedProcessBlocks_SSE41(m_rkeys, (
size_t)m_rounds,
470 inBlocks, xorBlocks, outBlocks, length, flags);
472 #if (CRYPTOPP_ARM_NEON_AVAILABLE) 474 return SPECK64_Dec_AdvancedProcessBlocks_NEON(m_rkeys, (
size_t)m_rounds,
475 inBlocks, xorBlocks, outBlocks, length, flags);
477 #if (CRYPTOPP_ALTIVEC_AVAILABLE) 479 return SPECK64_Dec_AdvancedProcessBlocks_ALTIVEC(m_rkeys, (
size_t)m_rounds,
480 inBlocks, xorBlocks, outBlocks, length, flags);
484 #endif // CRYPTOPP_SPECK64_ADVANCED_PROCESS_BLOCKS 486 #if defined(CRYPTOPP_SPECK128_ADVANCED_PROCESS_BLOCKS) 487 size_t SPECK128::Enc::AdvancedProcessBlocks(
const byte *inBlocks,
const byte *xorBlocks,
488 byte *outBlocks,
size_t length, word32 flags)
const 490 #if defined(CRYPTOPP_SSSE3_AVAILABLE) 492 return SPECK128_Enc_AdvancedProcessBlocks_SSSE3(m_rkeys, (
size_t)m_rounds,
493 inBlocks, xorBlocks, outBlocks, length, flags);
495 #if (CRYPTOPP_ARM_NEON_AVAILABLE) 497 return SPECK128_Enc_AdvancedProcessBlocks_NEON(m_rkeys, (
size_t)m_rounds,
498 inBlocks, xorBlocks, outBlocks, length, flags);
500 #if (CRYPTOPP_POWER8_AVAILABLE) 502 return SPECK128_Enc_AdvancedProcessBlocks_POWER8(m_rkeys, (
size_t)m_rounds,
503 inBlocks, xorBlocks, outBlocks, length, flags);
508 size_t SPECK128::Dec::AdvancedProcessBlocks(
const byte *inBlocks,
const byte *xorBlocks,
509 byte *outBlocks,
size_t length, word32 flags)
const 511 #if defined(CRYPTOPP_SSSE3_AVAILABLE) 513 return SPECK128_Dec_AdvancedProcessBlocks_SSSE3(m_rkeys, (
size_t)m_rounds,
514 inBlocks, xorBlocks, outBlocks, length, flags);
516 #if (CRYPTOPP_ARM_NEON_AVAILABLE) 518 return SPECK128_Dec_AdvancedProcessBlocks_NEON(m_rkeys, (
size_t)m_rounds,
519 inBlocks, xorBlocks, outBlocks, length, flags);
521 #if (CRYPTOPP_POWER8_AVAILABLE) 523 return SPECK128_Dec_AdvancedProcessBlocks_POWER8(m_rkeys, (
size_t)m_rounds,
524 inBlocks, xorBlocks, outBlocks, length, flags);
528 #endif // CRYPTOPP_SPECK128_ADVANCED_PROCESS_BLOCKS bool HasAltivec()
Determine if a PowerPC processor has Altivec available.
Utility functions for the Crypto++ library.
bool HasSSSE3()
Determines SSSE3 availability.
Library configuration file.
T rotlConstant(T x)
Performs a left rotate.
bool HasPower8()
Determine if a PowerPC processor has Power8 available.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
Functions for CPU features and intrinsics.
Classes for the Speck block cipher.
T rotrConstant(T x)
Performs a right rotate.
Access a block of memory.
bool HasSSE41()
Determines SSE4.1 availability.
Access a block of memory.
Crypto++ library namespace.
bool HasNEON()
Determine if an ARM processor has Advanced SIMD available.
Interface for retrieving values given their names.