diff --git a/Cargo.toml b/Cargo.toml index a2dc745..3a23e94 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hmac-sm3" -version = "0.1.0" +version = "0.1.1" edition = "2021" authors = ["Hatter Jiang"] repository = "https://git.hatter.ink/hatter/hmac-sm3" @@ -14,6 +14,8 @@ categories = ["cryptography"] [dependencies] sm3 = "0.4.2" - [dev-dependencies] hex = "0.4.3" +hmac-sha1 = "0.1.3" +hmac-sha256 = "1.1.7" +benchmark-simple = "0.1.8" diff --git a/README.md b/README.md index 29ed84b..65bab2e 100644 --- a/README.md +++ b/README.md @@ -19,3 +19,10 @@ let hmac2 = hm.finalize(); assert_eq!("9d91da552268ddf11b9f69662773a66c6375b250336dfb9293e7e2611c36d79f", hex::encode(hmac2)); ``` +Benchmark @MacBook Pro (Retina, 15-inch, Late 2013/2 GHz Quad-Core Intel Core i7) +```text +$ cargo run --release --example bench +HMAC-SM3 : 219.19 M/s +HMAC-SHA1 : 228.57 M/s +HMAC-SHA256 : 204.96 M/s +``` diff --git a/examples/bench.rs b/examples/bench.rs new file mode 100644 index 0000000..3eb29e1 --- /dev/null +++ b/examples/bench.rs @@ -0,0 +1,46 @@ +use benchmark_simple::{Bench, Options}; + +use hmac_sm3::hmac_sm3; + +fn test_hmac_sm3(m: &mut [u8]) { + let key = [0u8; 32]; + + hmac_sm3(&key, m); +} + +fn test_hmac_sha1(m: &mut [u8]) { + let key = [0u8; 32]; + + hmacsha1::hmac_sha1(&key, m); +} + +fn test_hmac_sha256(m: &mut [u8]) { + let key = [0u8; 32]; + + let mut hsha256 = hmac_sha256::HMAC::new(&key); + hsha256.update(m); + hsha256.finalize(); +} + +fn main() { + let bench = Bench::new(); + let mut m = vec![0xd0u8; 16384]; + + let options = &Options { + iterations: 1_000, + warmup_iterations: 1_00, + min_samples: 5, + max_samples: 10, + max_rsd: 1.0, + ..Default::default() + }; + + let res = bench.run(options, || test_hmac_sm3(&mut m)); + println!("HMAC-SM3 : {}", res.throughput(m.len() as _)); + + let res = bench.run(options, || test_hmac_sha1(&mut m)); + println!("HMAC-SHA1 : {}", res.throughput(m.len() as _)); + + let res = bench.run(options, || test_hmac_sha256(&mut m)); + println!("HMAC-SHA256 : {}", res.throughput(m.len() as _)); +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 5c51b39..65bbda7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,7 +11,7 @@ pub struct HmacSm3 { impl HmacSm3 { pub fn new(key: &[u8]) -> Self { - let mut structured_key = vec![0_u8; BLOCK_LENGTH]; + let mut structured_key = [0_u8; BLOCK_LENGTH]; if key.len() > BLOCK_LENGTH { structured_key[0..SM3_OUTPUT_LENGTH].copy_from_slice(sm3_digest(&key).as_slice()); } else { @@ -39,9 +39,7 @@ impl HmacSm3 { pub fn finalize(&mut self) -> Vec { let ipad_message_digest = self.sm3.clone().finalize(); - let mut opad_ipad_message_digest = self.opad.to_vec(); - opad_ipad_message_digest.extend_from_slice(ipad_message_digest.as_slice()); - sm3_digest(&opad_ipad_message_digest).as_slice().to_vec() + sm3_digest_2(&self.opad, &ipad_message_digest).as_slice().to_vec() } } @@ -51,12 +49,21 @@ pub fn hmac_sm3(key: &[u8], message: &[u8]) -> Vec { hsm3.finalize() } +#[inline] fn sm3_digest(message: &[u8]) -> Output { let mut sm3 = Sm3::new(); sm3.update(&message); sm3.finalize() } +#[inline] +fn sm3_digest_2(message: &[u8], message2: &[u8]) -> Output { + let mut sm3 = Sm3::new(); + sm3.update(&message); + sm3.update(&message2); + sm3.finalize() +} + #[test] fn test_001() { let message = b"Hello World";