21NAMESPACE_BEGIN(KalynaTab)
24extern const word64 T[8][256];
25extern const word64 IT[8][256];
26extern const byte S[4][256];
27extern const byte IS[4][256];
32ANONYMOUS_NAMESPACE_BEGIN
35typedef unsigned char byte;
37using CryptoPP::word64;
38using CryptoPP::KalynaTab::T;
39using CryptoPP::KalynaTab::S;
40using CryptoPP::KalynaTab::IT;
41using CryptoPP::KalynaTab::IS;
43template <
unsigned int NB>
44inline void MakeOddKey(
const word64 evenkey[NB],
word64 oddkey[NB])
46#if (CRYPTOPP_BIG_ENDIAN)
49 oddkey[0] = (evenkey[1] << 8) | (evenkey[0] >> 56);
50 oddkey[1] = (evenkey[0] << 8) | (evenkey[1] >> 56);
54 oddkey[0] = (evenkey[2] << 40) | (evenkey[1] >> 24);
55 oddkey[1] = (evenkey[3] << 40) | (evenkey[2] >> 24);
56 oddkey[2] = (evenkey[0] << 40) | (evenkey[3] >> 24);
57 oddkey[3] = (evenkey[1] << 40) | (evenkey[0] >> 24);
61 oddkey[0] = (evenkey[3] << 40) | (evenkey[2] >> 24);
62 oddkey[1] = (evenkey[4] << 40) | (evenkey[3] >> 24);
63 oddkey[2] = (evenkey[5] << 40) | (evenkey[4] >> 24);
64 oddkey[3] = (evenkey[6] << 40) | (evenkey[5] >> 24);
66 oddkey[4] = (evenkey[7] << 40) | (evenkey[6] >> 24);
67 oddkey[5] = (evenkey[0] << 40) | (evenkey[7] >> 24);
68 oddkey[6] = (evenkey[1] << 40) | (evenkey[0] >> 24);
69 oddkey[7] = (evenkey[2] << 40) | (evenkey[1] >> 24);
76 static const unsigned int U = (NB == 2) ? 16 : (NB == 4) ? 32 : (NB == 8) ? 64 : -1;
77 static const unsigned int V = (NB == 2) ? 7 : (NB == 4) ? 11 : (NB == 8) ? 19 : -1;
79 const byte* even =
reinterpret_cast<const byte*
>(evenkey);
80 byte* odd =
reinterpret_cast<byte*
>(oddkey);
82 std::memcpy(odd, even + V, U - V);
83 std::memcpy(odd + U - V, even, V);
87template <
unsigned int NB>
88inline void SwapBlocks(
word64 k[NB])
110template <
unsigned int NB>
131template <
unsigned int NB>
152template <
unsigned int NB>
155 dst[0] = src[0] + constant;
156 dst[1] = src[1] + constant;
160 dst[2] = src[2] + constant;
161 dst[3] = src[3] + constant;
166 dst[4] = src[4] + constant;
167 dst[5] = src[5] + constant;
168 dst[6] = src[6] + constant;
169 dst[7] = src[7] + constant;
175 y[0] = T[0][(
byte)x[0]] ^ T[1][(
byte)(x[0] >> 8)] ^ T[2][(
byte)(x[0] >> 16)] ^ T[3][(
byte)(x[0] >> 24)] ^
176 T[4][(
byte)(x[1] >> 32)] ^ T[5][(
byte)(x[1] >> 40)] ^ T[6][(
byte)(x[1] >> 48)] ^ T[7][(
byte)(x[1] >> 56)];
177 y[1] = T[0][(
byte)x[1]] ^ T[1][(
byte)(x[1] >> 8)] ^ T[2][(
byte)(x[1] >> 16)] ^ T[3][(
byte)(x[1] >> 24)] ^
178 T[4][(
byte)(x[0] >> 32)] ^ T[5][(
byte)(x[0] >> 40)] ^ T[6][(
byte)(x[0] >> 48)] ^ T[7][(
byte)(x[0] >> 56)];
183 y[0] = T[0][(
byte)x[0]] ^ T[1][(
byte)(x[0] >> 8)] ^ T[2][(
byte)(x[3] >> 16)] ^ T[3][(
byte)(x[3] >> 24)] ^
184 T[4][(
byte)(x[2] >> 32)] ^ T[5][(
byte)(x[2] >> 40)] ^ T[6][(
byte)(x[1] >> 48)] ^ T[7][(
byte)(x[1] >> 56)];
185 y[1] = T[0][(
byte)x[1]] ^ T[1][(
byte)(x[1] >> 8)] ^ T[2][(
byte)(x[0] >> 16)] ^ T[3][(
byte)(x[0] >> 24)] ^
186 T[4][(
byte)(x[3] >> 32)] ^ T[5][(
byte)(x[3] >> 40)] ^ T[6][(
byte)(x[2] >> 48)] ^ T[7][(
byte)(x[2] >> 56)];
187 y[2] = T[0][(
byte)x[2]] ^ T[1][(
byte)(x[2] >> 8)] ^ T[2][(
byte)(x[1] >> 16)] ^ T[3][(
byte)(x[1] >> 24)] ^
188 T[4][(
byte)(x[0] >> 32)] ^ T[5][(
byte)(x[0] >> 40)] ^ T[6][(
byte)(x[3] >> 48)] ^ T[7][(
byte)(x[3] >> 56)];
189 y[3] = T[0][(
byte)x[3]] ^ T[1][(
byte)(x[3] >> 8)] ^ T[2][(
byte)(x[2] >> 16)] ^ T[3][(
byte)(x[2] >> 24)] ^
190 T[4][(
byte)(x[1] >> 32)] ^ T[5][(
byte)(x[1] >> 40)] ^ T[6][(
byte)(x[0] >> 48)] ^ T[7][(
byte)(x[0] >> 56)];
195 y[0] = T[0][(
byte)x[0]] ^ T[1][(
byte)(x[7] >> 8)] ^ T[2][(
byte)(x[6] >> 16)] ^ T[3][(
byte)(x[5] >> 24)] ^
196 T[4][(
byte)(x[4] >> 32)] ^ T[5][(
byte)(x[3] >> 40)] ^ T[6][(
byte)(x[2] >> 48)] ^ T[7][(
byte)(x[1] >> 56)];
197 y[1] = T[0][(
byte)x[1]] ^ T[1][(
byte)(x[0] >> 8)] ^ T[2][(
byte)(x[7] >> 16)] ^ T[3][(
byte)(x[6] >> 24)] ^
198 T[4][(
byte)(x[5] >> 32)] ^ T[5][(
byte)(x[4] >> 40)] ^ T[6][(
byte)(x[3] >> 48)] ^ T[7][(
byte)(x[2] >> 56)];
199 y[2] = T[0][(
byte)x[2]] ^ T[1][(
byte)(x[1] >> 8)] ^ T[2][(
byte)(x[0] >> 16)] ^ T[3][(
byte)(x[7] >> 24)] ^
200 T[4][(
byte)(x[6] >> 32)] ^ T[5][(
byte)(x[5] >> 40)] ^ T[6][(
byte)(x[4] >> 48)] ^ T[7][(
byte)(x[3] >> 56)];
201 y[3] = T[0][(
byte)x[3]] ^ T[1][(
byte)(x[2] >> 8)] ^ T[2][(
byte)(x[1] >> 16)] ^ T[3][(
byte)(x[0] >> 24)] ^
202 T[4][(
byte)(x[7] >> 32)] ^ T[5][(
byte)(x[6] >> 40)] ^ T[6][(
byte)(x[5] >> 48)] ^ T[7][(
byte)(x[4] >> 56)];
203 y[4] = T[0][(
byte)x[4]] ^ T[1][(
byte)(x[3] >> 8)] ^ T[2][(
byte)(x[2] >> 16)] ^ T[3][(
byte)(x[1] >> 24)] ^
204 T[4][(
byte)(x[0] >> 32)] ^ T[5][(
byte)(x[7] >> 40)] ^ T[6][(
byte)(x[6] >> 48)] ^ T[7][(
byte)(x[5] >> 56)];
205 y[5] = T[0][(
byte)x[5]] ^ T[1][(
byte)(x[4] >> 8)] ^ T[2][(
byte)(x[3] >> 16)] ^ T[3][(
byte)(x[2] >> 24)] ^
206 T[4][(
byte)(x[1] >> 32)] ^ T[5][(
byte)(x[0] >> 40)] ^ T[6][(
byte)(x[7] >> 48)] ^ T[7][(
byte)(x[6] >> 56)];
207 y[6] = T[0][(
byte)x[6]] ^ T[1][(
byte)(x[5] >> 8)] ^ T[2][(
byte)(x[4] >> 16)] ^ T[3][(
byte)(x[3] >> 24)] ^
208 T[4][(
byte)(x[2] >> 32)] ^ T[5][(
byte)(x[1] >> 40)] ^ T[6][(
byte)(x[0] >> 48)] ^ T[7][(
byte)(x[7] >> 56)];
209 y[7] = T[0][(
byte)x[7]] ^ T[1][(
byte)(x[6] >> 8)] ^ T[2][(
byte)(x[5] >> 16)] ^ T[3][(
byte)(x[4] >> 24)] ^
210 T[4][(
byte)(x[3] >> 32)] ^ T[5][(
byte)(x[2] >> 40)] ^ T[6][(
byte)(x[1] >> 48)] ^ T[7][(
byte)(x[0] >> 56)];
215 y[0] = k[0] + (T[0][(
byte)x[0]] ^ T[1][(
byte)(x[0] >> 8)] ^ T[2][(
byte)(x[0] >> 16)] ^ T[3][(
byte)(x[0] >> 24)] ^
216 T[4][(
byte)(x[1] >> 32)] ^ T[5][(
byte)(x[1] >> 40)] ^ T[6][(
byte)(x[1] >> 48)] ^ T[7][(
byte)(x[1] >> 56)]);
217 y[1] = k[1] + (T[0][(
byte)x[1]] ^ T[1][(
byte)(x[1] >> 8)] ^ T[2][(
byte)(x[1] >> 16)] ^ T[3][(
byte)(x[1] >> 24)] ^
218 T[4][(
byte)(x[0] >> 32)] ^ T[5][(
byte)(x[0] >> 40)] ^ T[6][(
byte)(x[0] >> 48)] ^ T[7][(
byte)(x[0] >> 56)]);
223 y[0] = k[0] + (T[0][(
byte)x[0]] ^ T[1][(
byte)(x[0] >> 8)] ^ T[2][(
byte)(x[3] >> 16)] ^ T[3][(
byte)(x[3] >> 24)] ^
224 T[4][(
byte)(x[2] >> 32)] ^ T[5][(
byte)(x[2] >> 40)] ^ T[6][(
byte)(x[1] >> 48)] ^ T[7][(
byte)(x[1] >> 56)]);
225 y[1] = k[1] + (T[0][(
byte)x[1]] ^ T[1][(
byte)(x[1] >> 8)] ^ T[2][(
byte)(x[0] >> 16)] ^ T[3][(
byte)(x[0] >> 24)] ^
226 T[4][(
byte)(x[3] >> 32)] ^ T[5][(
byte)(x[3] >> 40)] ^ T[6][(
byte)(x[2] >> 48)] ^ T[7][(
byte)(x[2] >> 56)]);
227 y[2] = k[2] + (T[0][(
byte)x[2]] ^ T[1][(
byte)(x[2] >> 8)] ^ T[2][(
byte)(x[1] >> 16)] ^ T[3][(
byte)(x[1] >> 24)] ^
228 T[4][(
byte)(x[0] >> 32)] ^ T[5][(
byte)(x[0] >> 40)] ^ T[6][(
byte)(x[3] >> 48)] ^ T[7][(
byte)(x[3] >> 56)]);
229 y[3] = k[3] + (T[0][(
byte)x[3]] ^ T[1][(
byte)(x[3] >> 8)] ^ T[2][(
byte)(x[2] >> 16)] ^ T[3][(
byte)(x[2] >> 24)] ^
230 T[4][(
byte)(x[1] >> 32)] ^ T[5][(
byte)(x[1] >> 40)] ^ T[6][(
byte)(x[0] >> 48)] ^ T[7][(
byte)(x[0] >> 56)]);
235 y[0] = k[0] + (T[0][(
byte)x[0]] ^ T[1][(
byte)(x[7] >> 8)] ^ T[2][(
byte)(x[6] >> 16)] ^ T[3][(
byte)(x[5] >> 24)] ^
236 T[4][(
byte)(x[4] >> 32)] ^ T[5][(
byte)(x[3] >> 40)] ^ T[6][(
byte)(x[2] >> 48)] ^ T[7][(
byte)(x[1] >> 56)]);
237 y[1] = k[1] + (T[0][(
byte)x[1]] ^ T[1][(
byte)(x[0] >> 8)] ^ T[2][(
byte)(x[7] >> 16)] ^ T[3][(
byte)(x[6] >> 24)] ^
238 T[4][(
byte)(x[5] >> 32)] ^ T[5][(
byte)(x[4] >> 40)] ^ T[6][(
byte)(x[3] >> 48)] ^ T[7][(
byte)(x[2] >> 56)]);
239 y[2] = k[2] + (T[0][(
byte)x[2]] ^ T[1][(
byte)(x[1] >> 8)] ^ T[2][(
byte)(x[0] >> 16)] ^ T[3][(
byte)(x[7] >> 24)] ^
240 T[4][(
byte)(x[6] >> 32)] ^ T[5][(
byte)(x[5] >> 40)] ^ T[6][(
byte)(x[4] >> 48)] ^ T[7][(
byte)(x[3] >> 56)]);
241 y[3] = k[3] + (T[0][(
byte)x[3]] ^ T[1][(
byte)(x[2] >> 8)] ^ T[2][(
byte)(x[1] >> 16)] ^ T[3][(
byte)(x[0] >> 24)] ^
242 T[4][(
byte)(x[7] >> 32)] ^ T[5][(
byte)(x[6] >> 40)] ^ T[6][(
byte)(x[5] >> 48)] ^ T[7][(
byte)(x[4] >> 56)]);
243 y[4] = k[4] + (T[0][(
byte)x[4]] ^ T[1][(
byte)(x[3] >> 8)] ^ T[2][(
byte)(x[2] >> 16)] ^ T[3][(
byte)(x[1] >> 24)] ^
244 T[4][(
byte)(x[0] >> 32)] ^ T[5][(
byte)(x[7] >> 40)] ^ T[6][(
byte)(x[6] >> 48)] ^ T[7][(
byte)(x[5] >> 56)]);
245 y[5] = k[5] + (T[0][(
byte)x[5]] ^ T[1][(
byte)(x[4] >> 8)] ^ T[2][(
byte)(x[3] >> 16)] ^ T[3][(
byte)(x[2] >> 24)] ^
246 T[4][(
byte)(x[1] >> 32)] ^ T[5][(
byte)(x[0] >> 40)] ^ T[6][(
byte)(x[7] >> 48)] ^ T[7][(
byte)(x[6] >> 56)]);
247 y[6] = k[6] + (T[0][(
byte)x[6]] ^ T[1][(
byte)(x[5] >> 8)] ^ T[2][(
byte)(x[4] >> 16)] ^ T[3][(
byte)(x[3] >> 24)] ^
248 T[4][(
byte)(x[2] >> 32)] ^ T[5][(
byte)(x[1] >> 40)] ^ T[6][(
byte)(x[0] >> 48)] ^ T[7][(
byte)(x[7] >> 56)]);
249 y[7] = k[7] + (T[0][(
byte)x[7]] ^ T[1][(
byte)(x[6] >> 8)] ^ T[2][(
byte)(x[5] >> 16)] ^ T[3][(
byte)(x[4] >> 24)] ^
250 T[4][(
byte)(x[3] >> 32)] ^ T[5][(
byte)(x[2] >> 40)] ^ T[6][(
byte)(x[1] >> 48)] ^ T[7][(
byte)(x[0] >> 56)]);
253inline void IMC128(
word64 x[2])
255 x[0] = IT[0][S[0][(
byte)x[0]]] ^ IT[1][S[1][(
byte)(x[0] >> 8)]] ^ IT[2][S[2][(
byte)(x[0] >> 16)]] ^ IT[3][S[3][(
byte)(x[0] >> 24)]] ^
256 IT[4][S[0][(
byte)(x[0] >> 32)]] ^ IT[5][S[1][(
byte)(x[0] >> 40)]] ^ IT[6][S[2][(
byte)(x[0] >> 48)]] ^ IT[7][S[3][(
byte)(x[0] >> 56)]];
257 x[1] = IT[0][S[0][(
byte)x[1]]] ^ IT[1][S[1][(
byte)(x[1] >> 8)]] ^ IT[2][S[2][(
byte)(x[1] >> 16)]] ^ IT[3][S[3][(
byte)(x[1] >> 24)]] ^
258 IT[4][S[0][(
byte)(x[1] >> 32)]] ^ IT[5][S[1][(
byte)(x[1] >> 40)]] ^ IT[6][S[2][(
byte)(x[1] >> 48)]] ^ IT[7][S[3][(
byte)(x[1] >> 56)]];
261inline void IMC256(
word64 x[4])
263 x[0] = IT[0][S[0][(
byte)x[0]]] ^ IT[1][S[1][(
byte)(x[0] >> 8)]] ^ IT[2][S[2][(
byte)(x[0] >> 16)]] ^ IT[3][S[3][(
byte)(x[0] >> 24)]] ^
264 IT[4][S[0][(
byte)(x[0] >> 32)]] ^ IT[5][S[1][(
byte)(x[0] >> 40)]] ^ IT[6][S[2][(
byte)(x[0] >> 48)]] ^ IT[7][S[3][(
byte)(x[0] >> 56)]];
265 x[1] = IT[0][S[0][(
byte)x[1]]] ^ IT[1][S[1][(
byte)(x[1] >> 8)]] ^ IT[2][S[2][(
byte)(x[1] >> 16)]] ^ IT[3][S[3][(
byte)(x[1] >> 24)]] ^
266 IT[4][S[0][(
byte)(x[1] >> 32)]] ^ IT[5][S[1][(
byte)(x[1] >> 40)]] ^ IT[6][S[2][(
byte)(x[1] >> 48)]] ^ IT[7][S[3][(
byte)(x[1] >> 56)]];
267 x[2] = IT[0][S[0][(
byte)x[2]]] ^ IT[1][S[1][(
byte)(x[2] >> 8)]] ^ IT[2][S[2][(
byte)(x[2] >> 16)]] ^ IT[3][S[3][(
byte)(x[2] >> 24)]] ^
268 IT[4][S[0][(
byte)(x[2] >> 32)]] ^ IT[5][S[1][(
byte)(x[2] >> 40)]] ^ IT[6][S[2][(
byte)(x[2] >> 48)]] ^ IT[7][S[3][(
byte)(x[2] >> 56)]];
269 x[3] = IT[0][S[0][(
byte)x[3]]] ^ IT[1][S[1][(
byte)(x[3] >> 8)]] ^ IT[2][S[2][(
byte)(x[3] >> 16)]] ^ IT[3][S[3][(
byte)(x[3] >> 24)]] ^
270 IT[4][S[0][(
byte)(x[3] >> 32)]] ^ IT[5][S[1][(
byte)(x[3] >> 40)]] ^ IT[6][S[2][(
byte)(x[3] >> 48)]] ^ IT[7][S[3][(
byte)(x[3] >> 56)]];
273inline void IMC512(
word64 x[8])
275 x[0] = IT[0][S[0][(
byte)x[0]]] ^ IT[1][S[1][(
byte)(x[0] >> 8)]] ^ IT[2][S[2][(
byte)(x[0] >> 16)]] ^ IT[3][S[3][(
byte)(x[0] >> 24)]] ^
276 IT[4][S[0][(
byte)(x[0] >> 32)]] ^ IT[5][S[1][(
byte)(x[0] >> 40)]] ^ IT[6][S[2][(
byte)(x[0] >> 48)]] ^ IT[7][S[3][(
byte)(x[0] >> 56)]];
277 x[1] = IT[0][S[0][(
byte)x[1]]] ^ IT[1][S[1][(
byte)(x[1] >> 8)]] ^ IT[2][S[2][(
byte)(x[1] >> 16)]] ^ IT[3][S[3][(
byte)(x[1] >> 24)]] ^
278 IT[4][S[0][(
byte)(x[1] >> 32)]] ^ IT[5][S[1][(
byte)(x[1] >> 40)]] ^ IT[6][S[2][(
byte)(x[1] >> 48)]] ^ IT[7][S[3][(
byte)(x[1] >> 56)]];
279 x[2] = IT[0][S[0][(
byte)x[2]]] ^ IT[1][S[1][(
byte)(x[2] >> 8)]] ^ IT[2][S[2][(
byte)(x[2] >> 16)]] ^ IT[3][S[3][(
byte)(x[2] >> 24)]] ^
280 IT[4][S[0][(
byte)(x[2] >> 32)]] ^ IT[5][S[1][(
byte)(x[2] >> 40)]] ^ IT[6][S[2][(
byte)(x[2] >> 48)]] ^ IT[7][S[3][(
byte)(x[2] >> 56)]];
281 x[3] = IT[0][S[0][(
byte)x[3]]] ^ IT[1][S[1][(
byte)(x[3] >> 8)]] ^ IT[2][S[2][(
byte)(x[3] >> 16)]] ^ IT[3][S[3][(
byte)(x[3] >> 24)]] ^
282 IT[4][S[0][(
byte)(x[3] >> 32)]] ^ IT[5][S[1][(
byte)(x[3] >> 40)]] ^ IT[6][S[2][(
byte)(x[3] >> 48)]] ^ IT[7][S[3][(
byte)(x[3] >> 56)]];
283 x[4] = IT[0][S[0][(
byte)x[4]]] ^ IT[1][S[1][(
byte)(x[4] >> 8)]] ^ IT[2][S[2][(
byte)(x[4] >> 16)]] ^ IT[3][S[3][(
byte)(x[4] >> 24)]] ^
284 IT[4][S[0][(
byte)(x[4] >> 32)]] ^ IT[5][S[1][(
byte)(x[4] >> 40)]] ^ IT[6][S[2][(
byte)(x[4] >> 48)]] ^ IT[7][S[3][(
byte)(x[4] >> 56)]];
285 x[5] = IT[0][S[0][(
byte)x[5]]] ^ IT[1][S[1][(
byte)(x[5] >> 8)]] ^ IT[2][S[2][(
byte)(x[5] >> 16)]] ^ IT[3][S[3][(
byte)(x[5] >> 24)]] ^
286 IT[4][S[0][(
byte)(x[5] >> 32)]] ^ IT[5][S[1][(
byte)(x[5] >> 40)]] ^ IT[6][S[2][(
byte)(x[5] >> 48)]] ^ IT[7][S[3][(
byte)(x[5] >> 56)]];
287 x[6] = IT[0][S[0][(
byte)x[6]]] ^ IT[1][S[1][(
byte)(x[6] >> 8)]] ^ IT[2][S[2][(
byte)(x[6] >> 16)]] ^ IT[3][S[3][(
byte)(x[6] >> 24)]] ^
288 IT[4][S[0][(
byte)(x[6] >> 32)]] ^ IT[5][S[1][(
byte)(x[6] >> 40)]] ^ IT[6][S[2][(
byte)(x[6] >> 48)]] ^ IT[7][S[3][(
byte)(x[6] >> 56)]];
289 x[7] = IT[0][S[0][(
byte)x[7]]] ^ IT[1][S[1][(
byte)(x[7] >> 8)]] ^ IT[2][S[2][(
byte)(x[7] >> 16)]] ^ IT[3][S[3][(
byte)(x[7] >> 24)]] ^
290 IT[4][S[0][(
byte)(x[7] >> 32)]] ^ IT[5][S[1][(
byte)(x[7] >> 40)]] ^ IT[6][S[2][(
byte)(x[7] >> 48)]] ^ IT[7][S[3][(
byte)(x[7] >> 56)]];
295 y[0] = k[0] ^ IT[0][(
byte)x[0]] ^ IT[1][(
byte)(x[0] >> 8)] ^ IT[2][(
byte)(x[0] >> 16)] ^ IT[3][(
byte)(x[0] >> 24)] ^
296 IT[4][(
byte)(x[1] >> 32)] ^ IT[5][(
byte)(x[1] >> 40)] ^ IT[6][(
byte)(x[1] >> 48)] ^ IT[7][(
byte)(x[1] >> 56)];
297 y[1] = k[1] ^ IT[0][(
byte)x[1]] ^ IT[1][(
byte)(x[1] >> 8)] ^ IT[2][(
byte)(x[1] >> 16)] ^ IT[3][(
byte)(x[1] >> 24)] ^
298 IT[4][(
byte)(x[0] >> 32)] ^ IT[5][(
byte)(x[0] >> 40)] ^ IT[6][(
byte)(x[0] >> 48)] ^ IT[7][(
byte)(x[0] >> 56)];
303 y[0] = k[0] ^ IT[0][(
byte)x[0]] ^ IT[1][(
byte)(x[0] >> 8)] ^ IT[2][(
byte)(x[1] >> 16)] ^ IT[3][(
byte)(x[1] >> 24)] ^
304 IT[4][(
byte)(x[2] >> 32)] ^ IT[5][(
byte)(x[2] >> 40)] ^ IT[6][(
byte)(x[3] >> 48)] ^ IT[7][(
byte)(x[3] >> 56)];
305 y[1] = k[1] ^ IT[0][(
byte)x[1]] ^ IT[1][(
byte)(x[1] >> 8)] ^ IT[2][(
byte)(x[2] >> 16)] ^ IT[3][(
byte)(x[2] >> 24)] ^
306 IT[4][(
byte)(x[3] >> 32)] ^ IT[5][(
byte)(x[3] >> 40)] ^ IT[6][(
byte)(x[0] >> 48)] ^ IT[7][(
byte)(x[0] >> 56)];
307 y[2] = k[2] ^ IT[0][(
byte)x[2]] ^ IT[1][(
byte)(x[2] >> 8)] ^ IT[2][(
byte)(x[3] >> 16)] ^ IT[3][(
byte)(x[3] >> 24)] ^
308 IT[4][(
byte)(x[0] >> 32)] ^ IT[5][(
byte)(x[0] >> 40)] ^ IT[6][(
byte)(x[1] >> 48)] ^ IT[7][(
byte)(x[1] >> 56)];
309 y[3] = k[3] ^ IT[0][(
byte)x[3]] ^ IT[1][(
byte)(x[3] >> 8)] ^ IT[2][(
byte)(x[0] >> 16)] ^ IT[3][(
byte)(x[0] >> 24)] ^
310 IT[4][(
byte)(x[1] >> 32)] ^ IT[5][(
byte)(x[1] >> 40)] ^ IT[6][(
byte)(x[2] >> 48)] ^ IT[7][(
byte)(x[2] >> 56)];
315 y[0] = k[0] ^ IT[0][(
byte)x[0]] ^ IT[1][(
byte)(x[1] >> 8)] ^ IT[2][(
byte)(x[2] >> 16)] ^ IT[3][(
byte)(x[3] >> 24)] ^
316 IT[4][(
byte)(x[4] >> 32)] ^ IT[5][(
byte)(x[5] >> 40)] ^ IT[6][(
byte)(x[6] >> 48)] ^ IT[7][(
byte)(x[7] >> 56)];
317 y[1] = k[1] ^ IT[0][(
byte)x[1]] ^ IT[1][(
byte)(x[2] >> 8)] ^ IT[2][(
byte)(x[3] >> 16)] ^ IT[3][(
byte)(x[4] >> 24)] ^
318 IT[4][(
byte)(x[5] >> 32)] ^ IT[5][(
byte)(x[6] >> 40)] ^ IT[6][(
byte)(x[7] >> 48)] ^ IT[7][(
byte)(x[0] >> 56)];
319 y[2] = k[2] ^ IT[0][(
byte)x[2]] ^ IT[1][(
byte)(x[3] >> 8)] ^ IT[2][(
byte)(x[4] >> 16)] ^ IT[3][(
byte)(x[5] >> 24)] ^
320 IT[4][(
byte)(x[6] >> 32)] ^ IT[5][(
byte)(x[7] >> 40)] ^ IT[6][(
byte)(x[0] >> 48)] ^ IT[7][(
byte)(x[1] >> 56)];
321 y[3] = k[3] ^ IT[0][(
byte)x[3]] ^ IT[1][(
byte)(x[4] >> 8)] ^ IT[2][(
byte)(x[5] >> 16)] ^ IT[3][(
byte)(x[6] >> 24)] ^
322 IT[4][(
byte)(x[7] >> 32)] ^ IT[5][(
byte)(x[0] >> 40)] ^ IT[6][(
byte)(x[1] >> 48)] ^ IT[7][(
byte)(x[2] >> 56)];
323 y[4] = k[4] ^ IT[0][(
byte)x[4]] ^ IT[1][(
byte)(x[5] >> 8)] ^ IT[2][(
byte)(x[6] >> 16)] ^ IT[3][(
byte)(x[7] >> 24)] ^
324 IT[4][(
byte)(x[0] >> 32)] ^ IT[5][(
byte)(x[1] >> 40)] ^ IT[6][(
byte)(x[2] >> 48)] ^ IT[7][(
byte)(x[3] >> 56)];
325 y[5] = k[5] ^ IT[0][(
byte)x[5]] ^ IT[1][(
byte)(x[6] >> 8)] ^ IT[2][(
byte)(x[7] >> 16)] ^ IT[3][(
byte)(x[0] >> 24)] ^
326 IT[4][(
byte)(x[1] >> 32)] ^ IT[5][(
byte)(x[2] >> 40)] ^ IT[6][(
byte)(x[3] >> 48)] ^ IT[7][(
byte)(x[4] >> 56)];
327 y[6] = k[6] ^ IT[0][(
byte)x[6]] ^ IT[1][(
byte)(x[7] >> 8)] ^ IT[2][(
byte)(x[0] >> 16)] ^ IT[3][(
byte)(x[1] >> 24)] ^
328 IT[4][(
byte)(x[2] >> 32)] ^ IT[5][(
byte)(x[3] >> 40)] ^ IT[6][(
byte)(x[4] >> 48)] ^ IT[7][(
byte)(x[5] >> 56)];
329 y[7] = k[7] ^ IT[0][(
byte)x[7]] ^ IT[1][(
byte)(x[0] >> 8)] ^ IT[2][(
byte)(x[1] >> 16)] ^ IT[3][(
byte)(x[2] >> 24)] ^
330 IT[4][(
byte)(x[3] >> 32)] ^ IT[5][(
byte)(x[4] >> 40)] ^ IT[6][(
byte)(x[5] >> 48)] ^ IT[7][(
byte)(x[6] >> 56)];
335 y[0] = (
word64(IS[0][(
byte)x[0]]) ^
word64(IS[1][(
byte)(x[0] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[0] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[0] >> 24)]) << 24 ^
336 word64(IS[0][(
byte)(x[1] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[1] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[1] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[1] >> 56)]) << 56) - k[0];
337 y[1] = (
word64(IS[0][(
byte)x[1]]) ^
word64(IS[1][(
byte)(x[1] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[1] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[1] >> 24)]) << 24 ^
338 word64(IS[0][(
byte)(x[0] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[0] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[0] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[0] >> 56)]) << 56) - k[1];
343 y[0] = (
word64(IS[0][(
byte)x[0]]) ^
word64(IS[1][(
byte)(x[0] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[1] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[1] >> 24)]) << 24 ^
344 word64(IS[0][(
byte)(x[2] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[2] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[3] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[3] >> 56)]) << 56) - k[0];
345 y[1] = (
word64(IS[0][(
byte)x[1]]) ^
word64(IS[1][(
byte)(x[1] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[2] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[2] >> 24)]) << 24 ^
346 word64(IS[0][(
byte)(x[3] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[3] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[0] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[0] >> 56)]) << 56) - k[1];
347 y[2] = (
word64(IS[0][(
byte)x[2]]) ^
word64(IS[1][(
byte)(x[2] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[3] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[3] >> 24)]) << 24 ^
348 word64(IS[0][(
byte)(x[0] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[0] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[1] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[1] >> 56)]) << 56) - k[2];
349 y[3] = (
word64(IS[0][(
byte)x[3]]) ^
word64(IS[1][(
byte)(x[3] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[0] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[0] >> 24)]) << 24 ^
350 word64(IS[0][(
byte)(x[1] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[1] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[2] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[2] >> 56)]) << 56) - k[3];
355 y[0] = (
word64(IS[0][(
byte)x[0]]) ^
word64(IS[1][(
byte)(x[1] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[2] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[3] >> 24)]) << 24 ^
356 word64(IS[0][(
byte)(x[4] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[5] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[6] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[7] >> 56)]) << 56) - k[0];
357 y[1] = (
word64(IS[0][(
byte)x[1]]) ^
word64(IS[1][(
byte)(x[2] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[3] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[4] >> 24)]) << 24 ^
358 word64(IS[0][(
byte)(x[5] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[6] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[7] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[0] >> 56)]) << 56) - k[1];
359 y[2] = (
word64(IS[0][(
byte)x[2]]) ^
word64(IS[1][(
byte)(x[3] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[4] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[5] >> 24)]) << 24 ^
360 word64(IS[0][(
byte)(x[6] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[7] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[0] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[1] >> 56)]) << 56) - k[2];
361 y[3] = (
word64(IS[0][(
byte)x[3]]) ^
word64(IS[1][(
byte)(x[4] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[5] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[6] >> 24)]) << 24 ^
362 word64(IS[0][(
byte)(x[7] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[0] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[1] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[2] >> 56)]) << 56) - k[3];
363 y[4] = (
word64(IS[0][(
byte)x[4]]) ^
word64(IS[1][(
byte)(x[5] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[6] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[7] >> 24)]) << 24 ^
364 word64(IS[0][(
byte)(x[0] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[1] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[2] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[3] >> 56)]) << 56) - k[4];
365 y[5] = (
word64(IS[0][(
byte)x[5]]) ^
word64(IS[1][(
byte)(x[6] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[7] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[0] >> 24)]) << 24 ^
366 word64(IS[0][(
byte)(x[1] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[2] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[3] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[4] >> 56)]) << 56) - k[5];
367 y[6] = (
word64(IS[0][(
byte)x[6]]) ^
word64(IS[1][(
byte)(x[7] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[0] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[1] >> 24)]) << 24 ^
368 word64(IS[0][(
byte)(x[2] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[3] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[4] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[5] >> 56)]) << 56) - k[6];
369 y[7] = (
word64(IS[0][(
byte)x[7]]) ^
word64(IS[1][(
byte)(x[0] >> 8)]) << 8 ^
word64(IS[2][(
byte)(x[1] >> 16)]) << 16 ^
word64(IS[3][(
byte)(x[2] >> 24)]) << 24 ^
370 word64(IS[0][(
byte)(x[3] >> 32)]) << 32 ^
word64(IS[1][(
byte)(x[4] >> 40)]) << 40 ^
word64(IS[2][(
byte)(x[5] >> 48)]) << 48 ^
word64(IS[3][(
byte)(x[6] >> 56)]) << 56) - k[7];
375 y[0] = k[0] ^ T[0][(
byte)x[0]] ^ T[1][(
byte)(x[0] >> 8)] ^ T[2][(
byte)(x[0] >> 16)] ^ T[3][(
byte)(x[0] >> 24)] ^
376 T[4][(
byte)(x[1] >> 32)] ^ T[5][(
byte)(x[1] >> 40)] ^ T[6][(
byte)(x[1] >> 48)] ^ T[7][(
byte)(x[1] >> 56)];
377 y[1] = k[1] ^ T[0][(
byte)x[1]] ^ T[1][(
byte)(x[1] >> 8)] ^ T[2][(
byte)(x[1] >> 16)] ^ T[3][(
byte)(x[1] >> 24)] ^
378 T[4][(
byte)(x[0] >> 32)] ^ T[5][(
byte)(x[0] >> 40)] ^ T[6][(
byte)(x[0] >> 48)] ^ T[7][(
byte)(x[0] >> 56)];
383 y[0] = k[0] ^ T[0][(
byte)x[0]] ^ T[1][(
byte)(x[0] >> 8)] ^ T[2][(
byte)(x[3] >> 16)] ^ T[3][(
byte)(x[3] >> 24)] ^
384 T[4][(
byte)(x[2] >> 32)] ^ T[5][(
byte)(x[2] >> 40)] ^ T[6][(
byte)(x[1] >> 48)] ^ T[7][(
byte)(x[1] >> 56)];
385 y[1] = k[1] ^ T[0][(
byte)x[1]] ^ T[1][(
byte)(x[1] >> 8)] ^ T[2][(
byte)(x[0] >> 16)] ^ T[3][(
byte)(x[0] >> 24)] ^
386 T[4][(
byte)(x[3] >> 32)] ^ T[5][(
byte)(x[3] >> 40)] ^ T[6][(
byte)(x[2] >> 48)] ^ T[7][(
byte)(x[2] >> 56)];
387 y[2] = k[2] ^ T[0][(
byte)x[2]] ^ T[1][(
byte)(x[2] >> 8)] ^ T[2][(
byte)(x[1] >> 16)] ^ T[3][(
byte)(x[1] >> 24)] ^
388 T[4][(
byte)(x[0] >> 32)] ^ T[5][(
byte)(x[0] >> 40)] ^ T[6][(
byte)(x[3] >> 48)] ^ T[7][(
byte)(x[3] >> 56)];
389 y[3] = k[3] ^ T[0][(
byte)x[3]] ^ T[1][(
byte)(x[3] >> 8)] ^ T[2][(
byte)(x[2] >> 16)] ^ T[3][(
byte)(x[2] >> 24)] ^
390 T[4][(
byte)(x[1] >> 32)] ^ T[5][(
byte)(x[1] >> 40)] ^ T[6][(
byte)(x[0] >> 48)] ^ T[7][(
byte)(x[0] >> 56)];
395 y[0] = k[0] ^ T[0][(
byte)x[0]] ^ T[1][(
byte)(x[7] >> 8)] ^ T[2][(
byte)(x[6] >> 16)] ^ T[3][(
byte)(x[5] >> 24)] ^
396 T[4][(
byte)(x[4] >> 32)] ^ T[5][(
byte)(x[3] >> 40)] ^ T[6][(
byte)(x[2] >> 48)] ^ T[7][(
byte)(x[1] >> 56)];
397 y[1] = k[1] ^ T[0][(
byte)x[1]] ^ T[1][(
byte)(x[0] >> 8)] ^ T[2][(
byte)(x[7] >> 16)] ^ T[3][(
byte)(x[6] >> 24)] ^
398 T[4][(
byte)(x[5] >> 32)] ^ T[5][(
byte)(x[4] >> 40)] ^ T[6][(
byte)(x[3] >> 48)] ^ T[7][(
byte)(x[2] >> 56)];
399 y[2] = k[2] ^ T[0][(
byte)x[2]] ^ T[1][(
byte)(x[1] >> 8)] ^ T[2][(
byte)(x[0] >> 16)] ^ T[3][(
byte)(x[7] >> 24)] ^
400 T[4][(
byte)(x[6] >> 32)] ^ T[5][(
byte)(x[5] >> 40)] ^ T[6][(
byte)(x[4] >> 48)] ^ T[7][(
byte)(x[3] >> 56)];
401 y[3] = k[3] ^ T[0][(
byte)x[3]] ^ T[1][(
byte)(x[2] >> 8)] ^ T[2][(
byte)(x[1] >> 16)] ^ T[3][(
byte)(x[0] >> 24)] ^
402 T[4][(
byte)(x[7] >> 32)] ^ T[5][(
byte)(x[6] >> 40)] ^ T[6][(
byte)(x[5] >> 48)] ^ T[7][(
byte)(x[4] >> 56)];
403 y[4] = k[4] ^ T[0][(
byte)x[4]] ^ T[1][(
byte)(x[3] >> 8)] ^ T[2][(
byte)(x[2] >> 16)] ^ T[3][(
byte)(x[1] >> 24)] ^
404 T[4][(
byte)(x[0] >> 32)] ^ T[5][(
byte)(x[7] >> 40)] ^ T[6][(
byte)(x[6] >> 48)] ^ T[7][(
byte)(x[5] >> 56)];
405 y[5] = k[5] ^ T[0][(
byte)x[5]] ^ T[1][(
byte)(x[4] >> 8)] ^ T[2][(
byte)(x[3] >> 16)] ^ T[3][(
byte)(x[2] >> 24)] ^
406 T[4][(
byte)(x[1] >> 32)] ^ T[5][(
byte)(x[0] >> 40)] ^ T[6][(
byte)(x[7] >> 48)] ^ T[7][(
byte)(x[6] >> 56)];
407 y[6] = k[6] ^ T[0][(
byte)x[6]] ^ T[1][(
byte)(x[5] >> 8)] ^ T[2][(
byte)(x[4] >> 16)] ^ T[3][(
byte)(x[3] >> 24)] ^
408 T[4][(
byte)(x[2] >> 32)] ^ T[5][(
byte)(x[1] >> 40)] ^ T[6][(
byte)(x[0] >> 48)] ^ T[7][(
byte)(x[7] >> 56)];
409 y[7] = k[7] ^ T[0][(
byte)x[7]] ^ T[1][(
byte)(x[6] >> 8)] ^ T[2][(
byte)(x[5] >> 16)] ^ T[3][(
byte)(x[4] >> 24)] ^
410 T[4][(
byte)(x[3] >> 32)] ^ T[5][(
byte)(x[2] >> 40)] ^ T[6][(
byte)(x[1] >> 48)] ^ T[7][(
byte)(x[0] >> 56)];
413ANONYMOUS_NAMESPACE_END
419void Kalyna128::Base::SetKey_22(
const word64 key[2])
421 word64 *ks = m_wspace+0, *ksc = m_wspace+2, *t1 = m_wspace+4;
422 word64 *t2 = m_wspace+6, *k = m_wspace+8, *kswapped = m_wspace+10;
424 std::memset(t1, 0, 2*8);
425 t1[0] = (128 + 128 + 64) / 64;
427 AddKey<2>(t1, t2, key);
435 std::memcpy(k, key, 16);
439 AddConstant<2>(ks, ksc, constant);
440 AddKey<2>(k, t2, ksc);
442 GL128(t1, &m_rkeys[0], ksc);
443 MakeOddKey<2>(&m_rkeys[0], &m_rkeys[2]);
447 AddConstant<2>(ks, ksc, constant);
448 AddKey<2>(kswapped, t2, ksc);
450 GL128(t1, &m_rkeys[4], ksc);
451 MakeOddKey<2>(&m_rkeys[4], &m_rkeys[6]);
455 AddConstant<2>(ks, ksc, constant);
456 AddKey<2>(k, t2, ksc);
458 GL128(t1, &m_rkeys[8], ksc);
459 MakeOddKey<2>(&m_rkeys[8], &m_rkeys[10]);
463 AddConstant<2>(ks, ksc, constant);
464 AddKey<2>(kswapped, t2, ksc);
466 GL128(t1, &m_rkeys[12], ksc);
467 MakeOddKey<2>(&m_rkeys[12], &m_rkeys[14]);
471 AddConstant<2>(ks, ksc, constant);
472 AddKey<2>(k, t2, ksc);
474 GL128(t1, &m_rkeys[16], ksc);
475 MakeOddKey<2>(&m_rkeys[16], &m_rkeys[18]);
479 AddConstant<2>(ks, ksc, constant);
480 AddKey<2>(kswapped, t2, ksc);
482 GL128(t1, &m_rkeys[20], ksc);
484 if (!IsForwardTransformation())
486 IMC128(&m_rkeys[18]); IMC128(&m_rkeys[16]);
487 IMC128(&m_rkeys[14]); IMC128(&m_rkeys[12]);
488 IMC128(&m_rkeys[10]); IMC128(&m_rkeys[ 8]);
489 IMC128(&m_rkeys[ 6]); IMC128(&m_rkeys[ 4]);
490 IMC128(&m_rkeys[ 2]);
494void Kalyna128::Base::SetKey_24(
const word64 key[4])
496 word64 *ks = m_wspace+0, *ksc = m_wspace+2, *t1 = m_wspace+4, *t2 = m_wspace+6;
497 word64 *k = m_wspace+8, *ka = m_wspace+12, *ko = m_wspace+14;
499 std::memset(t1, 0, 2*8);
500 t1[0] = (128 + 256 + 64) / 64;
501 std::memcpy(ka, key, 16);
502 std::memcpy(ko, key + 2, 16);
504 AddKey<2>(t1, t2, ka);
512 std::memcpy(k, key, 256 / 8);
513 AddConstant<2>(ks, ksc, constant);
514 AddKey<2>(k, t2, ksc);
516 GL128(t1, &m_rkeys[0], ksc);
517 MakeOddKey<2>(&m_rkeys[0], &m_rkeys[2]);
521 AddConstant<2>(ks, ksc, constant);
522 AddKey<2>(k + 2, t2, ksc);
524 GL128(t1, &m_rkeys[4], ksc);
525 MakeOddKey<2>(&m_rkeys[4], &m_rkeys[6]);
530 AddConstant<2>(ks, ksc, constant);
531 AddKey<2>(k, t2, ksc);
533 GL128(t1, &m_rkeys[8], ksc);
534 MakeOddKey<2>(&m_rkeys[8], &m_rkeys[10]);
538 AddConstant<2>(ks, ksc, constant);
539 AddKey<2>(k + 2, t2, ksc);
541 GL128(t1, &m_rkeys[12], ksc);
542 MakeOddKey<2>(&m_rkeys[12], &m_rkeys[14]);
547 AddConstant<2>(ks, ksc, constant);
548 AddKey<2>(k, t2, ksc);
550 GL128(t1, &m_rkeys[16], ksc);
551 MakeOddKey<2>(&m_rkeys[16], &m_rkeys[18]);
555 AddConstant<2>(ks, ksc, constant);
556 AddKey<2>(k + 2, t2, ksc);
558 GL128(t1, &m_rkeys[20], ksc);
559 MakeOddKey<2>(&m_rkeys[20], &m_rkeys[22]);
564 AddConstant<2>(ks, ksc, constant);
565 AddKey<2>(k, t2, ksc);
567 GL128(t1, &m_rkeys[24], ksc);
568 MakeOddKey<2>(&m_rkeys[24], &m_rkeys[26]);
572 AddConstant<2>(ks, ksc, constant);
573 AddKey<2>(k + 2, t2, ksc);
575 GL128(t1, &m_rkeys[28], ksc);
577 if (!IsForwardTransformation())
579 IMC128(&m_rkeys[26]);
580 IMC128(&m_rkeys[24]);
581 IMC128(&m_rkeys[22]);
582 IMC128(&m_rkeys[20]);
583 IMC128(&m_rkeys[18]);
584 IMC128(&m_rkeys[16]);
585 IMC128(&m_rkeys[14]);
586 IMC128(&m_rkeys[12]);
587 IMC128(&m_rkeys[10]);
595void Kalyna256::Base::SetKey_44(
const word64 key[4])
597 word64 *ks = m_wspace+0, *ksc = m_wspace+4, *t1 = m_wspace+8;
598 word64 *t2 = m_wspace+12, *k = m_wspace+16;
600 std::memset(t1, 0, 32);
601 t1[0] = (256 + 256 + 64) / 64;
603 AddKey<4>(t1, t2, key);
611 std::memcpy(k, key, 32);
612 AddConstant<4>(ks, ksc, constant);
613 AddKey<4>(k, t2, ksc);
615 GL256(t1, &m_rkeys[0], ksc);
616 MakeOddKey<4>(&m_rkeys[0], &m_rkeys[4]);
621 AddConstant<4>(ks, ksc, constant);
622 AddKey<4>(k, t2, ksc);
624 GL256(t1, &m_rkeys[8], ksc);
625 MakeOddKey<4>(&m_rkeys[8], &m_rkeys[12]);
630 AddConstant<4>(ks, ksc, constant);
631 AddKey<4>(k, t2, ksc);
633 GL256(t1, &m_rkeys[16], ksc);
634 MakeOddKey<4>(&m_rkeys[16], &m_rkeys[20]);
639 AddConstant<4>(ks, ksc, constant);
640 AddKey<4>(k, t2, ksc);
642 GL256(t1, &m_rkeys[24], ksc);
643 MakeOddKey<4>(&m_rkeys[24], &m_rkeys[28]);
648 AddConstant<4>(ks, ksc, constant);
649 AddKey<4>(k, t2, ksc);
651 GL256(t1, &m_rkeys[32], ksc);
652 MakeOddKey<4>(&m_rkeys[32], &m_rkeys[36]);
657 AddConstant<4>(ks, ksc, constant);
658 AddKey<4>(k, t2, ksc);
660 GL256(t1, &m_rkeys[40], ksc);
661 MakeOddKey<4>(&m_rkeys[40], &m_rkeys[44]);
666 AddConstant<4>(ks, ksc, constant);
667 AddKey<4>(k, t2, ksc);
669 GL256(t1, &m_rkeys[48], ksc);
670 MakeOddKey<4>(&m_rkeys[48], &m_rkeys[52]);
675 AddConstant<4>(ks, ksc, constant);
676 AddKey<4>(k, t2, ksc);
678 GL256(t1, &m_rkeys[56], ksc);
680 if (!IsForwardTransformation())
682 IMC256(&m_rkeys[52]);
683 IMC256(&m_rkeys[48]);
684 IMC256(&m_rkeys[44]);
685 IMC256(&m_rkeys[40]);
686 IMC256(&m_rkeys[36]);
687 IMC256(&m_rkeys[32]);
688 IMC256(&m_rkeys[28]);
689 IMC256(&m_rkeys[24]);
690 IMC256(&m_rkeys[20]);
691 IMC256(&m_rkeys[16]);
692 IMC256(&m_rkeys[12]);
698void Kalyna256::Base::SetKey_48(
const word64 key[8])
700 word64 *ks = m_wspace+0, *ksc = m_wspace+4, *t1 = m_wspace+8, *t2 = m_wspace+12;
701 word64 *k = m_wspace+16, *ka = m_wspace+24, *ko = m_wspace+28;
703 std::memset(t1, 0, 4*8);
704 t1[0] = (512 + 256 + 64) / 64;
705 std::memcpy(ka, key, 32);
706 std::memcpy(ko, key+4, 32);
708 AddKey<4>(t1, t2, ka);
716 std::memcpy(k, key, 512 / 8);
717 AddConstant<4>(ks, ksc, constant);
718 AddKey<4>(k, t2, ksc);
720 GL256(t1, &m_rkeys[0], ksc);
721 MakeOddKey<4>(&m_rkeys[0], &m_rkeys[4]);
725 AddConstant<4>(ks, ksc, constant);
726 AddKey<4>(k+4, t2, ksc);
728 GL256(t1, &m_rkeys[8], ksc);
729 MakeOddKey<4>(&m_rkeys[8], &m_rkeys[12]);
734 AddConstant<4>(ks, ksc, constant);
735 AddKey<4>(k, t2, ksc);
737 GL256(t1, &m_rkeys[16], ksc);
738 MakeOddKey<4>(&m_rkeys[16], &m_rkeys[20]);
742 AddConstant<4>(ks, ksc, constant);
743 AddKey<4>(k+4, t2, ksc);
745 GL256(t1, &m_rkeys[24], ksc);
746 MakeOddKey<4>(&m_rkeys[24], &m_rkeys[28]);
751 AddConstant<4>(ks, ksc, constant);
752 AddKey<4>(k, t2, ksc);
754 GL256(t1, &m_rkeys[32], ksc);
755 MakeOddKey<4>(&m_rkeys[32], &m_rkeys[36]);
759 AddConstant<4>(ks, ksc, constant);
760 AddKey<4>(k+4, t2, ksc);
762 GL256(t1, &m_rkeys[40], ksc);
763 MakeOddKey<4>(&m_rkeys[40], &m_rkeys[44]);
768 AddConstant<4>(ks, ksc, constant);
769 AddKey<4>(k, t2, ksc);
771 GL256(t1, &m_rkeys[48], ksc);
772 MakeOddKey<4>(&m_rkeys[48], &m_rkeys[52]);
776 AddConstant<4>(ks, ksc, constant);
777 AddKey<4>(k+4, t2, ksc);
779 GL256(t1, &m_rkeys[56], ksc);
780 MakeOddKey<4>(&m_rkeys[56], &m_rkeys[60]);
785 AddConstant<4>(ks, ksc, constant);
786 AddKey<4>(k, t2, ksc);
788 GL256(t1, &m_rkeys[64], ksc);
789 MakeOddKey<4>(&m_rkeys[64], &m_rkeys[68]);
793 AddConstant<4>(ks, ksc, constant);
794 AddKey<4>(k+4, t2, ksc);
796 GL256(t1, &m_rkeys[72], ksc);
798 if (!IsForwardTransformation())
800 IMC256(&m_rkeys[68]);
801 IMC256(&m_rkeys[64]);
802 IMC256(&m_rkeys[60]);
803 IMC256(&m_rkeys[56]);
804 IMC256(&m_rkeys[52]);
805 IMC256(&m_rkeys[48]);
806 IMC256(&m_rkeys[44]);
807 IMC256(&m_rkeys[40]);
808 IMC256(&m_rkeys[36]);
809 IMC256(&m_rkeys[32]);
810 IMC256(&m_rkeys[28]);
811 IMC256(&m_rkeys[24]);
812 IMC256(&m_rkeys[20]);
813 IMC256(&m_rkeys[16]);
814 IMC256(&m_rkeys[12]);
820void Kalyna512::Base::SetKey_88(
const word64 key[8])
822 word64 *ks = m_wspace+0, *ksc = m_wspace+8, *t1 = m_wspace+16;
823 word64 *t2 = m_wspace+24, *k = m_wspace+32;
825 std::memset(t1, 0, 8*8);
826 t1[0] = (512 + 512 + 64) / 64;
828 AddKey<8>(t1, t2, key);
836 std::memcpy(k, key, 512 / 8);
837 AddConstant<8>(ks, ksc, constant);
838 AddKey<8>(k, t2, ksc);
840 GL512(t1, &m_rkeys[0], ksc);
841 MakeOddKey<8>(&m_rkeys[0], &m_rkeys[8]);
846 AddConstant<8>(ks, ksc, constant);
847 AddKey<8>(k, t2, ksc);
849 GL512(t1, &m_rkeys[16], ksc);
850 MakeOddKey<8>(&m_rkeys[16], &m_rkeys[24]);
855 AddConstant<8>(ks, ksc, constant);
856 AddKey<8>(k, t2, ksc);
858 GL512(t1, &m_rkeys[32], ksc);
859 MakeOddKey<8>(&m_rkeys[32], &m_rkeys[40]);
864 AddConstant<8>(ks, ksc, constant);
865 AddKey<8>(k, t2, ksc);
867 GL512(t1, &m_rkeys[48], ksc);
868 MakeOddKey<8>(&m_rkeys[48], &m_rkeys[56]);
873 AddConstant<8>(ks, ksc, constant);
874 AddKey<8>(k, t2, ksc);
876 GL512(t1, &m_rkeys[64], ksc);
877 MakeOddKey<8>(&m_rkeys[64], &m_rkeys[72]);
882 AddConstant<8>(ks, ksc, constant);
883 AddKey<8>(k, t2, ksc);
885 GL512(t1, &m_rkeys[80], ksc);
886 MakeOddKey<8>(&m_rkeys[80], &m_rkeys[88]);
891 AddConstant<8>(ks, ksc, constant);
892 AddKey<8>(k, t2, ksc);
894 GL512(t1, &m_rkeys[96], ksc);
895 MakeOddKey<8>(&m_rkeys[96], &m_rkeys[104]);
900 AddConstant<8>(ks, ksc, constant);
901 AddKey<8>(k, t2, ksc);
903 GL512(t1, &m_rkeys[112], ksc);
904 MakeOddKey<8>(&m_rkeys[112], &m_rkeys[120]);
909 AddConstant<8>(ks, ksc, constant);
910 AddKey<8>(k, t2, ksc);
912 GL512(t1, &m_rkeys[128], ksc);
913 MakeOddKey<8>(&m_rkeys[128], &m_rkeys[136]);
918 AddConstant<8>(ks, ksc, constant);
919 AddKey<8>(k, t2, ksc);
921 GL512(t1, &m_rkeys[144], ksc);
923 if (!IsForwardTransformation())
925 IMC512(&m_rkeys[136]); IMC512(&m_rkeys[128]); IMC512(&m_rkeys[120]); IMC512(&m_rkeys[112]);
926 IMC512(&m_rkeys[104]); IMC512(&m_rkeys[ 96]); IMC512(&m_rkeys[ 88]); IMC512(&m_rkeys[ 80]);
927 IMC512(&m_rkeys[ 72]); IMC512(&m_rkeys[ 64]); IMC512(&m_rkeys[ 56]); IMC512(&m_rkeys[ 48]);
928 IMC512(&m_rkeys[ 40]); IMC512(&m_rkeys[ 32]); IMC512(&m_rkeys[ 24]); IMC512(&m_rkeys[ 16]);
929 IMC512(&m_rkeys[ 8]);
935void Kalyna128::Base::ProcessBlock_22(
const byte* inBlock,
const byte* xorBlock,
byte* outBlock)
const
937 word64 *t1 = m_wspace+0, *t2 = m_wspace+2, *msg = m_wspace+4;
941 InBlock iblk(inBlock);
942 iblk(msg[0])(msg[1]);
944 if (IsForwardTransformation())
946 AddKey<2>(msg, t1, m_rkeys);
947 G128(t1, t2, &m_rkeys[2]);
948 G128(t2, t1, &m_rkeys[4]);
949 G128(t1, t2, &m_rkeys[6]);
950 G128(t2, t1, &m_rkeys[8]);
951 G128(t1, t2, &m_rkeys[10]);
952 G128(t2, t1, &m_rkeys[12]);
953 G128(t1, t2, &m_rkeys[14]);
954 G128(t2, t1, &m_rkeys[16]);
955 G128(t1, t2, &m_rkeys[18]);
956 GL128(t2, t1, &m_rkeys[20]);
960 SubKey<2>(msg, t1, &m_rkeys[20]);
962 IG128(t1, t2, &m_rkeys[18]);
963 IG128(t2, t1, &m_rkeys[16]);
964 IG128(t1, t2, &m_rkeys[14]);
965 IG128(t2, t1, &m_rkeys[12]);
966 IG128(t1, t2, &m_rkeys[10]);
967 IG128(t2, t1, &m_rkeys[8]);
968 IG128(t1, t2, &m_rkeys[6]);
969 IG128(t2, t1, &m_rkeys[4]);
970 IG128(t1, t2, &m_rkeys[2]);
971 IGL128(t2, t1, &m_rkeys[0]);
976 OutBlock oblk(xorBlock, outBlock);
980void Kalyna128::Base::ProcessBlock_24(
const byte *inBlock,
const byte *xorBlock,
byte *outBlock)
const
982 word64 *t1 = m_wspace+0, *t2 = m_wspace+2, *msg = m_wspace+4;
986 InBlock iblk(inBlock);
987 iblk(msg[0])(msg[1]);
989 if (IsForwardTransformation())
991 AddKey<2>(msg, t1, m_rkeys);
992 G128(t1, t2, &m_rkeys[ 2]);
993 G128(t2, t1, &m_rkeys[ 4]);
994 G128(t1, t2, &m_rkeys[ 6]);
995 G128(t2, t1, &m_rkeys[ 8]);
996 G128(t1, t2, &m_rkeys[10]);
997 G128(t2, t1, &m_rkeys[12]);
998 G128(t1, t2, &m_rkeys[14]);
999 G128(t2, t1, &m_rkeys[16]);
1000 G128(t1, t2, &m_rkeys[18]);
1001 G128(t2, t1, &m_rkeys[20]);
1002 G128(t1, t2, &m_rkeys[22]);
1003 G128(t2, t1, &m_rkeys[24]);
1004 G128(t1, t2, &m_rkeys[26]);
1005 GL128(t2, t1, &m_rkeys[28]);
1009 SubKey<2>(msg, t1, &m_rkeys[28]);
1011 IG128(t1, t2, &m_rkeys[26]);
1012 IG128(t2, t1, &m_rkeys[24]);
1013 IG128(t1, t2, &m_rkeys[22]);
1014 IG128(t2, t1, &m_rkeys[20]);
1015 IG128(t1, t2, &m_rkeys[18]);
1016 IG128(t2, t1, &m_rkeys[16]);
1017 IG128(t1, t2, &m_rkeys[14]);
1018 IG128(t2, t1, &m_rkeys[12]);
1019 IG128(t1, t2, &m_rkeys[10]);
1020 IG128(t2, t1, &m_rkeys[8]);
1021 IG128(t1, t2, &m_rkeys[6]);
1022 IG128(t2, t1, &m_rkeys[4]);
1023 IG128(t1, t2, &m_rkeys[2]);
1024 IGL128(t2, t1, &m_rkeys[0]);
1029 OutBlock oblk(xorBlock, outBlock);
1033void Kalyna256::Base::ProcessBlock_44(
const byte *inBlock,
const byte *xorBlock,
byte *outBlock)
const
1035 word64 *t1 = m_wspace+0, *t2 = m_wspace+4, *msg = m_wspace+8;
1039 InBlock iblk(inBlock);
1040 iblk(msg[0])(msg[1])(msg[2])(msg[3]);
1042 if (IsForwardTransformation())
1044 AddKey<4>(msg, t1, m_rkeys);
1045 G256(t1, t2, &m_rkeys[4]);
1046 G256(t2, t1, &m_rkeys[8]);
1047 G256(t1, t2, &m_rkeys[12]);
1048 G256(t2, t1, &m_rkeys[16]);
1049 G256(t1, t2, &m_rkeys[20]);
1050 G256(t2, t1, &m_rkeys[24]);
1051 G256(t1, t2, &m_rkeys[28]);
1052 G256(t2, t1, &m_rkeys[32]);
1053 G256(t1, t2, &m_rkeys[36]);
1054 G256(t2, t1, &m_rkeys[40]);
1055 G256(t1, t2, &m_rkeys[44]);
1056 G256(t2, t1, &m_rkeys[48]);
1057 G256(t1, t2, &m_rkeys[52]);
1058 GL256(t2, t1, &m_rkeys[56]);
1062 SubKey<4>(msg, t1, &m_rkeys[56]);
1064 IG256(t1, t2, &m_rkeys[52]);
1065 IG256(t2, t1, &m_rkeys[48]);
1066 IG256(t1, t2, &m_rkeys[44]);
1067 IG256(t2, t1, &m_rkeys[40]);
1068 IG256(t1, t2, &m_rkeys[36]);
1069 IG256(t2, t1, &m_rkeys[32]);
1070 IG256(t1, t2, &m_rkeys[28]);
1071 IG256(t2, t1, &m_rkeys[24]);
1072 IG256(t1, t2, &m_rkeys[20]);
1073 IG256(t2, t1, &m_rkeys[16]);
1074 IG256(t1, t2, &m_rkeys[12]);
1075 IG256(t2, t1, &m_rkeys[8]);
1076 IG256(t1, t2, &m_rkeys[4]);
1077 IGL256(t2, t1, &m_rkeys[0]);
1082 OutBlock oblk(xorBlock, outBlock);
1083 oblk(t1[0])(t1[1])(t1[2])(t1[3]);
1086void Kalyna256::Base::ProcessBlock_48(
const byte *inBlock,
const byte *xorBlock,
byte *outBlock)
const
1088 word64 *t1 = m_wspace+0, *t2 = m_wspace+4, *msg = m_wspace+8;
1092 InBlock iblk(inBlock);
1093 iblk(msg[0])(msg[1])(msg[2])(msg[3]);
1095 if (IsForwardTransformation())
1097 AddKey<4>(msg, t1, m_rkeys);
1098 G256(t1, t2, &m_rkeys[4]);
1099 G256(t2, t1, &m_rkeys[8]);
1100 G256(t1, t2, &m_rkeys[12]);
1101 G256(t2, t1, &m_rkeys[16]);
1102 G256(t1, t2, &m_rkeys[20]);
1103 G256(t2, t1, &m_rkeys[24]);
1104 G256(t1, t2, &m_rkeys[28]);
1105 G256(t2, t1, &m_rkeys[32]);
1106 G256(t1, t2, &m_rkeys[36]);
1107 G256(t2, t1, &m_rkeys[40]);
1108 G256(t1, t2, &m_rkeys[44]);
1109 G256(t2, t1, &m_rkeys[48]);
1110 G256(t1, t2, &m_rkeys[52]);
1111 G256(t2, t1, &m_rkeys[56]);
1112 G256(t1, t2, &m_rkeys[60]);
1113 G256(t2, t1, &m_rkeys[64]);
1114 G256(t1, t2, &m_rkeys[68]);
1115 GL256(t2, t1, &m_rkeys[72]);
1119 SubKey<4>(msg, t1, &m_rkeys[72]);
1121 IG256(t1, t2, &m_rkeys[68]);
1122 IG256(t2, t1, &m_rkeys[64]);
1123 IG256(t1, t2, &m_rkeys[60]);
1124 IG256(t2, t1, &m_rkeys[56]);
1125 IG256(t1, t2, &m_rkeys[52]);
1126 IG256(t2, t1, &m_rkeys[48]);
1127 IG256(t1, t2, &m_rkeys[44]);
1128 IG256(t2, t1, &m_rkeys[40]);
1129 IG256(t1, t2, &m_rkeys[36]);
1130 IG256(t2, t1, &m_rkeys[32]);
1131 IG256(t1, t2, &m_rkeys[28]);
1132 IG256(t2, t1, &m_rkeys[24]);
1133 IG256(t1, t2, &m_rkeys[20]);
1134 IG256(t2, t1, &m_rkeys[16]);
1135 IG256(t1, t2, &m_rkeys[12]);
1136 IG256(t2, t1, &m_rkeys[8]);
1137 IG256(t1, t2, &m_rkeys[4]);
1138 IGL256(t2, t1, &m_rkeys[0]);
1143 OutBlock oblk(xorBlock, outBlock);
1144 oblk(t1[0])(t1[1])(t1[2])(t1[3]);
1147void Kalyna512::Base::ProcessBlock_88(
const byte *inBlock,
const byte *xorBlock,
byte *outBlock)
const
1149 word64 *t1 = m_wspace+0, *t2 = m_wspace+8, *msg = m_wspace+16;
1153 InBlock iblk(inBlock);
1154 iblk(msg[0])(msg[1])(msg[2])(msg[3])(msg[4])(msg[5])(msg[6])(msg[7]);
1156 if (IsForwardTransformation())
1158 AddKey<8>(msg, t1, m_rkeys);
1159 G512(t1, t2, &m_rkeys[8]);
1160 G512(t2, t1, &m_rkeys[16]);
1161 G512(t1, t2, &m_rkeys[24]);
1162 G512(t2, t1, &m_rkeys[32]);
1163 G512(t1, t2, &m_rkeys[40]);
1164 G512(t2, t1, &m_rkeys[48]);
1165 G512(t1, t2, &m_rkeys[56]);
1166 G512(t2, t1, &m_rkeys[64]);
1167 G512(t1, t2, &m_rkeys[72]);
1168 G512(t2, t1, &m_rkeys[80]);
1169 G512(t1, t2, &m_rkeys[88]);
1170 G512(t2, t1, &m_rkeys[96]);
1171 G512(t1, t2, &m_rkeys[104]);
1172 G512(t2, t1, &m_rkeys[112]);
1173 G512(t1, t2, &m_rkeys[120]);
1174 G512(t2, t1, &m_rkeys[128]);
1175 G512(t1, t2, &m_rkeys[136]);
1176 GL512(t2, t1, &m_rkeys[144]);
1180 SubKey<8>(msg, t1, &m_rkeys[144]);
1182 IG512(t1, t2, &m_rkeys[136]);
1183 IG512(t2, t1, &m_rkeys[128]);
1184 IG512(t1, t2, &m_rkeys[120]);
1185 IG512(t2, t1, &m_rkeys[112]);
1186 IG512(t1, t2, &m_rkeys[104]);
1187 IG512(t2, t1, &m_rkeys[96]);
1188 IG512(t1, t2, &m_rkeys[88]);
1189 IG512(t2, t1, &m_rkeys[80]);
1190 IG512(t1, t2, &m_rkeys[72]);
1191 IG512(t2, t1, &m_rkeys[64]);
1192 IG512(t1, t2, &m_rkeys[56]);
1193 IG512(t2, t1, &m_rkeys[48]);
1194 IG512(t1, t2, &m_rkeys[40]);
1195 IG512(t2, t1, &m_rkeys[32]);
1196 IG512(t1, t2, &m_rkeys[24]);
1197 IG512(t2, t1, &m_rkeys[16]);
1198 IG512(t1, t2, &m_rkeys[8]);
1199 IGL512(t2, t1, &m_rkeys[0]);
1204 OutBlock oblk(xorBlock, outBlock);
1205 oblk(t1[0])(t1[1])(t1[2])(t1[3])(t1[4])(t1[5])(t1[6])(t1[7]);
1210void Kalyna128::Base::UncheckedSetKey(
const byte *key,
unsigned int keylen,
const NameValuePairs ¶ms)
1212 CRYPTOPP_UNUSED(params);
1213 m_nb =
static_cast<unsigned int>(16U /
sizeof(
word64));
1214 m_nk =
static_cast<unsigned int>(keylen /
sizeof(
word64));
1225 SetKey_22(m_mkey.begin());
1231 m_wspace.New(6*2+4);
1234 SetKey_24(m_mkey.begin());
1241void Kalyna128::Base::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock,
byte *outBlock)
const
1244 const int cacheLineSize = GetCacheLineSize();
1248 const byte* p =
reinterpret_cast<const byte*
>(KalynaTab::S);
1249 for (
unsigned int i=0; i<256; i+=cacheLineSize)
1250 u ^= *
reinterpret_cast<const word64*
>(p+i);
1253 switch ((m_nb << 8) | m_nk)
1256 ProcessBlock_22(inBlock, xorBlock, outBlock);
1259 ProcessBlock_24(inBlock, xorBlock, outBlock);
1266void Kalyna256::Base::UncheckedSetKey(
const byte *key,
unsigned int keylen,
const NameValuePairs ¶ms)
1268 CRYPTOPP_UNUSED(params);
1269 m_nb =
static_cast<unsigned int>(32U /
sizeof(
word64));
1270 m_nk =
static_cast<unsigned int>(keylen /
sizeof(
word64));
1281 SetKey_44(m_mkey.begin());
1287 m_wspace.New(6*4+8);
1290 SetKey_48(m_mkey.begin());
1297void Kalyna256::Base::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock,
byte *outBlock)
const
1300 const int cacheLineSize = GetCacheLineSize();
1304 const byte* p =
reinterpret_cast<const byte*
>(KalynaTab::S);
1305 for (
unsigned int i=0; i<256; i+=cacheLineSize)
1306 u ^= *
reinterpret_cast<const word64*
>(p+i);
1309 switch ((m_nb << 8) | m_nk)
1312 ProcessBlock_44(inBlock, xorBlock, outBlock);
1315 ProcessBlock_48(inBlock, xorBlock, outBlock);
1322void Kalyna512::Base::UncheckedSetKey(
const byte *key,
unsigned int keylen,
const NameValuePairs ¶ms)
1324 CRYPTOPP_UNUSED(params);
1325 m_nb =
static_cast<unsigned int>(64U /
sizeof(
word64));
1326 m_nk =
static_cast<unsigned int>(keylen /
sizeof(
word64));
1332 m_nb =
static_cast<unsigned int>(64U /
sizeof(
word64));
1333 m_nk =
static_cast<unsigned int>(keylen /
sizeof(
word64));
1340 SetKey_88(m_mkey.begin());
1347void Kalyna512::Base::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock,
byte *outBlock)
const
1350 const int cacheLineSize = GetCacheLineSize();
1354 const byte* p =
reinterpret_cast<const byte*
>(KalynaTab::S);
1355 for (
unsigned int i=0; i<256; i+=cacheLineSize)
1356 u ^= *
reinterpret_cast<const word64*
>(p+i);
1359 ProcessBlock_88(inBlock, xorBlock, outBlock);
Standard names for retrieving values by name when working with NameValuePairs.
Access a block of memory.
Interface for retrieving values given their names.
Access a block of memory.
Library configuration file.
unsigned char byte
8-bit unsigned datatype
#define W64LIT(x)
Declare an unsigned word64.
unsigned long long word64
64-bit unsigned datatype
Functions for CPU features and intrinsics.
@ LITTLE_ENDIAN_ORDER
byte order is little-endian
Classes for the Kalyna block cipher.
Utility functions for the Crypto++ library.
void GetUserKey(ByteOrder order, T *out, size_t outlen, const byte *in, size_t inlen)
Copy bytes in a buffer to an array of elements in big-endian order.
Crypto++ library namespace.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.