#public-key #bls-signatures #apache #bls12-381 #ethereum #milagro #curve

无std snowbridge-milagro-bls

使用Apache米尔加罗曲线库实现BLS12-381签名,针对以太坊2.0

3个稳定版本

1.5.4 2024年1月22日
1.5.2 2024年1月19日

1149魔力豆

Download history 20403/week @ 2024-03-14 25902/week @ 2024-03-21 26974/week @ 2024-03-28 31667/week @ 2024-04-04 28312/week @ 2024-04-11 25346/week @ 2024-04-18 19777/week @ 2024-04-25 19150/week @ 2024-05-02 18579/week @ 2024-05-09 18425/week @ 2024-05-16 29499/week @ 2024-05-23 25297/week @ 2024-05-30 17876/week @ 2024-06-06 20771/week @ 2024-06-13 21792/week @ 2024-06-20 15417/week @ 2024-06-27

79,951 每月下载量
用于 18 个crate(通过 snowbridge-beacon-primiti…

Apache-2.0

69KB
1K SLoC

使用Apache米尔加罗实现的Rust中的BLS12-381聚合签名

Build Status Gitter

警告:此库仍在开发中,尚未经过审计。请勿将加密视为安全!

使用Apache米尔加罗密码库

此crate大量基于@lovesh的工作。

目前,此库仅支持以太坊2.0签名验证所需的功能。此处的方法易受到恶意密钥攻击。

此crate尚未进行公开审计或审查。如果您是密码学家,我将非常欢迎您的意见。

此库使用占有证明(PoP)变体作为对抗恶意密钥攻击的保护。可以通过签署公钥的哈希值来验证公钥的PoP。这必须在任何聚合签名中使用公钥之前完成。

在验证签名期间和反序列化公钥期间执行子群检查。

BLS标准

当前BLS标准的实现与bls-signatures-v04hash-to-curve-v09相一致。

使用方法

单个签名

执行非聚合BLS签名的签名和验证。支持序列化和反序列化公钥和私钥。

let sk_bytes = vec![
	78, 252, 122, 126, 32, 0, 75, 89, 252, 31, 42, 130, 254, 88, 6, 90, 138, 202, 135, 194,
	233, 117, 181, 75, 96, 238, 79, 100, 237, 59, 140, 111,
];

// Load some keys from a serialized secret key.
let sk = SecretKey::from_bytes(&sk_bytes).unwrap();
let pk = PublicKey::from_secret_key(&sk);

// Sign a message
let message = "cats".as_bytes();
let signature = Signature::new(&message, &sk);
assert!(signature.verify(&message, &pk));

// Serialize then de-serialize, just 'cause we can.
let pk_bytes = pk.as_bytes();
let pk = PublicKey::from_bytes(&pk_bytes).unwrap();

// Verify the message
assert!(signature.verify(&message, &pk));

生成新的“随机”密钥(有关熵源信息,请参阅 SecretKey 文档)。

// Generate a random key pair.
let sk = SecretKey::random(&mut rand::thread_rng());
let pk = PublicKey::from_secret_key(&sk);

// Sign and verify a message.
let message = "cats".as_bytes();
let signature = Signature::new(&message, &sk);
assert!(signature.verify(&message, &pk));

聚合签名

支持序列化和反序列化聚合签名和公钥。支持序列化和反序列化 AggregateSignaturesAggregatePublicKeys

let signing_secret_key_bytes = vec![
		vec![
				98, 161, 50, 32, 254, 87, 16, 25, 167, 79, 192, 116, 176, 74, 164, 217, 40, 57,
				179, 15, 19, 21, 240, 100, 70, 127, 111, 170, 129, 137, 42, 53,
		],
		vec![
				53, 72, 211, 104, 184, 68, 142, 208, 115, 22, 156, 97, 28, 216, 228, 102, 4, 218,
				116, 226, 166, 131, 67, 7, 40, 55, 157, 167, 157, 127, 143, 13,
		],
];

// Load the key pairs from our serialized secret keys,
let signing_keypairs: Vec<Keypair> = signing_secret_key_bytes
		.iter()
		.map(|bytes| {
				let sk = SecretKey::from_bytes(&bytes).unwrap();
				let pk = PublicKey::from_secret_key(&sk);
				Keypair { sk, pk }
		})
		.collect();

let message = "cats".as_bytes();

// Create an aggregate signature over some message, also generating an
// aggregate public key at the same time.
let mut agg_sig = AggregateSignature::new();
let mut public_keys = vec![];
for keypair in &signing_keypairs {
		let sig = Signature::new(&message, &keypair.sk);
		agg_sig.add(&sig);
		public_keys.push(keypair.pk.clone());
}
let agg_pub_key = AggregatePublicKey::into_aggregate(&public_keys).unwrap();

// Serialize and de-serialize the aggregates, just 'cause we can.
let agg_sig_bytes = agg_sig.as_bytes();
let agg_sig = AggregateSignature::from_bytes(&agg_sig_bytes).unwrap();

// Verify the AggregateSignature against the AggregatePublicKey
assert!(agg_sig.fast_aggregate_verify_pre_aggregated(&message, &agg_pub_key));
}

如何运行基准测试

cargo bench --features "bench"

依赖项

~4–15MB
~193K SLoC