attenuable_jwt/ed25519/
ed25519_sign.rs

1use std::ops::DerefMut;
2use std::sync::{Arc, Mutex};
3
4use rand_core::{CryptoRng, RngCore};
5
6use crate::sign::Result;
7use crate::{protocol::AttenuationKeyGenerator, sign::Error};
8
9use super::{Ed25519PrivateKey, Ed25519PublicKey};
10
11/// [AttenuationKeygenerator] for EdDSA (ED25519) keys.
12#[derive(Clone)]
13pub struct EddsaKeyGen<RNG: RngCore + CryptoRng> {
14    rng: Arc<Mutex<RNG>>,
15}
16
17impl<RNG: RngCore + CryptoRng> EddsaKeyGen<RNG> {
18    /// Create a new EddsaKeyGen with the provided random number generator.
19    pub fn new(rng: RNG) -> Self {
20        EddsaKeyGen {
21            rng: Arc::new(Mutex::new(rng)),
22        }
23    }
24}
25
26#[cfg(any(feature = "rng", test))]
27impl EddsaKeyGen<rand::rngs::StdRng> {
28    /// Create a new EddsaKeyGen with the standard random number generator, seeded with system entropy.
29    pub fn new_with_std_rng() -> Self {
30        use rand::SeedableRng;
31        EddsaKeyGen {
32            rng: Arc::new(Mutex::new(rand::rngs::StdRng::from_entropy())),
33        }
34    }
35}
36
37impl<RNG: RngCore + CryptoRng> AttenuationKeyGenerator<Ed25519PublicKey, Ed25519PrivateKey>
38    for EddsaKeyGen<RNG>
39{
40    fn generate_attenuation_key(&self) -> Result<(Ed25519PublicKey, Ed25519PrivateKey)> {
41        let mut rng = self.rng.lock().map_err(|_| Error::CryptoError)?;
42        let keypair = ed25519_dalek::Keypair::generate(rng.deref_mut());
43        let pub_key = Ed25519PublicKey::new(keypair.public);
44        let priv_key = Ed25519PrivateKey::new("aky".to_owned(), keypair);
45        Ok((pub_key, priv_key))
46    }
47}