11//! Hashing utilities using aws-lc-rs
22
3- use aws_lc_rs::digest::{self, Context, SHA256, SHA384, SHA512};
3+ use aws_lc_rs::digest::{self, Context, SHA256};
4+ use sigstore_types::Sha256Hash;
45
5- /// Hash data using SHA-256
6- pub fn sha256(data: &[u8]) -> [u8; 32] {
6+ /// Hash data using SHA-256, returning a typed hash
7+ pub fn sha256(data: &[u8]) -> Sha256Hash {
78 let digest = digest::digest(&SHA256, data);
89 let mut result = [0u8; 32];
910 result.copy_from_slice(digest.as_ref());
10- result
11- }
12-
13- /// Hash data using SHA-384
14- pub fn sha384(data: &[u8]) -> [u8; 48] {
15- let digest = digest::digest(&SHA384, data);
16- let mut result = [0u8; 48];
17- result.copy_from_slice(digest.as_ref());
18- result
19- }
20-
21- /// Hash data using SHA-512
22- pub fn sha512(data: &[u8]) -> [u8; 64] {
23- // TODO: should we use aws-lc-rs DIGEST?
24- let digest = digest::digest(&SHA512, data);
25- let mut result = [0u8; 64];
26- result.copy_from_slice(digest.as_ref());
27- result
11+ Sha256Hash::from_bytes(result)
2812}
2913
3014/// Incremental SHA-256 hasher
@@ -45,12 +29,12 @@ impl Sha256Hasher {
4529 self.context.update(data);
4630 }
4731
48- /// Finalize and get the digest
49- pub fn finalize(self) -> [u8; 32] {
32+ /// Finalize and get the digest as a typed hash
33+ pub fn finalize(self) -> Sha256Hash {
5034 let digest = self.context.finish();
5135 let mut result = [0u8; 32];
5236 result.copy_from_slice(digest.as_ref());
53- result
37+ Sha256Hash::from_bytes( result)
5438 }
5539}
5640
@@ -67,13 +51,13 @@ mod tests {
6751 #[test]
6852 fn test_sha256() {
6953 let hash = sha256(b"hello");
70- assert_eq!(hash.len(), 32);
54+ assert_eq!(hash.as_bytes(). len(), 32);
7155
7256 // Known SHA-256 hash of "hello"
7357 let expected =
7458 hex::decode("2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824")
7559 .unwrap();
76- assert_eq!(& hash[..], & expected[..] );
60+ assert_eq!(hash.as_bytes(), expected.as_slice() );
7761 }
7862
7963 #[test]
0 commit comments