1use sha3::{Digest, Sha3_224, Sha3_384, Sha3_512};
6use zeroize::{Zeroize, ZeroizeOnDrop};
7
8pub const SHA3_224_DIGEST_LENGTH: usize = 28;
10pub const SHA3_384_DIGEST_LENGTH: usize = 48;
12pub const SHA3_512_DIGEST_LENGTH: usize = 64;
14
15#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
17pub struct Sha3_224Digest {
18 bytes: [u8; SHA3_224_DIGEST_LENGTH],
19}
20
21impl Sha3_224Digest {
22 pub fn as_bytes(&self) -> &[u8; SHA3_224_DIGEST_LENGTH] {
24 &self.bytes
25 }
26
27 pub fn into_bytes(self) -> [u8; SHA3_224_DIGEST_LENGTH] {
29 self.bytes
30 }
31}
32
33impl core::fmt::Debug for Sha3_224Digest {
34 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
35 write!(f, "Sha3_224Digest(len={})", SHA3_224_DIGEST_LENGTH)
36 }
37}
38
39#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
41pub struct Sha3_384Digest {
42 bytes: [u8; SHA3_384_DIGEST_LENGTH],
43}
44
45impl Sha3_384Digest {
46 pub fn as_bytes(&self) -> &[u8; SHA3_384_DIGEST_LENGTH] {
48 &self.bytes
49 }
50
51 pub fn into_bytes(self) -> [u8; SHA3_384_DIGEST_LENGTH] {
53 self.bytes
54 }
55}
56
57impl core::fmt::Debug for Sha3_384Digest {
58 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
59 write!(f, "Sha3_384Digest(len={})", SHA3_384_DIGEST_LENGTH)
60 }
61}
62
63#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
65pub struct Sha3_512Digest {
66 bytes: [u8; SHA3_512_DIGEST_LENGTH],
67}
68
69impl Sha3_512Digest {
70 pub fn as_bytes(&self) -> &[u8; SHA3_512_DIGEST_LENGTH] {
72 &self.bytes
73 }
74
75 pub fn into_bytes(self) -> [u8; SHA3_512_DIGEST_LENGTH] {
77 self.bytes
78 }
79}
80
81impl core::fmt::Debug for Sha3_512Digest {
82 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
83 write!(f, "Sha3_512Digest(len={})", SHA3_512_DIGEST_LENGTH)
84 }
85}
86
87pub fn digest_sha3_224(message: &[u8]) -> Sha3_224Digest {
89 let mut hasher = Sha3_224::new();
90 hasher.update(message);
91 let output = hasher.finalize();
92
93 let mut bytes = [0u8; SHA3_224_DIGEST_LENGTH];
94 bytes.copy_from_slice(&output);
95 Sha3_224Digest { bytes }
96}
97
98pub fn digest_sha3_384(message: &[u8]) -> Sha3_384Digest {
100 let mut hasher = Sha3_384::new();
101 hasher.update(message);
102 let output = hasher.finalize();
103
104 let mut bytes = [0u8; SHA3_384_DIGEST_LENGTH];
105 bytes.copy_from_slice(&output);
106 Sha3_384Digest { bytes }
107}
108
109pub fn digest_sha3_512(message: &[u8]) -> Sha3_512Digest {
111 let mut hasher = Sha3_512::new();
112 hasher.update(message);
113 let output = hasher.finalize();
114
115 let mut bytes = [0u8; SHA3_512_DIGEST_LENGTH];
116 bytes.copy_from_slice(&output);
117 Sha3_512Digest { bytes }
118}