1use sha2::{Digest, Sha384, Sha512};
6use zeroize::{Zeroize, ZeroizeOnDrop};
7
8pub const SHA2_384_DIGEST_LENGTH: usize = 48;
10pub const SHA2_512_DIGEST_LENGTH: usize = 64;
12
13#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
15pub struct Sha2_384Digest {
16 bytes: [u8; SHA2_384_DIGEST_LENGTH],
17}
18
19impl Sha2_384Digest {
20 pub fn as_bytes(&self) -> &[u8; SHA2_384_DIGEST_LENGTH] {
22 &self.bytes
23 }
24
25 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#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)]
39pub struct Sha2_512Digest {
40 bytes: [u8; SHA2_512_DIGEST_LENGTH],
41}
42
43impl Sha2_512Digest {
44 pub fn as_bytes(&self) -> &[u8; SHA2_512_DIGEST_LENGTH] {
46 &self.bytes
47 }
48
49 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
61pub 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
72pub 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}