use crate::{zest_block::ZestBlock, zest_hash::zest4096};
pub fn zest_dec(
cipher_blocks: Vec<ZestBlock>,
key: ZestBlock,
init_ctr_dec: Option<ZestBlock>,
init_result_dgst: Option<ZestBlock>,
init_ctr_dgst: Option<ZestBlock>,
) -> Option<Vec<ZestBlock>> {
let mut text_out = vec![];
let mut counter = init_ctr_dec.unwrap_or_else(ZestBlock::new);
let mut result_dgst = init_result_dgst.unwrap_or_else(ZestBlock::new);
let mut ctr_dgst = init_ctr_dgst.unwrap_or_else(ZestBlock::new);
for block in cipher_blocks.iter().take(cipher_blocks.len() - 1) {
let mut hashed_out = zest4096(key ^ counter);
hashed_out ^= *block;
counter.increment_block();
text_out.push(hashed_out);
result_dgst ^= zest4096(hashed_out + ctr_dgst);
ctr_dgst.increment_block();
}
if let Some(digest_enc) = cipher_blocks.last() {
if *digest_enc == result_dgst {
return Some(text_out);
}
}
None
}