是什么
gm-crypto-rs 用纯 Rust 实现了
GB/T 32905(SM3 哈希)、
GB/T 32918(SM2 公钥签名 / 验签 / 加密 / 解密)、
GB/T 32907(SM4 分组密码)。
整个 crate 图是 no_std + alloc,
能编进 wasm32-unknown-unknown,
也给出了 RustCrypto 的 digest / mac / cipher trait 适配。
跟其他实现差在哪儿
Rust 里也有别的 SM 系列实现,RustCrypto 的 sm2 是用得最多的——
它在设计上就奔着"秘密相关操作走常量时间"去的。
这里的差异不在"设计意图"本身,
而在 CI 里多了一道回归门控:
一旦冒出时序泄漏,门控立刻拦住,
不靠人工评审去断言"目前没事"。
每次 CI 跑,dudect-bencher 都会扫过 15 个涉及秘密的代码路径,
门槛是 |τ| < 0.20。
覆盖了 SM2 签名、SM2 解密、SM4 密钥扩展、SM4 加密
(默认线性扫描和位切片 SIMD S-box 两种都跑)、
HMAC-SM3、加密 PKCS#8 解密,
还有 Fn::invert / Fp::invert 的直接诊断。
harness 报告的是检测事件——
|τ| 低,只意味着这次预算下没检测到泄漏,
并不等于"常量时间"。
这段措辞是直接借用 dudect-bencher 自己的文档。
安全设定
gmcrypto-core开了#![forbid(unsafe_code)]。- 所有 SIMD 的
unsafe都隔离到 sibling crategmcrypto-simd,通过sm4-bitsliced-simd特性按需启用。 - 常量时间算术用
subtle配crypto-bigint0.7。 - 秘密材料在 drop 的时候由
zeroize清零。
吞吐量是怎么上去的
v0.5 到 v0.6 是一条 SIMD 演进线。
v0.5.0 先搭好脚手架;
v0.5.1 加上 AVX2 的 sbox_x8;
v0.6.0 把它拓到 AVX2 上的 sbox_x32,
又在 aarch64 上加了 NEON 的 sbox_x16,
CBC 解密做了 fanout,让单块延迟藏在并行 S-box 后面。
v0.7(正在写)就在这之上,
做出第一批用户能直接调用的密码模式。
状态
- v0.6.0
- 已发布 2026-05-14 — AVX2
sbox_x32、NEONsbox_x16、CBC 解密 fanout。 - v0.7.0
- 在收尾 — 密码模式。5 个 PR 串成一摞;目标 2026-05-15 发出。
- v0.8.0
- 规划中 — AEAD:SM4-GCM 和 SM4-CCM,见
docs/v0.7-aead-scope.md。 - v0.9+
- 研究中 — 隔离环境的 dudect runner、流式 AEAD、AVX-512 16 路
sbox_x64、RustCrypto 0.11 / 0.5 / 0.6 trait 迁移。
它不是什么
- 不是 TLS / TLCP 实现。
- 不包括 SM9、ZUC、后量子算法。
- 不是 HSM / SDF / SKF 集成。
- 不是经过认证的密码模块。
- 在某些"乘法延迟跟数据相关"的 CPU 上(部分老 x86、部分嵌入式)不保证常量时间。
个人项目。不隶属、也没有被任何上游密码库、 支付网关、标准机构或厂商背书或认证。