Skip to main content

crypto_sha2/
digest.rs

1// SPDX-FileCopyrightText: Copyright © 2026 ReallyMe LLC. All rights reserved
2//
3// SPDX-License-Identifier: Apache-2.0
4
5use sha2::{Digest, Sha384, Sha512};
6use zeroize::{Zeroize, ZeroizeOnDrop};
7
8/// Length in bytes of a SHA-384 digest.
9pub const SHA2_384_DIGEST_LENGTH: usize = 48;
10/// Length in bytes of a SHA-512 digest.
11pub const SHA2_512_DIGEST_LENGTH: usize = 64;
12
13/// SHA-384 digest bytes.
14#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
15pub struct Sha2_384Digest {
16    bytes: [u8; SHA2_384_DIGEST_LENGTH],
17}
18
19impl Sha2_384Digest {
20    /// Borrow the fixed-size digest bytes.
21    pub fn as_bytes(&self) -> &[u8; SHA2_384_DIGEST_LENGTH] {
22        &self.bytes
23    }
24
25    /// Consume the digest and return its fixed-size byte array.
26    pub fn into_bytes(self) -> [u8; SHA2_384_DIGEST_LENGTH] {
27        self.bytes
28    }
29}
30
31impl core::fmt::Debug for Sha2_384Digest {
32    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
33        write!(f, "Sha2_384Digest(len={})", SHA2_384_DIGEST_LENGTH)
34    }
35}
36
37/// SHA-512 digest bytes.
38#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
39pub struct Sha2_512Digest {
40    bytes: [u8; SHA2_512_DIGEST_LENGTH],
41}
42
43impl Sha2_512Digest {
44    /// Borrow the fixed-size digest bytes.
45    pub fn as_bytes(&self) -> &[u8; SHA2_512_DIGEST_LENGTH] {
46        &self.bytes
47    }
48
49    /// Consume the digest and return its fixed-size byte array.
50    pub fn into_bytes(self) -> [u8; SHA2_512_DIGEST_LENGTH] {
51        self.bytes
52    }
53}
54
55impl core::fmt::Debug for Sha2_512Digest {
56    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
57        write!(f, "Sha2_512Digest(len={})", SHA2_512_DIGEST_LENGTH)
58    }
59}
60
61/// Compute SHA-384 digest bytes for `message`.
62pub fn digest_sha2_384(message: &[u8]) -> Sha2_384Digest {
63    let mut hasher = Sha384::new();
64    hasher.update(message);
65    let output = hasher.finalize();
66
67    let mut bytes = [0u8; SHA2_384_DIGEST_LENGTH];
68    bytes.copy_from_slice(&output);
69    Sha2_384Digest { bytes }
70}
71
72/// Compute SHA-512 digest bytes for `message`.
73pub fn digest_sha2_512(message: &[u8]) -> Sha2_512Digest {
74    let mut hasher = Sha512::new();
75    hasher.update(message);
76    let output = hasher.finalize();
77
78    let mut bytes = [0u8; SHA2_512_DIGEST_LENGTH];
79    bytes.copy_from_slice(&output);
80    Sha2_512Digest { bytes }
81}