1个不稳定版本
0.2.0 | 2023年1月12日 |
---|
#24 in #bls
17KB
245 行
Rust BLS子密钥派生(EIP2333,EIP2334)
这个库是 bls_key_derivation 的分支版本,包含一个直接访问BLS12-381子密钥派生的简单接口,完全符合 EIP2333。
由于EIP2333只提出了硬化的子密钥派生,因此这个库还实现了一种受 BIP32 启发的非硬化子密钥派生方法,以支持当前的应用场景。
变更
与原始库(《https://github.com/ChainSafe/rust-bls-derivation》)的不同之处在于以下
- 移除了对超过6年未维护的crate rust-crypto 的依赖;
- 添加了活跃的crate curv-kzen,以支持EIP233之外的非硬化BLS子密钥派生;
- 将种子熵的下限从16字节改为32字节,以符合当前的EIP2333和 draft-irtf-cfrg-bls-signature-05;
- 特别修改了以下5个部分的函数
hkdf_mod_r
,以完全符合EIP2333和 draft-irtf-cfrg-bls-signature-05的第2.3节- IKM -> IMK || I20SP(0, 1);
- keyinfo -> keyinfo || I20SP(L, 2);
- salt -> H(salt);
- 添加一个带有零私钥检查的循环;
- 添加一个输入参数
key_info
,以支持用户自定义的密钥信息字符串,而不是固定为默认空字符串""。
用法
定义在crate 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
~213K SLoC