cardano_serialization_lib/chain_crypto/
derive.rs

1use crate::chain_crypto::algorithms::{
2    ed25519::Pub, ed25519_derive::Ed25519Bip32, ed25519_extended::ExtendedPriv, Ed25519,
3};
4use crate::chain_crypto::key::{PublicKey, SecretKey};
5use crate::chain_crypto::Ed25519Extended;
6use cryptoxide::hmac::Hmac;
7use cryptoxide::pbkdf2::pbkdf2;
8use cryptoxide::sha2::Sha512;
9use ed25519_bip32::{DerivationError, DerivationScheme};
10use ed25519_bip32::{XPrv, XPRV_SIZE};
11
12pub fn derive_sk_ed25519(key: &SecretKey<Ed25519Bip32>, index: u32) -> SecretKey<Ed25519Bip32> {
13    let new_key = key.0.derive(DerivationScheme::V2, index);
14    SecretKey(new_key)
15}
16
17pub fn derive_pk_ed25519(
18    key: &PublicKey<Ed25519Bip32>,
19    index: u32,
20) -> Result<PublicKey<Ed25519Bip32>, DerivationError> {
21    key.0.derive(DerivationScheme::V2, index).map(PublicKey)
22}
23
24pub fn to_raw_sk(key: &SecretKey<Ed25519Bip32>) -> SecretKey<Ed25519Extended> {
25    SecretKey(ExtendedPriv::from_xprv(&key.0))
26}
27
28pub fn to_raw_pk(key: &PublicKey<Ed25519Bip32>) -> PublicKey<Ed25519> {
29    PublicKey(Pub::from_xpub(&key.0))
30}
31
32pub fn from_bip39_entropy(entropy: &[u8], password: &[u8]) -> SecretKey<Ed25519Bip32> {
33    let mut pbkdf2_result = [0; XPRV_SIZE];
34
35    const ITER: u32 = 4096;
36    let mut mac = Hmac::new(Sha512::new(), password);
37    pbkdf2(&mut mac, entropy.as_ref(), ITER, &mut pbkdf2_result);
38
39    SecretKey(XPrv::normalize_bytes_force3rd(pbkdf2_result))
40}