pub mod eip2333;
use alloc::vec::Vec;
use core::ops::Range;
use dusk_core::signatures::bls::{
PublicKey as BlsPublicKey, SecretKey as BlsSecretKey,
};
use dusk_core::transfer::phoenix::{
PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey,
ViewKey as PhoenixViewKey,
};
use rand_chacha::ChaCha12Rng;
use rand_chacha::rand_core::SeedableRng;
use sha2::{Digest, Sha256};
use zeroize::Zeroize;
use crate::Seed;
#[must_use]
pub fn derive_bls_sk(seed: &Seed, index: u8) -> BlsSecretKey {
BlsSecretKey::random(&mut rng_with_index(seed, index, b"SK"))
}
#[must_use]
pub fn derive_bls_pk(seed: &Seed, index: u8) -> BlsPublicKey {
let mut sk = derive_bls_sk(seed, index);
let pk = BlsPublicKey::from(&sk);
sk.zeroize();
pk
}
#[must_use]
pub fn derive_phoenix_sk(seed: &Seed, index: u8) -> PhoenixSecretKey {
PhoenixSecretKey::random(&mut rng_with_index(seed, index, b"SSK"))
}
#[must_use]
pub fn derive_multiple_phoenix_sk(
seed: &Seed,
index_range: Range<u8>,
) -> Vec<PhoenixSecretKey> {
index_range
.map(|index| derive_phoenix_sk(seed, index))
.collect()
}
#[must_use]
pub fn derive_phoenix_pk(seed: &Seed, index: u8) -> PhoenixPublicKey {
let mut sk = derive_phoenix_sk(seed, index);
let pk = PhoenixPublicKey::from(&sk);
sk.zeroize();
pk
}
#[must_use]
pub fn derive_phoenix_vk(seed: &Seed, index: u8) -> PhoenixViewKey {
let mut sk = derive_phoenix_sk(seed, index);
let vk = PhoenixViewKey::from(&sk);
sk.zeroize();
vk
}
#[must_use]
pub fn rng_with_index(
seed: &Seed,
index: u8,
termination: &[u8],
) -> ChaCha12Rng {
let index = u64::from(index);
let mut hash = Sha256::new();
hash.update(seed);
hash.update(index.to_le_bytes());
hash.update(termination);
let hash = hash.finalize().into();
ChaCha12Rng::from_seed(hash)
}