use crate::Error;
use base64::Engine;
use base64::prelude::BASE64_STANDARD;
use hmac::Hmac;
use hmac::KeyInit;
use hmac::Mac;
use sha1::Sha1;
use sha2::Digest;
use sha2::Sha256;
pub fn base64_encode(content: &[u8]) -> String {
BASE64_STANDARD.encode(content)
}
pub fn base64_decode(content: &str) -> crate::Result<Vec<u8>> {
BASE64_STANDARD
.decode(content)
.map_err(|e| Error::unexpected("base64 decode failed").with_source(e))
}
pub fn hex_sha1(content: &[u8]) -> String {
hex::encode(Sha1::digest(content))
}
pub fn hex_sha256(content: &[u8]) -> String {
hex::encode(Sha256::digest(content))
}
pub fn hmac_sha256(key: &[u8], content: &[u8]) -> Vec<u8> {
let mut h = Hmac::<Sha256>::new_from_slice(key).unwrap();
h.update(content);
h.finalize().into_bytes().to_vec()
}
pub fn base64_hmac_sha256(key: &[u8], content: &[u8]) -> String {
let mut h = Hmac::<Sha256>::new_from_slice(key).unwrap();
h.update(content);
base64_encode(&h.finalize().into_bytes())
}
pub fn hex_hmac_sha1(key: &[u8], content: &[u8]) -> String {
let mut h = Hmac::<Sha1>::new_from_slice(key).unwrap();
h.update(content);
hex::encode(h.finalize().into_bytes())
}
pub fn hex_hmac_sha256(key: &[u8], content: &[u8]) -> String {
let mut h = Hmac::<Sha256>::new_from_slice(key).unwrap();
h.update(content);
hex::encode(h.finalize().into_bytes())
}
pub fn base64_hmac_sha1(key: &[u8], content: &[u8]) -> String {
let mut h = Hmac::<Sha1>::new_from_slice(key).unwrap();
h.update(content);
base64_encode(&h.finalize().into_bytes())
}