Rijndael::Rijndael(const byte *userKey, unsigned int keylen) : k_len(keylen/4), key(k_len*5 + 24) { assert(keylen == KeyLength(keylen)); word32 t; int i; GetUserKeyLittleEndian(key.ptr, k_len, userKey, keylen); switch(k_len) { case 4: t = key[3]; for(i = 0; i < 10; ++i) { t = rotrFixed(t, 8); t = ls_box(t) ^ rco_tab[i]; key[4 * i + 4] = t ^= key[4 * i]; key[4 * i + 5] = t ^= key[4 * i + 1]; key[4 * i + 6] = t ^= key[4 * i + 2]; key[4 * i + 7] = t ^= key[4 * i + 3]; } break; case 6: t = key[5]; for(i = 0; i < 8; ++i) { t = rotrFixed(t, 8); t = ls_box(t) ^ rco_tab[i]; key[6 * i + 6] = t ^= key[6 * i]; key[6 * i + 7] = t ^= key[6 * i + 1]; key[6 * i + 8] = t ^= key[6 * i + 2]; key[6 * i + 9] = t ^= key[6 * i + 3]; key[6 * i + 10] = t ^= key[6 * i + 4]; key[6 * i + 11] = t ^= key[6 * i + 5]; } break; case 8: t = key[7]; for(i = 0; i < 7; ++i) { t = rotrFixed(t, 8); t = ls_box(t) ^ rco_tab[i]; key[8 * i + 8] = t ^= key[8 * i]; key[8 * i + 9] = t ^= key[8 * i + 1]; key[8 * i + 10] = t ^= key[8 * i + 2]; key[8 * i + 11] = t ^= key[8 * i + 3]; key[8 * i + 12] = t = key[8 * i + 4] ^ ls_box(t); \ key[8 * i + 13] = t ^= key[8 * i + 5]; key[8 * i + 14] = t ^= key[8 * i + 6]; key[8 * i + 15] = t ^= key[8 * i + 7]; } break; } }
/*----------------------------------------------------------- * RijndaelKeySchedule * Initialise the key schedule from a supplied key */ void RijndaelKeySchedule(u8 key[16]) { u32 t; u32 *ek=Ekey, /* pointer to the expanded key */ *rc=rnd_con; /* pointer to the round constant */ Ekey[0] = u32_in(key ); Ekey[1] = u32_in(key + 4); Ekey[2] = u32_in(key + 8); Ekey[3] = u32_in(key + 12); while(ek < Ekey + 40) { t = rot3(ek[3]); ek[4] = ek[0] ^ ls_box(t) ^ *rc++; ek[5] = ek[1] ^ ek[4]; ek[6] = ek[2] ^ ek[5]; ek[7] = ek[3] ^ ek[6]; ek += 4; } }