1use base64::{prelude::BASE64_STANDARD, Engine, DecodeError};
3use hmac::{Hmac, Mac};
4use sha1::{Sha1, Digest};
5
6pub struct SecureUtil;
7
8impl SecureUtil {
9
10 pub fn base64_encode(bytes: &[u8]) -> String {
12 BASE64_STANDARD.encode(bytes)
13 }
14
15 pub fn base64_decode(base64_str: &str) -> Result<Vec<u8>, DecodeError> {
17 BASE64_STANDARD.decode(base64_str)
18 }
19
20 pub fn hmac_sha1(data: &[u8], key: &str) -> Vec<u8> {
22 let key = key.as_bytes();
23 let mut hmac = Hmac::<Sha1>::new_from_slice(key).expect("HMAC can take key of any size");
24 hmac.update(data);
25 let result = hmac.finalize();
26 let hmac_bytes = result.into_bytes();
27 hmac_bytes.to_vec()
28 }
29
30 pub fn to_md5_str(bytes: &[u8]) -> String {
31 let data_md5 = md5::compute(bytes);
32 let md5_string = format!("{:x}", data_md5);
33 md5_string
34 }
35
36 pub fn to_md5(bytes: &[u8]) -> Vec<u8> {
37 let data_md5 = md5::compute(bytes).to_vec();
38 data_md5
39 }
40
41
42}
43
44
45#[cfg(test)]
46mod tests {
47
48 use super::*;
49
50 #[test]
51 fn test_base64() {
52 let bytes = "hello, rust!".as_bytes();
53 let base64_str = SecureUtil::base64_encode(bytes);
54 println!("{}", base64_str);
55
56 }
57}