void rijndael::encrypt(u1byte in_blk[16],u1byte out_blk[16]) { u4byte b0[4], b1[4], *kp; b0[0] = u4byte_in(in_blk ) ^ e_key[0]; b0[1] = u4byte_in(in_blk + 4) ^ e_key[1]; b0[2] = u4byte_in(in_blk + 8) ^ e_key[2]; b0[3] = u4byte_in(in_blk + 12) ^ e_key[3]; kp = e_key + 4; if(k_len > 6) { f_nround(b1, b0, kp); f_nround(b0, b1, kp); } if(k_len > 4) { f_nround(b1, b0, kp); f_nround(b0, b1, kp); } f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_lround(b0, b1, kp); u4byte_out(out_blk, b0[0]); u4byte_out(out_blk + 4, b0[1]); u4byte_out(out_blk + 8, b0[2]); u4byte_out(out_blk + 12, b0[3]); }
void AES::decrypt(const u1byte in_blk[16], u1byte out_blk[16]) { u4byte b0[4], b1[4], *kp; b0[0] = u4byte_in(in_blk ) ^ e_key[4 * k_len + 24]; b0[1] = u4byte_in(in_blk + 4) ^ e_key[4 * k_len + 25]; b0[2] = u4byte_in(in_blk + 8) ^ e_key[4 * k_len + 26]; b0[3] = u4byte_in(in_blk + 12) ^ e_key[4 * k_len + 27]; kp = d_key + 4 * (k_len + 5); if(k_len > 6) { i_nround(b1, b0, kp); i_nround(b0, b1, kp); } if(k_len > 4) { i_nround(b1, b0, kp); i_nround(b0, b1, kp); } i_nround(b1, b0, kp); i_nround(b0, b1, kp); i_nround(b1, b0, kp); i_nround(b0, b1, kp); i_nround(b1, b0, kp); i_nround(b0, b1, kp); i_nround(b1, b0, kp); i_nround(b0, b1, kp); i_nround(b1, b0, kp); i_lround(b0, b1, kp); u4byte_out(out_blk, b0[0]); u4byte_out(out_blk + 4, b0[1]); u4byte_out(out_blk + 8, b0[2]); u4byte_out(out_blk + 12, b0[3]); }
void rijndael::set_key(const u1byte in_key[], const u4byte key_len) { u4byte i, t, u, v, w; if(!tab_gen) gen_tabs(); k_len = (key_len + 31) / 32; e_key[0] = u4byte_in(in_key ); e_key[1] = u4byte_in(in_key + 4); e_key[2] = u4byte_in(in_key + 8); e_key[3] = u4byte_in(in_key + 12); switch(k_len) { case 4: t = e_key[3]; for(i = 0; i < 10; ++i) loop4(i); break; case 6: e_key[4] = u4byte_in(in_key + 16); t = e_key[5] = u4byte_in(in_key + 20); for(i = 0; i < 8; ++i) loop6(i); break; case 8: e_key[4] = u4byte_in(in_key + 16); e_key[5] = u4byte_in(in_key + 20); e_key[6] = u4byte_in(in_key + 24); t = e_key[7] = u4byte_in(in_key + 28); for(i = 0; i < 7; ++i) loop8(i); break; } d_key[0] = e_key[0]; d_key[1] = e_key[1]; d_key[2] = e_key[2]; d_key[3] = e_key[3]; for(i = 4; i < 4 * k_len + 24; ++i) { imix_col(d_key[i], e_key[i]); } return; }