7#include <botan/internal/serpent.h>
9#include <botan/internal/serpent_sbox.h>
10#include <botan/internal/simd_avx2.h>
15#if defined(__GNUG__) && !defined(__clang__) && (__GNUG__ < 13)
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>(); \
51void BOTAN_FN_ISA_AVX2 Serpent::avx2_encrypt_8(
const uint8_t in[128], uint8_t out[128])
const {
52 using namespace Botan::Serpent_F;
63 const Key_Inserter key_xor(m_round_key.data());
65 key_xor(0, B0, B1, B2, B3);
68 key_xor(1, B0, B1, B2, B3);
71 key_xor(2, B0, B1, B2, B3);
74 key_xor(3, B0, B1, B2, B3);
77 key_xor(4, B0, B1, B2, B3);
80 key_xor(5, B0, B1, B2, B3);
83 key_xor(6, B0, B1, B2, B3);
86 key_xor(7, B0, B1, B2, B3);
90 key_xor(8, B0, B1, B2, B3);
93 key_xor(9, B0, B1, B2, B3);
96 key_xor(10, B0, B1, B2, B3);
99 key_xor(11, B0, B1, B2, B3);
102 key_xor(12, B0, B1, B2, B3);
105 key_xor(13, B0, B1, B2, B3);
108 key_xor(14, B0, B1, B2, B3);
111 key_xor(15, B0, B1, B2, B3);
115 key_xor(16, B0, B1, B2, B3);
118 key_xor(17, B0, B1, B2, B3);
121 key_xor(18, B0, B1, B2, B3);
124 key_xor(19, B0, B1, B2, B3);
127 key_xor(20, B0, B1, B2, B3);
130 key_xor(21, B0, B1, B2, B3);
133 key_xor(22, B0, B1, B2, B3);
136 key_xor(23, B0, B1, B2, B3);
140 key_xor(24, B0, B1, B2, B3);
143 key_xor(25, B0, B1, B2, B3);
146 key_xor(26, B0, B1, B2, B3);
149 key_xor(27, B0, B1, B2, B3);
152 key_xor(28, B0, B1, B2, B3);
155 key_xor(29, B0, B1, B2, B3);
158 key_xor(30, B0, B1, B2, B3);
161 key_xor(31, B0, B1, B2, B3);
163 key_xor(32, B0, B1, B2, B3);
174void BOTAN_FN_ISA_AVX2 Serpent::avx2_decrypt_8(
const uint8_t in[128], uint8_t out[128])
const {
175 using namespace Botan::Serpent_F;
186 const Key_Inserter key_xor(m_round_key.data());
188 key_xor(32, B0, B1, B2, B3);
190 key_xor(31, B0, B1, B2, B3);
193 key_xor(30, B0, B1, B2, B3);
196 key_xor(29, B0, B1, B2, B3);
199 key_xor(28, B0, B1, B2, B3);
202 key_xor(27, B0, B1, B2, B3);
205 key_xor(26, B0, B1, B2, B3);
208 key_xor(25, B0, B1, B2, B3);
211 key_xor(24, B0, B1, B2, B3);
215 key_xor(23, B0, B1, B2, B3);
218 key_xor(22, B0, B1, B2, B3);
221 key_xor(21, B0, B1, B2, B3);
224 key_xor(20, B0, B1, B2, B3);
227 key_xor(19, B0, B1, B2, B3);
230 key_xor(18, B0, B1, B2, B3);
233 key_xor(17, B0, B1, B2, B3);
236 key_xor(16, B0, B1, B2, B3);
240 key_xor(15, B0, B1, B2, B3);
243 key_xor(14, B0, B1, B2, B3);
246 key_xor(13, B0, B1, B2, B3);
249 key_xor(12, B0, B1, B2, B3);
252 key_xor(11, B0, B1, B2, B3);
255 key_xor(10, B0, B1, B2, B3);
258 key_xor(9, B0, B1, B2, B3);
261 key_xor(8, B0, B1, B2, B3);
265 key_xor(7, B0, B1, B2, B3);
268 key_xor(6, B0, B1, B2, B3);
271 key_xor(5, B0, B1, B2, B3);
274 key_xor(4, B0, B1, B2, B3);
277 key_xor(3, B0, B1, B2, B3);
280 key_xor(2, B0, B1, B2, B3);
283 key_xor(1, B0, B1, B2, B3);
286 key_xor(0, B0, B1, B2, B3);
static BOTAN_FN_ISA_AVX2 void reset_registers() noexcept
static BOTAN_FN_ISA_AVX2 SIMD_8x32 load_le(const uint8_t *in) noexcept
static BOTAN_FN_ISA_AVX2 void transpose(SIMD_8x32 &B0, SIMD_8x32 &B1, SIMD_8x32 &B2, SIMD_8x32 &B3) noexcept
static BOTAN_FN_ISA_AVX2 void zero_registers() noexcept
BOTAN_FN_ISA_AVX2 void store_le(uint8_t out[]) const noexcept
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)