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 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 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#[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}