use core::marker::PhantomData;
use blake2b_simd::{Params, State};
use crate::{private::SealedScalar, SigType};
pub struct HStar<T: SigType> {
state: State,
_marker: PhantomData<T>,
}
impl<T: SigType> Default for HStar<T> {
fn default() -> Self {
let state = Params::new()
.hash_length(64)
.personal(T::H_STAR_PERSONALIZATION)
.to_state();
Self {
state,
_marker: PhantomData::default(),
}
}
}
impl<T: SigType> HStar<T> {
pub fn update(&mut self, data: impl AsRef<[u8]>) -> &mut Self {
self.state.update(data.as_ref());
self
}
pub fn finalize(&self) -> T::Scalar {
T::Scalar::from_bytes_wide(self.state.finalize().as_array())
}
}