vade_sidetree_client/
multihash.rs1use std::todo;
2
3use ::multihash::{Code, MultihashDigest};
4use serde::Serialize;
5use sha2::{Digest, Sha256};
6
7use crate::encoder;
8
9pub fn canonicalize<T: Serialize + ?Sized>(value: &T) -> Result<Vec<u8>, String> {
10 serde_jcs::to_vec(value).map_err(|err| format!("{}", err))
11}
12
13pub fn canonicalize_then_hash_then_encode<T: Serialize + ?Sized>(
14 value: &T,
15 algorithm: HashAlgorithm,
16) -> String {
17 let canonicalized_string_buffer = match canonicalize(value){
18 Ok(value) => value,
19 Err(err) => return err,
20 };
21
22 hash_then_encode(&canonicalized_string_buffer, algorithm)
23}
24
25pub fn canonicalize_then_double_hash_then_encode<T: Serialize + ?Sized>(
26 value: &T,
27) -> Result<String, String> {
28 let content_buffer = match canonicalize(value) {
29 Ok(x) => x,
30 Err(_) => return Err("failed to canonicalize".to_string()),
31 };
32
33 let intermediate_hash_buffer =
34 hash_as_non_multihash_buffer(content_buffer.as_slice(), HashAlgorithm::Sha256);
35 let multihash_encoded_string =
36 hash_then_encode(intermediate_hash_buffer.as_slice(), HashAlgorithm::Sha256);
37 Ok(multihash_encoded_string)
38}
39
40pub fn hash(buffer: &[u8], algorithm: HashAlgorithm) -> Vec<u8> {
41 match algorithm {
42 HashAlgorithm::Sha256 => Code::Sha2_256.digest(buffer).to_bytes(),
43 HashAlgorithm::Sha3_256 => Code::Sha3_256.digest(buffer).to_bytes(),
44 }
45}
46
47pub fn hash_as_non_multihash_buffer(buffer: &[u8], algorithm: HashAlgorithm) -> Vec<u8> {
48 match algorithm {
49 HashAlgorithm::Sha256 => Sha256::digest(buffer).to_vec(),
50 HashAlgorithm::Sha3_256 => todo!(),
51 }
52}
53
54pub fn hash_then_encode(buffer: &[u8], algorithm: HashAlgorithm) -> String {
55 let multihash_buffer = hash(buffer, algorithm);
56 encoder::encode(multihash_buffer)
57}
58
59pub enum HashAlgorithm {
60 Sha256,
61 #[allow(dead_code)]
62 Sha3_256,
63}
64
65#[cfg(test)]
66pub mod test {
67 use ::multihash::{Code, MultihashDigest};
68
69 #[test]
70 pub fn test() {
71 let digest = Code::Sha2_256.digest(b"hello");
72
73 println!("{:?}", digest);
74 println!("{:?}", digest.to_bytes())
75 }
76}