Skip to main content

aster/codesign/
keys.rs

1//! 签名密钥管理
2
3use super::storage::{load_keys, save_key};
4use super::types::SigningKey;
5
6/// 生成新的签名密钥对
7///
8/// 注意:当前实现仅生成密钥 ID,不包含加密签名功能
9/// 如需完整的 Ed25519 签名,需要添加 ring 或 ed25519-dalek 依赖
10pub fn generate_key_pair() -> Result<SigningKey, String> {
11    use rand::RngCore;
12
13    let mut rng = rand::thread_rng();
14
15    // 生成随机 ID
16    let mut id_bytes = [0u8; 16];
17    rng.fill_bytes(&mut id_bytes);
18    let id = hex::encode(id_bytes);
19
20    // 生成占位符密钥(实际使用需要真正的密钥生成)
21    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    // 保存密钥
38    save_key(&key)?;
39
40    Ok(key)
41}
42
43/// 根据 ID 获取密钥
44pub fn get_key(id: &str) -> Option<SigningKey> {
45    let keys = load_keys();
46    keys.into_iter().find(|k| k.id == id)
47}
48
49/// 获取第一个可用的签名密钥(有私钥的)
50pub fn get_signing_key() -> Option<SigningKey> {
51    let keys = load_keys();
52    keys.into_iter().find(|k| k.private_key.is_some())
53}