chaincraft_rust/crypto/
hash.rs1use serde::{Deserialize, Serialize};
4use sha2::{Digest, Sha256};
5use sha3::{Keccak256, Sha3_256};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9pub enum HashAlgorithm {
10 Sha256,
11 Sha3_256,
12 Keccak256,
13 Blake3,
14}
15
16pub fn sha256(data: &[u8]) -> [u8; 32] {
18 let mut hasher = Sha256::new();
19 hasher.update(data);
20 hasher.finalize().into()
21}
22
23pub fn sha256_hex(data: &[u8]) -> String {
25 hex::encode(sha256(data))
26}
27
28pub fn sha3_256(data: &[u8]) -> [u8; 32] {
30 let mut hasher = Sha3_256::new();
31 hasher.update(data);
32 hasher.finalize().into()
33}
34
35pub fn keccak256(data: &[u8]) -> [u8; 32] {
37 let mut hasher = Keccak256::new();
38 hasher.update(data);
39 hasher.finalize().into()
40}
41
42pub fn blake3_hash(data: &[u8]) -> [u8; 32] {
44 blake3::hash(data).into()
45}
46
47pub 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
57pub 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}