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, 公钥密码学, 分层签名, 后量子安全, 后量子密码, 哈希基签名, 哈希树, 哈希签名, 密钥生成, 开源实现, 抗量子签名, 日志审计, 状态化签名, 签名生成, 签名算法, 签名验证, 量子安全