Untitled
unknown
rust
10 months ago
2.3 kB
8
Indexable
pub fn derive_priv_child(key: ExKey, child_num: u32) -> Result<ExKey,BalanceError> {
let mut hmac = Hmac::<Sha512>::new_from_slice(&key.chaincode).expect("an error occured");
let mut data_to_hash = Vec::new();
if child_num >= 0x80000000 {
data_to_hash.push(0x00);
data_to_hash.extend_from_slice(&key.key);
}else {
let parent_pub_key = derive_public_key_from_private(&key.key)?;
data_to_hash.extend_from_slice(&parent_pub_key);
println!(" normal {:?}",data_to_hash);
}
data_to_hash.extend_from_slice(&child_num.to_be_bytes());
hmac.update(&data_to_hash);
let result = hmac.finalize().into_bytes();
let (left, right) = result.split_at(32);
// Convert I_L (left 32 bytes) into a SecretKey
let il_secret_key = SecretKey::from_slice(left).map_err(|_| BalanceError::RpcCommandError)?;
// Convert the parent private key into a SecretKey
let parent_secret_key = SecretKey::from_slice(&key.key).map_err(|_| BalanceError::RpcCommandError)?;
// Derive the child private key: child_privkey = (I_L + parent_privkey) mod n
let child_secret_key = parent_secret_key.add_tweak(&il_secret_key.into()).unwrap();
let child_key_bytes = child_secret_key.secret_bytes();
// The child chain code is I_R (right 32 bytes)
let mut child_chaincode = [0u8; 32];
child_chaincode.copy_from_slice(right);
println!("child {:?}",child_chaincode);
let parent_pub_key = derive_public_key_from_private(&key.key)?;
println!("pub {:?}",parent_pub_key);
let sha_256 = Sha256::digest(parent_pub_key);
let ripemd_hash = Ripemd160::digest(&sha_256);
let pubkey_bytes = ripemd_hash.to_vec();
let child_fingerprint: [u8; 4] = pubkey_bytes[0..4].try_into().expect("Failed to create fingerprint");
println!("child {:?}", child_fingerprint);
let mut depth = key.depth;
depth[0] = depth[0].saturating_add(1);
return Ok(ExKey {
version: key.version,
depth: depth,
finger_print: child_fingerprint,
child_number: child_num.to_be_bytes(),
chaincode: child_chaincode.try_into().expect("error"),
key: child_key_bytes
});
}Editor is loading...
Leave a Comment