bwesterb/go-xmssmt
GitHub: bwesterb/go-xmssmt
Go 实现的后量子哈希签名方案 XMSS[MT],提供抗量子攻击的身份认证能力。
Stars: 24 | Forks: 5
## XMSSMT for Go
这是状态哈希签名方案 [RFC8391 (XMSS: Extended Hash-Based Signatures)](
https://tools.ietf.org/html/rfc8391) 和 [NIST SP 800-208](https://csrc.nist.gov/publications/detail/sp/800-208/draft) 的 Go 实现。
还有一个[方便的命令行工具](https://github.com/bwesterb/xmssmt)。
**警告**,XMSS(MT) 是 **有状态** 的,这意味着你不应该备份你的
私钥或制作它的副本。参见 [CLI 工具的 README](https://github.com/bwesterb/xmssmt#state)。
```
package main
import (
"github.com/bwesterb/go-xmssmt" // imported as xmssmt
"fmt"
)
func main() {
// Create a new keypair. See ListNames().
sk, pk, err := xmssmt.GenerateKeyPair("XMSSMT-SHAKE_20/4_256", "key")
if err != nil {
panic(err)
}
// Sign a message
sig, err := sk.Sign([]byte("Example message!"))
if err != nil {
panic(err)
}
sigBytes, _ := sig.MarshalBinary() // serialize signature
pkBytes, _ := pk.MarshalBinary() // serialize public key
fmt.Printf("len(sigBytes)=%d len(pkBytes)=%d\n",
len(sigBytes), len(pkBytes))
sk.Close() // close the private key container
// To verify we can simply use the Verify() method on PublicKey
valid, _ := pk.Verify(sig, []byte("Example message!"))
fmt.Printf("Valid=%v\n", valid)
// Or we can use the helper xmssmt.Verify() on serialized signature and pk
valid, _ = xmssmt.Verify(pkBytes, sigBytes, []byte("Example message!"))
fmt.Printf("Valid=%v\n", valid)
// To sign a new message, we open the private key container again
sk, pk, _, _ = xmssmt.LoadPrivateKey("key")
sig2, _ := sk.Sign([]byte("Other message"))
valid, _ = pk.Verify(sig2, []byte("Other message"))
fmt.Printf("Valid=%v\n", valid)
sk.Close()
// Or we can simply use the xmssmt.Sign() helper.
pkBytes, _ = pk.MarshalBinary()
sig3Bytes, _ := xmssmt.Sign("key", []byte("Third message"))
valid, _ = xmssmt.Verify(pkBytes, sig3Bytes, []byte("Third message"))
fmt.Printf("Valid=%v\n", valid)
}
```
有关 API 的更多文档,请参见 [godoc](https://godoc.org/github.com/bwesterb/go-xmssmt)。
## 关于兼容性
`go-xmssmt` 支持 XMSS[MT] 实例,这些实例(目前)未在
RFC 或 NIST SP 中列出,因此可能不被其他实现支持,例如
`XMSSMT-SHAKE_20/4_128_w256`。`go-xmssmt` 将这些
非标准实例的参数编码在 OID 编号的保留空间中,
请参考 [`Params.MarshalBinary()`](https://godoc.org/github.com/bwesterb/go-xmssmt#Params.MarshalBinary)。
如需最大兼容性,可以检查实例是否被 RFC 支持,方法是检查 `Context.FromRFC()` 和 `Context.FromNIST()`。
## 更新记录
### 1.5.2 (2022年7月5日)
- 修复在 32 位平台上的构建问题。感谢 @sietseringers。
- 更新依赖项
### 1.5.0 (2021年6月22日)
- 修复了非标准实例中 w≠16 的重大问题:
对于 w=256,包含了过多的校验和链;而对于 w=4
则包含过少。 在这两种情况下,签名都将
与正确的实现不兼容。
在 w=4 的情况下,签名可能被伪造。
这破坏了 w≠16 的非标准实例的兼容性。
### 1.4.3 (2020年12月21日)
- 支持页面大小不为 4096 的系统。
### 1.4.0 (2020年5月25日)
- 生成私钥的方式已按照
[参考实现](https://github.com/XMSS/xmss-reference/commit/3e28db2362f25600699972766e7782635b1826f5)
进行了更改,以防止多目标攻击
被 ETSI TC CYBER WG QSC 识别。 由于 XMSS 尚未广泛使用,
旧密钥无需重新生成。 请注意,这将
改变 `Derive()` 的输出。
- 添加对
[NIST SP 800-208](https://csrc.nist.gov/publications/detail/sp/800-208/draft)
中列出的实例的支持。
请注意,NIST 出版物中列出的 192 位实例使用了不同的 PRF 构造,因此 `XMSSMT-SHAKE_20/4_192` 在此版本中的含义
发生了变化。 以前未列出的使用 RFC 构造的实例
可以通过 `XMSSMT-SHAKE_20/4_192_RFC` 访问。 若要在其他模式上使用 NIST PRF
构造,可以在末尾添加 `_NIST`,例如
`XMSSMT-SHA2_20/4_128_NIST`。
- 修复了未列出的 128 位 SHA2 实例中的内存损坏错误。
在此版本之前,128 位 SHA2 实例的密钥和签名
生成和验证均不正确。
### 1.3.0 (2020年5月17日)
- 如果可用,使用 AVX2 来四路计算 SHAKE。 这使得 SHAKE
比 SHA2 更快。
### 1.2.0 (2019年12月27日)
- 添加对 RFC 中未列出的实例名称的支持。
### 1.1.0 (2019年12月20日)
- 添加对安全参数 N=16 的支持。
标签:CLI, EVTX分析, Go, NIST SP 800-208, RFC8391, Ruby工具, WiFi技术, XMSS, XMSSMT, 公钥密码学, 分层签名, 后量子安全, 后量子密码, 哈希基签名, 哈希树, 哈希签名, 密钥生成, 开源实现, 抗量子签名, 日志审计, 状态化签名, 签名生成, 签名算法, 签名验证, 量子安全