RC6Base::RC6Base(const byte *k, unsigned int keylen, unsigned int rounds) : r(rounds), sTable((2*r)+4) { assert(keylen == KeyLength(keylen)); static const RC6_WORD MAGIC_P = 0xb7e15163L; // magic constant P for wordsize static const RC6_WORD MAGIC_Q = 0x9e3779b9L; // magic constant Q for wordsize static const int U=sizeof(RC6_WORD); const unsigned int c=(keylen-1)/U + 1; SecBlock<RC6_WORD> l(c); GetUserKeyLittleEndian(l.ptr, c, k, keylen); sTable[0] = MAGIC_P; for (unsigned j=1; j<sTable.size;j++) sTable[j] = sTable[j-1] + MAGIC_Q; RC6_WORD a=0, b=0; const unsigned n = 3*STDMAX(sTable.size,c); for (unsigned h=0; h < n; h++) { a = sTable[h % sTable.size] = rotlFixed((sTable[h % sTable.size] + a + b), 3); b = l[h % c] = rotlMod((l[h % c] + a + b), (a+b)); } }
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; } }