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]);
u16bit load_be< u16bit >(const byte in[], size_t off)
void decrypt_n(const byte in[], byte out[], size_t blocks) const
void store_be(u16bit in, byte out[2])
void encrypt_n(const byte in[], byte out[], size_t blocks) const