7#include <botan/internal/serpent.h>
9#include <botan/internal/serpent_fn.h>
10#include <botan/internal/simd_avx512.h>
15#if defined(__GNUG__) && !defined(__clang__) && (__GNUG__ < 14)
21 #define transform(B0, B1, B2, B3) \
26 B3 ^= B2 ^ B0.shl<3>(); \
30 B2 ^= B3 ^ B1.shl<7>(); \
35 #define i_transform(B0, B1, B2, B3) \
39 B2 ^= B3 ^ B1.shl<7>(); \
43 B3 ^= B2 ^ B0.shl<3>(); \
306void BOTAN_FN_ISA_AVX512 Serpent::avx512_encrypt_16(
const uint8_t in[16 * 16], uint8_t out[16 * 16])
const {
307 using namespace Botan::Serpent_F;
316 const Key_Inserter key_xor(m_round_key.data());
318 key_xor(0, B0, B1, B2, B3);
321 key_xor(1, B0, B1, B2, B3);
324 key_xor(2, B0, B1, B2, B3);
327 key_xor(3, B0, B1, B2, B3);
330 key_xor(4, B0, B1, B2, B3);
333 key_xor(5, B0, B1, B2, B3);
336 key_xor(6, B0, B1, B2, B3);
339 key_xor(7, B0, B1, B2, B3);
343 key_xor(8, B0, B1, B2, B3);
346 key_xor(9, B0, B1, B2, B3);
349 key_xor(10, B0, B1, B2, B3);
352 key_xor(11, B0, B1, B2, B3);
355 key_xor(12, B0, B1, B2, B3);
358 key_xor(13, B0, B1, B2, B3);
361 key_xor(14, B0, B1, B2, B3);
364 key_xor(15, B0, B1, B2, B3);
368 key_xor(16, B0, B1, B2, B3);
371 key_xor(17, B0, B1, B2, B3);
374 key_xor(18, B0, B1, B2, B3);
377 key_xor(19, B0, B1, B2, B3);
380 key_xor(20, B0, B1, B2, B3);
383 key_xor(21, B0, B1, B2, B3);
386 key_xor(22, B0, B1, B2, B3);
389 key_xor(23, B0, B1, B2, B3);
393 key_xor(24, B0, B1, B2, B3);
396 key_xor(25, B0, B1, B2, B3);
399 key_xor(26, B0, B1, B2, B3);
402 key_xor(27, B0, B1, B2, B3);
405 key_xor(28, B0, B1, B2, B3);
408 key_xor(29, B0, B1, B2, B3);
411 key_xor(30, B0, B1, B2, B3);
414 key_xor(31, B0, B1, B2, B3);
416 key_xor(32, B0, B1, B2, B3);
427void BOTAN_FN_ISA_AVX512 Serpent::avx512_decrypt_16(
const uint8_t in[16 * 16], uint8_t out[16 * 16])
const {
428 using namespace Botan::Serpent_F;
437 const Key_Inserter key_xor(m_round_key.data());
439 key_xor(32, B0, B1, B2, B3);
441 key_xor(31, B0, B1, B2, B3);
444 key_xor(30, B0, B1, B2, B3);
447 key_xor(29, B0, B1, B2, B3);
450 key_xor(28, B0, B1, B2, B3);
453 key_xor(27, B0, B1, B2, B3);
456 key_xor(26, B0, B1, B2, B3);
459 key_xor(25, B0, B1, B2, B3);
462 key_xor(24, B0, B1, B2, B3);
466 key_xor(23, B0, B1, B2, B3);
469 key_xor(22, B0, B1, B2, B3);
472 key_xor(21, B0, B1, B2, B3);
475 key_xor(20, B0, B1, B2, B3);
478 key_xor(19, B0, B1, B2, B3);
481 key_xor(18, B0, B1, B2, B3);
484 key_xor(17, B0, B1, B2, B3);
487 key_xor(16, B0, B1, B2, B3);
491 key_xor(15, B0, B1, B2, B3);
494 key_xor(14, B0, B1, B2, B3);
497 key_xor(13, B0, B1, B2, B3);
500 key_xor(12, B0, B1, B2, B3);
503 key_xor(11, B0, B1, B2, B3);
506 key_xor(10, B0, B1, B2, B3);
509 key_xor(9, B0, B1, B2, B3);
512 key_xor(8, B0, B1, B2, B3);
516 key_xor(7, B0, B1, B2, B3);
519 key_xor(6, B0, B1, B2, B3);
522 key_xor(5, B0, B1, B2, B3);
525 key_xor(4, B0, B1, B2, B3);
528 key_xor(3, B0, B1, B2, B3);
531 key_xor(2, B0, B1, B2, B3);
534 key_xor(1, B0, B1, B2, B3);
537 key_xor(0, B0, B1, B2, B3);
static BOTAN_FN_ISA_AVX512 void transpose(SIMD_16x32 &B0, SIMD_16x32 &B1, SIMD_16x32 &B2, SIMD_16x32 &B3)
BOTAN_FN_ISA_AVX512 void store_le(uint8_t out[]) const
static BOTAN_FN_ISA_AVX512 SIMD_16x32 ternary_fn(const SIMD_16x32 &a, const SIMD_16x32 &b, const SIMD_16x32 &c)
static BOTAN_FN_ISA_AVX512 SIMD_16x32 load_le(const uint8_t *in)
static BOTAN_FN_ISA_AVX512 void zero_registers()
#define BOTAN_FORCE_INLINE
BOTAN_FORCE_INLINE void transform(T &B0, T &B1, T &B2, T &B3)
BOTAN_FORCE_INLINE void SBoxD5(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD4(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE0(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE1(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE3(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD0(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE5(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD6(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD3(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void i_transform(T &B0, T &B1, T &B2, T &B3)
BOTAN_FORCE_INLINE void SBoxD2(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE6(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE2(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE4(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD1(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE7(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD7(T &a, T &b, T &c, T &d)