aes_rval aes_dec_blk(const unsigned char in_blk[], unsigned char out_blk[], const aes_ctx cx[1]) { uint32_t locals(b0, b1); const uint32_t *kp = cx->k_sch + nc * cx->n_rnd; dec_imvars /* declare variables for inv_mcol() if needed */ if(!(cx->n_blk & 2)) return aes_bad; #if (DEC_UNROLL == FULL) state_in((cx->n_rnd & 1 ? b1 : b0), in_blk, kp); kp = cx->k_sch + 9 * nc; switch(cx->n_rnd) { case 14: round(inv_rnd, b1, b0, kp + 4 * nc); case 13: round(inv_rnd, b0, b1, kp + 3 * nc); case 12: round(inv_rnd, b1, b0, kp + 2 * nc); case 11: round(inv_rnd, b0, b1, kp + nc); case 10: round(inv_rnd, b1, b0, kp ); round(inv_rnd, b0, b1, kp - nc); round(inv_rnd, b1, b0, kp - 2 * nc); round(inv_rnd, b0, b1, kp - 3 * nc); round(inv_rnd, b1, b0, kp - 4 * nc); round(inv_rnd, b0, b1, kp - 5 * nc); round(inv_rnd, b1, b0, kp - 6 * nc); round(inv_rnd, b0, b1, kp - 7 * nc); round(inv_rnd, b1, b0, kp - 8 * nc); round(inv_lrnd, b0, b1, kp - 9 * nc); } #else { uint32_t rnd; state_in(b0, in_blk, kp); #if (DEC_UNROLL == PARTIAL) for(rnd = 0; rnd < (cx->n_rnd - 1) >> 1; ++rnd) { kp -= nc; round(inv_rnd, b1, b0, kp); kp -= nc; round(inv_rnd, b0, b1, kp); } if(cx->n_rnd & 1) { l_copy(b1, b0); } else { kp -= nc; round(inv_rnd, b1, b0, kp); } #else for(rnd = 0; rnd < cx->n_rnd - 1; ++rnd) { kp -= nc; round(inv_rnd, b1, b0, kp); l_copy(b0, b1); } #endif kp -= nc; round(inv_lrnd, b0, b1, kp); } #endif state_out(out_blk, b0); return aes_good; }
aes_rval aes_enc_blk(const unsigned char in_blk[], unsigned char out_blk[], const aes_ctx cx[1]) { aes_32t locals(b0, b1); const aes_32t *kp = cx->k_sch; dec_fmvars /* declare variables for fwd_mcol() if needed */ if(!(cx->n_blk & 1)) return aes_bad; #if (ENC_UNROLL == FULL) state_in((cx->n_rnd & 1 ? b1 : b0), in_blk, kp); kp += (cx->n_rnd - 9) * nc; switch(cx->n_rnd) { case 14: round(fwd_rnd, b1, b0, kp - 4 * nc); case 13: round(fwd_rnd, b0, b1, kp - 3 * nc); case 12: round(fwd_rnd, b1, b0, kp - 2 * nc); case 11: round(fwd_rnd, b0, b1, kp - nc); case 10: round(fwd_rnd, b1, b0, kp ); round(fwd_rnd, b0, b1, kp + nc); round(fwd_rnd, b1, b0, kp + 2 * nc); round(fwd_rnd, b0, b1, kp + 3 * nc); round(fwd_rnd, b1, b0, kp + 4 * nc); round(fwd_rnd, b0, b1, kp + 5 * nc); round(fwd_rnd, b1, b0, kp + 6 * nc); round(fwd_rnd, b0, b1, kp + 7 * nc); round(fwd_rnd, b1, b0, kp + 8 * nc); round(fwd_lrnd, b0, b1, kp + 9 * nc); } #else { aes_32t rnd; state_in(b0, in_blk, kp); #if (ENC_UNROLL == PARTIAL) for(rnd = 0; rnd < (cx->n_rnd - 1) >> 1; ++rnd) { kp += nc; round(fwd_rnd, b1, b0, kp); kp += nc; round(fwd_rnd, b0, b1, kp); } if(cx->n_rnd & 1) { l_copy(b1, b0); } else { kp += nc; round(fwd_rnd, b1, b0, kp); } #else for(rnd = 0; rnd < cx->n_rnd - 1; ++rnd) { kp += nc; round(fwd_rnd, b1, b0, kp); l_copy(b0, b1); } #endif kp += nc; round(fwd_lrnd, b0, b1, kp); } #endif state_out(out_blk, b0); return aes_good; }