chik_bls/
derive_keys.rs

1use crate::secret_key::SecretKey;
2
3pub trait DerivableKey {
4    #[must_use]
5    fn derive_unhardened(&self, idx: u32) -> Self;
6}
7
8fn derive_path_unhardened<Key: DerivableKey>(key: &Key, path: &[u32]) -> Key {
9    let mut derived = key.derive_unhardened(path[0]);
10    for idx in &path[1..] {
11        derived = derived.derive_unhardened(*idx);
12    }
13    derived
14}
15
16fn derive_path_hardened(key: &SecretKey, path: &[u32]) -> SecretKey {
17    let mut derived = key.derive_hardened(path[0]);
18    for idx in &path[1..] {
19        derived = derived.derive_hardened(*idx);
20    }
21    derived
22}
23
24pub fn master_to_wallet_unhardened_intermediate<Key: DerivableKey>(key: &Key) -> Key {
25    derive_path_unhardened(key, &[12381_u32, 8444, 2])
26}
27
28pub fn master_to_wallet_unhardened<Key: DerivableKey>(key: &Key, idx: u32) -> Key {
29    derive_path_unhardened(key, &[12381_u32, 8444, 2, idx])
30}
31
32pub fn master_to_wallet_hardened_intermediate(key: &SecretKey) -> SecretKey {
33    derive_path_hardened(key, &[12381_u32, 8444, 2])
34}
35
36pub fn master_to_wallet_hardened(key: &SecretKey, idx: u32) -> SecretKey {
37    derive_path_hardened(key, &[12381_u32, 8444, 2, idx])
38}
39
40pub fn master_to_pool_singleton(key: &SecretKey, pool_wallet_idx: u32) -> SecretKey {
41    derive_path_hardened(key, &[12381_u32, 8444, 5, pool_wallet_idx])
42}
43
44/// # Panics
45///
46/// Panics if `pool_wallet_idx` or `idx` is greater than or equal to 10000.
47pub fn master_to_pool_authentication(key: &SecretKey, pool_wallet_idx: u32, idx: u32) -> SecretKey {
48    assert!(pool_wallet_idx < 10000);
49    assert!(idx < 10000);
50    derive_path_hardened(key, &[12381_u32, 8444, 6, pool_wallet_idx * 10000 + idx])
51}