1 个不稳定版本

0.2.1 2024年3月19日

#672 in 文件系统

Download history 886/week @ 2024-04-22 1159/week @ 2024-04-29 1702/week @ 2024-05-06 2458/week @ 2024-05-13 2637/week @ 2024-05-20 1975/week @ 2024-05-27 3242/week @ 2024-06-03 1711/week @ 2024-06-10 1332/week @ 2024-06-17 995/week @ 2024-06-24 1332/week @ 2024-07-01 1609/week @ 2024-07-08 1910/week @ 2024-07-15 1831/week @ 2024-07-22

6,703 每月下载次数
6 个 Crates 中使用(通过 sn_client

Apache-2.0

17KB
245

Rust BLS 子密钥派生(EIP2333,EIP2334)

这个库是 bls_key_derivation 的一个分支版本,提供了一个简单易用的接口,用于完全符合 EIP2333 的 BLS12-381 子密钥派生。

由于 EIP2333 只提出了加固子密钥派生的方案,这个库还实现了一个基于 BIP32 的非加固子密钥派生方法,以支持当前的应用场景。

变更

与原始库 (https://github.com/ChainSafe/rust-bls-derivation) 的不同之处在于以下

  1. 移除了对已停止维护超过6年的 crate rust-crypto 的依赖;
  2. 添加了活跃的 crate curv-kzen,以支持 EIP2333 以外的非加固 BLS 子密钥派生;
  3. 将种子熵的最低限制从16字节更改为32字节,以与当前的 EIP2333 和 draft-irtf-cfrg-bls-signature-05 保持一致;
  4. 特别修改了以下5个部分的 hkdf_mod_r 函数,以确保完全符合 EIP2333 和 draft-irtf-cfrg-bls-signature-05 第 2.3 节 中的 KeyGen
    1. IKM -> IMK || I20SP(0, 1);
    2. keyinfo -> keyinfo || I20SP(L, 2);
    3. salt -> H(salt);
    4. 添加一个循环进行零私钥检查;
    5. 添加一个输入参数 key_info,以支持用户自定义的密钥信息字符串,而不是固定为默认空字符串 ""。

使用方法

定义在curv中,FE是$G_1$和$G_2$中的标量类型,分别用GE1GE2作为点类型。以下泛型类型T应该是GE1GE2

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