vade_sidetree_client/
multihash.rs

1use 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}