use base64::Engine;
use base64::engine::general_purpose;
use hmac::{Hmac, Mac};
use std::fmt::Write;
use sha2::Sha256;
use sha2::Digest;
type Hmac256 = Hmac<Sha256>;
pub fn encrypt_hex(data: &[u8]) -> String {
let mut hasher = Sha256::new();
hasher.update(data);
hex::encode(hasher.finalize())
}
pub fn encrypt_byte(data: &[u8]) -> Vec<u8> {
let digest = Sha256::digest(data);
digest.to_vec()
}
pub fn encrypt_base64(data: &[u8]) -> String {
let mut hasher = Sha256::new();
hasher.update(data);
let digest = hasher.finalize();
general_purpose::STANDARD.encode(digest)
}
pub fn encrypt_hmac(key: &str, data: &[u8]) -> String {
let mut mac = Hmac256::new_from_slice(key.as_bytes()).expect("HMAC can take key of any size");
mac.update(data);
let result = mac.finalize();
let code = result.into_bytes();
let mut contents = String::with_capacity(code.len() * 2); for &byte in &code {
write!(&mut contents, "{byte:02x}").expect("Unable to write");
}
contents
}
pub fn encrypt_hmac_hex(key: &str, data: &[u8]) -> String {
let mut mac = Hmac256::new_from_slice(key.as_bytes()).expect("HMAC can take key of any size");
mac.update(data);
let result = mac.finalize();
let code = result.into_bytes();
hex::encode(code)
}
pub fn encrypt_hmac_byte(key: &str, data: &[u8]) -> Vec<u8> {
let mut mac = Hmac256::new_from_slice(key.as_bytes()).expect("HMAC can take key of any size");
mac.update(data);
let result = mac.finalize();
let code = result.into_bytes();
code.to_vec()
}
#[test]
fn tests() {
let data = encrypt_hex(b"1");
assert_eq!("6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", data);
let data = encrypt_base64(b"1");
assert_eq!("a4ayc/80/OGda4BO/1o/V0etpOqiLx1JwB5S3beHW0s=", data);
let data = encrypt_hmac("1", b"1");
assert_eq!("6ff6ceedb1c100266849d7e4e13449c98d1c98e569994f8ddbfe7b52e780dead", data);
let data = encrypt_hmac_byte("1", b"1");
let md5 = hex::decode("6ff6ceedb1c100266849d7e4e13449c98d1c98e569994f8ddbfe7b52e780dead").unwrap();
assert_eq!(md5, data);
let data = encrypt_byte(b"1");
println!("body:\n{data:?}");
let body = br#"{"orderId":12345,"amount":99.9}"#;
println!("body:\n{body:?}");
}