使用旧Rust 2015

0.1.0 2019年7月3日
0.0.3 2019年6月27日
0.0.1 2019年6月4日

#30 in #bls-signatures

MIT/Apache

10MB
1.5K SLoC

bls Crates.io

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.0许可证定义,您提交给作品的所有贡献都将按照上述方式双许可,不附加任何额外条款或条件。

依赖关系

~5.5MB
~94K SLoC