1use crate::error::Error::BlakeError;
2use crate::error::{InvalidSizeError, Result};
3use blake2::digest::{Update, VariableOutput};
4use blake2::Blake2bVar;
5use sha2::Sha256;
6use sha3::{Digest, Keccak256};
7
8pub struct Hash;
9
10impl Hash {
11 pub fn secure_hash(source: &[u8]) -> Result<Vec<u8>> {
12 Ok(Self::keccak(&Self::blake(source)?))
13 }
14
15 pub fn keccak(source: &Vec<u8>) -> Vec<u8> {
16 Keccak256::digest(source).to_vec()
17 }
18
19 pub fn blake(source: &[u8]) -> Result<Vec<u8>> {
20 let mut blake =
21 Blake2bVar::new(32).map_err(|e| BlakeError(InvalidSizeError::InvalidOutputSize(e)))?;
22 blake.update(source);
23 let mut buf = [0u8; 32];
24 blake
25 .finalize_variable(&mut buf)
26 .map_err(|e| BlakeError(InvalidSizeError::InvalidBufferSize(e)))?;
27 Ok(buf.to_vec())
28 }
29
30 pub fn sha256(source: &Vec<u8>) -> Vec<u8> {
31 let hash_seed = Sha256::digest(source.as_slice());
32 hash_seed.as_slice().to_vec()
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use crate::error::Result;
39 use crate::util::{Base58, Hash};
40
41 #[test]
42 fn test_secure_hash() -> Result<()> {
43 let source = "test".as_bytes().to_vec();
44 let expected_secure = Base58::decode("JDJkZrg24XwvBgBUi6PgpHzrAFgeefb7nU8LJPRR58ga")?;
45 let secure_hash = Hash::secure_hash(&source)?;
46 assert_eq!(secure_hash, expected_secure);
47 Ok(())
48 }
49
50 #[test]
51 fn test_sha256() {
52 let source = "test".as_bytes().to_vec();
53 let expected_sha = Base58::decode("Bjj4AWTNrjQVHqgWbP2XaxXz4DYH1WZMyERHxsad7b2w")
54 .expect("failed to decode base58 string");
55
56 assert_eq!(Hash::sha256(&source), expected_sha)
57 }
58}