11 #include <botan/twofish.h>
12 #include <botan/loadstor.h>
13 #include <botan/rotate.h>
32 for(
size_t j = 0; j != 16; j += 2)
41 Y += X + m_RK[2*j + 9];
52 Y += X + m_RK[2*j + 11];
83 for(
size_t j = 0; j != 16; j += 2)
92 Y += X + m_RK[39 - 2*j];
103 Y += X + m_RK[37 - 2*j];
122 void Twofish::key_schedule(
const uint8_t key[],
size_t length)
129 for(
size_t i = 0; i != length; ++i)
136 uint8_t X = POLY_TO_EXP[key[i] - 1];
138 uint8_t RS1 = RS[(4*i ) % 32];
139 uint8_t RS2 = RS[(4*i+1) % 32];
140 uint8_t RS3 = RS[(4*i+2) % 32];
141 uint8_t RS4 = RS[(4*i+3) % 32];
143 S[4*(i/8) ] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS1 - 1]) % 255];
144 S[4*(i/8)+1] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS2 - 1]) % 255];
145 S[4*(i/8)+2] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS3 - 1]) % 255];
146 S[4*(i/8)+3] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS4 - 1]) % 255];
152 for(
size_t i = 0; i != 256; ++i)
154 m_SB[ i] = MDS0[Q0[Q0[i]^S[ 0]]^S[ 4]];
155 m_SB[256+i] = MDS1[Q0[Q1[i]^S[ 1]]^S[ 5]];
156 m_SB[512+i] = MDS2[Q1[Q0[i]^S[ 2]]^S[ 6]];
157 m_SB[768+i] = MDS3[Q1[Q1[i]^S[ 3]]^S[ 7]];
162 uint32_t X = MDS0[Q0[Q0[i ]^key[ 8]]^key[ 0]] ^
163 MDS1[Q0[Q1[i ]^key[ 9]]^key[ 1]] ^
164 MDS2[Q1[Q0[i ]^key[10]]^key[ 2]] ^
165 MDS3[Q1[Q1[i ]^key[11]]^key[ 3]];
166 uint32_t Y = MDS0[Q0[Q0[i+1]^key[12]]^key[ 4]] ^
167 MDS1[Q0[Q1[i+1]^key[13]]^key[ 5]] ^
168 MDS2[Q1[Q0[i+1]^key[14]]^key[ 6]] ^
169 MDS3[Q1[Q1[i+1]^key[15]]^key[ 7]];
177 else if(length == 24)
179 for(
size_t i = 0; i != 256; ++i)
181 m_SB[ i] = MDS0[Q0[Q0[Q1[i]^S[ 0]]^S[ 4]]^S[ 8]];
182 m_SB[256+i] = MDS1[Q0[Q1[Q1[i]^S[ 1]]^S[ 5]]^S[ 9]];
183 m_SB[512+i] = MDS2[Q1[Q0[Q0[i]^S[ 2]]^S[ 6]]^S[10]];
184 m_SB[768+i] = MDS3[Q1[Q1[Q0[i]^S[ 3]]^S[ 7]]^S[11]];
189 uint32_t X = MDS0[Q0[Q0[Q1[i ]^key[16]]^key[ 8]]^key[ 0]] ^
190 MDS1[Q0[Q1[Q1[i ]^key[17]]^key[ 9]]^key[ 1]] ^
191 MDS2[Q1[Q0[Q0[i ]^key[18]]^key[10]]^key[ 2]] ^
192 MDS3[Q1[Q1[Q0[i ]^key[19]]^key[11]]^key[ 3]];
193 uint32_t Y = MDS0[Q0[Q0[Q1[i+1]^key[20]]^key[12]]^key[ 4]] ^
194 MDS1[Q0[Q1[Q1[i+1]^key[21]]^key[13]]^key[ 5]] ^
195 MDS2[Q1[Q0[Q0[i+1]^key[22]]^key[14]]^key[ 6]] ^
196 MDS3[Q1[Q1[Q0[i+1]^key[23]]^key[15]]^key[ 7]];
204 else if(length == 32)
206 for(
size_t i = 0; i != 256; ++i)
208 m_SB[ i] = MDS0[Q0[Q0[Q1[Q1[i]^S[ 0]]^S[ 4]]^S[ 8]]^S[12]];
209 m_SB[256+i] = MDS1[Q0[Q1[Q1[Q0[i]^S[ 1]]^S[ 5]]^S[ 9]]^S[13]];
210 m_SB[512+i] = MDS2[Q1[Q0[Q0[Q0[i]^S[ 2]]^S[ 6]]^S[10]]^S[14]];
211 m_SB[768+i] = MDS3[Q1[Q1[Q0[Q1[i]^S[ 3]]^S[ 7]]^S[11]]^S[15]];
216 uint32_t X = MDS0[Q0[Q0[Q1[Q1[i ]^key[24]]^key[16]]^key[ 8]]^key[ 0]] ^
217 MDS1[Q0[Q1[Q1[Q0[i ]^key[25]]^key[17]]^key[ 9]]^key[ 1]] ^
218 MDS2[Q1[Q0[Q0[Q0[i ]^key[26]]^key[18]]^key[10]]^key[ 2]] ^
219 MDS3[Q1[Q1[Q0[Q1[i ]^key[27]]^key[19]]^key[11]]^key[ 3]];
220 uint32_t Y = MDS0[Q0[Q0[Q1[Q1[i+1]^key[28]]^key[20]]^key[12]]^key[ 4]] ^
221 MDS1[Q0[Q1[Q1[Q0[i+1]^key[29]]^key[21]]^key[13]]^key[ 5]] ^
222 MDS2[Q1[Q0[Q0[Q0[i+1]^key[30]]^key[22]]^key[14]]^key[ 6]] ^
223 MDS3[Q1[Q1[Q0[Q1[i+1]^key[31]]^key[23]]^key[15]]^key[ 7]];
void zap(std::vector< T, Alloc > &vec)
T rotate_left(T input, size_t rot)
#define BOTAN_PARALLEL_FOR
std::vector< T, secure_allocator< T >> secure_vector
T rotate_right(T input, size_t rot)
void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override
T load_le(const uint8_t in[], size_t off)
uint8_t get_byte(size_t byte_num, T input)
void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override
void store_le(uint16_t in, uint8_t out[2])