4个版本
0.2.1 | 2023年9月11日 |
---|---|
0.2.0 | 2023年3月6日 |
0.1.1 | 2023年1月4日 |
0.1.0 | 2022年12月30日 |
844在密码学
每月564次下载
在2个crate中使用(通过mithril-common)
56KB
996 行
密钥演变签名

kes-sumed-ed25519
是密钥演变签名的纯Rust实现,遵循Malkin、Micciancio和Miner发表的论文 "Composition and Efficiency Tradeoffs for Forward-Secure Digital Signatures",特别是第3.1节中的 "sum" 组合。作为一个深度零签名算法,我们使用Ed25519,并采用来自 ed25519_dalek
的 strict
验证标准,这与当前在 libsodium 中使用的相同。
该库定义了宏来生成不同深度的KES算法。我们目前公开了深度高达7的KES算法。但是,如果您需要更高深度的密钥,请随时提交issue/PR。
库使用
该库为[2,7]范围内的X暴露了 SumXKes
。深度为X的KES算法可以演变密钥 2^X
。当密钥演变时,旧种子会被零覆盖。
use kes_summed_ed25519::kes::Sum6Kes;
use kes_summed_ed25519::traits::{KesSig, KesSk};
fn main() {
let (mut skey, pkey) = Sum6Kes::keygen(&mut [0u8; 32]);
let dummy_message = b"tilin";
let sigma = skey.sign(0, dummy_message);
assert!(sigma.verify(0, &pkey, dummy_message).is_ok());
// Key can be updated 63 times
for i in 0..63 {
assert!(skey.update(i).is_ok());
}
}
与Cardano的兼容性
我们提供了两个KES实现,以与Cardano的区块链兼容。Cardano目前使用 Sum6Kes
。然而,那个实现关于签名大小并不优化。相反,我们提供了 SumCompact6Kes
的实现,它将签名大小提供了渐近的减半。我们提供使用Cardano代码生成的测试向量,以确保库的未来更改不会失去与Cardano的兼容性。这些测试向量可以在 ./tests/data
中找到,测试可以在 ./tests/interoperability.rs
中找到。
注意:本库的秘密密钥与用于cardano节点的KES密钥不兼容。在这个库中,我们将KES秘密密钥的周期作为其结构的一部分,而cardano实现则没有这样做。这个决定基于以下两个原因
- 它极大地简化了API,使其使用更加直观。此外,周期是签名/更新skey所必需的知识,我们得出结论,秘密密钥应该包含它的周期。
- 秘密密钥不会通过网络发送,这意味着使用此实现的节点不需要与cardano节点的序列化兼容。然而,如果出于某种原因,需要将cardano节点序列化的密钥用于此应用程序(或反之亦然),只需将周期作为4个大端字节表示的32位数字添加即可(或反过来,从序列化的签名中移除最后4个字节)。此程序的示例可以在本库的互操作性测试中找到。
代码的先前版本
此仓库是对kes-mmm-sumed25519的复制和修改。旧仓库保持不变,以供历史参考。
免责声明
本库未经过审计。使用风险自负。
贡献
除非您明确声明,否则任何有意提交以供包含在您的工作中的贡献,如Apache-2.0许可证中定义的,均应按上述方式许可,不附加任何额外条款或条件。
依赖项
~1.9–2.8MB
~59K SLoC