mod curlp;
mod kerl;
mod kind;
use super::HASH_LENGTH;
pub use curlp::{BatchHasher, CurlP, CurlP27, CurlP81, CurlPRounds, UnrolledCurlP81, BATCH_SIZE};
pub use kerl::Kerl;
pub use kind::SpongeKind;
use bee_ternary::{TritBuf, Trits};
use std::ops::DerefMut;
pub trait Sponge {
type Error;
fn reset(&mut self);
fn absorb(&mut self, input: &Trits) -> Result<(), Self::Error>;
fn squeeze_into(&mut self, buf: &mut Trits) -> Result<(), Self::Error>;
fn squeeze(&mut self) -> Result<TritBuf, Self::Error> {
let mut output = TritBuf::zeros(HASH_LENGTH);
self.squeeze_into(&mut output)?;
Ok(output)
}
fn digest_into(&mut self, input: &Trits, buf: &mut Trits) -> Result<(), Self::Error> {
self.absorb(input)?;
self.squeeze_into(buf)?;
self.reset();
Ok(())
}
fn digest(&mut self, input: &Trits) -> Result<TritBuf, Self::Error> {
self.absorb(input)?;
let output = self.squeeze()?;
self.reset();
Ok(output)
}
}
impl<T: Sponge, U: DerefMut<Target = T>> Sponge for U {
type Error = T::Error;
fn reset(&mut self) {
T::reset(self)
}
fn absorb(&mut self, input: &Trits) -> Result<(), Self::Error> {
T::absorb(self, input)
}
fn squeeze_into(&mut self, buf: &mut Trits) -> Result<(), Self::Error> {
T::squeeze_into(self, buf)
}
}