#[inline(always)]
pub fn resize_block<const LEN: usize>(block: &[u8]) -> [u8; LEN] {
let mut uninit_output = [0u8; LEN];
let min_len = block.len().min(LEN);
(0..min_len).for_each(|i| uninit_output[i] = block[i]);
(min_len..LEN).for_each(|i| uninit_output[i] = 0);
uninit_output
}
#[inline(always)]
pub const fn const_resize_block<const LEN: usize, const LEN2: usize>(
block: &[u8; LEN2],
) -> [u8; LEN] {
let mut uninit_output = [0u8; LEN];
let min_len = match LEN2 < LEN {
true => LEN2,
false => LEN,
};
let mut i = 0;
while i < min_len {
uninit_output[i] = block[i];
i += 1;
}
let mut i = min_len;
while i < LEN {
uninit_output[i] = 0;
i += 1;
}
uninit_output
}
#[inline(always)]
pub fn pad_input<const LEN: usize>(input: &[u8]) -> Vec<[u8; LEN]> {
let block_cnt = (input.len() + LEN - 1) / LEN;
let chunks = input.chunks_exact(LEN);
let mut result_vec = Vec::with_capacity(block_cnt);
let remainder = chunks.remainder();
chunks.for_each(|chunk| result_vec.push(chunk.try_into().unwrap()));
if !remainder.is_empty() {
let marked_remainder = [remainder, &[0xFF]].concat();
result_vec.push(resize_block(&marked_remainder));
}
result_vec
}
#[inline(always)]
pub const fn xor_blocks<const LEN: usize>(lhs: &[u8; LEN], rhs: &[u8; LEN]) -> [u8; LEN] {
let mut uninit_output = [0u8; LEN];
let mut i = 0;
while i < LEN {
uninit_output[i] = lhs[i] ^ rhs[i];
i += 1;
}
uninit_output
}
#[inline(always)]
pub const fn inc_block<const LEN: usize>(block: &[u8; LEN]) -> [u8; LEN] {
let mut uninit_output = [0u8; LEN];
let mut i = 0;
while i < LEN {
uninit_output[i] = block[i];
i += 1;
}
let mut i = 0;
while i < LEN {
uninit_output[i] = uninit_output[i].wrapping_add(1);
if uninit_output[i] != 0 {
return uninit_output;
}
i += 1;
}
uninit_output
}