Skip to main content

chaincraft_rust/crypto/
hash.rs

1//! Hash utilities and functions
2
3use serde::{Deserialize, Serialize};
4use sha2::{Digest, Sha256};
5use sha3::{Keccak256, Sha3_256};
6
7/// Hash algorithms supported by the system
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9pub enum HashAlgorithm {
10    Sha256,
11    Sha3_256,
12    Keccak256,
13    Blake3,
14}
15
16/// Compute SHA-256 hash
17pub fn sha256(data: &[u8]) -> [u8; 32] {
18    let mut hasher = Sha256::new();
19    hasher.update(data);
20    hasher.finalize().into()
21}
22
23/// Compute SHA-256 hash and return as hex string
24pub fn sha256_hex(data: &[u8]) -> String {
25    hex::encode(sha256(data))
26}
27
28/// Compute SHA3-256 hash
29pub fn sha3_256(data: &[u8]) -> [u8; 32] {
30    let mut hasher = Sha3_256::new();
31    hasher.update(data);
32    hasher.finalize().into()
33}
34
35/// Compute Keccak-256 hash (Ethereum style)
36pub fn keccak256(data: &[u8]) -> [u8; 32] {
37    let mut hasher = Keccak256::new();
38    hasher.update(data);
39    hasher.finalize().into()
40}
41
42/// Compute Blake3 hash
43pub fn blake3_hash(data: &[u8]) -> [u8; 32] {
44    blake3::hash(data).into()
45}
46
47/// Generic hash function
48pub fn hash_with_algorithm(data: &[u8], algorithm: HashAlgorithm) -> [u8; 32] {
49    match algorithm {
50        HashAlgorithm::Sha256 => sha256(data),
51        HashAlgorithm::Sha3_256 => sha3_256(data),
52        HashAlgorithm::Keccak256 => keccak256(data),
53        HashAlgorithm::Blake3 => blake3_hash(data),
54    }
55}
56
57/// Hash multiple pieces of data together
58pub fn hash_multiple(data_pieces: &[&[u8]], algorithm: HashAlgorithm) -> [u8; 32] {
59    match algorithm {
60        HashAlgorithm::Sha256 => {
61            let mut hasher = Sha256::new();
62            for piece in data_pieces {
63                hasher.update(piece);
64            }
65            hasher.finalize().into()
66        },
67        HashAlgorithm::Sha3_256 => {
68            let mut hasher = Sha3_256::new();
69            for piece in data_pieces {
70                hasher.update(piece);
71            }
72            hasher.finalize().into()
73        },
74        HashAlgorithm::Keccak256 => {
75            let mut hasher = Keccak256::new();
76            for piece in data_pieces {
77                hasher.update(piece);
78            }
79            hasher.finalize().into()
80        },
81        HashAlgorithm::Blake3 => {
82            let mut hasher = blake3::Hasher::new();
83            for piece in data_pieces {
84                hasher.update(piece);
85            }
86            hasher.finalize().into()
87        },
88    }
89}