VeraCrypt/src/Crypto/SerpentFast_sbox.h

438 lines
20 KiB
C

/*
* Serpent SBox Expressions
* (C) 1999-2007,2013 Jack Lloyd
*
* The sbox expressions used here were discovered by Dag Arne Osvik and
* are described in his paper "Speeding Up Serpent".
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
#ifndef BOTAN_SERPENT_SBOX_H__
#define BOTAN_SERPENT_SBOX_H__
#define SBoxE1(T, B0, B1, B2, B3) \
do { \
T B4; \
B3 ^= B0; \
B4 = B1; \
B1 &= B3; \
B4 ^= B2; \
B1 ^= B0; \
B0 |= B3; \
B0 ^= B4; \
B4 ^= B3; \
B3 ^= B2; \
B2 |= B1; \
B2 ^= B4; \
B4 = ~B4; \
B4 |= B1; \
B1 ^= B3; \
B1 ^= B4; \
B3 |= B0; \
B1 ^= B3; \
B4 ^= B3; \
B3 = B0; \
B0 = B1; \
B1 = B4; \
} while(0);
#define SBoxE2(T, B0, B1, B2, B3) \
do { \
T B4; \
B0 = ~B0; \
B2 = ~B2; \
B4 = B0; \
B0 &= B1; \
B2 ^= B0; \
B0 |= B3; \
B3 ^= B2; \
B1 ^= B0; \
B0 ^= B4; \
B4 |= B1; \
B1 ^= B3; \
B2 |= B0; \
B2 &= B4; \
B0 ^= B1; \
B1 &= B2; \
B1 ^= B0; \
B0 &= B2; \
B4 ^= B0; \
B0 = B2; \
B2 = B3; \
B3 = B1; \
B1 = B4; \
} while(0);
#define SBoxE3(T, B0, B1, B2, B3) \
do { \
T B4 = B0; \
B0 &= B2; \
B0 ^= B3; \
B2 ^= B1; \
B2 ^= B0; \
B3 |= B4; \
B3 ^= B1; \
B4 ^= B2; \
B1 = B3; \
B3 |= B4; \
B3 ^= B0; \
B0 &= B1; \
B4 ^= B0; \
B1 ^= B3; \
B1 ^= B4; \
B0 = B2; \
B2 = B1; \
B1 = B3; \
B3 = ~B4; \
} while(0);
#define SBoxE4(T, B0, B1, B2, B3) \
do { \
T B4 = B0; \
B0 |= B3; \
B3 ^= B1; \
B1 &= B4; \
B4 ^= B2; \
B2 ^= B3; \
B3 &= B0; \
B4 |= B1; \
B3 ^= B4; \
B0 ^= B1; \
B4 &= B0; \
B1 ^= B3; \
B4 ^= B2; \
B1 |= B0; \
B1 ^= B2; \
B0 ^= B3; \
B2 = B1; \
B1 |= B3; \
B0 ^= B1; \
B1 = B2; \
B2 = B3; \
B3 = B4; \
} while(0);
#define SBoxE5(T, B0, B1, B2, B3) \
do { \
T B4; \
B1 ^= B3; \
B3 = ~B3; \
B2 ^= B3; \
B3 ^= B0; \
B4 = B1; \
B1 &= B3; \
B1 ^= B2; \
B4 ^= B3; \
B0 ^= B4; \
B2 &= B4; \
B2 ^= B0; \
B0 &= B1; \
B3 ^= B0; \
B4 |= B1; \
B4 ^= B0; \
B0 |= B3; \
B0 ^= B2; \
B2 &= B3; \
B0 = ~B0; \
B4 ^= B2; \
B2 = B0; \
B0 = B1; \
B1 = B4; \
} while(0);
#define SBoxE6(T, B0, B1, B2, B3) \
do { \
T B4; \
B0 ^= B1; \
B1 ^= B3; \
B3 = ~B3; \
B4 = B1; \
B1 &= B0; \
B2 ^= B3; \
B1 ^= B2; \
B2 |= B4; \
B4 ^= B3; \
B3 &= B1; \
B3 ^= B0; \
B4 ^= B1; \
B4 ^= B2; \
B2 ^= B0; \
B0 &= B3; \
B2 = ~B2; \
B0 ^= B4; \
B4 |= B3; \
B4 ^= B2; \
B2 = B0; \
B0 = B1; \
B1 = B3; \
B3 = B4; \
} while(0);
#define SBoxE7(T, B0, B1, B2, B3) \
do { \
T B4; \
B2 = ~B2; \
B4 = B3; \
B3 &= B0; \
B0 ^= B4; \
B3 ^= B2; \
B2 |= B4; \
B1 ^= B3; \
B2 ^= B0; \
B0 |= B1; \
B2 ^= B1; \
B4 ^= B0; \
B0 |= B3; \
B0 ^= B2; \
B4 ^= B3; \
B4 ^= B0; \
B3 = ~B3; \
B2 &= B4; \
B3 ^= B2; \
B2 = B4; \
} while(0);
#define SBoxE8(T, B0, B1, B2, B3) \
do { \
T B4 = B1; \
B1 |= B2; \
B1 ^= B3; \
B4 ^= B2; \
B2 ^= B1; \
B3 |= B4; \
B3 &= B0; \
B4 ^= B2; \
B3 ^= B1; \
B1 |= B4; \
B1 ^= B0; \
B0 |= B4; \
B0 ^= B2; \
B1 ^= B4; \
B2 ^= B1; \
B1 &= B0; \
B1 ^= B4; \
B2 = ~B2; \
B2 |= B0; \
B4 ^= B2; \
B2 = B1; \
B1 = B3; \
B3 = B0; \
B0 = B4; \
} while(0);
#define SBoxD1(T, B0, B1, B2, B3) \
do { \
T B4; \
B2 = ~B2; \
B4 = B1; \
B1 |= B0; \
B4 = ~B4; \
B1 ^= B2; \
B2 |= B4; \
B1 ^= B3; \
B0 ^= B4; \
B2 ^= B0; \
B0 &= B3; \
B4 ^= B0; \
B0 |= B1; \
B0 ^= B2; \
B3 ^= B4; \
B2 ^= B1; \
B3 ^= B0; \
B3 ^= B1; \
B2 &= B3; \
B4 ^= B2; \
B2 = B1; \
B1 = B4; \
} while(0);
#define SBoxD2(T, B0, B1, B2, B3) \
do { \
T B4 = B1; \
B1 ^= B3; \
B3 &= B1; \
B4 ^= B2; \
B3 ^= B0; \
B0 |= B1; \
B2 ^= B3; \
B0 ^= B4; \
B0 |= B2; \
B1 ^= B3; \
B0 ^= B1; \
B1 |= B3; \
B1 ^= B0; \
B4 = ~B4; \
B4 ^= B1; \
B1 |= B0; \
B1 ^= B0; \
B1 |= B4; \
B3 ^= B1; \
B1 = B0; \
B0 = B4; \
B4 = B2; \
B2 = B3; \
B3 = B4; \
} while(0);
#define SBoxD3(T, B0, B1, B2, B3) \
do { \
T B4; \
B2 ^= B3; \
B3 ^= B0; \
B4 = B3; \
B3 &= B2; \
B3 ^= B1; \
B1 |= B2; \
B1 ^= B4; \
B4 &= B3; \
B2 ^= B3; \
B4 &= B0; \
B4 ^= B2; \
B2 &= B1; \
B2 |= B0; \
B3 = ~B3; \
B2 ^= B3; \
B0 ^= B3; \
B0 &= B1; \
B3 ^= B4; \
B3 ^= B0; \
B0 = B1; \
B1 = B4; \
} while(0);
#define SBoxD4(T, B0, B1, B2, B3) \
do { \
T B4 = B2; \
B2 ^= B1; \
B0 ^= B2; \
B4 &= B2; \
B4 ^= B0; \
B0 &= B1; \
B1 ^= B3; \
B3 |= B4; \
B2 ^= B3; \
B0 ^= B3; \
B1 ^= B4; \
B3 &= B2; \
B3 ^= B1; \
B1 ^= B0; \
B1 |= B2; \
B0 ^= B3; \
B1 ^= B4; \
B0 ^= B1; \
B4 = B0; \
B0 = B2; \
B2 = B3; \
B3 = B4; \
} while(0);
#define SBoxD5(T, B0, B1, B2, B3) \
do { \
T B4 = B2; \
B2 &= B3; \
B2 ^= B1; \
B1 |= B3; \
B1 &= B0; \
B4 ^= B2; \
B4 ^= B1; \
B1 &= B2; \
B0 = ~B0; \
B3 ^= B4; \
B1 ^= B3; \
B3 &= B0; \
B3 ^= B2; \
B0 ^= B1; \
B2 &= B0; \
B3 ^= B0; \
B2 ^= B4; \
B2 |= B3; \
B3 ^= B0; \
B2 ^= B1; \
B1 = B3; \
B3 = B4; \
} while(0);
#define SBoxD6(T, B0, B1, B2, B3) \
do { \
T B4; \
B1 = ~B1; \
B4 = B3; \
B2 ^= B1; \
B3 |= B0; \
B3 ^= B2; \
B2 |= B1; \
B2 &= B0; \
B4 ^= B3; \
B2 ^= B4; \
B4 |= B0; \
B4 ^= B1; \
B1 &= B2; \
B1 ^= B3; \
B4 ^= B2; \
B3 &= B4; \
B4 ^= B1; \
B3 ^= B4; \
B4 = ~B4; \
B3 ^= B0; \
B0 = B1; \
B1 = B4; \
B4 = B3; \
B3 = B2; \
B2 = B4; \
} while(0);
#define SBoxD7(T, B0, B1, B2, B3) \
do { \
T B4; \
B0 ^= B2; \
B4 = B2; \
B2 &= B0; \
B4 ^= B3; \
B2 = ~B2; \
B3 ^= B1; \
B2 ^= B3; \
B4 |= B0; \
B0 ^= B2; \
B3 ^= B4; \
B4 ^= B1; \
B1 &= B3; \
B1 ^= B0; \
B0 ^= B3; \
B0 |= B2; \
B3 ^= B1; \
B4 ^= B0; \
B0 = B1; \
B1 = B2; \
B2 = B4; \
} while(0);
#define SBoxD8(T, B0, B1, B2, B3) \
do { \
T B4 = B2; \
B2 ^= B0; \
B0 &= B3; \
B4 |= B3; \
B2 = ~B2; \
B3 ^= B1; \
B1 |= B0; \
B0 ^= B2; \
B2 &= B4; \
B3 &= B4; \
B1 ^= B2; \
B2 ^= B0; \
B0 |= B2; \
B4 ^= B1; \
B0 ^= B3; \
B3 ^= B4; \
B4 |= B0; \
B3 ^= B2; \
B4 ^= B2; \
B2 = B1; \
B1 = B0; \
B0 = B3; \
B3 = B4; \
} while(0);
#endif