You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
434 lines
8.3 KiB
434 lines
8.3 KiB
// private header for Serpent and Sosemanuk |
|
|
|
NAMESPACE_BEGIN(CryptoPP) |
|
|
|
// linear transformation |
|
#define LT(i,a,b,c,d,e) {\ |
|
a = rotlFixed(a, 13); \ |
|
c = rotlFixed(c, 3); \ |
|
d = rotlFixed(d ^ c ^ (a << 3), 7); \ |
|
b = rotlFixed(b ^ a ^ c, 1); \ |
|
a = rotlFixed(a ^ b ^ d, 5); \ |
|
c = rotlFixed(c ^ d ^ (b << 7), 22);} |
|
|
|
// inverse linear transformation |
|
#define ILT(i,a,b,c,d,e) {\ |
|
c = rotrFixed(c, 22); \ |
|
a = rotrFixed(a, 5); \ |
|
c ^= d ^ (b << 7); \ |
|
a ^= b ^ d; \ |
|
b = rotrFixed(b, 1); \ |
|
d = rotrFixed(d, 7) ^ c ^ (a << 3); \ |
|
b ^= a ^ c; \ |
|
c = rotrFixed(c, 3); \ |
|
a = rotrFixed(a, 13);} |
|
|
|
// order of output from S-box functions |
|
#define beforeS0(f) f(0,a,b,c,d,e) |
|
#define afterS0(f) f(1,b,e,c,a,d) |
|
#define afterS1(f) f(2,c,b,a,e,d) |
|
#define afterS2(f) f(3,a,e,b,d,c) |
|
#define afterS3(f) f(4,e,b,d,c,a) |
|
#define afterS4(f) f(5,b,a,e,c,d) |
|
#define afterS5(f) f(6,a,c,b,e,d) |
|
#define afterS6(f) f(7,a,c,d,b,e) |
|
#define afterS7(f) f(8,d,e,b,a,c) |
|
|
|
// order of output from inverse S-box functions |
|
#define beforeI7(f) f(8,a,b,c,d,e) |
|
#define afterI7(f) f(7,d,a,b,e,c) |
|
#define afterI6(f) f(6,a,b,c,e,d) |
|
#define afterI5(f) f(5,b,d,e,c,a) |
|
#define afterI4(f) f(4,b,c,e,a,d) |
|
#define afterI3(f) f(3,a,b,e,c,d) |
|
#define afterI2(f) f(2,b,d,e,c,a) |
|
#define afterI1(f) f(1,a,b,c,e,d) |
|
#define afterI0(f) f(0,a,d,b,e,c) |
|
|
|
// The instruction sequences for the S-box functions |
|
// come from Dag Arne Osvik's paper "Speeding up Serpent". |
|
|
|
#define S0(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r3 ^= r0; \ |
|
r4 = r1; \ |
|
r1 &= r3; \ |
|
r4 ^= r2; \ |
|
r1 ^= r0; \ |
|
r0 |= r3; \ |
|
r0 ^= r4; \ |
|
r4 ^= r3; \ |
|
r3 ^= r2; \ |
|
r2 |= r1; \ |
|
r2 ^= r4; \ |
|
r4 = ~r4; \ |
|
r4 |= r1; \ |
|
r1 ^= r3; \ |
|
r1 ^= r4; \ |
|
r3 |= r0; \ |
|
r1 ^= r3; \ |
|
r4 ^= r3; \ |
|
} |
|
|
|
#define I0(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r2 = ~r2; \ |
|
r4 = r1; \ |
|
r1 |= r0; \ |
|
r4 = ~r4; \ |
|
r1 ^= r2; \ |
|
r2 |= r4; \ |
|
r1 ^= r3; \ |
|
r0 ^= r4; \ |
|
r2 ^= r0; \ |
|
r0 &= r3; \ |
|
r4 ^= r0; \ |
|
r0 |= r1; \ |
|
r0 ^= r2; \ |
|
r3 ^= r4; \ |
|
r2 ^= r1; \ |
|
r3 ^= r0; \ |
|
r3 ^= r1; \ |
|
r2 &= r3; \ |
|
r4 ^= r2; \ |
|
} |
|
|
|
#define S1(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r0 = ~r0; \ |
|
r2 = ~r2; \ |
|
r4 = r0; \ |
|
r0 &= r1; \ |
|
r2 ^= r0; \ |
|
r0 |= r3; \ |
|
r3 ^= r2; \ |
|
r1 ^= r0; \ |
|
r0 ^= r4; \ |
|
r4 |= r1; \ |
|
r1 ^= r3; \ |
|
r2 |= r0; \ |
|
r2 &= r4; \ |
|
r0 ^= r1; \ |
|
r1 &= r2; \ |
|
r1 ^= r0; \ |
|
r0 &= r2; \ |
|
r0 ^= r4; \ |
|
} |
|
|
|
#define I1(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r4 = r1; \ |
|
r1 ^= r3; \ |
|
r3 &= r1; \ |
|
r4 ^= r2; \ |
|
r3 ^= r0; \ |
|
r0 |= r1; \ |
|
r2 ^= r3; \ |
|
r0 ^= r4; \ |
|
r0 |= r2; \ |
|
r1 ^= r3; \ |
|
r0 ^= r1; \ |
|
r1 |= r3; \ |
|
r1 ^= r0; \ |
|
r4 = ~r4; \ |
|
r4 ^= r1; \ |
|
r1 |= r0; \ |
|
r1 ^= r0; \ |
|
r1 |= r4; \ |
|
r3 ^= r1; \ |
|
} |
|
|
|
#define S2(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r4 = r0; \ |
|
r0 &= r2; \ |
|
r0 ^= r3; \ |
|
r2 ^= r1; \ |
|
r2 ^= r0; \ |
|
r3 |= r4; \ |
|
r3 ^= r1; \ |
|
r4 ^= r2; \ |
|
r1 = r3; \ |
|
r3 |= r4; \ |
|
r3 ^= r0; \ |
|
r0 &= r1; \ |
|
r4 ^= r0; \ |
|
r1 ^= r3; \ |
|
r1 ^= r4; \ |
|
r4 = ~r4; \ |
|
} |
|
|
|
#define I2(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r2 ^= r3; \ |
|
r3 ^= r0; \ |
|
r4 = r3; \ |
|
r3 &= r2; \ |
|
r3 ^= r1; \ |
|
r1 |= r2; \ |
|
r1 ^= r4; \ |
|
r4 &= r3; \ |
|
r2 ^= r3; \ |
|
r4 &= r0; \ |
|
r4 ^= r2; \ |
|
r2 &= r1; \ |
|
r2 |= r0; \ |
|
r3 = ~r3; \ |
|
r2 ^= r3; \ |
|
r0 ^= r3; \ |
|
r0 &= r1; \ |
|
r3 ^= r4; \ |
|
r3 ^= r0; \ |
|
} |
|
|
|
#define S3(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r4 = r0; \ |
|
r0 |= r3; \ |
|
r3 ^= r1; \ |
|
r1 &= r4; \ |
|
r4 ^= r2; \ |
|
r2 ^= r3; \ |
|
r3 &= r0; \ |
|
r4 |= r1; \ |
|
r3 ^= r4; \ |
|
r0 ^= r1; \ |
|
r4 &= r0; \ |
|
r1 ^= r3; \ |
|
r4 ^= r2; \ |
|
r1 |= r0; \ |
|
r1 ^= r2; \ |
|
r0 ^= r3; \ |
|
r2 = r1; \ |
|
r1 |= r3; \ |
|
r1 ^= r0; \ |
|
} |
|
|
|
#define I3(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r4 = r2; \ |
|
r2 ^= r1; \ |
|
r1 &= r2; \ |
|
r1 ^= r0; \ |
|
r0 &= r4; \ |
|
r4 ^= r3; \ |
|
r3 |= r1; \ |
|
r3 ^= r2; \ |
|
r0 ^= r4; \ |
|
r2 ^= r0; \ |
|
r0 |= r3; \ |
|
r0 ^= r1; \ |
|
r4 ^= r2; \ |
|
r2 &= r3; \ |
|
r1 |= r3; \ |
|
r1 ^= r2; \ |
|
r4 ^= r0; \ |
|
r2 ^= r4; \ |
|
} |
|
|
|
#define S4(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r1 ^= r3; \ |
|
r3 = ~r3; \ |
|
r2 ^= r3; \ |
|
r3 ^= r0; \ |
|
r4 = r1; \ |
|
r1 &= r3; \ |
|
r1 ^= r2; \ |
|
r4 ^= r3; \ |
|
r0 ^= r4; \ |
|
r2 &= r4; \ |
|
r2 ^= r0; \ |
|
r0 &= r1; \ |
|
r3 ^= r0; \ |
|
r4 |= r1; \ |
|
r4 ^= r0; \ |
|
r0 |= r3; \ |
|
r0 ^= r2; \ |
|
r2 &= r3; \ |
|
r0 = ~r0; \ |
|
r4 ^= r2; \ |
|
} |
|
|
|
#define I4(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r4 = r2; \ |
|
r2 &= r3; \ |
|
r2 ^= r1; \ |
|
r1 |= r3; \ |
|
r1 &= r0; \ |
|
r4 ^= r2; \ |
|
r4 ^= r1; \ |
|
r1 &= r2; \ |
|
r0 = ~r0; \ |
|
r3 ^= r4; \ |
|
r1 ^= r3; \ |
|
r3 &= r0; \ |
|
r3 ^= r2; \ |
|
r0 ^= r1; \ |
|
r2 &= r0; \ |
|
r3 ^= r0; \ |
|
r2 ^= r4; \ |
|
r2 |= r3; \ |
|
r3 ^= r0; \ |
|
r2 ^= r1; \ |
|
} |
|
|
|
#define S5(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r0 ^= r1; \ |
|
r1 ^= r3; \ |
|
r3 = ~r3; \ |
|
r4 = r1; \ |
|
r1 &= r0; \ |
|
r2 ^= r3; \ |
|
r1 ^= r2; \ |
|
r2 |= r4; \ |
|
r4 ^= r3; \ |
|
r3 &= r1; \ |
|
r3 ^= r0; \ |
|
r4 ^= r1; \ |
|
r4 ^= r2; \ |
|
r2 ^= r0; \ |
|
r0 &= r3; \ |
|
r2 = ~r2; \ |
|
r0 ^= r4; \ |
|
r4 |= r3; \ |
|
r2 ^= r4; \ |
|
} |
|
|
|
#define I5(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r1 = ~r1; \ |
|
r4 = r3; \ |
|
r2 ^= r1; \ |
|
r3 |= r0; \ |
|
r3 ^= r2; \ |
|
r2 |= r1; \ |
|
r2 &= r0; \ |
|
r4 ^= r3; \ |
|
r2 ^= r4; \ |
|
r4 |= r0; \ |
|
r4 ^= r1; \ |
|
r1 &= r2; \ |
|
r1 ^= r3; \ |
|
r4 ^= r2; \ |
|
r3 &= r4; \ |
|
r4 ^= r1; \ |
|
r3 ^= r0; \ |
|
r3 ^= r4; \ |
|
r4 = ~r4; \ |
|
} |
|
|
|
#define S6(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r2 = ~r2; \ |
|
r4 = r3; \ |
|
r3 &= r0; \ |
|
r0 ^= r4; \ |
|
r3 ^= r2; \ |
|
r2 |= r4; \ |
|
r1 ^= r3; \ |
|
r2 ^= r0; \ |
|
r0 |= r1; \ |
|
r2 ^= r1; \ |
|
r4 ^= r0; \ |
|
r0 |= r3; \ |
|
r0 ^= r2; \ |
|
r4 ^= r3; \ |
|
r4 ^= r0; \ |
|
r3 = ~r3; \ |
|
r2 &= r4; \ |
|
r2 ^= r3; \ |
|
} |
|
|
|
#define I6(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r0 ^= r2; \ |
|
r4 = r2; \ |
|
r2 &= r0; \ |
|
r4 ^= r3; \ |
|
r2 = ~r2; \ |
|
r3 ^= r1; \ |
|
r2 ^= r3; \ |
|
r4 |= r0; \ |
|
r0 ^= r2; \ |
|
r3 ^= r4; \ |
|
r4 ^= r1; \ |
|
r1 &= r3; \ |
|
r1 ^= r0; \ |
|
r0 ^= r3; \ |
|
r0 |= r2; \ |
|
r3 ^= r1; \ |
|
r4 ^= r0; \ |
|
} |
|
|
|
#define S7(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r4 = r2; \ |
|
r2 &= r1; \ |
|
r2 ^= r3; \ |
|
r3 &= r1; \ |
|
r4 ^= r2; \ |
|
r2 ^= r1; \ |
|
r1 ^= r0; \ |
|
r0 |= r4; \ |
|
r0 ^= r2; \ |
|
r3 ^= r1; \ |
|
r2 ^= r3; \ |
|
r3 &= r0; \ |
|
r3 ^= r4; \ |
|
r4 ^= r2; \ |
|
r2 &= r0; \ |
|
r4 = ~r4; \ |
|
r2 ^= r4; \ |
|
r4 &= r0; \ |
|
r1 ^= r3; \ |
|
r4 ^= r1; \ |
|
} |
|
|
|
#define I7(i, r0, r1, r2, r3, r4) \ |
|
{ \ |
|
r4 = r2; \ |
|
r2 ^= r0; \ |
|
r0 &= r3; \ |
|
r2 = ~r2; \ |
|
r4 |= r3; \ |
|
r3 ^= r1; \ |
|
r1 |= r0; \ |
|
r0 ^= r2; \ |
|
r2 &= r4; \ |
|
r1 ^= r2; \ |
|
r2 ^= r0; \ |
|
r0 |= r2; \ |
|
r3 &= r4; \ |
|
r0 ^= r3; \ |
|
r4 ^= r1; \ |
|
r3 ^= r4; \ |
|
r4 |= r0; \ |
|
r3 ^= r2; \ |
|
r4 ^= r2; \ |
|
} |
|
|
|
// key xor |
|
#define KX(r, a, b, c, d, e) {\ |
|
a ^= k[4 * r + 0]; \ |
|
b ^= k[4 * r + 1]; \ |
|
c ^= k[4 * r + 2]; \ |
|
d ^= k[4 * r + 3];} |
|
|
|
#define LK(r, a, b, c, d, e) {\ |
|
a = k[(8-r)*4 + 0]; \ |
|
b = k[(8-r)*4 + 1]; \ |
|
c = k[(8-r)*4 + 2]; \ |
|
d = k[(8-r)*4 + 3];} |
|
|
|
#define SK(r, a, b, c, d, e) {\ |
|
k[(8-r)*4 + 4] = a; \ |
|
k[(8-r)*4 + 5] = b; \ |
|
k[(8-r)*4 + 6] = c; \ |
|
k[(8-r)*4 + 7] = d;} |
|
|
|
void Serpent_KeySchedule(word32 *k, unsigned int rounds, const byte *userKey, size_t keylen); |
|
|
|
NAMESPACE_END
|
|
|