use anyhow::Result;
use crypto::mac::Mac;
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()))
}