trailofbits/lms-go
GitHub: trailofbits/lms-go
Go 语言实现的 RFC 8554 Leighton-Micali 哈希签名算法,提供抗量子计算攻击的有状态数字签名能力。
Stars: 13 | Forks: 2
# Leighton-Micali 基于哈希的签名
本代码库包含 [Leighton-Micali Hash-Based
Signatures (RFC 8554)](https://datatracker.ietf.org/doc/html/rfc8554) 的实现。
## 安全须知
LMS 签名是有状态的:用户务必注意,切勿使用同一个内部 LM-OTS 私钥签署多条
消息。为避免灾难性后果,必须在签名算法的多次调用之间维护状态。
在使用我们的 LMS 实现时,内部计数器 (`q`) 会在返回每个签名之前
递增。
如果 LMS 私钥被持久化到存储中,您 **必须** 在生成每个签名后、将其释放给
应用程序其余部分之前,更新持久化存储。未能遵守此要求属于您的应用程序中的
安全漏洞。
关于无状态基于哈希的签名算法,请参阅
[SPHINCS+](https://sphincs.org)。
注意:本项目未经外部审计,但整个代码库
已由 Trail of Bits 的密码学家进行了内部审查。
## 安装
```
go get https://github.com/trailofbits/lms-go
```
## 用法
```
seckey, err := lms.NewPrivateKey(common.LMS_SHA256_M32_H10, common.LMOTS_SHA256_N32_W4)
pubkey, err := seckey.Public()
// The optional nil argument can be a user-chosen RNG
sig, err := seckey.Sign([]byte("example"), nil)
sig_valid := pubkey.Verify([]byte("example"), sig)
```
### 密钥管理
在密钥管理方面,我们对用户的要求并不多。任何更改内部
状态的操作都使用指针调用来更新内部状态。
将私钥持久化到长期存储时,用户必须非常小心,
确保 **同一私钥绝不会从磁盘读取两次**。这将导致
存在两个处于相同状态的私钥,因此当它们都用于签署
消息时,LMOTS 私钥将被重复使用,这被认为 **后果严重**。
## 许可证
本代码库根据 [3-Clause BSD License](https://opensource.org/license/bsd-3-clause/) 授权。
## 贡献
如果您有兴趣为本代码库做贡献,请参阅 [CONTRIBUTING.md](/CONTRIBUTING.md) 获取更多信息。
标签:CVE, EVTX分析, EVTX分析, Go, Golang, Leighton-Micali, LM-OTS, LMS, PQC, RFC 8554, Ruby工具, SHA-256, Trail of Bits, 加密算法, 后量子密码学, 哈希签名, 安全编程, 密码学, 开发库, 手动系统调用, 抗量子, 数字签名, 日志审计, 状态签名, 网络安全, 隐私保护