use sha3::{Digest, Sha3_224, Sha3_384, Sha3_512};
use zeroize::{Zeroize, ZeroizeOnDrop};
pub const SHA3_224_DIGEST_LENGTH: usize = 28;
pub const SHA3_384_DIGEST_LENGTH: usize = 48;
pub const SHA3_512_DIGEST_LENGTH: usize = 64;
#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
pub struct Sha3_224Digest {
bytes: [u8; SHA3_224_DIGEST_LENGTH],
}
impl Sha3_224Digest {
pub fn as_bytes(&self) -> &[u8; SHA3_224_DIGEST_LENGTH] {
&self.bytes
}
pub fn into_bytes(self) -> [u8; SHA3_224_DIGEST_LENGTH] {
self.bytes
}
}
impl core::fmt::Debug for Sha3_224Digest {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "Sha3_224Digest(len={})", SHA3_224_DIGEST_LENGTH)
}
}
#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
pub struct Sha3_384Digest {
bytes: [u8; SHA3_384_DIGEST_LENGTH],
}
impl Sha3_384Digest {
pub fn as_bytes(&self) -> &[u8; SHA3_384_DIGEST_LENGTH] {
&self.bytes
}
pub fn into_bytes(self) -> [u8; SHA3_384_DIGEST_LENGTH] {
self.bytes
}
}
impl core::fmt::Debug for Sha3_384Digest {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "Sha3_384Digest(len={})", SHA3_384_DIGEST_LENGTH)
}
}
#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
pub struct Sha3_512Digest {
bytes: [u8; SHA3_512_DIGEST_LENGTH],
}
impl Sha3_512Digest {
pub fn as_bytes(&self) -> &[u8; SHA3_512_DIGEST_LENGTH] {
&self.bytes
}
pub fn into_bytes(self) -> [u8; SHA3_512_DIGEST_LENGTH] {
self.bytes
}
}
impl core::fmt::Debug for Sha3_512Digest {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "Sha3_512Digest(len={})", SHA3_512_DIGEST_LENGTH)
}
}
pub fn digest_sha3_224(message: &[u8]) -> Sha3_224Digest {
let mut hasher = Sha3_224::new();
hasher.update(message);
let output = hasher.finalize();
let mut bytes = [0u8; SHA3_224_DIGEST_LENGTH];
bytes.copy_from_slice(&output);
Sha3_224Digest { bytes }
}
pub fn digest_sha3_384(message: &[u8]) -> Sha3_384Digest {
let mut hasher = Sha3_384::new();
hasher.update(message);
let output = hasher.finalize();
let mut bytes = [0u8; SHA3_384_DIGEST_LENGTH];
bytes.copy_from_slice(&output);
Sha3_384Digest { bytes }
}
pub fn digest_sha3_512(message: &[u8]) -> Sha3_512Digest {
let mut hasher = Sha3_512::new();
hasher.update(message);
let output = hasher.finalize();
let mut bytes = [0u8; SHA3_512_DIGEST_LENGTH];
bytes.copy_from_slice(&output);
Sha3_512Digest { bytes }
}