ckb_crypto/secp/
generator.rs

1use super::privkey::Privkey;
2use super::pubkey::Pubkey;
3use super::SECP256K1;
4use rand::{self, Rng, SeedableRng};
5use secp256k1::{PublicKey, SecretKey};
6
7/// A random secp keypair generator
8pub 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    /// Create a new Generator
20    ///
21    /// Default random number generator is `rand::rngs::ThreadRng`
22    pub fn new() -> Self {
23        let rng = rand::thread_rng();
24        Generator { rng: Box::new(rng) }
25    }
26
27    /// Non crypto safe prng, should only used in tests
28    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    /// Generate a SecretKey
34    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    /// Generate a Privkey
45    pub fn gen_privkey(&mut self) -> Privkey {
46        self.gen_secret_key().into()
47    }
48
49    /// Generate a keypair
50    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    /// Shortcuts construct temporary Generator, and generate a Privkey
58    pub fn random_privkey() -> Privkey {
59        Generator::new().gen_privkey()
60    }
61
62    /// Shortcuts construct temporary Generator, and generate a keypair
63    pub fn random_keypair() -> (Privkey, Pubkey) {
64        Generator::new().gen_keypair()
65    }
66
67    /// Shortcuts construct temporary Generator, and generate a SecretKey
68    pub fn random_secret_key() -> SecretKey {
69        Generator::new().gen_secret_key()
70    }
71}