use crate::arith::P;
use crate::constants::ROUND_CONSTANTS_U64;
use crate::field::MATRIX_DIAG_16;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PartialSbox {
Inverse,
Pow7,
}
#[derive(Clone, Copy, Debug)]
pub struct Profile<'a> {
pub rf_half: usize,
pub rp: usize,
pub partial: PartialSbox,
pub external: &'a [u64],
pub internal: &'a [u64],
pub diag: &'a [u64; 16],
}
impl<'a> Profile<'a> {
pub const fn new(
rf_half: usize,
rp: usize,
partial: PartialSbox,
external: &'a [u64],
internal: &'a [u64],
diag: &'a [u64; 16],
) -> Self {
assert!(
external.len() == 2 * rf_half * 16,
"external constants: 2·rf_half·16"
);
assert!(internal.len() == rp, "internal constants: rp");
let mut i = 0;
while i < external.len() {
assert!(external[i] < P, "round constants must be canonical");
i += 1;
}
let mut i = 0;
while i < internal.len() {
assert!(internal[i] < P, "round constants must be canonical");
i += 1;
}
Self {
rf_half,
rp,
partial,
external,
internal,
diag,
}
}
}
const DIAG: [u64; 16] = {
let mut d = [0u64; 16];
let mut i = 0;
while i < 16 {
d[i] = MATRIX_DIAG_16[i].raw();
i += 1;
}
d
};
const NUM_EXTERNAL: usize = 128;
pub const HEMERA: Profile<'static> = Profile::new(
4,
16,
PartialSbox::Inverse,
ROUND_CONSTANTS_U64.split_at(NUM_EXTERNAL).0,
ROUND_CONSTANTS_U64.split_at(NUM_EXTERNAL).1,
&DIAG,
);