40 lines
1.5 KiB
Rust
40 lines
1.5 KiB
Rust
use std::fs;
|
|
|
|
use mtp::crypto::{Ed25519Signer, Keyring, MlDsaSigner};
|
|
use mtp::crypto::kem::HybridKem;
|
|
|
|
pub fn load_or_generate_host_keys(path: &str) -> Result<(u64, Keyring), Box<dyn std::error::Error>> {
|
|
if let Ok(data) = fs::read_to_string(path) {
|
|
let json: serde_json::Value = serde_json::from_str(&data)?;
|
|
let hid = json["host_id"].as_u64().unwrap_or(1);
|
|
let keyring = Keyring::from_bytes(&hex::decode(json["keyring"].as_str().unwrap())?)?;
|
|
println!("Loaded host keys (ID: {})", hid);
|
|
return Ok((hid, keyring));
|
|
}
|
|
|
|
let (_ed_signer, sig_sk, sig_pk) = Ed25519Signer::generate();
|
|
let (_pq_signer, sig_pq_sk, sig_pq_pk) = MlDsaSigner::generate();
|
|
let (kem_sk, kem_pk) = HybridKem::generate_keypair();
|
|
let keyring = Keyring::new(kem_pk, kem_sk, sig_pq_pk, sig_pq_sk, sig_pk, sig_sk);
|
|
|
|
let json = serde_json::json!({
|
|
"host_id": 1,
|
|
"keyring": hex::encode(keyring.to_bytes()),
|
|
});
|
|
fs::write(path, serde_json::to_string_pretty(&json)?)?;
|
|
println!("Generated host keys -> {path}");
|
|
Ok((1u64, keyring))
|
|
}
|
|
|
|
pub fn export_host_public_keys(host_keyring: &Keyring) -> Result<(), Box<dyn std::error::Error>> {
|
|
fs::write(
|
|
"host_enc_kem_pk.bin",
|
|
host_keyring.kem_public_key.as_bytes(),
|
|
)?;
|
|
fs::write("host_sig_pk.bin", host_keyring.sig_cl_public_key.as_bytes())?;
|
|
fs::write(
|
|
"host_sig_pq_pk.bin",
|
|
host_keyring.sig_pq_public_key.as_bytes(),
|
|
)?;
|
|
Ok(())
|
|
}
|