Skip to main content

crypto_sha3/
digest.rs

1// SPDX-FileCopyrightText: Copyright © 2026 ReallyMe LLC. All rights reserved
2//
3// SPDX-License-Identifier: Apache-2.0
4
5use sha3::{Digest, Sha3_224, Sha3_384, Sha3_512};
6use zeroize::{Zeroize, ZeroizeOnDrop};
7
8/// Length in bytes of a SHA3-224 digest.
9pub const SHA3_224_DIGEST_LENGTH: usize = 28;
10/// Length in bytes of a SHA3-384 digest.
11pub const SHA3_384_DIGEST_LENGTH: usize = 48;
12/// Length in bytes of a SHA3-512 digest.
13pub const SHA3_512_DIGEST_LENGTH: usize = 64;
14
15/// SHA3-224 digest bytes.
16#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
17pub struct Sha3_224Digest {
18    bytes: [u8; SHA3_224_DIGEST_LENGTH],
19}
20
21impl Sha3_224Digest {
22    /// Borrow the fixed-size digest bytes.
23    pub fn as_bytes(&self) -> &[u8; SHA3_224_DIGEST_LENGTH] {
24        &self.bytes
25    }
26
27    /// Consume the digest and return its fixed-size byte array.
28    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/// SHA3-384 digest bytes.
40#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
41pub struct Sha3_384Digest {
42    bytes: [u8; SHA3_384_DIGEST_LENGTH],
43}
44
45impl Sha3_384Digest {
46    /// Borrow the fixed-size digest bytes.
47    pub fn as_bytes(&self) -> &[u8; SHA3_384_DIGEST_LENGTH] {
48        &self.bytes
49    }
50
51    /// Consume the digest and return its fixed-size byte array.
52    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/// SHA3-512 digest bytes.
64#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
65pub struct Sha3_512Digest {
66    bytes: [u8; SHA3_512_DIGEST_LENGTH],
67}
68
69impl Sha3_512Digest {
70    /// Borrow the fixed-size digest bytes.
71    pub fn as_bytes(&self) -> &[u8; SHA3_512_DIGEST_LENGTH] {
72        &self.bytes
73    }
74
75    /// Consume the digest and return its fixed-size byte array.
76    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
87/// Compute SHA3-224 digest bytes for `message`.
88pub 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
98/// Compute SHA3-384 digest bytes for `message`.
99pub 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
109/// Compute SHA3-512 digest bytes for `message`.
110pub 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}