static void inv_mix_sub_columns (byte dt[N_BLOCK], byte st[N_BLOCK]) { for (byte i = 0 ; i < N_BLOCK ; i += N_COL) { byte a1 = st [i] ; byte b1 = st [i+1] ; byte c1 = st [i+2] ; byte d1 = st [i+3] ; byte a2 = f2(a1), b2 = f2(b1), c2 = f2(c1), d2 = f2(d1) ; byte a4 = f2(a2), b4 = f2(b2), c4 = f2(c2), d4 = f2(d2) ; byte a8 = f2(a4), b8 = f2(b4), c8 = f2(c4), d8 = f2(d4) ; byte a9 = a8 ^ a1,b9 = b8 ^ b1,c9 = c8 ^ c1,d9 = d8 ^ d1 ; byte ac = a8 ^ a4,bc = b8 ^ b4,cc = c8 ^ c4,dc = d8 ^ d4 ; dt[i] = is_box (ac^a2 ^ b9^b2 ^ cc^c1 ^ d9) ; dt[(i+5)&15] = is_box (a9 ^ bc^b2 ^ c9^c2 ^ dc^d1) ; dt[(i+10)&15] = is_box (ac^a1 ^ b9 ^ cc^c2 ^ d9^d2) ; dt[(i+15)&15] = is_box (a9^a2 ^ bc^b1 ^ c9 ^ dc^d2) ; } }
/** * Inverses mixed columns * @param dt Data */ void AES::inv_mix_sub_columns( uint_8t dt[N_BLOCK] ) { uint_8t st[N_BLOCK]; block_copy(st, dt); dt[ 0] = is_box(gfm_e(st[ 0]) ^ gfm_b(st[ 1]) ^ gfm_d(st[ 2]) ^ gfm_9(st[ 3])); dt[ 5] = is_box(gfm_9(st[ 0]) ^ gfm_e(st[ 1]) ^ gfm_b(st[ 2]) ^ gfm_d(st[ 3])); dt[10] = is_box(gfm_d(st[ 0]) ^ gfm_9(st[ 1]) ^ gfm_e(st[ 2]) ^ gfm_b(st[ 3])); dt[15] = is_box(gfm_b(st[ 0]) ^ gfm_d(st[ 1]) ^ gfm_9(st[ 2]) ^ gfm_e(st[ 3])); dt[ 4] = is_box(gfm_e(st[ 4]) ^ gfm_b(st[ 5]) ^ gfm_d(st[ 6]) ^ gfm_9(st[ 7])); dt[ 9] = is_box(gfm_9(st[ 4]) ^ gfm_e(st[ 5]) ^ gfm_b(st[ 6]) ^ gfm_d(st[ 7])); dt[14] = is_box(gfm_d(st[ 4]) ^ gfm_9(st[ 5]) ^ gfm_e(st[ 6]) ^ gfm_b(st[ 7])); dt[ 3] = is_box(gfm_b(st[ 4]) ^ gfm_d(st[ 5]) ^ gfm_9(st[ 6]) ^ gfm_e(st[ 7])); dt[ 8] = is_box(gfm_e(st[ 8]) ^ gfm_b(st[ 9]) ^ gfm_d(st[10]) ^ gfm_9(st[11])); dt[13] = is_box(gfm_9(st[ 8]) ^ gfm_e(st[ 9]) ^ gfm_b(st[10]) ^ gfm_d(st[11])); dt[ 2] = is_box(gfm_d(st[ 8]) ^ gfm_9(st[ 9]) ^ gfm_e(st[10]) ^ gfm_b(st[11])); dt[ 7] = is_box(gfm_b(st[ 8]) ^ gfm_d(st[ 9]) ^ gfm_9(st[10]) ^ gfm_e(st[11])); dt[12] = is_box(gfm_e(st[12]) ^ gfm_b(st[13]) ^ gfm_d(st[14]) ^ gfm_9(st[15])); dt[ 1] = is_box(gfm_9(st[12]) ^ gfm_e(st[13]) ^ gfm_b(st[14]) ^ gfm_d(st[15])); dt[ 6] = is_box(gfm_d(st[12]) ^ gfm_9(st[13]) ^ gfm_e(st[14]) ^ gfm_b(st[15])); dt[11] = is_box(gfm_b(st[12]) ^ gfm_d(st[13]) ^ gfm_9(st[14]) ^ gfm_e(st[15])); }
/** * Inverts shifted rows * @param st Data */ void AES::inv_shift_sub_rows( uint_8t st[N_BLOCK] ) { uint_8t tt; st[ 0] = is_box(st[ 0]); st[ 4] = is_box(st[ 4]); st[ 8] = is_box(st[ 8]); st[12] = is_box(st[12]); tt = st[13]; st[13] = is_box(st[9]); st[ 9] = is_box(st[5]); st[ 5] = is_box(st[1]); st[ 1] = is_box( tt ); tt = st[2]; st[ 2] = is_box(st[10]); st[10] = is_box( tt ); tt = st[6]; st[ 6] = is_box(st[14]); st[14] = is_box( tt ); tt = st[3]; st[ 3] = is_box(st[ 7]); st[ 7] = is_box(st[11]); st[11] = is_box(st[15]); st[15] = is_box( tt ); }
static void inv_shift_sub_rows (byte st[N_BLOCK]) { st [0] = is_box (st[0]) ; st [4] = is_box (st [4]); st [8] = is_box (st[8]) ; st [12] = is_box (st [12]); byte tt = st[13] ; st [13] = is_box (st [9]) ; st [9] = is_box (st [5]) ; st [5] = is_box (st [1]) ; st [1] = is_box (tt) ; tt = st [2] ; st [2] = is_box (st [10]) ; st [10] = is_box (tt) ; tt = st [6] ; st [6] = is_box (st [14]) ; st [14] = is_box (tt) ; tt = st [3] ; st [3] = is_box (st [7]) ; st [7] = is_box (st [11]) ; st [11] = is_box (st [15]) ; st [15] = is_box (tt) ; }