是什么

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 crate gmcrypto-simd,通过 sm4-bitsliced-simd 特性按需启用。
  • 常量时间算术用 subtlecrypto-bigint 0.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、NEON sbox_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、部分嵌入式)不保证常量时间。

个人项目。不隶属、也没有被任何上游密码库、 支付网关、标准机构或厂商背书或认证。