swactor/crates/distribution/src/crypto.rs

49 lines
1.6 KiB
Rust
Raw Normal View History

//! Ed25519 cryptographic primitives for distribution.
pub use swactor_transport::crypto::{Keypair, Signature, verify};
use crate::types::{DirectoryEntry, DirectoryEntryPayload};
// ─── Directory Entry Helpers ────────────────────────────────────────────────
/// Extension methods for Keypair specific to distribution directory entries.
pub trait KeypairExt {
/// Sign a directory entry payload, returning a complete `DirectoryEntry`.
fn sign_directory_entry(
&self,
actor_addr: swactor::actor::ActorAddress,
generation: u64,
) -> DirectoryEntry;
}
impl KeypairExt for Keypair {
fn sign_directory_entry(
&self,
actor_addr: swactor::actor::ActorAddress,
generation: u64,
) -> DirectoryEntry {
let payload = DirectoryEntryPayload {
actor_addr,
node_id: self.node_id(),
generation,
};
let bytes = serde_json::to_vec(&payload).expect("DirectoryEntryPayload is always serializable");
let signature = self.sign(&bytes);
DirectoryEntry {
actor_addr,
node_id: self.node_id(),
generation,
signature,
}
}
}
/// Verify a `DirectoryEntry`'s signature against its embedded `node_id`.
pub fn verify_directory_entry(entry: &DirectoryEntry) -> bool {
let payload = entry.payload();
let Ok(bytes) = serde_json::to_vec(&payload) else {
return false;
};
verify(&entry.node_id, &bytes, &entry.signature)
}