1个不稳定版本

0.2.0 2023年1月12日

#24 in #bls

Apache-2.0

17KB
245

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

这个库是 bls_key_derivation 的分支版本,包含一个直接访问BLS12-381子密钥派生的简单接口,完全符合 EIP2333

由于EIP2333只提出了硬化的子密钥派生,因此这个库还实现了一种受 BIP32 启发的非硬化子密钥派生方法,以支持当前的应用场景。

变更

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

  1. 移除了对超过6年未维护的crate rust-crypto 的依赖;
  2. 添加了活跃的crate curv-kzen,以支持EIP233之外的非硬化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节
    1. IKM -> IMK || I20SP(0, 1);
    2. keyinfo -> keyinfo || I20SP(L, 2);
    3. salt -> H(salt);
    4. 添加一个带有零私钥检查的循环;
    5. 添加一个输入参数 key_info,以支持用户自定义的密钥信息字符串,而不是固定为默认空字符串""。

用法

定义在crate 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
~213K SLoC