8 #include <botan/serpent.h>
9 #include <botan/internal/serpent_sbox.h>
10 #include <botan/internal/simd_32.h>
16 #define key_xor(round, B0, B1, B2, B3) \
18 B0 ^= SIMD_32::splat(m_round_key[4*round ]); \
19 B1 ^= SIMD_32::splat(m_round_key[4*round+1]); \
20 B2 ^= SIMD_32::splat(m_round_key[4*round+2]); \
21 B3 ^= SIMD_32::splat(m_round_key[4*round+3]); \
27 #define transform(B0, B1, B2, B3) \
32 B3 ^= B2 ^ (B0 << 3); \
36 B2 ^= B3 ^ (B1 << 7); \
41 #define i_transform(B0, B1, B2, B3) \
43 B2.rotate_right(22); \
45 B2 ^= B3 ^ (B1 << 7); \
49 B3 ^= B2 ^ (B0 << 3); \
52 B0.rotate_right(13); \
69 key_xor( 0,B0,B1,B2,B3);
SBoxE1(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
70 key_xor( 1,B0,B1,B2,B3);
SBoxE2(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
71 key_xor( 2,B0,B1,B2,B3);
SBoxE3(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
72 key_xor( 3,B0,B1,B2,B3);
SBoxE4(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
73 key_xor( 4,B0,B1,B2,B3);
SBoxE5(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
74 key_xor( 5,B0,B1,B2,B3);
SBoxE6(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
75 key_xor( 6,B0,B1,B2,B3);
SBoxE7(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
76 key_xor( 7,B0,B1,B2,B3);
SBoxE8(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
78 key_xor( 8,B0,B1,B2,B3);
SBoxE1(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
79 key_xor( 9,B0,B1,B2,B3);
SBoxE2(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
80 key_xor(10,B0,B1,B2,B3);
SBoxE3(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
81 key_xor(11,B0,B1,B2,B3);
SBoxE4(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
82 key_xor(12,B0,B1,B2,B3);
SBoxE5(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
83 key_xor(13,B0,B1,B2,B3);
SBoxE6(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
84 key_xor(14,B0,B1,B2,B3);
SBoxE7(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
85 key_xor(15,B0,B1,B2,B3);
SBoxE8(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
87 key_xor(16,B0,B1,B2,B3);
SBoxE1(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
88 key_xor(17,B0,B1,B2,B3);
SBoxE2(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
89 key_xor(18,B0,B1,B2,B3);
SBoxE3(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
90 key_xor(19,B0,B1,B2,B3);
SBoxE4(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
91 key_xor(20,B0,B1,B2,B3);
SBoxE5(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
92 key_xor(21,B0,B1,B2,B3);
SBoxE6(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
93 key_xor(22,B0,B1,B2,B3);
SBoxE7(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
94 key_xor(23,B0,B1,B2,B3);
SBoxE8(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
96 key_xor(24,B0,B1,B2,B3);
SBoxE1(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
97 key_xor(25,B0,B1,B2,B3);
SBoxE2(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
98 key_xor(26,B0,B1,B2,B3);
SBoxE3(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
99 key_xor(27,B0,B1,B2,B3);
SBoxE4(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
100 key_xor(28,B0,B1,B2,B3);
SBoxE5(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
101 key_xor(29,B0,B1,B2,B3);
SBoxE6(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
102 key_xor(30,B0,B1,B2,B3);
SBoxE7(B0,B1,B2,B3);
transform(B0,B1,B2,B3);
103 key_xor(31,B0,B1,B2,B3);
SBoxE8(B0,B1,B2,B3);
key_xor(32,B0,B1,B2,B3);
125 key_xor(32,B0,B1,B2,B3);
SBoxD8(B0,B1,B2,B3);
key_xor(31,B0,B1,B2,B3);
126 i_transform(B0,B1,B2,B3);
SBoxD7(B0,B1,B2,B3);
key_xor(30,B0,B1,B2,B3);
127 i_transform(B0,B1,B2,B3);
SBoxD6(B0,B1,B2,B3);
key_xor(29,B0,B1,B2,B3);
128 i_transform(B0,B1,B2,B3);
SBoxD5(B0,B1,B2,B3);
key_xor(28,B0,B1,B2,B3);
129 i_transform(B0,B1,B2,B3);
SBoxD4(B0,B1,B2,B3);
key_xor(27,B0,B1,B2,B3);
130 i_transform(B0,B1,B2,B3);
SBoxD3(B0,B1,B2,B3);
key_xor(26,B0,B1,B2,B3);
131 i_transform(B0,B1,B2,B3);
SBoxD2(B0,B1,B2,B3);
key_xor(25,B0,B1,B2,B3);
132 i_transform(B0,B1,B2,B3);
SBoxD1(B0,B1,B2,B3);
key_xor(24,B0,B1,B2,B3);
134 i_transform(B0,B1,B2,B3);
SBoxD8(B0,B1,B2,B3);
key_xor(23,B0,B1,B2,B3);
135 i_transform(B0,B1,B2,B3);
SBoxD7(B0,B1,B2,B3);
key_xor(22,B0,B1,B2,B3);
136 i_transform(B0,B1,B2,B3);
SBoxD6(B0,B1,B2,B3);
key_xor(21,B0,B1,B2,B3);
137 i_transform(B0,B1,B2,B3);
SBoxD5(B0,B1,B2,B3);
key_xor(20,B0,B1,B2,B3);
138 i_transform(B0,B1,B2,B3);
SBoxD4(B0,B1,B2,B3);
key_xor(19,B0,B1,B2,B3);
139 i_transform(B0,B1,B2,B3);
SBoxD3(B0,B1,B2,B3);
key_xor(18,B0,B1,B2,B3);
140 i_transform(B0,B1,B2,B3);
SBoxD2(B0,B1,B2,B3);
key_xor(17,B0,B1,B2,B3);
141 i_transform(B0,B1,B2,B3);
SBoxD1(B0,B1,B2,B3);
key_xor(16,B0,B1,B2,B3);
143 i_transform(B0,B1,B2,B3);
SBoxD8(B0,B1,B2,B3);
key_xor(15,B0,B1,B2,B3);
144 i_transform(B0,B1,B2,B3);
SBoxD7(B0,B1,B2,B3);
key_xor(14,B0,B1,B2,B3);
145 i_transform(B0,B1,B2,B3);
SBoxD6(B0,B1,B2,B3);
key_xor(13,B0,B1,B2,B3);
146 i_transform(B0,B1,B2,B3);
SBoxD5(B0,B1,B2,B3);
key_xor(12,B0,B1,B2,B3);
147 i_transform(B0,B1,B2,B3);
SBoxD4(B0,B1,B2,B3);
key_xor(11,B0,B1,B2,B3);
148 i_transform(B0,B1,B2,B3);
SBoxD3(B0,B1,B2,B3);
key_xor(10,B0,B1,B2,B3);
149 i_transform(B0,B1,B2,B3);
SBoxD2(B0,B1,B2,B3);
key_xor( 9,B0,B1,B2,B3);
150 i_transform(B0,B1,B2,B3);
SBoxD1(B0,B1,B2,B3);
key_xor( 8,B0,B1,B2,B3);
152 i_transform(B0,B1,B2,B3);
SBoxD8(B0,B1,B2,B3);
key_xor( 7,B0,B1,B2,B3);
153 i_transform(B0,B1,B2,B3);
SBoxD7(B0,B1,B2,B3);
key_xor( 6,B0,B1,B2,B3);
154 i_transform(B0,B1,B2,B3);
SBoxD6(B0,B1,B2,B3);
key_xor( 5,B0,B1,B2,B3);
155 i_transform(B0,B1,B2,B3);
SBoxD5(B0,B1,B2,B3);
key_xor( 4,B0,B1,B2,B3);
156 i_transform(B0,B1,B2,B3);
SBoxD4(B0,B1,B2,B3);
key_xor( 3,B0,B1,B2,B3);
157 i_transform(B0,B1,B2,B3);
SBoxD3(B0,B1,B2,B3);
key_xor( 2,B0,B1,B2,B3);
158 i_transform(B0,B1,B2,B3);
SBoxD2(B0,B1,B2,B3);
key_xor( 1,B0,B1,B2,B3);
159 i_transform(B0,B1,B2,B3);
SBoxD1(B0,B1,B2,B3);
key_xor( 0,B0,B1,B2,B3);
#define i_transform(B0, B1, B2, B3)
#define SBoxE5(B0, B1, B2, B3)
#define SBoxD4(B0, B1, B2, B3)
static SIMD_4x32 load_le(const void *in)
#define SBoxE1(B0, B1, B2, B3)
#define SBoxD2(B0, B1, B2, B3)
#define SBoxD6(B0, B1, B2, B3)
#define key_xor(round, B0, B1, B2, B3)
void simd_encrypt_4(const uint8_t in[64], uint8_t out[64]) const
static void transpose(SIMD_4x32 &B0, SIMD_4x32 &B1, SIMD_4x32 &B2, SIMD_4x32 &B3)
#define SBoxE2(B0, B1, B2, B3)
#define SBoxE6(B0, B1, B2, B3)
#define SBoxE7(B0, B1, B2, B3)
#define SBoxE3(B0, B1, B2, B3)
void store_le(uint8_t out[]) const
#define SBoxD1(B0, B1, B2, B3)
void simd_decrypt_4(const uint8_t in[64], uint8_t out[64]) const
#define SBoxD3(B0, B1, B2, B3)
#define SBoxE4(B0, B1, B2, B3)
#define SBoxD8(B0, B1, B2, B3)
#define SBoxE8(B0, B1, B2, B3)
#define SBoxD7(B0, B1, B2, B3)
#define transform(B0, B1, B2, B3)
#define SBoxD5(B0, B1, B2, B3)