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 密码学

Download history 54890/week @ 2024-04-19 45311/week @ 2024-04-26 49786/week @ 2024-05-03 58352/week @ 2024-05-10 50580/week @ 2024-05-17 44962/week @ 2024-05-24 55168/week @ 2024-05-31 63185/week @ 2024-06-07 69998/week @ 2024-06-14 74030/week @ 2024-06-21 59801/week @ 2024-06-28 77267/week @ 2024-07-05 64661/week @ 2024-07-12 63453/week @ 2024-07-19 67621/week @ 2024-07-26 65075/week @ 2024-08-02

275,583 每月下载量
473 个crate(36个直接) 中使用

Apache-2.0

2.5MB
112K SLoC

GNU Style Assembly 79K SLoC // 0.0% comments Assembly 24K SLoC C 5K SLoC // 0.1% comments Rust 4.5K SLoC // 0.0% comments Shell 42 SLoC Perl 30 SLoC // 0.1% comments Go 11 SLoC

blst Crates.io

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功能。但请注意,ccCFLAGS环境变量的值传递给C编译器,如果设置为包含特定标志,则可能干扰功能选择。-D__BLST_PORTABLE__-D__ADX__是这些功能的等效功能。

要为WebAssembly编译,您的clang必须能够识别--target=wasm32。或者,您可以通过设置环境变量CCemccEmscripten编译器)以及将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