8 #include <botan/serp_simd.h>     9 #include <botan/internal/simd_32.h>    10 #include <botan/loadstor.h>    16 #define SBoxE1(B0, B1, B2, B3)                    \    41 #define SBoxE2(B0, B1, B2, B3)                    \    67 #define SBoxE3(B0, B1, B2, B3)                    \    90 #define SBoxE4(B0, B1, B2, B3)                    \   116 #define SBoxE5(B0, B1, B2, B3)                    \   143 #define SBoxE6(B0, B1, B2, B3)                    \   170 #define SBoxE7(B0, B1, B2, B3)                    \   193 #define SBoxE8(B0, B1, B2, B3)                    \   221 #define SBoxD1(B0, B1, B2, B3)                    \   246 #define SBoxD2(B0, B1, B2, B3)                    \   274 #define SBoxD3(B0, B1, B2, B3)                    \   299 #define SBoxD4(B0, B1, B2, B3)                    \   325 #define SBoxD5(B0, B1, B2, B3)                    \   351 #define SBoxD6(B0, B1, B2, B3)                    \   379 #define SBoxD7(B0, B1, B2, B3)                    \   403 #define SBoxD8(B0, B1, B2, B3)                    \   430 #define key_xor(round, B0, B1, B2, B3)                             \   432       B0 ^= SIMD_32(keys[4*round  ]);                              \   433       B1 ^= SIMD_32(keys[4*round+1]);                              \   434       B2 ^= SIMD_32(keys[4*round+2]);                              \   435       B3 ^= SIMD_32(keys[4*round+3]);                              \   441 #define transform(B0, B1, B2, B3)                                  \   443       B0.rotate_left(13);                                          \   446       B3 ^= B2 ^ (B0 << 3);                                        \   450       B2 ^= B3 ^ (B1 << 7);                                        \   452       B2.rotate_left(22);                                          \   455 #define i_transform(B0, B1, B2, B3)                                \   457       B2.rotate_right(22);                                         \   458       B0.rotate_right(5);                                          \   459       B2 ^= B3 ^ (B1 << 7);                                        \   461       B3.rotate_right(7);                                          \   462       B1.rotate_right(1);                                          \   463       B3 ^= B2 ^ (B0 << 3);                                        \   465       B2.rotate_right(3);                                          \   466       B0.rotate_right(13);                                         \   472 void serpent_encrypt_4(
const byte in[64],
   481    SIMD_32::transpose(B0, B1, B2, B3);
   483    key_xor( 0,B0,B1,B2,B3); 
SBoxE1(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   484    key_xor( 1,B0,B1,B2,B3); 
SBoxE2(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   485    key_xor( 2,B0,B1,B2,B3); 
SBoxE3(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   486    key_xor( 3,B0,B1,B2,B3); 
SBoxE4(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   487    key_xor( 4,B0,B1,B2,B3); 
SBoxE5(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   488    key_xor( 5,B0,B1,B2,B3); 
SBoxE6(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   489    key_xor( 6,B0,B1,B2,B3); 
SBoxE7(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   490    key_xor( 7,B0,B1,B2,B3); 
SBoxE8(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   492    key_xor( 8,B0,B1,B2,B3); 
SBoxE1(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   493    key_xor( 9,B0,B1,B2,B3); 
SBoxE2(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   494    key_xor(10,B0,B1,B2,B3); 
SBoxE3(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   495    key_xor(11,B0,B1,B2,B3); 
SBoxE4(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   496    key_xor(12,B0,B1,B2,B3); 
SBoxE5(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   497    key_xor(13,B0,B1,B2,B3); 
SBoxE6(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   498    key_xor(14,B0,B1,B2,B3); 
SBoxE7(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   499    key_xor(15,B0,B1,B2,B3); 
SBoxE8(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   501    key_xor(16,B0,B1,B2,B3); 
SBoxE1(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   502    key_xor(17,B0,B1,B2,B3); 
SBoxE2(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   503    key_xor(18,B0,B1,B2,B3); 
SBoxE3(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   504    key_xor(19,B0,B1,B2,B3); 
SBoxE4(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   505    key_xor(20,B0,B1,B2,B3); 
SBoxE5(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   506    key_xor(21,B0,B1,B2,B3); 
SBoxE6(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   507    key_xor(22,B0,B1,B2,B3); 
SBoxE7(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   508    key_xor(23,B0,B1,B2,B3); 
SBoxE8(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   510    key_xor(24,B0,B1,B2,B3); 
SBoxE1(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   511    key_xor(25,B0,B1,B2,B3); 
SBoxE2(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   512    key_xor(26,B0,B1,B2,B3); 
SBoxE3(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   513    key_xor(27,B0,B1,B2,B3); 
SBoxE4(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   514    key_xor(28,B0,B1,B2,B3); 
SBoxE5(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   515    key_xor(29,B0,B1,B2,B3); 
SBoxE6(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   516    key_xor(30,B0,B1,B2,B3); 
SBoxE7(B0,B1,B2,B3); 
transform(B0,B1,B2,B3);
   517    key_xor(31,B0,B1,B2,B3); 
SBoxE8(B0,B1,B2,B3); 
key_xor(32,B0,B1,B2,B3);
   519    SIMD_32::transpose(B0, B1, B2, B3);
   522    B1.store_le(out + 16);
   523    B2.store_le(out + 32);
   524    B3.store_le(out + 48);
   530 void serpent_decrypt_4(
const byte in[64],
   539    SIMD_32::transpose(B0, B1, B2, B3);
   541    key_xor(32,B0,B1,B2,B3);  
SBoxD8(B0,B1,B2,B3); 
key_xor(31,B0,B1,B2,B3);
   542    i_transform(B0,B1,B2,B3); 
SBoxD7(B0,B1,B2,B3); 
key_xor(30,B0,B1,B2,B3);
   543    i_transform(B0,B1,B2,B3); 
SBoxD6(B0,B1,B2,B3); 
key_xor(29,B0,B1,B2,B3);
   544    i_transform(B0,B1,B2,B3); 
SBoxD5(B0,B1,B2,B3); 
key_xor(28,B0,B1,B2,B3);
   545    i_transform(B0,B1,B2,B3); 
SBoxD4(B0,B1,B2,B3); 
key_xor(27,B0,B1,B2,B3);
   546    i_transform(B0,B1,B2,B3); 
SBoxD3(B0,B1,B2,B3); 
key_xor(26,B0,B1,B2,B3);
   547    i_transform(B0,B1,B2,B3); 
SBoxD2(B0,B1,B2,B3); 
key_xor(25,B0,B1,B2,B3);
   548    i_transform(B0,B1,B2,B3); 
SBoxD1(B0,B1,B2,B3); 
key_xor(24,B0,B1,B2,B3);
   550    i_transform(B0,B1,B2,B3); 
SBoxD8(B0,B1,B2,B3); 
key_xor(23,B0,B1,B2,B3);
   551    i_transform(B0,B1,B2,B3); 
SBoxD7(B0,B1,B2,B3); 
key_xor(22,B0,B1,B2,B3);
   552    i_transform(B0,B1,B2,B3); 
SBoxD6(B0,B1,B2,B3); 
key_xor(21,B0,B1,B2,B3);
   553    i_transform(B0,B1,B2,B3); 
SBoxD5(B0,B1,B2,B3); 
key_xor(20,B0,B1,B2,B3);
   554    i_transform(B0,B1,B2,B3); 
SBoxD4(B0,B1,B2,B3); 
key_xor(19,B0,B1,B2,B3);
   555    i_transform(B0,B1,B2,B3); 
SBoxD3(B0,B1,B2,B3); 
key_xor(18,B0,B1,B2,B3);
   556    i_transform(B0,B1,B2,B3); 
SBoxD2(B0,B1,B2,B3); 
key_xor(17,B0,B1,B2,B3);
   557    i_transform(B0,B1,B2,B3); 
SBoxD1(B0,B1,B2,B3); 
key_xor(16,B0,B1,B2,B3);
   559    i_transform(B0,B1,B2,B3); 
SBoxD8(B0,B1,B2,B3); 
key_xor(15,B0,B1,B2,B3);
   560    i_transform(B0,B1,B2,B3); 
SBoxD7(B0,B1,B2,B3); 
key_xor(14,B0,B1,B2,B3);
   561    i_transform(B0,B1,B2,B3); 
SBoxD6(B0,B1,B2,B3); 
key_xor(13,B0,B1,B2,B3);
   562    i_transform(B0,B1,B2,B3); 
SBoxD5(B0,B1,B2,B3); 
key_xor(12,B0,B1,B2,B3);
   563    i_transform(B0,B1,B2,B3); 
SBoxD4(B0,B1,B2,B3); 
key_xor(11,B0,B1,B2,B3);
   564    i_transform(B0,B1,B2,B3); 
SBoxD3(B0,B1,B2,B3); 
key_xor(10,B0,B1,B2,B3);
   565    i_transform(B0,B1,B2,B3); 
SBoxD2(B0,B1,B2,B3); 
key_xor( 9,B0,B1,B2,B3);
   566    i_transform(B0,B1,B2,B3); 
SBoxD1(B0,B1,B2,B3); 
key_xor( 8,B0,B1,B2,B3);
   568    i_transform(B0,B1,B2,B3); 
SBoxD8(B0,B1,B2,B3); 
key_xor( 7,B0,B1,B2,B3);
   569    i_transform(B0,B1,B2,B3); 
SBoxD7(B0,B1,B2,B3); 
key_xor( 6,B0,B1,B2,B3);
   570    i_transform(B0,B1,B2,B3); 
SBoxD6(B0,B1,B2,B3); 
key_xor( 5,B0,B1,B2,B3);
   571    i_transform(B0,B1,B2,B3); 
SBoxD5(B0,B1,B2,B3); 
key_xor( 4,B0,B1,B2,B3);
   572    i_transform(B0,B1,B2,B3); 
SBoxD4(B0,B1,B2,B3); 
key_xor( 3,B0,B1,B2,B3);
   573    i_transform(B0,B1,B2,B3); 
SBoxD3(B0,B1,B2,B3); 
key_xor( 2,B0,B1,B2,B3);
   574    i_transform(B0,B1,B2,B3); 
SBoxD2(B0,B1,B2,B3); 
key_xor( 1,B0,B1,B2,B3);
   575    i_transform(B0,B1,B2,B3); 
SBoxD1(B0,B1,B2,B3); 
key_xor( 0,B0,B1,B2,B3);
   577    SIMD_32::transpose(B0, B1, B2, B3);
   580    B1.store_le(out + 16);
   581    B2.store_le(out + 32);
   582    B3.store_le(out + 48);
   618       serpent_encrypt_4(in, out, KS);
   637       serpent_decrypt_4(in, out, KS);
 #define SBoxE5(B0, B1, B2, B3)
const SecureVector< u32bit > & get_round_keys() const
#define transform(B0, B1, B2, B3)
#define SBoxE6(B0, B1, B2, B3)
#define SBoxD5(B0, B1, B2, B3)
#define SBoxE4(B0, B1, B2, B3)
#define SBoxE7(B0, B1, B2, B3)
#define SBoxD4(B0, B1, B2, B3)
T load_le(const byte in[], size_t off)
#define SBoxE3(B0, B1, B2, B3)
#define SBoxE8(B0, B1, B2, B3)
#define SBoxD7(B0, B1, B2, B3)
void decrypt_n(const byte in[], byte out[], size_t blocks) const
#define SBoxE2(B0, B1, B2, B3)
#define SBoxE1(B0, B1, B2, B3)
#define SBoxD1(B0, B1, B2, B3)
#define key_xor(round, B0, B1, B2, B3)
#define SBoxD8(B0, B1, B2, B3)
#define SBoxD2(B0, B1, B2, B3)
void decrypt_n(const byte in[], byte out[], size_t blocks) const
void encrypt_n(const byte in[], byte out[], size_t blocks) const
void encrypt_n(const byte in[], byte out[], size_t blocks) const
#define SBoxD3(B0, B1, B2, B3)
#define i_transform(B0, B1, B2, B3)
#define SBoxD6(B0, B1, B2, B3)