8 #include <botan/idea.h>     9 #include <botan/loadstor.h>    23    const u16bit P_mask = !P - 1;
    25    const u32bit P_hi = P >> 16;
    26    const u32bit P_lo = P & 0xFFFF;
    28    const u16bit r_1 = (P_lo - P_hi) + (P_lo < P_hi);
    29    const u16bit r_2 = 1 - x - y;
    31    return (r_1 & P_mask) | (r_2 & ~P_mask);
    49    for(
size_t i = 0; i != 15; ++i)
    61 void idea_op(
const byte in[], 
byte out[], 
size_t blocks, 
const u16bit K[52])
    63    const size_t BLOCK_SIZE = 8;
    65    for(
size_t i = 0; i != blocks; ++i)
    72       for(
size_t j = 0; j != 8; ++j)
    74          X1 = mul(X1, K[6*j+0]);
    77          X4 = mul(X4, K[6*j+3]);
    80          X3 = mul(X3 ^ X1, K[6*j+4]);
    83          X2 = mul((X2 ^ X4) + X3, K[6*j+5]);
   111    idea_op(in, out, blocks, &EK[0]);
   119    idea_op(in, out, blocks, &DK[0]);
   125 void IDEA::key_schedule(
const byte key[], 
size_t)
   127    for(
size_t i = 0; i != 8; ++i)
   130    for(
size_t i = 1, j = 8, offset = 0; j != 52; i %= 8, ++i, ++j)
   132       EK[i+7+offset] = 
static_cast<u16bit>((EK[(i     % 8) + offset] << 9) |
   133                                            (EK[((i+1) % 8) + offset] >> 7));
   134       offset += (i == 8) ? 8 : 0;
   137    DK[51] = mul_inv(EK[3]);
   140    DK[48] = mul_inv(EK[0]);
   142    for(
size_t i = 1, j = 4, counter = 47; i != 8; ++i, j += 6)
   144       DK[counter--] = EK[j+1];
   145       DK[counter--] = EK[j];
   146       DK[counter--] = mul_inv(EK[j+5]);
   147       DK[counter--] = -EK[j+3];
   148       DK[counter--] = -EK[j+4];
   149       DK[counter--] = mul_inv(EK[j+2]);
   154    DK[3] = mul_inv(EK[51]);
   157    DK[0] = mul_inv(EK[48]);
 
void encrypt_n(const byte in[], byte out[], size_t blocks) const
u16bit load_be< u16bit >(const byte in[], size_t off)
void store_be(u16bit in, byte out[2])
void decrypt_n(const byte in[], byte out[], size_t blocks) const