Thanks to visit codestin.com
Credit goes to github.com

Skip to content

emmansun/gmsm

Repository files navigation

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 架构进行了汇编优化。

功能特性:

  • 数字签名算法(GB/T 32918.2-2016)
  • 公钥加密算法(GB/T 32918.4-2016)
  • 密钥交换协议(GB/T 32918.3-2016)
  • 密钥对保护数据格式(GB/T 35276-2017)

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

SM9 - 标识密码算法

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

功能特性:

  • 密钥生成算法(GM/T 0044-2016)
  • 数字签名算法
  • 密钥封装机制(KEM)
  • 公钥加密算法
  • 密钥交换协议

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


对称密码算法

SM3 - 密码杂凑算法

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

架构优化:

  • amd64:针对 AVX2+BMI2、AVX、SSE2+SSSE3 指令集优化消息扩展
  • arm64:使用 NEON 指令优化消息扩展,并提供基于 A64 扩展密码指令的实现
  • s390x/ppc64x:通过向量指令优化消息扩展

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

SM4 - 分组密码算法

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

架构优化:

  • amd64:使用 AES-NI 指令结合 AVX2/AVX/SSE2+SSSE3
  • arm64:使用 AES 指令结合 NEON,并提供基于 A64 扩展密码指令的实现
  • ppc64x:使用 vsbox 指令结合向量指令

工作模式优化:

  • ECB(电子密码本)
  • CBC(密码块链接)
  • GCM(伽罗瓦/计数器模式)
  • XTS(可调整密文分组链接,支持 GB/T 17964-2021 和 NIST SP 800-38E)

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

ZUC - 祖冲之序列密码算法

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

功能特性:

  • 机密性算法(128-EEA3 / 256-EEA3)
  • 完整性算法(128-EIA3 / 256-EIA3)

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


消息认证码

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

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

支持的 MAC 模式:

  • CBC-MAC(方案 1)
  • EMAC(方案 2)
  • ANSI Retail MAC(方案 3)
  • MAC-DES(方案 4)
  • CMAC(方案 5,RFC 4493)
  • LMAC(方案 6)
  • TR-CBC-MAC(方案 7)
  • CBCR-MAC(方案 8)

工作模式与填充

CIPHER - 分组密码工作模式

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

支持的工作模式:

  • ECB:电子密码本模式
  • CCM:计数器模式与 CBC-MAC 模式(RFC 3610)
  • XTS:可调整密文分组链接模式(GB/T 17964-2021 / NIST SP 800-38E)
  • HCTR:带泛杂凑函数的计数器模式(GB/T 17964-2021 新增)
  • BC:分组链接模式(GB/T 17964 遗留模式)
  • OFBNLF:带非线性函数的输出反馈模式(GB/T 17964 遗留模式)

注意事项:

  • XTS 模式实现了 cipher.BlockMode 接口,内部包含 tweak 状态,不支持并发使用
  • BC 模式与 CBC 模式功能相似
  • OFBNLF 模式从软件实现角度性能优化空间有限

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 非标准(遗留兼容)

安全实现:

  • 所有方案提供 ConstantTimeUnpad()Unpad() 两种方法
  • 加密数据必须使用 ConstantTimeUnpad() 防御时序攻击
  • Unpad() 仅用于非敏感数据的性能优化

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 曲线的密钥协商协议:

支持协议:

  • ECDH 密钥协商
  • SM2MQV 密钥协商(推荐)

特性:

  • big.Int 依赖,性能更优
  • 可作为 sm2 包密钥交换协议的替代实现

DRBG - 确定性随机位生成器

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

特性:

  • 使用 NIST 官方测试向量验证
  • 不支持并发使用

CFCA 互操作性

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

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

功能特性:

  • SM2 私钥和证书封装(PKCS#12_SM2 格式)
  • 信封加密与数字签名
  • CSR 生成与解析
  • 私钥解密

后量子密码学

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

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

支持参数集:

  • ML-KEM-512
  • ML-KEM-768
  • ML-KEM-1024

MLDSA - 基于模格的数字签名

符合 NIST FIPS 204 标准。

SLHDSA - 无状态哈希数字签名

符合 NIST FIPS 205 标准。

相关项目

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