10#ifndef CRYPTOPP_INLINE
11# if defined(CRYPTOPP_DEBUG)
12# define CRYPTOPP_INLINE static
14# define CRYPTOPP_INLINE inline
24ANONYMOUS_NAMESPACE_BEGIN
26using CryptoPP::word32;
27using CryptoPP::word64;
28using CryptoPP::rotlConstant;
29using CryptoPP::rotrConstant;
39CRYPTOPP_INLINE
void TF83(W& x, W& y,
const W k)
41 x = rotrConstant<8>(x);
43 y = rotlConstant<3>(y);
55CRYPTOPP_INLINE
void TR83(W& x, W& y,
const W k)
58 y = rotrConstant<3>(y);
60 x = rotlConstant<8>(x);
69template <
class W,
unsigned int R>
70CRYPTOPP_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]);
85template <
class W,
unsigned int R>
86CRYPTOPP_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]);
101template <
class W,
unsigned int R>
102CRYPTOPP_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);
121template <
class W,
unsigned int R>
122CRYPTOPP_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);
148template <
class W,
unsigned int R>
149CRYPTOPP_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));
175ANONYMOUS_NAMESPACE_END
181#if (CRYPTOPP_ARM_NEON_AVAILABLE)
182extern 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);
185extern 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);
188extern 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);
191extern 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)
196extern 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);
199extern 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)
204extern 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);
207extern 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)
212extern 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);
215extern 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)
220extern 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);
223extern 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);
227std::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)
250void 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);
287void 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]);
310void 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]);
335std::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)
354void 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);
390void 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]);
416void 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)
443size_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);
464size_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);
486#if defined(CRYPTOPP_SPECK128_ADVANCED_PROCESS_BLOCKS)
487size_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);
508size_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);
Access a block of memory.
Interface for retrieving values given their names.
Access a block of memory.
Library configuration file.
Functions for CPU features and intrinsics.
bool HasAltivec()
Determine if a PowerPC processor has Altivec available.
bool HasNEON()
Determine if an ARM processor has Advanced SIMD available.
bool HasSSSE3()
Determines SSSE3 availability.
bool HasPower8()
Determine if a PowerPC processor has Power8 available.
bool HasSSE41()
Determines SSE4.1 availability.
Utility functions for the Crypto++ library.
Crypto++ library namespace.
Classes for the Speck block cipher.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.