ex3_crypto/secp256k1/
generator.rs

1use k256::ecdsa::SigningKey;
2
3use super::privkey::Privkey;
4use super::pubkey::Pubkey;
5use rand_core::OsRng;
6
7/// A random secp keypair generator
8pub struct Generator {
9    rng: OsRng,
10}
11
12impl Default for Generator {
13    fn default() -> Self {
14        Self::new()
15    }
16}
17
18impl Generator {
19    /// Create a new Generator
20    pub fn new() -> Self {
21        let rng: OsRng = OsRng;
22        Generator { rng }
23    }
24
25    /// Generate a SecretKey
26    fn gen_secret_key(&mut self) -> SigningKey {
27        SigningKey::random(&mut self.rng)
28    }
29
30    /// Generate a Privkey
31    pub fn gen_privkey(&mut self) -> Privkey {
32        self.gen_secret_key().into()
33    }
34
35    /// Generate a keypair
36    pub fn gen_keypair(&mut self) -> (Privkey, Pubkey) {
37        let secret_key = self.gen_secret_key();
38        let pubkey = secret_key.verifying_key().clone();
39
40        (secret_key.into(), pubkey.into())
41    }
42
43    /// Shortcuts construct temporary Generator, and generate a Privkey
44    pub fn random_privkey() -> Privkey {
45        Generator::new().gen_privkey()
46    }
47
48    /// Shortcuts construct temporary Generator, and generate a keypair
49    pub fn random_keypair() -> (Privkey, Pubkey) {
50        Generator::new().gen_keypair()
51    }
52
53    /// Shortcuts construct temporary Generator, and generate a SecretKey
54    pub fn random_secret_key() -> SigningKey {
55        Generator::new().gen_secret_key()
56    }
57}