ShangMi (SM) cipher suites for golang (Go语言商用密码软件)
Go to file
2025-05-30 15:25:37 +08:00
.github ci: test coverage for golang 1.24 2025-05-21 13:49:11 +08:00
cbcmac cbcmac: fix typo 2025-03-21 08:38:59 +08:00
cfca cfca: fix test cases #322 2025-04-01 17:06:47 +08:00
cipher cipher: move xts detail implementation to internal #320 2025-03-19 10:21:52 +08:00
docs sm2, sm2ec: remove useless codes since go 1.19 2025-04-07 13:10:09 +08:00
drbg drbg: replace with for range 2025-03-25 08:49:56 +08:00
ecdh internal/bigmod: use clear() 2025-02-26 10:50:35 +08:00
internal internal/zuc: supplement comments 2025-04-03 10:40:06 +08:00
kdf internal/byteorder: new package #275 2024-11-21 14:32:32 +08:00
mldsa mldsa: add benchmark for Verify 2025-05-30 15:25:37 +08:00
padding cbcmac,padding: supplement/update comments 2025-03-20 16:34:19 +08:00
pkcs internal/byteorder: new package #275 2024-11-21 14:32:32 +08:00
pkcs7 improve test coverage and remove deprecated methods 2025-01-22 10:28:01 +08:00
pkcs8 sm9: refactoring #314 2025-03-13 16:50:28 +08:00
slhdsa slhdsa: go1.24 build 2025-05-27 10:14:54 +08:00
sm2 sm2: provide SignMessage method to comply with the [crypto.MessageSigner] interface 2025-05-26 15:10:48 +08:00
sm3 internal/cpu: move to internal/deps/cpu #310 2025-03-21 10:04:35 +08:00
sm4 sm4: move implementation detail to internal 2025-03-11 11:43:49 +08:00
sm9 sm9: Prevent PublicKey() returning nil after unmarshaling master private key 2025-04-15 17:01:27 +08:00
smx509 smx509: use truncated SHA-256 for SubjectKeyId #328 2025-05-26 13:34:12 +08:00
zuc internal/zuc,zuc: eea seakable stream support zuc states cache per bucket #321 2025-03-28 16:53:29 +08:00
.gitattributes align format 2022-01-21 11:24:10 +08:00
.gitignore align format 2022-01-21 11:24:10 +08:00
DISCLAIMER.md update disclaimer 2025-04-18 08:50:39 +08:00
go.mod build(deps): bump golang.org/x/crypto from 0.37.0 to 0.38.0 2025-05-06 00:09:53 +00:00
go.sum build(deps): bump golang.org/x/crypto from 0.37.0 to 0.38.0 2025-05-06 00:09:53 +00:00
LICENSE align format 2022-01-21 11:24:10 +08:00
README-EN.md slhdsa: supplement more test cases 2025-05-21 11:41:00 +08:00
README.md slhdsa: supplement more test cases 2025-05-21 11:41:00 +08:00

Go语言商用密码软件

Github CI arm64-qemu sm3-sm4-ni-qemu codecov Go Report Card Documentation GitHub go.mod Go version (branch) Release

English | 简体中文

Go语言商用密码软件简称GMSM一个安全、高性能、易于使用的Go语言商用密码软件库涵盖商用密码公开算法SM2/SM3/SM4/SM9/ZUC。

用户文档

如果你想提问题,建议你阅读提问的智慧

包结构

  • SM2 - SM2椭圆曲线公钥密码算法曲线的具体实现位于internal/sm2ec package中。SM2曲线实现性能和Golang标准库中的NIST P256椭圆曲线原生实现非BoringCrypto类似也对amd64arm64s390xppc64le架构做了专门汇编优化实现,您也可以参考SM2实现细节及相关Wiki和代码以获得更多实现细节。SM2包实现了SM2椭圆曲线公钥密码算法的数字签名算法、公钥加密算法、密钥交换算法以及《GB/T 35276-2017信息安全技术 SM2密码算法使用规范》中的密钥对保护数据格式。

  • SM3 - SM3密码杂凑算法实现。amd64下分别针对AVX2+BMI2、AVX、SSE2+SSSE3做了消息扩展部分的SIMD实现 arm64下使用NEON指令做了消息扩展部分的SIMD实现同时也提供了基于A64扩展密码指令的汇编实现;s390xppc64x通过向量指令做了消息扩展部分的优化实现。您也可以参考SM3性能优化及相关Wiki和代码以获得更多实现细节。

  • SM4 - SM4分组密码算法实现。amd64下使用AES指令加上AVX2、AVX、SSE2+SSSE3实现了比较好的性能。arm64下使用AES指令加上NEON指令实现了比较好的性能同时也提供了基于A64扩展密码指令的汇编实现。ppc64x下使用vsbox指令加上向量指令进行了并行优化。针对ECB/CBC/GCM/XTS加密模式做了和SM4分组密码算法的融合汇编优化实现。您也可以参考SM4性能优化及相关Wiki和代码以获得更多实现细节。

  • SM9 - SM9标识密码算法实现。基础的素域、扩域、椭圆曲线运算以及双线性对运算位于bn256包中,分别对amd64arm64ppc64x架构做了优化实现。您也可以参考SM9实现及优化及相关讨论和代码以获得更多实现细节。SM9包实现了SM9标识密码算法的密钥生成、数字签名算法、密钥封装机制和公钥加密算法、密钥交换协议。

  • ZUC - 祖冲之序列密码算法实现。使用SIMD、AES指令以及无进位乘法指令分别对amd64arm64ppc64x架构做了优化实现, 您也可以参考ZUC实现及优化和相关代码以获得更多实现细节。ZUC包实现了基于祖冲之序列密码算法的机密性算法、128/256位完整性算法。

  • CBCMAC - 符合《GB/T 15852.1-2020 采用分组密码的机制》的消息鉴别码。

  • CFCA - CFCA中金特定实现目前实现的是SM2私钥、证书封装处理对应SADK中的PKCS12_SM2信封加密、签名CSR生成及返回私钥解密、解析等功能。

  • CIPHER - ECB/CCM/XTS/HCTR/BC/OFBNLF加密模式实现。XTS模式同时支持NIST规范和国标 GB/T 17964-2021。当前的XTS模式由于实现了BlockMode其结构包含一个tweak数组所以其不支持并发使用分组链接BC模式带非线性函数的输出反馈OFBNLF模式为分组密码算法的工作模式标准GB/T 17964的遗留模式,带泛杂凑函数的计数器HCTR模式GB/T 17964-2021中的新增模式。分组链接BC模式和CBC模式类似而带非线性函数的输出反馈OFBNLF模式的话从软件实现的角度来看基本没有性能优化的空间。

  • SMX509 - Go语言X509包的分支加入了商用密码支持。

  • PADDING - 一些填充方法实现(非常量时间运行):pkcs7,这是当前主要使用的填充方式,对应GB/T 17964-2021的附录C.2 填充方法 1iso9797m2,对应GB/T 17964-2021的附录C.3 填充方法 2ansix923对应ANSI X9.23标准。GB/T 17964-2021的附录C.4 填充方法 3对应ISO/IEC_9797-1 padding method 3。

  • PKCS7 - mozilla-services/pkcs7 项目该项目已于2024年2月10日被归档的分支加入了商用密码支持。

  • PKCS8 - youmark/pkcs8项目的分支,加入了商用密码支持。

  • ECDH - 一个类似Go语言中ECDH包的实现支持SM2椭圆曲线密码算法的ECDH & SM2MQV协议该实现没有使用 big.Int也是一个SM2包中密钥交换协议实现的替换实现推荐使用

  • DRBG - 《GM/T 0105-2021软件随机数发生器设计指南》实现。本实现同时支持NIST Special Publication 800-90A(部分) 和 GM/T 0105-2021NIST相关实现使用了NIST提供的测试数据进行测试。本实现不支持并发使用

  • MLDSA - NIST FIPS 204 Module-Lattice-Based Digital Signature Standard实现。

  • SLHDSA - NIST FIPS 205 Stateless Hash-Based Digital Signature Standard实现。

相关项目

  • Trisia/TLCP - 一个《GB/T 38636-2020 信息安全技术 传输层密码协议》Go语言实现项目。
  • Trisia/Randomness - 一个Go语言随机性检测规范实现。
  • PKCS12 - SSLMate/go-pkcs12项目的一个分支加入了商用密码支持由于PKCS12标准比较老安全性不高所以以独立项目进行维护。
  • MKSMCERT - 一个用于生成SM2私钥和证书的工具主要用于开发测试它是FiloSottile/mkcert项目的一个分支,加入了商用密码支持。
  • JavaScript实现
    • jsrsasign-sm 扩展jsrsasign实现的优势在于充分利用jsrsasign的PKIXCSRCERTPKCS8等处理能力。
    • sjcl-sm 扩展sjcl实现的优势在于其丰富的对称加密模式实现,以及其简洁的代码、较好的性能。

软件许可

本软件使用MIT许可证详情请参考软件许可。如果不熟悉MIT许可证条款请参考MIT许可证。请知晓和遵守被许可人义务

致谢

本项目的基础架构、设计和部分代码源自golang crypto.

SM4分组密码算法amd64 SIMD AES-NI实现SSE部分的算法源自mjosaarinen/sm4ni

SM9/BN256最初版本的代码复制自cloudflare/bn256项目,后期对基础的素域、扩域、椭圆曲线运算等进行了重写。

祖冲之序列密码算法实现amd64 SIMD AES-NI, CLMUL实现算法源自Intel(R) Multi-Buffer Crypto for IPsec Library项目。

PKCS7包代码是mozilla-services/pkcs7项目该项目已于2024年2月10日被归档的一个分支加入了商用密码扩展。

PKCS8包代码是youmark/pkcs8项目的一个分支,加入了商用密码扩展。

免责声明

使用本项目前,请务必仔细阅读GMSM软件免责声明

项目星标趋势

Stargazers over time