Sun Yimin 7724ae48da
Merge pull request #233 from emmansun/dependabot/go_modules/golang.org/x/crypto-0.26.0
build(deps): bump golang.org/x/crypto from 0.25.0 to 0.26.0
2024-08-13 08:35:21 +08:00
2024-05-29 12:57:54 +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
2024-07-26 17:42:58 +08:00
2024-07-26 17:42:58 +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 SDK中的NIST P256椭圆曲线原生实现非BoringCrypto类似也对amd64arm64架构做了专门汇编优化实现,您也可以参考SM2实现细节及相关Wiki和代码以获得更多实现细节。SM2包实现了SM2椭圆曲线公钥密码算法的数字签名算法、公钥加密算法、密钥交换算法以及《GB/T 35276-2017信息安全技术 SM2密码算法使用规范》中的密钥对保护数据格式。

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

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

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

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

  • CFCA - CFCA中金特定实现目前实现的是SM2私钥、证书封装处理对应SADK中的PKCS12_SM2

  • 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%