Skip to main content

encryption/guomi/
sm3.rs

1// Copyright (c) 2026 erik <erik@erik.xyz> — https://erik.xyz
2
3//! 国密 SM3 杂凑(GB/T 32905-2016);输出 32 字节。
4
5use sm3::{Digest, Sm3};
6
7use crate::contract::Hasher;
8use crate::error::Result;
9use crate::hash::hasher;
10
11hasher!(Sm3Hasher, "sm3", "SM3 哈希器(无状态,可复用)。");
12
13// sm3 crate 走 digest 0.11 代际,与 hash/ 模块的 digest 0.10 不是同一个
14// `Digest` trait,故不能接 `NamedDigest`,此处自实现(`Identified` 由宏给出)。
15impl Hasher for Sm3Hasher {
16    fn digest(&self, data: &[u8]) -> Result<Vec<u8>> {
17        Ok(Sm3::digest(data).to_vec())
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24
25    /// GB/T 32905-2016 附录 A 的标准测试向量。
26    #[test]
27    fn matches_standard_vector() {
28        let hasher = Sm3Hasher::new();
29        assert_eq!(
30            hasher.digest_hex(b"abc").unwrap(),
31            "66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0"
32        );
33        assert_eq!(hasher.digest(b"abc").unwrap().len(), 32);
34    }
35}