YuanHongYe fe532e12b4 sm9: Prevent PublicKey() returning nil after unmarshaling master private key
During unmarshaling of SignMasterPrivateKey and EncryptMasterPrivateKey,
now generate the corresponding public key.
This ensures that PublicKey() does not return nil.

Test cases included to validate the changes.

Signed-off-by: YuanHongYe <yuanhongye@chinatelecom.cn>
2025-04-15 17:01:27 +08:00
2025-03-13 14:44:56 +08:00
2025-03-21 08:38:59 +08:00
2025-04-01 17:06:47 +08:00
2025-03-25 08:49:56 +08:00
2025-02-26 10:50:35 +08:00
2024-11-21 14:32:32 +08:00
2024-11-21 14:32:32 +08:00
2025-03-13 16:50:28 +08:00
2022-01-21 11:24:10 +08:00
2022-01-21 11:24:10 +08:00
2022-11-03 09:41:36 +08:00
2022-01-21 11:24:10 +08:00
2025-03-18 11:27:28 +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提供的测试数据进行测试。本实现不支持并发使用

相关项目

  • 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

Description
ShangMi (SM) cipher suites for Go (Go语言商用密码软件)
Readme MIT 5.4 MiB
Languages
Go 70.1%
Assembly 29.9%