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 { 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 { 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") ); }