Skip to main content

crypto_sha2_256/
digest.rs

1// SPDX-FileCopyrightText: Copyright © 2026 ReallyMe LLC. All rights reserved
2//
3// SPDX-License-Identifier: Apache-2.0
4
5use sha2::{Digest, Sha256};
6use zeroize::{Zeroize, ZeroizeOnDrop};
7
8/// Length in bytes of a SHA-256 digest.
9pub const SHA2_256_DIGEST_LENGTH: usize = 32;
10
11/// SHA-256 digest bytes.
12#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
13pub struct Sha2_256Digest {
14    bytes: [u8; SHA2_256_DIGEST_LENGTH],
15}
16
17impl Sha2_256Digest {
18    /// Borrow the fixed-size digest bytes.
19    pub fn as_bytes(&self) -> &[u8; SHA2_256_DIGEST_LENGTH] {
20        &self.bytes
21    }
22
23    /// Consume the digest and return its fixed-size byte array.
24    pub fn into_bytes(self) -> [u8; SHA2_256_DIGEST_LENGTH] {
25        self.bytes
26    }
27}
28
29impl core::fmt::Debug for Sha2_256Digest {
30    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
31        write!(f, "Sha2_256Digest(len={})", SHA2_256_DIGEST_LENGTH)
32    }
33}
34
35/// Compute SHA-256 digest bytes for `message`.
36pub fn digest(message: &[u8]) -> Sha2_256Digest {
37    let mut hasher = Sha256::new();
38    hasher.update(message);
39    let output = hasher.finalize();
40
41    let mut bytes = [0u8; SHA2_256_DIGEST_LENGTH];
42    bytes.copy_from_slice(&output);
43    Sha2_256Digest { bytes }
44}