#blst #bls12-381 #ckb #public-key #compatibility #signature #bindings

no-std ckb-blst

为 blst BLS12-381 库提供 ckb 兼容的绑定

2 个不稳定版本

0.100.0 2023 年 5 月 24 日
0.3.4 2023 年 4 月 27 日

#6 in #blst


用于 axon-tools-riscv

Apache-2.0

3MB
122K SLoC

GNU Style Assembly 71K SLoC // 0.0% comments Assembly 22K SLoC Perl 18K SLoC // 0.1% comments C 9K SLoC // 0.1% comments Rust 2.5K SLoC // 0.0% comments Shell 39 SLoC

blst Crates.io

blst 包提供了 Rust 接口,用于访问 blst BLS12-381 签名库。

构建

bindgen 用于生成对 blst.h 的 FFI 绑定。然后 build.rs 调用 C 编译器将所有内容编译为 rust 目标构建区域的 libblst.a。在 Linux 上,可以通过设置 CC 环境变量来选择编译器。

可以使用典型的 cargo 命令构建和运行所有内容

cargo test
cargo bench

如果目标应用程序在复制到较旧的系统后崩溃并出现“非法指令”异常,则在构建 blst 时激活 portable 功能。相反,如果您在较旧的英特尔系统上编译,但将在较新的系统上执行二进制文件,则考虑激活 force-adx 功能。但请注意,ccCFLAGS 环境变量的值传递给 C 编译器,并且如果设置了特定的标志,则可能会干扰功能选择。 -D__BLST_PORTABLE__-D__ADX__ 是这些功能的等效功能。

使用方法

可以根据声明路径选择两种主要的工作模式

对于最小公钥大小操作

use ckb_blst::min_pk::*

对于最小签名大小操作

use ckb_blst::min_sig::*

有五个结构体具有固有实现,提供 BLS12-381 签名功能。

SecretKey
PublicKey
AggregatePublicKey
Signature
AggregateSignature

生成密钥、签名消息和验证消息的简单示例

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(msg, dst, &[], &pk);
assert_eq!(err, BLST_ERROR::BLST_SUCCESS);

有关使用示例的更多示例,请参阅 src/lib.rs 和 benches/blst_benches.rs 中的测试。

依赖项