1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use anyhow::Result;
use crypto::mac::Mac;

/* pub fn md5(str: &str) -> String {
    let mut hasher = Md5::new();
    hasher.input_str(str);
    hasher.result_str()
} */

pub fn sha1(data: &str) -> Result<String> {
    digest(data, crypto::sha1::Sha1::new())
}

pub fn sha256(data: &str) -> Result<String> {
    digest(data, crypto::sha2::Sha256::new())
}

pub fn sha512(data: &str) -> Result<String> {
    digest(data, crypto::sha2::Sha512::new())
}

pub fn md5(data: &str) -> Result<String> {
    digest(data, crypto::md5::Md5::new())
}

pub fn hmac_sha1(data: &str, key: &str) -> Result<String> {
    digest_hmac(data, key, crypto::sha1::Sha1::new())
}

pub fn hmac_sha256(data: &str, key: &str) -> Result<String> {
    digest_hmac(data, key, crypto::sha2::Sha256::new())
}

pub fn hmac_sha512(data: &str, key: &str) -> Result<String> {
    digest_hmac(data, key, crypto::sha2::Sha512::new())
}

pub fn sm3(data: &str) -> Result<String> {
    use libsm::sm3::hash::Sm3Hash;
    Ok(hex::encode(Sm3Hash::new(data.as_bytes()).get_hash()))
}

fn digest<A: crypto::digest::Digest>(data: &str, mut algorithm: A) -> Result<String> {
    algorithm.input_str(data);
    Ok(algorithm.result_str())
}

fn digest_hmac<A: crypto::digest::Digest>(data: &str, key: &str, algorithm: A) -> Result<String> {
    let mut hmac = crypto::hmac::Hmac::new(algorithm, key.as_bytes());
    hmac.input(data.as_bytes());
    Ok(hex::encode(hmac.result().code()))
}