使用旧Rust 2015
0.1.0 |
|
---|---|
0.0.3 |
|
0.0.1 |
|
#30 in #bls-signatures
10MB
1.5K SLoC
bls
Boneh-Lynn-Shacham (BLS) 签名具有慢速签名、非常慢的验证速度,需要慢速且安全性较低的配对友好曲线,并且容易受到危险的可塑性影响。然而,BLS 允许的签名聚合选项比任何其他已知签名方案都要多样化,这使得 BLS 成为共识算法和门限签名中首选的方案。
在这个包中,我们采用了一种在很大程度上统一的方法来处理 BLS 签名的聚合技术和验证器优化:我们通过 ZCash 的特性支持 BLS12-381 (Barreto-Lynn-Scott) 曲线,但抽象了配对,以便开发人员可以选择他们首选的 BLS 签名方向。我们提供了基于消息唯一性、持有证明和反线性化的聚合技术,尽管我们没有提供所有已知反线性的优化。
我们无法宣称这些抽象提供了误用抵抗,但它们至少结构化了问题,提供了一些指导原则,并最大化了文档中存在的警告的相关性。
文档
您只需像通常一样将 bls
包引入您的项目中。
use bls_like::{Keypair,ZBLS};
let keypair = Keypair::<ZBLS>::generate(::rand::thread_rng());
let message = Message::new(b"Some context",b"Some message");
let sig = keypair.sign(message);
assert!( sig.verify() );
在这个例子中,sig
是一个包含消息哈希、签名者的公钥以及当然签名,但通常应该将这些组成部分分离以用于网络格式。
聚合和盲签名几乎是人们考虑使用 BLS 签名的唯一原因,因此我们在此处重点关注聚合。我们假设为了简洁,sigs
是一个包含 SignedMessage
的数组,就像人们可能构建的那样
let sigs = msgs.iter().zip(keypairs.iter_mut()).map(|(m,k)| k.sign(*m)).collect::<Vec<_>>();
通常,需要唯一消息的聚合仍然需要每个消息一个米勒循环步骤,因此聚合签名的验证时间相当慢。然而,您可以仍然实现相当小的签名大小,如
let mut dms = sigs.iter().try_fold(
::bls::distinct::DistinctMessages::<ZBLS>::new(),
|dm,sig| dm.add(sig)
).unwrap();
dms.signature()
任何收到已聚合签名以及消息列表和公钥的人都可以像这样重建
let mut dms = msgs.iter().zip(publickeys).try_fold(
::bls::distinct::DistinctMessages::<ZBLS>::new(),
|dm,(message,publickey)| dm.add_message_n_publickey(message,publickey)
) ?;
dms.dms.add_signature(signature);
dms.verify()
我们主要推荐使用这种独特消息聚合来验证持有证明,这意味着检查多个密钥的自我证书。
假设您已经拥有占位证明,那么您可能希望使用 BitPoPSignedMessage
或针对您用例调整的变体进行聚合。我们建议在使用 BatchAssumingProofsOfPossession
时更加谨慎,因为它没有提供检查占位证明表的机制。
// TODO: Use BitPoPSignedMessage
如果您没有占位证明,那么在 delinear
模块中提供了非线化方法,但这些方案可能需要更定制化的方法。
安全警告
此库不对恒定时间操作、内存访问模式或对侧信道攻击的抵抗力做出任何保证。
许可证
在以下任一许可证下授权:
- Apache许可证第2版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您提交给作品的所有贡献都将按照上述方式双许可,不附加任何额外条款或条件。
依赖关系
~5.5MB
~94K SLoC