gmsm

Go语言商用密码软件

Github CI arm64 sm3-sm4-ni riscv64 loong64 ppc64le s390x 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 包中。本实现在性能上与 Go 标准库中 NIST P-256 曲线的原生实现(非 BoringCrypto)相当,并针对 amd64arm64s390xppc64leriscv64loong64 架构进行了汇编优化。

功能特性:

详细的性能优化分析和实现细节请参阅 SM2 性能优化 Wiki

SM9 - 标识密码算法

SM9 标识密码算法的底层数学运算(素域、扩域、椭圆曲线及双线性对)实现于 bn256 包中,支持 amd64arm64ppc64xriscv64loong64 架构的优化实现。

功能特性:

实现细节和优化策略请参阅 SM9 实现及优化 Wiki


对称密码算法

SM3 - 密码杂凑算法

SM3 密码杂凑算法(GM/T 0004-2012)实现了高效的 SIMD 优化:

架构优化:

详细实现分析请参阅 SM3 性能优化 Wiki

SM4 - 分组密码算法

SM4 分组密码算法(GM/T 0002-2012)实现了多架构汇编优化,并针对常用工作模式进行了融合优化:

架构优化:

工作模式优化:

详细实现分析请参阅 SM4 性能优化 Wiki

ZUC - 祖冲之序列密码算法

祖冲之序列密码算法(GM/T 0001-2012)实现了基于 SIMD、AES 指令和无进位乘法指令的优化,支持 amd64arm64ppc64x 架构。

功能特性:

详细实现分析请参阅 ZUC 实现及优化 Wiki


消息认证码

CBCMAC - 基于分组密码的消息认证码

符合《GB/T 15852.1-2020 信息安全技术 消息鉴别码算法 第1部分:采用分组密码的机制》标准,实现了多种 MAC 算法:

支持的 MAC 模式:


工作模式与填充

CIPHER - 分组密码工作模式

实现了《GB/T 17964-2021 信息安全技术 分组密码算法的工作模式》标准中定义的多种工作模式:

支持的工作模式:

注意事项:

PADDING - 填充方案

实现了多种符合标准的填充方案,支持常量时间去填充防御 Padding Oracle 攻击:

填充方案 对应标准
PKCS#7 GB/T 17964-2021 附录 C.2 填充方法 1 / RFC 5652
ISO/IEC 9797-1 方法 2 GB/T 17964-2021 附录 C.3 填充方法 2
ANSI X.923 ANSI X9.23 标准
ISO/IEC 9797-1 方法 3 GB/T 17964-2021 附录 C.4 填充方法 3
Zero Padding 非标准(遗留兼容)

安全实现:


PKI 与证书

SMX509 - 国密证书扩展

基于 Go 标准库 crypto/x509 包扩展,增加了国密算法支持,实现符合《GM/T 0015-2012 基于 SM2 密码算法的数字证书格式规范》。

PKCS#7 - 加密消息语法

基于 mozilla-services/pkcs7 项目(已于 2024 年 2 月归档)扩展,增加了国密算法支持,符合 RFC 2315 标准。

PKCS#8 - 私钥信息语法

基于 youmark/pkcs8 项目扩展,增加了国密算法支持,符合 RFC 5208 / RFC 5958 标准。


密钥协商与随机数

ECDH - 椭圆曲线 Diffie-Hellman

提供类似 Go 标准库 crypto/ecdh 的接口设计,支持 SM2 曲线的密钥协商协议:

支持协议:

特性:

DRBG - 确定性随机位生成器

符合《GM/T 0105-2021 软件随机数发生器设计指南》标准,同时兼容 NIST SP 800-90A 部分要求。

特性:


CFCA 互操作性

CFCA - 中国金融认证中心扩展

提供与 CFCA SADK 的互操作性支持:

功能特性:


后量子密码学

MLKEM - 基于模格的密钥封装机制

符合 NIST FIPS 203 标准,基于 Go 标准库实现。

支持参数集:

MLDSA - 基于模格的数字签名

符合 NIST FIPS 204 标准。

SLHDSA - 无状态哈希数字签名

符合 NIST FIPS 205 标准。

相关项目

软件许可

本软件使用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