ckb_crypto/secp/
generator.rs1use super::privkey::Privkey;
2use super::pubkey::Pubkey;
3use super::SECP256K1;
4use rand::{self, Rng, SeedableRng};
5use secp256k1::{PublicKey, SecretKey};
6
7pub struct Generator {
9 rng: Box<dyn rand::RngCore>,
10}
11
12impl Default for Generator {
13 fn default() -> Self {
14 Self::new()
15 }
16}
17
18impl Generator {
19 pub fn new() -> Self {
23 let rng = rand::thread_rng();
24 Generator { rng: Box::new(rng) }
25 }
26
27 pub fn non_crypto_safe_prng(seed: u64) -> Self {
29 let rng = rand::rngs::SmallRng::seed_from_u64(seed);
30 Generator { rng: Box::new(rng) }
31 }
32
33 fn gen_secret_key(&mut self) -> SecretKey {
35 let mut seed = vec![0; 32];
36 loop {
37 self.rng.fill(seed.as_mut_slice());
38 if let Ok(key) = SecretKey::from_slice(&seed) {
39 return key;
40 }
41 }
42 }
43
44 pub fn gen_privkey(&mut self) -> Privkey {
46 self.gen_secret_key().into()
47 }
48
49 pub fn gen_keypair(&mut self) -> (Privkey, Pubkey) {
51 let secret_key = self.gen_secret_key();
52 let pubkey = PublicKey::from_secret_key(&*SECP256K1, &secret_key);
53
54 (secret_key.into(), pubkey.into())
55 }
56
57 pub fn random_privkey() -> Privkey {
59 Generator::new().gen_privkey()
60 }
61
62 pub fn random_keypair() -> (Privkey, Pubkey) {
64 Generator::new().gen_keypair()
65 }
66
67 pub fn random_secret_key() -> SecretKey {
69 Generator::new().gen_secret_key()
70 }
71}