rust_bottle/hash.rs
1use sha2::{Digest, Sha256, Sha384, Sha512};
2use sha3::{Sha3_256, Sha3_384, Sha3_512};
3
4/// Hash data using the provided hasher type.
5///
6/// This is a generic function that works with any type implementing the
7/// `Digest` trait from the `sha2` or `sha3` crates.
8///
9/// # Type Parameters
10///
11/// * `D` - A hasher type implementing `Digest` (e.g., `Sha256`, `Sha3_512`)
12///
13/// # Arguments
14///
15/// * `data` - The data to hash
16///
17/// # Returns
18///
19/// The hash output as a byte vector
20///
21/// # Example
22///
23/// ```rust
24/// use rust_bottle::hash::hash;
25/// use sha2::Sha256;
26///
27/// let data = b"Hello, world!";
28/// let hash = hash::<Sha256>(data);
29/// ```
30pub fn hash<D: Digest>(data: &[u8]) -> Vec<u8> {
31 let mut hasher = D::new();
32 hasher.update(data);
33 hasher.finalize().to_vec()
34}
35
36/// Multi-level hash (hash of hash).
37///
38/// This function applies hashing multiple times, hashing the result of the
39/// previous hash. This can be useful for certain cryptographic constructions.
40///
41/// # Type Parameters
42///
43/// * `D` - A hasher type implementing `Digest`
44///
45/// # Arguments
46///
47/// * `data` - The data to hash
48/// * `levels` - The number of times to hash (0 means no hashing, 1 means hash once, etc.)
49///
50/// # Returns
51///
52/// The final hash output after applying hashing `levels` times
53///
54/// # Example
55///
56/// ```rust
57/// use rust_bottle::hash::multi_hash;
58/// use sha2::Sha256;
59///
60/// let data = b"Hello, world!";
61/// let hash = multi_hash::<Sha256>(data, 3); // Hash 3 times
62/// ```
63pub fn multi_hash<D: Digest>(data: &[u8], levels: usize) -> Vec<u8> {
64 let mut result = data.to_vec();
65 for _ in 0..levels {
66 result = crate::hash::hash::<D>(&result);
67 }
68 result
69}
70
71/// Hash data using SHA-256.
72///
73/// SHA-256 is a widely-used cryptographic hash function producing 256-bit
74/// (32-byte) outputs. It's used throughout rust-bottle for key fingerprinting.
75///
76/// # Arguments
77///
78/// * `data` - The data to hash
79///
80/// # Returns
81///
82/// SHA-256 hash as a 32-byte vector
83///
84/// # Example
85///
86/// ```rust
87/// use rust_bottle::hash::sha256;
88///
89/// let data = b"Hello, world!";
90/// let hash = sha256(data);
91/// assert_eq!(hash.len(), 32);
92/// ```
93pub fn sha256(data: &[u8]) -> Vec<u8> {
94 hash::<Sha256>(data)
95}
96
97/// Hash data using SHA-384.
98///
99/// SHA-384 is a cryptographic hash function producing 384-bit (48-byte) outputs.
100///
101/// # Arguments
102///
103/// * `data` - The data to hash
104///
105/// # Returns
106///
107/// SHA-384 hash as a 48-byte vector
108pub fn sha384(data: &[u8]) -> Vec<u8> {
109 hash::<Sha384>(data)
110}
111
112/// Hash data using SHA-512.
113///
114/// SHA-512 is a cryptographic hash function producing 512-bit (64-byte) outputs.
115///
116/// # Arguments
117///
118/// * `data` - The data to hash
119///
120/// # Returns
121///
122/// SHA-512 hash as a 64-byte vector
123pub fn sha512(data: &[u8]) -> Vec<u8> {
124 hash::<Sha512>(data)
125}
126
127/// Hash data using SHA3-256.
128///
129/// SHA3-256 is a SHA-3 variant producing 256-bit (32-byte) outputs.
130///
131/// # Arguments
132///
133/// * `data` - The data to hash
134///
135/// # Returns
136///
137/// SHA3-256 hash as a 32-byte vector
138pub fn sha3_256(data: &[u8]) -> Vec<u8> {
139 hash::<Sha3_256>(data)
140}
141
142/// Hash data using SHA3-384.
143///
144/// SHA3-384 is a SHA-3 variant producing 384-bit (48-byte) outputs.
145///
146/// # Arguments
147///
148/// * `data` - The data to hash
149///
150/// # Returns
151///
152/// SHA3-384 hash as a 48-byte vector
153pub fn sha3_384(data: &[u8]) -> Vec<u8> {
154 hash::<Sha3_384>(data)
155}
156
157/// Hash data using SHA3-512.
158///
159/// SHA3-512 is a SHA-3 variant producing 512-bit (64-byte) outputs.
160///
161/// # Arguments
162///
163/// * `data` - The data to hash
164///
165/// # Returns
166///
167/// SHA3-512 hash as a 64-byte vector
168pub fn sha3_512(data: &[u8]) -> Vec<u8> {
169 hash::<Sha3_512>(data)
170}