use std::fmt::Debug;
use zerocopy::IntoBytes;
use zeroize::{Zeroize, ZeroizeOnDrop};
use crate::duplex_sponge::{DuplexSponge, Permutation};
pub type Keccak = DuplexSponge<KeccakF1600>;
#[derive(Clone, PartialEq, Eq, Default, Zeroize, ZeroizeOnDrop)]
pub struct KeccakF1600([u64; 25]);
impl Permutation for KeccakF1600 {
type U = u8;
const N: usize = 136 + 64;
const R: usize = 136;
fn new(iv: [u8; 32]) -> Self {
let mut state = Self::default();
state.as_mut()[Self::R..Self::R + 32].copy_from_slice(&iv);
state
}
fn permute(&mut self) {
keccak::f1600(&mut self.0);
}
}
impl AsRef<[u8]> for KeccakF1600 {
fn as_ref(&self) -> &[u8] {
self.0.as_bytes()
}
}
impl AsMut<[u8]> for KeccakF1600 {
fn as_mut(&mut self) -> &mut [u8] {
self.0.as_mut_bytes()
}
}
impl Debug for KeccakF1600 {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("AlignedKeccakF1600")
.field(&"<redacted>")
.finish()
}
}