use crate::{Block, Key, ParBlocks, Tag, field_element::FieldElement};
#[cfg(feature = "zeroize")]
use zeroize::Zeroize;
#[derive(Clone)]
#[allow(missing_copy_implementations)]
pub(crate) struct State {
h: FieldElement,
y: FieldElement,
}
impl State {
pub(crate) fn new(h: &Key) -> Self {
Self {
h: FieldElement::from(*h),
y: FieldElement::default(),
}
}
pub(crate) fn proc_block(&mut self, block: &Block) {
self.y = (self.y + block.into()) * self.h;
}
pub(crate) fn proc_par_blocks(&mut self, par_blocks: &ParBlocks) {
for block in par_blocks {
self.proc_block(block);
}
}
pub(crate) fn finalize(&self) -> Tag {
self.y.into()
}
pub(crate) fn reset(&mut self) {
self.y = FieldElement::default();
}
}
#[cfg(feature = "zeroize")]
impl Zeroize for State {
fn zeroize(&mut self) {
self.h.zeroize();
self.y.zeroize();
}
}