15个版本
0.3.13 | 2024年7月24日 |
---|---|
0.3.11 | 2023年8月9日 |
0.3.10 | 2022年6月25日 |
0.3.7 | 2022年1月31日 |
0.1.1 | 2020年7月6日 |
#33 in 密码学
275,583 每月下载量
在 473 个crate(36个直接) 中使用
2.5MB
112K SLoC
blst
blst
crate为blst BLS12-381签名库提供了一个Rust接口。
构建
bindgen用于生成对blst.h的FFI绑定。然后build.rs调用C编译器在Rust目标构建区域内编译所有内容为libblst.a。在Linux上,可以通过设置CC
环境变量来选择编译器。
可以使用典型的cargo命令构建和运行所有内容
cargo test
cargo bench
如果目标应用程序在复制到较旧的系统后崩溃并出现“非法指令”异常,请在构建blst时激活portable
功能。相反,如果您在较旧的Intel系统上编译,但将在较新的系统上执行二进制文件,则可以考虑激活force-adx
功能。但请注意,cc将CFLAGS
环境变量的值传递给C编译器,如果设置为包含特定标志,则可能干扰功能选择。-D__BLST_PORTABLE__
和-D__ADX__
是这些功能的等效功能。
要为WebAssembly编译,您的clang必须能够识别--target=wasm32
。或者,您可以通过设置环境变量CC
为emcc
(Emscripten编译器)以及将AR
设置为emar
(自然地,这两个命令都在您的PATH
中)来使用CC
环境变量构建您的项目。
当cargo test
的依赖需要至少Rust 1.65时,该库本身可以使用更早的编译器版本进行编译。尽管要使用1.56之前的Rust版本,您需要在您的项目Cargo.toml中将zeroize
锁定为"=1.3.0",将zeroize_derive
锁定为"=1.3.3"。甚至cc
可能也需要锁定为"=1.0.79"。如果您只有1.56到1.64的Rust版本作为唯一选择,并且想要执行cargo test
,您需要通过取消以下行的注释,在本项目的Cargo.toml中将一些[dev-dependencies]
版本锁定。
csv = "=1.1.6"
byteorder = "=1.4.3"
regex = "=1.7.3"
rayon = "=1.6.1"
rayon-core = "=1.10.1"
使用方法
可以根据声明路径选择两种主要的操作模式
对于最小公钥大小操作
use blst::min_pk::*;
对于最小签名大小操作
use blst::min_sig::*;
有五个具有固有实现的struct,提供BLS12-381签名功能。
SecretKey
PublicKey
AggregatePublicKey
Signature
AggregateSignature
以下是一个生成密钥、签名消息和验证消息的简单示例
use blst::min_pk::SecretKey;
let mut rng = rand::thread_rng();
let mut ikm = [0u8; 32];
rng.fill_bytes(&mut ikm);
let sk = SecretKey::key_gen(&ikm, &[]).unwrap();
let pk = sk.sk_to_pk();
let dst = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_";
let msg = b"blst is such a blast";
let sig = sk.sign(msg, dst, &[]);
let err = sig.verify(true, msg, dst, &[], &pk, true);
assert_eq!(err, blst::BLST_ERROR::BLST_SUCCESS);
请参阅src/lib.rs中的测试和benches/blst_benches.rs中的基准测试以获取更多使用示例。
依赖项
~0.3–1MB
~23K SLoC