use hmac::{Hmac, Mac};
use sha1::Sha1;
use sha1::Digest;
use std::fmt::Write;
use base64::Engine;
use base64::engine::general_purpose::STANDARD;
type Hmac1 = Hmac<Sha1>;
pub fn encrypt_hex(data: &[u8]) -> String {
let mut hasher = Sha1::new();
hasher.update(data);
let result = hasher.finalize();
format!("{result:x}")
}
pub fn encrypt_base64(data: &[u8]) -> String {
let mut hasher = Sha1::new();
hasher.update(data);
let result = hasher.finalize();
STANDARD.encode(result)
}
pub fn encrypt_hmac(key: &str, data: &[u8]) -> String {
let mut mac = Hmac1::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_byte(key: &str, data: &[u8]) -> Vec<u8> {
let mut mac = Hmac1::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!("356a192b7913b04c54574d18c28d46e6395428ab", data);
let data = encrypt_hmac("1", b"1");
assert_eq!("5b0c157d4e7672444c41033561554839ed1fd2d6", data);
let data = encrypt_hmac_byte("1", b"1");
let md5 = hex::decode("5b0c157d4e7672444c41033561554839ed1fd2d6").unwrap();
assert_eq!(md5, data);
}