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, Identified};
8use crate::error::Result;
9
10/// SM3 哈希器(无状态,可复用)。
11#[derive(Debug, Default, Clone, Copy)]
12pub struct Sm3Hasher;
13
14impl Sm3Hasher {
15    pub const IDENTIFIER: &'static str = "sm3";
16
17    pub fn new() -> Self {
18        Self
19    }
20}
21
22impl Identified for Sm3Hasher {
23    fn identifier(&self) -> &str {
24        Self::IDENTIFIER
25    }
26}
27
28impl Hasher for Sm3Hasher {
29    fn digest(&self, data: &[u8]) -> Result<Vec<u8>> {
30        Ok(Sm3::digest(data).to_vec())
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    /// GB/T 32905-2016 附录 A 的标准测试向量。
39    #[test]
40    fn matches_standard_vector() {
41        let hasher = Sm3Hasher::new();
42        assert_eq!(
43            hasher.digest_hex(b"abc").unwrap(),
44            "66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0"
45        );
46        assert_eq!(hasher.digest(b"abc").unwrap().len(), 32);
47    }
48}