keri_core/signer/
mod.rs

1use rand::rngs::OsRng;
2
3use crate::{
4    error::Error,
5    keys::{KeysError, PrivateKey, PublicKey},
6    prefix::SeedPrefix,
7};
8
9pub trait KeyManager {
10    fn sign(&self, msg: &[u8]) -> Result<Vec<u8>, Error>;
11    fn public_key(&self) -> PublicKey;
12    fn next_public_key(&self) -> PublicKey;
13    fn rotate(&mut self) -> Result<(), Error>;
14}
15
16pub struct CryptoBox {
17    signer: Signer,
18    next_priv_key: PrivateKey,
19    pub next_pub_key: PublicKey,
20}
21
22impl KeyManager for CryptoBox {
23    fn sign(&self, msg: &[u8]) -> Result<Vec<u8>, Error> {
24        Ok(self.signer.sign(msg)?)
25    }
26
27    fn public_key(&self) -> PublicKey {
28        self.signer.pub_key.clone()
29    }
30
31    fn next_public_key(&self) -> PublicKey {
32        self.next_pub_key.clone()
33    }
34
35    fn rotate(&mut self) -> Result<(), Error> {
36        let (next_pub_key, next_priv_key) = generate_key_pair()?;
37
38        let new_signer = Signer {
39            priv_key: self.next_priv_key.clone(),
40            pub_key: self.next_pub_key.clone(),
41        };
42        self.signer = new_signer;
43        self.next_priv_key = next_priv_key;
44        self.next_pub_key = next_pub_key;
45
46        Ok(())
47    }
48}
49impl CryptoBox {
50    pub fn new() -> Result<Self, Error> {
51        let signer = Signer::new();
52        let (next_pub_key, next_priv_key) = generate_key_pair()?;
53        Ok(CryptoBox {
54            signer,
55            next_pub_key,
56            next_priv_key,
57        })
58    }
59}
60
61pub struct Signer {
62    priv_key: PrivateKey,
63    pub_key: PublicKey,
64}
65
66impl Signer {
67    /// Creates a new Signer with a random key.
68    pub fn new() -> Self {
69        let ed = ed25519_dalek::SigningKey::generate(&mut OsRng);
70        let pub_key = PublicKey::new(ed.verifying_key().to_bytes().to_vec());
71        let priv_key = PrivateKey::new(ed.to_bytes().to_vec());
72
73        Signer { pub_key, priv_key }
74    }
75
76    /// Creates a new Signer with the given ED25519_dalek private key.
77    pub fn new_with_key(priv_key: &[u8; 32]) -> Result<Self, ed25519_dalek::SignatureError> {
78        let priv_key = ed25519_dalek::SigningKey::from_bytes(priv_key);
79        let pub_key = ed25519_dalek::VerifyingKey::from(&priv_key);
80
81        Ok(Signer {
82            priv_key: PrivateKey::new(priv_key.as_bytes().to_vec()),
83            pub_key: PublicKey::new(pub_key.as_bytes().to_vec()),
84        })
85    }
86
87    pub fn new_with_seed(seed: &SeedPrefix) -> Result<Self, Error> {
88        let (public_key, private_key) = seed.derive_key_pair()?;
89
90        Ok(Signer {
91            priv_key: private_key,
92            pub_key: public_key,
93        })
94    }
95
96    pub fn sign(&self, msg: impl AsRef<[u8]>) -> Result<Vec<u8>, KeysError> {
97        self.priv_key.sign_ed(msg.as_ref())
98    }
99
100    pub fn public_key(&self) -> PublicKey {
101        self.pub_key.clone()
102    }
103}
104
105impl Default for Signer {
106    fn default() -> Self {
107        Self::new()
108    }
109}
110
111fn generate_key_pair() -> Result<(PublicKey, PrivateKey), Error> {
112    let kp = ed25519_dalek::SigningKey::generate(&mut OsRng {});
113    let (vk, sk) = (kp.verifying_key(), kp);
114    let vk = PublicKey::new(vk.to_bytes().to_vec());
115    let sk = PrivateKey::new(sk.to_bytes().to_vec());
116    Ok((vk, sk))
117}
118
119/// Helper function to generate keypairs that can be used for signing in tests.
120#[cfg(test)]
121pub(crate) fn setup_signers() -> Vec<Signer> {
122    vec![
123        "AK8F6AAiYDpXlWdj2O5F5-6wNCCNJh2A4XOlqwR_HwwH",
124        "AOs8-zNPPh0EhavdrCfCiTk9nGeO8e6VxUCzwdKXJAd0",
125        "AHMBU5PsIJN2U9m7j0SGyvs8YD8fkym2noELzxIrzfdG",
126        "AJZ7ZLd7unQ4IkMUwE69NXcvDO9rrmmRH_Xk3TPu9BpP",
127        "ANfkMQ5LKPfjEdQPK2c_zWsOn4GgLWsnWvIa25EVVbtR",
128        "ACrmDHtPQjnM8H9pyKA-QBNdfZ-xixTlRZTS8WXCrrMH",
129        "AMRXyU3ErhBNdRSDX1zKlrbZGRp1GfCmkRIa58gF07I8",
130        "AC6vsNVCpHa6acGcxk7c-D1mBHlptPrAx8zr-bKvesSW",
131        "AAD8sznuHWMw7cl6eZJQLm8PGBKvCjQzDH1Ui9ygH0Uo",
132        "ANqQNn_9UjfayUJNdQobmixrH9qJF1cltKDwDMVkiLg8",
133        "A1t7ix1GuZIP48r6ljsoo8jPsB9dEnnWNfhy2XNl1r-c",
134        "AhzCysVY12fWXfkH1QkAOCY6oYbVwXOaUjf7YPtIfC8U",
135        "A4HrsYq9XfxYK76ffoceNzj9n8tBkXrWNBIXUNdoe5ME",
136        "AhpAiPtDqDcEeU_eXlJ8Bk3kJE0g0jdezyXZdBKfXslU",
137        "AzN9fKZAZEIn9jMN2fZ2B35MNMQJPAZrNrJQRMi_S_8g",
138        "AkNrzLqnqRx9WCpJAwTAOE5oNaDlOgOYiuM9bL4HM9R0",
139        "ALjR-EE3jUF2yXW7Tq7WJSh3OFc6-BNxXJ9jGdfwA6Bs",
140        "AvpsEhige2ssBrMxskK2xXpeKfed4cvcZCIdRh7fhgiI",
141    ]
142    .iter()
143    .map(|key| {
144        let (_pk, sk) = key
145            .parse::<SeedPrefix>()
146            .unwrap()
147            .derive_key_pair()
148            .unwrap();
149        Signer::new_with_key(&sk.key().try_into().unwrap()).unwrap()
150    })
151    .collect::<Vec<_>>()
152}