61 lines
1.6 KiB
Rust
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")
|
|
);
|
|
}
|