attenuable_jwt/ed25519/
ed25519_sign.rs1use 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#[derive(Clone)]
13pub struct EddsaKeyGen<RNG: RngCore + CryptoRng> {
14 rng: Arc<Mutex<RNG>>,
15}
16
17impl<RNG: RngCore + CryptoRng> EddsaKeyGen<RNG> {
18 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 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}