spark_cryptography/
key.rs

1use std::str::FromStr;
2
3use bip32::{Language, Mnemonic};
4use bitcoin::bip32::ChildNumber;
5use bitcoin::{bip32::Xpriv, Network};
6use eyre::Result;
7
8/// Utility function to generate a seed from seed phrase.
9///
10/// # Arguments
11/// * `phrase` - The seed phrase to generate the seed from.
12///
13/// # Returns
14/// The seed as a 64-byte array.
15pub fn seed_from_phrase(phrase: &str) -> Result<[u8; 64]> {
16    let mnemonic = Mnemonic::new(phrase, Language::English)?;
17    let seed = mnemonic.to_seed("");
18
19    Ok(seed.as_bytes().clone())
20}
21
22/// Utility function to derive a master xpriv from a seed.
23///
24/// # Arguments
25/// * `network` - The network to derive the master xpriv for.
26/// * `seed` - The seed to derive the master xpriv from.
27///
28/// # Returns
29/// The master extended private key as a string.
30pub fn master_xpriv_from_seed(network: Network, seed: &[u8]) -> Result<String> {
31    let xpriv = Xpriv::new_master(network, seed)?;
32    Ok(xpriv.to_string())
33}
34
35/// Utility function to derive a new leaf key from an xpriv.
36///
37/// # Arguments
38/// * `xpriv` - The extended private key to derive the new leaf key from.
39/// * `index` - The index of the new leaf key.
40///
41/// # Returns
42/// The new leaf key as a extended private key string.
43pub fn derive_new_leaf_key_from_xpriv(xpriv: &str, index: u32) -> Result<String> {
44    let xpriv = Xpriv::from_str(xpriv)?;
45    let secp = bitcoin::secp256k1::Secp256k1::new();
46    let derived_key = xpriv.derive_priv(&secp, &ChildNumber::from(index))?;
47    Ok(derived_key.to_string())
48}