11 #include <botan/twofish.h>
12 #include <botan/loadstor.h>
13 #include <botan/rotate.h>
22 for(
size_t i = 0; i != blocks; ++i)
29 for(
size_t j = 0; j != 16; j += 2)
49 Y += X + RK[2*j + 11];
73 for(
size_t i = 0; i != blocks; ++i)
80 for(
size_t j = 0; j != 16; j += 2)
89 Y += X + RK[39 - 2*j];
100 Y += X + RK[37 - 2*j];
122 void Twofish::key_schedule(
const byte key[],
size_t length)
126 for(
size_t i = 0; i != length; ++i)
127 rs_mul(&S[4*(i/8)], key[i], i);
131 for(
size_t i = 0; i != 256; ++i)
133 SB[ i] = MDS0[Q0[Q0[i]^S[ 0]]^S[ 4]];
134 SB[256+i] = MDS1[Q0[Q1[i]^S[ 1]]^S[ 5]];
135 SB[512+i] = MDS2[Q1[Q0[i]^S[ 2]]^S[ 6]];
136 SB[768+i] = MDS3[Q1[Q1[i]^S[ 3]]^S[ 7]];
139 for(
size_t i = 0; i != 40; i += 2)
141 u32bit X = MDS0[Q0[Q0[i ]^key[ 8]]^key[ 0]] ^
142 MDS1[Q0[Q1[i ]^key[ 9]]^key[ 1]] ^
143 MDS2[Q1[Q0[i ]^key[10]]^key[ 2]] ^
144 MDS3[Q1[Q1[i ]^key[11]]^key[ 3]];
145 u32bit Y = MDS0[Q0[Q0[i+1]^key[12]]^key[ 4]] ^
146 MDS1[Q0[Q1[i+1]^key[13]]^key[ 5]] ^
147 MDS2[Q1[Q0[i+1]^key[14]]^key[ 6]] ^
148 MDS3[Q1[Q1[i+1]^key[15]]^key[ 7]];
156 else if(length == 24)
158 for(
size_t i = 0; i != 256; ++i)
160 SB[ i] = MDS0[Q0[Q0[Q1[i]^S[ 0]]^S[ 4]]^S[ 8]];
161 SB[256+i] = MDS1[Q0[Q1[Q1[i]^S[ 1]]^S[ 5]]^S[ 9]];
162 SB[512+i] = MDS2[Q1[Q0[Q0[i]^S[ 2]]^S[ 6]]^S[10]];
163 SB[768+i] = MDS3[Q1[Q1[Q0[i]^S[ 3]]^S[ 7]]^S[11]];
166 for(
size_t i = 0; i != 40; i += 2)
168 u32bit X = MDS0[Q0[Q0[Q1[i ]^key[16]]^key[ 8]]^key[ 0]] ^
169 MDS1[Q0[Q1[Q1[i ]^key[17]]^key[ 9]]^key[ 1]] ^
170 MDS2[Q1[Q0[Q0[i ]^key[18]]^key[10]]^key[ 2]] ^
171 MDS3[Q1[Q1[Q0[i ]^key[19]]^key[11]]^key[ 3]];
172 u32bit Y = MDS0[Q0[Q0[Q1[i+1]^key[20]]^key[12]]^key[ 4]] ^
173 MDS1[Q0[Q1[Q1[i+1]^key[21]]^key[13]]^key[ 5]] ^
174 MDS2[Q1[Q0[Q0[i+1]^key[22]]^key[14]]^key[ 6]] ^
175 MDS3[Q1[Q1[Q0[i+1]^key[23]]^key[15]]^key[ 7]];
183 else if(length == 32)
185 for(
size_t i = 0; i != 256; ++i)
187 SB[ i] = MDS0[Q0[Q0[Q1[Q1[i]^S[ 0]]^S[ 4]]^S[ 8]]^S[12]];
188 SB[256+i] = MDS1[Q0[Q1[Q1[Q0[i]^S[ 1]]^S[ 5]]^S[ 9]]^S[13]];
189 SB[512+i] = MDS2[Q1[Q0[Q0[Q0[i]^S[ 2]]^S[ 6]]^S[10]]^S[14]];
190 SB[768+i] = MDS3[Q1[Q1[Q0[Q1[i]^S[ 3]]^S[ 7]]^S[11]]^S[15]];
193 for(
size_t i = 0; i != 40; i += 2)
195 u32bit X = MDS0[Q0[Q0[Q1[Q1[i ]^key[24]]^key[16]]^key[ 8]]^key[ 0]] ^
196 MDS1[Q0[Q1[Q1[Q0[i ]^key[25]]^key[17]]^key[ 9]]^key[ 1]] ^
197 MDS2[Q1[Q0[Q0[Q0[i ]^key[26]]^key[18]]^key[10]]^key[ 2]] ^
198 MDS3[Q1[Q1[Q0[Q1[i ]^key[27]]^key[19]]^key[11]]^key[ 3]];
199 u32bit Y = MDS0[Q0[Q0[Q1[Q1[i+1]^key[28]]^key[20]]^key[12]]^key[ 4]] ^
200 MDS1[Q0[Q1[Q1[Q0[i+1]^key[29]]^key[21]]^key[13]]^key[ 5]] ^
201 MDS2[Q1[Q0[Q0[Q0[i+1]^key[30]]^key[22]]^key[14]]^key[ 6]] ^
202 MDS3[Q1[Q1[Q0[Q1[i+1]^key[31]]^key[23]]^key[15]]^key[ 7]];
215 void Twofish::rs_mul(
byte S[4],
byte key,
size_t offset)
219 byte X = POLY_TO_EXP[key - 1];
221 byte RS1 = RS[(4*offset ) % 32];
222 byte RS2 = RS[(4*offset+1) % 32];
223 byte RS3 = RS[(4*offset+2) % 32];
224 byte RS4 = RS[(4*offset+3) % 32];
226 S[0] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS1 - 1]) % 255];
227 S[1] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS2 - 1]) % 255];
228 S[2] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS3 - 1]) % 255];
229 S[3] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS4 - 1]) % 255];
void encrypt_n(const byte in[], byte out[], size_t blocks) const
void decrypt_n(const byte in[], byte out[], size_t blocks) const
void store_le(u16bit in, byte out[2])
T rotate_left(T input, size_t rot)
byte get_byte(size_t byte_num, T input)
T rotate_right(T input, size_t rot)
u32bit load_le< u32bit >(const byte in[], size_t off)
void zeroise(MemoryRegion< T > &vec)