-
Notifications
You must be signed in to change notification settings - Fork 93
Home
中国国家密码管理局商用密码实现及优化系列。
总体而言,在AMD64架构下,SM2/3的性能已经和主流NIST P256 / SHA 256相差不大了(要是AMD64也实现了SHA指令扩展,那SM3/SHA256的性能差别就会显著扩大。注:crypto/sha256: add sha-ni implementation,NI实现预计将于golang 1.21发布。SHA extensions);
而SM4,以往由于CPU指令级别差距,AES具有明显优势。但目前随着主流 CPU 开始原生支持 SM4NI 扩展指令集(如项目的 amd64-sm3sm4ni 分支),SM4 的硬件加速吞吐量已迎来质的飞跃。”
各算法架构优化表:
| amd64 | arm64 | ppc64x(*1) | s390x | riscv64(*3) | loong64(*4) | |
|---|---|---|---|---|---|---|
| SM2 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| SM3 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| SM4 | ✔ | ✔ | ✔ | ✘ | ✘ | ✔ (*5) |
| SM9 | ✔ | ✔ | ✔ | ✘(*2) | ✔ | ✔ |
| ZUC | ✔ | ✔ | ✔ | ✘ | ✘ | ✘ |
| MLKEM | ✔ | ✔ | ✔ | ✘ | ✘ | ✔ |
| MLDSA | ✔ | ✔ | ✘ | ✘ | ✘ | ✔ |
注1:ppc64x主要指ppc64le, 因为ppc64相对老旧。
注2:s390x的SM9优化基于现实需求没有实现。
注3:riscv64的SM2优化需要Zbb (Bitmanip), M (Multiply/Divide)。暂不支持向量操作。如果今后有了RISC-V Cryptography Extension指令支持,可以考虑支持,尤其是SM3/SM4。
注4:loong64的SIMD支持(LSX/LASX),需要golang 1.25+,所以LSX/LASX支持将在以后版本(v0.44.0+)发布(代码实现可以参考https://github.com/emmansun/gmsm/tree/loong64)。
注5:从v0.44.0开始支持LASX向量化查表方案,只对ECB/CBC解密/CTR等可并行的模式有效。
SM4架构优化表(以后重点关注riscv64):
| amd64 | arm64 | ppc64x | s390x | riscv64 | loong64 | |
|---|---|---|---|---|---|---|
| AESNI | ✔ | ✔ | ✔ | ✘ | ✘ | ✘ |
| GFNI | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ |
| SM4NI | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ |
| 向量查表 | ✘ | ✘ | ✘ | ✘ | ✘ | ✔ |
C语言实现的话,大部分实现都修改、扩展、剪裁自OpenSSL。好处在于OpenSSL认可度高、社区活跃、功能完善。典型的例子如:
OpenSSL本身也已经支持基本的SM2/SM3/SM4实现。
优点在于:
- 不需要受限于依赖的链接库,使用方便;
- 易于维护;
缺点:
- 可能是重复造轮子,开发难度相对较大,密码软件不只是结果正确,其执行过程安全性非常重要;
- 纯Go语言(无汇编优化)实现的性能可能没有那么好;