#[cfg(target_arch = "aarch64")]
pub(crate) fn by8(counter: u32, inout: &mut [u8], mut apply_8: impl FnMut(u32, &mut [u8; 128])) {
let (chunks, tail) = inout.as_chunks_mut::<128>();
let mut counter = counter;
for chunk in chunks {
apply_8(counter, chunk);
counter = counter.wrapping_add(8);
}
if !tail.is_empty() {
let mut buf = [0u8; 128];
buf[..tail.len()].copy_from_slice(tail);
apply_8(counter, &mut buf);
tail.copy_from_slice(&buf[..tail.len()]);
}
}
pub(crate) fn blocks(
nonce: &[u8; 12],
counter: u32,
inout: &mut [u8],
ctr32: impl Fn(&[u8; 16], &mut [[u8; 16]]),
) {
let (blocks, tail) = inout.as_chunks_mut::<16>();
let mut ivec = [0u8; 16];
ivec[..12].copy_from_slice(nonce);
ivec[12..].copy_from_slice(&counter.to_be_bytes());
ctr32(&ivec, blocks);
if !tail.is_empty() {
let counter = counter.wrapping_add(blocks.len() as u32);
ivec[12..].copy_from_slice(&counter.to_be_bytes());
let mut buf = [0u8; 16];
buf[..tail.len()].copy_from_slice(tail);
ctr32(&ivec, core::slice::from_mut(&mut buf));
tail.copy_from_slice(&buf[..tail.len()]);
}
}