22 ANONYMOUS_NAMESPACE_BEGIN
45 template <
unsigned int RR,
unsigned int KW,
class T>
46 inline void CHAM_EncRound(T x[4],
const T k[KW],
unsigned int i)
48 CRYPTOPP_CONSTANT(IDX0 = (RR+0) % 4)
49 CRYPTOPP_CONSTANT(IDX1 = (RR+1) % 4)
50 CRYPTOPP_CONSTANT(IDX3 = (RR+3+1) % 4)
51 CRYPTOPP_CONSTANT(R1 = (RR % 2 == 0) ? 1 : 8)
52 CRYPTOPP_CONSTANT(R2 = (RR % 2 == 0) ? 8 : 1)
55 const T kk = k[i % KW];
56 const T aa = x[IDX0] ^ static_cast<T>(i);
79 template <
unsigned int RR,
unsigned int KW, class T>
80 inline void CHAM_DecRound(T x[4], const T k[KW],
unsigned int i)
82 CRYPTOPP_CONSTANT(IDX0 = (RR+0) % 4)
83 CRYPTOPP_CONSTANT(IDX1 = (RR+1) % 4)
84 CRYPTOPP_CONSTANT(IDX3 = (RR+3+1) % 4)
85 CRYPTOPP_CONSTANT(R1 = (RR % 2 == 0) ? 8 : 1)
86 CRYPTOPP_CONSTANT(R2 = (RR % 2 == 0) ? 1 : 8)
89 const T kk = k[i % KW];
92 x[IDX0] = static_cast<T>(aa - bb) ^ static_cast<T>(i);
95 ANONYMOUS_NAMESPACE_END
99 #if CRYPTOPP_CHAM_ADVANCED_PROCESS_BLOCKS 100 # if (CRYPTOPP_SSSE3_AVAILABLE) 101 extern size_t CHAM64_Enc_AdvancedProcessBlocks_SSSE3(
const word16* subKeys,
size_t rounds,
102 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
104 extern size_t CHAM64_Dec_AdvancedProcessBlocks_SSSE3(
const word16* subKeys,
size_t rounds,
105 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
107 extern size_t CHAM128_Enc_AdvancedProcessBlocks_SSSE3(
const word32* subKeys,
size_t rounds,
108 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
110 extern size_t CHAM128_Dec_AdvancedProcessBlocks_SSSE3(
const word32* subKeys,
size_t rounds,
111 const byte *inBlocks,
const byte *xorBlocks, byte *outBlocks,
size_t length, word32 flags);
112 # endif // CRYPTOPP_SSSE3_AVAILABLE 113 #endif // CRYPTOPP_CHAM_ADVANCED_PROCESS_BLOCKS 115 std::string CHAM64::Base::AlgorithmProvider()
const 117 #if (CRYPTOPP_CHAM_ADVANCED_PROCESS_BLOCKS) 118 # if defined(CRYPTOPP_SSSE3_AVAILABLE) 126 void CHAM64::Base::UncheckedSetKey(
const byte *userKey,
unsigned int keyLength,
const NameValuePairs ¶ms)
128 CRYPTOPP_UNUSED(params);
129 m_kw = keyLength/
sizeof(word16);
132 for (
size_t i = 0; i < m_kw; ++i, userKey +=
sizeof(word16))
136 m_rk[i] = rk ^ rotlConstant<1>(rk) ^ rotlConstant<8>(rk);
137 m_rk[(i + m_kw) ^ 1] = rk ^ rotlConstant<1>(rk) ^ rotlConstant<11>(rk);
141 void CHAM64::Enc::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const 145 iblock(m_x[0])(m_x[1])(m_x[2])(m_x[3]);
148 for (
int i = 0; i < R; i+=16)
150 CHAM_EncRound< 0, 16>(m_x.begin(), m_rk.begin(), i+0);
151 CHAM_EncRound< 1, 16>(m_x.begin(), m_rk.begin(), i+1);
152 CHAM_EncRound< 2, 16>(m_x.begin(), m_rk.begin(), i+2);
153 CHAM_EncRound< 3, 16>(m_x.begin(), m_rk.begin(), i+3);
154 CHAM_EncRound< 4, 16>(m_x.begin(), m_rk.begin(), i+4);
155 CHAM_EncRound< 5, 16>(m_x.begin(), m_rk.begin(), i+5);
156 CHAM_EncRound< 6, 16>(m_x.begin(), m_rk.begin(), i+6);
157 CHAM_EncRound< 7, 16>(m_x.begin(), m_rk.begin(), i+7);
158 CHAM_EncRound< 8, 16>(m_x.begin(), m_rk.begin(), i+8);
159 CHAM_EncRound< 9, 16>(m_x.begin(), m_rk.begin(), i+9);
160 CHAM_EncRound<10, 16>(m_x.begin(), m_rk.begin(), i+10);
161 CHAM_EncRound<11, 16>(m_x.begin(), m_rk.begin(), i+11);
162 CHAM_EncRound<12, 16>(m_x.begin(), m_rk.begin(), i+12);
163 CHAM_EncRound<13, 16>(m_x.begin(), m_rk.begin(), i+13);
164 CHAM_EncRound<14, 16>(m_x.begin(), m_rk.begin(), i+14);
165 CHAM_EncRound<15, 16>(m_x.begin(), m_rk.begin(), i+15);
169 oblock(m_x[0])(m_x[1])(m_x[2])(m_x[3]);
172 void CHAM64::Dec::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const 176 iblock(m_x[0])(m_x[1])(m_x[2])(m_x[3]);
179 for (
int i = R-1; i >=0 ; i-=16)
181 CHAM_DecRound<15, 16>(m_x.begin(), m_rk.begin(), i-0);
182 CHAM_DecRound<14, 16>(m_x.begin(), m_rk.begin(), i-1);
183 CHAM_DecRound<13, 16>(m_x.begin(), m_rk.begin(), i-2);
184 CHAM_DecRound<12, 16>(m_x.begin(), m_rk.begin(), i-3);
185 CHAM_DecRound<11, 16>(m_x.begin(), m_rk.begin(), i-4);
186 CHAM_DecRound<10, 16>(m_x.begin(), m_rk.begin(), i-5);
187 CHAM_DecRound< 9, 16>(m_x.begin(), m_rk.begin(), i-6);
188 CHAM_DecRound< 8, 16>(m_x.begin(), m_rk.begin(), i-7);
189 CHAM_DecRound< 7, 16>(m_x.begin(), m_rk.begin(), i-8);
190 CHAM_DecRound< 6, 16>(m_x.begin(), m_rk.begin(), i-9);
191 CHAM_DecRound< 5, 16>(m_x.begin(), m_rk.begin(), i-10);
192 CHAM_DecRound< 4, 16>(m_x.begin(), m_rk.begin(), i-11);
193 CHAM_DecRound< 3, 16>(m_x.begin(), m_rk.begin(), i-12);
194 CHAM_DecRound< 2, 16>(m_x.begin(), m_rk.begin(), i-13);
195 CHAM_DecRound< 1, 16>(m_x.begin(), m_rk.begin(), i-14);
196 CHAM_DecRound< 0, 16>(m_x.begin(), m_rk.begin(), i-15);
200 oblock(m_x[0])(m_x[1])(m_x[2])(m_x[3]);
203 std::string CHAM128::Base::AlgorithmProvider()
const 205 #if defined(CRYPTOPP_SSSE3_AVAILABLE) 212 void CHAM128::Base::UncheckedSetKey(
const byte *userKey,
unsigned int keyLength,
const NameValuePairs ¶ms)
214 CRYPTOPP_UNUSED(params);
215 m_kw = keyLength/
sizeof(word32);
218 for (
size_t i = 0; i < m_kw; ++i, userKey +=
sizeof(word32))
222 m_rk[i] = rk ^ rotlConstant<1>(rk) ^ rotlConstant<8>(rk);
223 m_rk[(i + m_kw) ^ 1] = rk ^ rotlConstant<1>(rk) ^ rotlConstant<11>(rk);
227 void CHAM128::Enc::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const 231 iblock(m_x[0])(m_x[1])(m_x[2])(m_x[3]);
238 for (
int i = 0; i < R; i+=8)
240 CHAM_EncRound<0, 8>(m_x.begin(), m_rk.begin(), i+0);
241 CHAM_EncRound<1, 8>(m_x.begin(), m_rk.begin(), i+1);
242 CHAM_EncRound<2, 8>(m_x.begin(), m_rk.begin(), i+2);
243 CHAM_EncRound<3, 8>(m_x.begin(), m_rk.begin(), i+3);
244 CHAM_EncRound<4, 8>(m_x.begin(), m_rk.begin(), i+4);
245 CHAM_EncRound<5, 8>(m_x.begin(), m_rk.begin(), i+5);
246 CHAM_EncRound<6, 8>(m_x.begin(), m_rk.begin(), i+6);
247 CHAM_EncRound<7, 8>(m_x.begin(), m_rk.begin(), i+7);
254 for (
int i = 0; i < R; i+=16)
256 CHAM_EncRound< 0, 16>(m_x.begin(), m_rk.begin(), i+0);
257 CHAM_EncRound< 1, 16>(m_x.begin(), m_rk.begin(), i+1);
258 CHAM_EncRound< 2, 16>(m_x.begin(), m_rk.begin(), i+2);
259 CHAM_EncRound< 3, 16>(m_x.begin(), m_rk.begin(), i+3);
260 CHAM_EncRound< 4, 16>(m_x.begin(), m_rk.begin(), i+4);
261 CHAM_EncRound< 5, 16>(m_x.begin(), m_rk.begin(), i+5);
262 CHAM_EncRound< 6, 16>(m_x.begin(), m_rk.begin(), i+6);
263 CHAM_EncRound< 7, 16>(m_x.begin(), m_rk.begin(), i+7);
264 CHAM_EncRound< 8, 16>(m_x.begin(), m_rk.begin(), i+8);
265 CHAM_EncRound< 9, 16>(m_x.begin(), m_rk.begin(), i+9);
266 CHAM_EncRound<10, 16>(m_x.begin(), m_rk.begin(), i+10);
267 CHAM_EncRound<11, 16>(m_x.begin(), m_rk.begin(), i+11);
268 CHAM_EncRound<12, 16>(m_x.begin(), m_rk.begin(), i+12);
269 CHAM_EncRound<13, 16>(m_x.begin(), m_rk.begin(), i+13);
270 CHAM_EncRound<14, 16>(m_x.begin(), m_rk.begin(), i+14);
271 CHAM_EncRound<15, 16>(m_x.begin(), m_rk.begin(), i+15);
280 oblock(m_x[0])(m_x[1])(m_x[2])(m_x[3]);
283 void CHAM128::Dec::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const 287 iblock(m_x[0])(m_x[1])(m_x[2])(m_x[3]);
294 for (
int i = R-1; i >= 0; i-=8)
296 CHAM_DecRound<7, 8>(m_x.begin(), m_rk.begin(), i-0);
297 CHAM_DecRound<6, 8>(m_x.begin(), m_rk.begin(), i-1);
298 CHAM_DecRound<5, 8>(m_x.begin(), m_rk.begin(), i-2);
299 CHAM_DecRound<4, 8>(m_x.begin(), m_rk.begin(), i-3);
300 CHAM_DecRound<3, 8>(m_x.begin(), m_rk.begin(), i-4);
301 CHAM_DecRound<2, 8>(m_x.begin(), m_rk.begin(), i-5);
302 CHAM_DecRound<1, 8>(m_x.begin(), m_rk.begin(), i-6);
303 CHAM_DecRound<0, 8>(m_x.begin(), m_rk.begin(), i-7);
310 for (
int i = R-1; i >= 0; i-=16)
312 CHAM_DecRound<15, 16>(m_x.begin(), m_rk.begin(), i-0);
313 CHAM_DecRound<14, 16>(m_x.begin(), m_rk.begin(), i-1);
314 CHAM_DecRound<13, 16>(m_x.begin(), m_rk.begin(), i-2);
315 CHAM_DecRound<12, 16>(m_x.begin(), m_rk.begin(), i-3);
316 CHAM_DecRound<11, 16>(m_x.begin(), m_rk.begin(), i-4);
317 CHAM_DecRound<10, 16>(m_x.begin(), m_rk.begin(), i-5);
318 CHAM_DecRound< 9, 16>(m_x.begin(), m_rk.begin(), i-6);
319 CHAM_DecRound< 8, 16>(m_x.begin(), m_rk.begin(), i-7);
320 CHAM_DecRound< 7, 16>(m_x.begin(), m_rk.begin(), i-8);
321 CHAM_DecRound< 6, 16>(m_x.begin(), m_rk.begin(), i-9);
322 CHAM_DecRound< 5, 16>(m_x.begin(), m_rk.begin(), i-10);
323 CHAM_DecRound< 4, 16>(m_x.begin(), m_rk.begin(), i-11);
324 CHAM_DecRound< 3, 16>(m_x.begin(), m_rk.begin(), i-12);
325 CHAM_DecRound< 2, 16>(m_x.begin(), m_rk.begin(), i-13);
326 CHAM_DecRound< 1, 16>(m_x.begin(), m_rk.begin(), i-14);
327 CHAM_DecRound< 0, 16>(m_x.begin(), m_rk.begin(), i-15);
336 oblock(m_x[0])(m_x[1])(m_x[2])(m_x[3]);
339 #if CRYPTOPP_CHAM_ADVANCED_PROCESS_BLOCKS 340 size_t CHAM64::Enc::AdvancedProcessBlocks(
const byte *inBlocks,
const byte *xorBlocks,
341 byte *outBlocks,
size_t length, word32 flags)
const 343 # if (CRYPTOPP_SSSE3_AVAILABLE) 345 return CHAM64_Enc_AdvancedProcessBlocks_SSSE3(m_rk, 80,
346 inBlocks, xorBlocks, outBlocks, length, flags);
348 # endif // CRYPTOPP_SSSE3_AVAILABLE 352 size_t CHAM64::Dec::AdvancedProcessBlocks(
const byte *inBlocks,
const byte *xorBlocks,
353 byte *outBlocks,
size_t length, word32 flags)
const 355 # if (CRYPTOPP_SSSE3_AVAILABLE) 357 return CHAM64_Dec_AdvancedProcessBlocks_SSSE3(m_rk, 80,
358 inBlocks, xorBlocks, outBlocks, length, flags);
360 # endif // CRYPTOPP_SSSE3_AVAILABLE 364 size_t CHAM128::Enc::AdvancedProcessBlocks(
const byte *inBlocks,
const byte *xorBlocks,
365 byte *outBlocks,
size_t length, word32 flags)
const 367 # if (CRYPTOPP_SSSE3_AVAILABLE) 369 const size_t rounds = (m_kw == 4 ? 80 : 96);
370 return CHAM128_Enc_AdvancedProcessBlocks_SSSE3(m_rk, rounds,
371 inBlocks, xorBlocks, outBlocks, length, flags);
373 # endif // CRYPTOPP_SSSE3_AVAILABLE 377 size_t CHAM128::Dec::AdvancedProcessBlocks(
const byte *inBlocks,
const byte *xorBlocks,
378 byte *outBlocks,
size_t length, word32 flags)
const 380 # if (CRYPTOPP_SSSE3_AVAILABLE) 382 const size_t rounds = (m_kw == 4 ? 80 : 96);
383 return CHAM128_Dec_AdvancedProcessBlocks_SSSE3(m_rk, rounds,
384 inBlocks, xorBlocks, outBlocks, length, flags);
386 # endif // CRYPTOPP_SSSE3_AVAILABLE 389 #endif // CRYPTOPP_CHAM_ADVANCED_PROCESS_BLOCKS Utility functions for the Crypto++ library.
bool HasSSSE3()
Determines SSSE3 availability.
Library configuration file.
Classes for the CHAM block cipher.
T rotlConstant(T x)
Performs a left rotate.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
Functions for CPU features and intrinsics.
T rotrConstant(T x)
Performs a right rotate.
Access a block of memory.
Access a block of memory.
Crypto++ library namespace.
Interface for retrieving values given their names.