Files
alibabacloud-openapi-signature/src/v4/algorithm.rs
2023-09-03 16:31:31 +08:00

61 lines
1.6 KiB
Rust

use sm3::{Digest, Sm3};
use crate::v4::constants::{ACS4_HMAC_SHA256, ACS4_HMAC_SM3};
#[derive(Clone, Copy)]
pub enum SignAlgorithm {
Sha256,
Sm3,
}
impl SignAlgorithm {
pub fn digest(&self, messge: &[u8]) -> String {
inner_digest(self, messge)
}
pub fn hmac_sign(&self, message: &[u8], key: &[u8]) -> Vec<u8> {
inner_hmac_sign(self, message, key)
}
pub fn as_aliyun_name(&self) -> &'static str {
match self {
SignAlgorithm::Sha256 => ACS4_HMAC_SHA256,
SignAlgorithm::Sm3 => ACS4_HMAC_SM3,
}
}
}
fn inner_digest(sign_algorithm: &SignAlgorithm, message: &[u8]) -> String {
match sign_algorithm {
SignAlgorithm::Sha256 => sha256::digest(message),
SignAlgorithm::Sm3 => {
let mut sm3 = Sm3::new();
sm3.update(&message);
hex::encode(sm3.finalize().as_slice())
}
}
}
fn inner_hmac_sign(sign_algorithm: &SignAlgorithm, message: &[u8], key: &[u8]) -> Vec<u8> {
match sign_algorithm {
SignAlgorithm::Sha256 => {
let mut hsha256 = hmac_sha256::HMAC::new(key);
hsha256.update(message);
hsha256.finalize().to_vec()
}
SignAlgorithm::Sm3 => hmac_sm3::hmac_sm3(key, message)
}
}
#[test]
fn test_digest() {
assert_eq!(
"a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e",
SignAlgorithm::Sha256.digest(b"Hello World")
);
assert_eq!(
"77015816143ee627f4fa410b6dad2bdb9fcbdf1e061a452a686b8711a484c5d7",
SignAlgorithm::Sm3.digest(b"Hello World")
);
}