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 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 encrypt_n(const byte in[], byte out[], size_t blocks) const
void zeroise(MemoryRegion< T > &vec)