use super::utils::{load_block, store_block};
use crate::hazmat::{Block, Block8};
use core::arch::aarch64::*;
#[target_feature(enable = "aes")]
pub(crate) fn cipher_round(block: &mut Block, round_key: &Block) {
let mut b = load_block(block);
let k = load_block(round_key);
b = vaeseq_u8(b, vdupq_n_u8(0));
b = vaesmcq_u8(b);
b = veorq_u8(b, k);
store_block(block, b);
}
#[target_feature(enable = "aes")]
pub(crate) fn cipher_round_par(blocks: &mut Block8, round_keys: &Block8) {
for i in 0..8 {
let mut b = load_block(&blocks[i]);
b = vaeseq_u8(b, vdupq_n_u8(0));
b = vaesmcq_u8(b);
let rk = load_block(&round_keys[i]);
b = veorq_u8(b, rk);
store_block(&mut blocks[i], b);
}
}
#[target_feature(enable = "aes")]
pub(crate) fn equiv_inv_cipher_round(block: &mut Block, round_key: &Block) {
let mut b = load_block(block);
let k = load_block(round_key);
b = vaesdq_u8(b, vdupq_n_u8(0));
b = vaesimcq_u8(b);
b = veorq_u8(b, k);
store_block(block, b);
}
#[target_feature(enable = "aes")]
pub(crate) fn equiv_inv_cipher_round_par(blocks: &mut Block8, round_keys: &Block8) {
for i in 0..8 {
let mut b = load_block(&blocks[i]);
b = vaesdq_u8(b, vdupq_n_u8(0));
b = vaesimcq_u8(b);
let rk = load_block(&round_keys[i]);
b = veorq_u8(b, rk);
store_block(&mut blocks[i], b);
}
}
#[target_feature(enable = "aes")]
pub(crate) fn mix_columns(block: &mut Block) {
let b = load_block(block);
let out = vaesmcq_u8(b);
store_block(block, out);
}
#[target_feature(enable = "aes")]
pub(crate) fn inv_mix_columns(block: &mut Block) {
let b = load_block(block);
let out = vaesimcq_u8(b);
store_block(block, out);
}