#![cfg_attr(feature = "cargo-clippy", allow(needless_range_loop, many_single_char_names))]
use consts::{PLEN, RC, RHO, PI};
macro_rules! REPEAT4 {
($e: expr) => ( $e; $e; $e; $e; )
}
macro_rules! REPEAT5 {
($e: expr) => ( $e; $e; $e; $e; $e; )
}
macro_rules! REPEAT6 {
($e: expr) => ( $e; $e; $e; $e; $e; $e; )
}
macro_rules! REPEAT24 {
($e: expr, $s: expr) => (
REPEAT6!({ $e; $s; });
REPEAT6!({ $e; $s; });
REPEAT6!({ $e; $s; });
REPEAT5!({ $e; $s; });
$e;
)
}
macro_rules! FOR5 {
($v: expr, $s: expr, $e: expr) => {
$v = 0;
REPEAT4!({
$e;
$v += $s;
});
$e;
}
}
pub fn f(a: &mut [u64; PLEN]) {
let mut b = [0u64; 5];
let mut t: u64;
let mut x: usize;
let mut y: usize;
for i in 0..24 {
FOR5!(x, 1, {
b[x] = 0;
FOR5!(y, 5, {
b[x] ^= a[x + y];
});
});
FOR5!(x, 1, {
FOR5!(y, 5, {
a[y + x] ^= b[(x + 4) % 5] ^ b[(x + 1) % 5].rotate_left(1);
});
});
t = a[1];
x = 0;
REPEAT24!({
b[0] = a[PI[x]];
a[PI[x]] = t.rotate_left(RHO[x]);
}, {
t = b[0];
x += 1;
});
FOR5!(y, 5, {
FOR5!(x, 1, {
b[x] = a[y + x];
});
FOR5!(x, 1, {
a[y + x] = b[x] ^ ((!b[(x + 1) % 5]) & (b[(x + 2) % 5]));
});
});
a[0] ^= RC[i];
}
}