1use super::storage::{load_keys, save_key};
4use super::types::SigningKey;
5
6pub fn generate_key_pair() -> Result<SigningKey, String> {
11 use rand::RngCore;
12
13 let mut rng = rand::thread_rng();
14
15 let mut id_bytes = [0u8; 16];
17 rng.fill_bytes(&mut id_bytes);
18 let id = hex::encode(id_bytes);
19
20 let mut key_bytes = [0u8; 32];
22 rng.fill_bytes(&mut key_bytes);
23 let public_key = hex::encode(key_bytes);
24
25 let mut private_bytes = [0u8; 64];
26 rng.fill_bytes(&mut private_bytes);
27 let private_key = hex::encode(private_bytes);
28
29 let key = SigningKey {
30 id: id.clone(),
31 public_key,
32 private_key: Some(private_key),
33 created_at: chrono::Utc::now().timestamp_millis(),
34 name: None,
35 };
36
37 save_key(&key)?;
39
40 Ok(key)
41}
42
43pub fn get_key(id: &str) -> Option<SigningKey> {
45 let keys = load_keys();
46 keys.into_iter().find(|k| k.id == id)
47}
48
49pub fn get_signing_key() -> Option<SigningKey> {
51 let keys = load_keys();
52 keys.into_iter().find(|k| k.private_key.is_some())
53}