use crate::{Block, Key, ParBlocks, Tag, field_element::FieldElement};
#[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();
}
}