serde_encrypt_core/key/
key_pair.rs

1//! X25519 key-pair (public-key and private-key).
2
3pub mod private_key;
4pub mod public_key;
5
6use core::ops::DerefMut;
7
8use self::{
9    private_key::{ReceiverPrivateKey, SenderPrivateKey},
10    public_key::{ReceiverPublicKey, SenderPublicKey},
11};
12use crate::random::RngSingleton;
13use crypto_box::{PublicKey, SecretKey};
14
15/// X25519 Key-pair generated by sender.
16pub trait SenderKeyPairCore {
17    /// RNG singleton
18    type R: RngSingleton;
19
20    /// Constructor
21    fn new(sender_private_key: SenderPrivateKey, sender_public_key: SenderPublicKey) -> Self
22    where
23        Self: Sized;
24
25    /// Generates a key-pair for message sender.
26    fn generate() -> Self
27    where
28        Self: Sized,
29    {
30        let (private_key, public_key) = gen_key_pair::<Self::R>();
31        let sender_private_key = SenderPrivateKey::from(private_key);
32        let sender_public_key = SenderPublicKey::from(public_key);
33        Self::new(sender_private_key, sender_public_key)
34    }
35
36    /// Ref to private key.
37    fn private_key(&self) -> &SenderPrivateKey;
38
39    /// Ref to public key.
40    fn public_key(&self) -> &SenderPublicKey;
41}
42
43/// X25519 Key-pair generated by receiver.
44pub trait ReceiverKeyPairCore {
45    /// RNG singleton
46    type R: RngSingleton;
47
48    /// Constructor
49    fn new(
50        receiver_private_key: ReceiverPrivateKey,
51        receiver_public_key: ReceiverPublicKey,
52    ) -> Self
53    where
54        Self: Sized;
55
56    /// Generates a key-pair for message receiver.
57    fn generate() -> Self
58    where
59        Self: Sized,
60    {
61        let (private_key, public_key) = gen_key_pair::<Self::R>();
62        let receiver_private_key = ReceiverPrivateKey::from(private_key);
63        let receiver_public_key = ReceiverPublicKey::from(public_key);
64        Self::new(receiver_private_key, receiver_public_key)
65    }
66
67    /// Ref to private key.
68    fn private_key(&self) -> &ReceiverPrivateKey;
69
70    /// Ref to public key.
71    fn public_key(&self) -> &ReceiverPublicKey;
72}
73
74fn gen_key_pair<R>() -> (SecretKey, PublicKey)
75where
76    R: RngSingleton,
77{
78    let mut rng = R::instance();
79
80    let secret_key = SecretKey::generate(rng.deref_mut());
81    let public_key = secret_key.public_key();
82
83    (secret_key, public_key)
84}