1 个不稳定版本
0.2.1 | 2024年3月19日 |
---|
#672 in 文件系统
6,703 每月下载次数
在 6 个 Crates 中使用(通过 sn_client)
17KB
245 行
Rust BLS 子密钥派生(EIP2333,EIP2334)
这个库是 bls_key_derivation 的一个分支版本,提供了一个简单易用的接口,用于完全符合 EIP2333 的 BLS12-381 子密钥派生。
由于 EIP2333 只提出了加固子密钥派生的方案,这个库还实现了一个基于 BIP32 的非加固子密钥派生方法,以支持当前的应用场景。
变更
与原始库 (https://github.com/ChainSafe/rust-bls-derivation) 的不同之处在于以下
- 移除了对已停止维护超过6年的 crate rust-crypto 的依赖;
- 添加了活跃的 crate curv-kzen,以支持 EIP2333 以外的非加固 BLS 子密钥派生;
- 将种子熵的最低限制从16字节更改为32字节,以与当前的 EIP2333 和 draft-irtf-cfrg-bls-signature-05 保持一致;
- 特别修改了以下5个部分的
hkdf_mod_r
函数,以确保完全符合 EIP2333 和 draft-irtf-cfrg-bls-signature-05 第 2.3 节 中的 KeyGen- IKM -> IMK || I20SP(0, 1);
- keyinfo -> keyinfo || I20SP(L, 2);
- salt -> H(salt);
- 添加一个循环进行零私钥检查;
- 添加一个输入参数
key_info
,以支持用户自定义的密钥信息字符串,而不是固定为默认空字符串 ""。
使用方法
定义在curv
中,FE
是$G_1$和$G_2$中的标量类型,分别用GE1
和GE2
作为点类型。以下泛型类型T
应该是GE1
或GE2
。
CKD加固
私有到私有的加固子密钥派生
pub fn ckd_sk_hardened(parent_sk: &FE, index: u32) -> FE
从路径派生私有到私有的加固子密钥
pub fn derive_child_sk(parent_sk: FE, path_str: &str) -> FE
从种子派生主私钥
pub fn derive_master_sk(seed: &[u8]) -> Result<FE, String>
根据EIP2334规范从字符串路径获取索引
pub fn path_to_node(path_str: &str) -> Result<Vec<u32>, String>
CKD非加固
私有到私有的非加固子密钥派生
pub fn ckd_sk_norma::<T>(parent_sk: &FE, index: u32) -> FE
从路径派生私有到私有的非加固子密钥
pub fn derive_child_sk_normal::<T>(parent_sk: FE, path_str: &str) -> FE
公钥到公钥的非加固子密钥派生
pub fn ckd_pk_normal(parent_pk: &T, index: u32) -> T
从路径派生公钥到公钥的非加固子密钥
pub fn derive_child_pk_normal(parent_pk: T, path_str: &str) -> T
计算添加到该密钥中的标量调整,以获得子密钥
pub fn ckd_tweak_normal(parent_pk: &T, index: u32) -> FE
测试
使用以下命令运行测试
cargo test
依赖项
~14MB
~207K SLoC