#bls-signatures #signature #bls #signing #threshold-signature #signature-scheme

no-std blsful

根据IETF关于BLS12-381曲线的规范实现的BLS签名

25个稳定版本

2.5.7 2024年3月26日
2.5.4 2024年2月22日
2.5.0 2023年12月22日
2.4.2 2023年11月20日
1.2.0 2023年3月30日

#107加密学

Download history 492/week @ 2024-05-01 228/week @ 2024-05-08 496/week @ 2024-05-15 219/week @ 2024-05-22 228/week @ 2024-05-29 260/week @ 2024-06-05 475/week @ 2024-06-12 633/week @ 2024-06-19 267/week @ 2024-06-26 368/week @ 2024-07-03 371/week @ 2024-07-10 354/week @ 2024-07-17 275/week @ 2024-07-24 614/week @ 2024-07-31 448/week @ 2024-08-07 320/week @ 2024-08-14

1,703 每月下载量
用于 3 crates

MIT/Apache

660KB
4K SLoC

BLS签名方案

Crate Docs Apache 2.0/MIT Licensed

blissful包提供了一套生产就绪的BLS签名实现。

安全注意事项

此包已通过Kudelski Security的安全审计,未发现任何重大问题。审计报告可在此处找到。我们感谢LIT Protocol赞助此审计。

除非明确指出,否则所有操作都是常量时间。

文档

BLS签名提供了已知最小的签名大小,以及其他好处,如一轮阈值签名和签名聚合。

BLS签名依赖于对偶友好曲线,该曲线有两个点字段。此库为这两个字段提供了密钥和签名。

例如,大多数签名发生在G1群中,需要G2中的公钥,因此它们被简单地命名为SignaturePublicKey。变体类型交换了字段,因此命名为SignatureVtPublicKeyVt。签名知识证明支持使用Signatures上的proof_of_knowledge方法,允许签名持有者证明对签名的知识,而不泄露它。签名的消息仍然公开。鉴于这主要用于签名,它不会直接提供多签名或聚合签名的功能。

此库支持以PartialSignature的形式的阈值签名,该签名由SecretKeyShare生成,而不是由SecretKey生成。在阈值足够的情况下,PartialSignature可以组合成完整的Signature。可以使用类似vsss-rs的crates或使用类似gennaro-dkg的分布式密钥生成方法生成SecretKeyShare

多签名是指针对同一消息进行签名的聚合签名。这允许签名压缩和非常快速的验证,前提是已经考虑了使用拥有权证明来防止恶意密钥攻击。目前,这个库仅提供拥有权证明方案,因为这是最广泛使用的。

聚合签名是指针对不同消息进行签名的聚合签名。虽然验证速度提升不大,但仍然允许签名压缩。

示例

密钥操作

从随机熵源

let sk = SecretKey::<Bls12381G1Impl>::random(rand_core::OsRng);
let pk = PublicKey::from(&sk);
let pop = ProofOfPossession::new(&sk).expect("a proof of possession");
assert_eq!(pop.verify(pk).unwrap_u8(), 1u8);

从种子

let sk = SecretKey::<Bls12381G1Impl>::hash(b"seed phrase");
let pk = PublicKey::from(&sk);

将密钥分割成密钥份额

let shares = sk.split::<rand_core::OsRng, 3, 5>(rand_core::OsRng);

从份额恢复密钥

let sk = SecretKey::<Bls12381G1Impl>::combine::<3, 5>(&shares);

签名操作

创建签名

let sig = Signature::new(&sk, b"00000000-0000-0000-0000-000000000000").expect("a valid signature");

验证签名

assert_eq!(sig.verify(pk, b"00000000-0000-0000-0000-000000000000").unwrap_u8(), 1u8);

许可证

许可方式为以下之一

任选其一。

贡献

除非你明确声明,否则根据Apache-2.0许可证定义的,你提交的任何旨在包含在作品中的贡献,都将如上所述双重许可,无需任何额外的条款或条件。

参考

  1. IETF规范

依赖项

~4.5–6.5MB
~118K SLoC