use crate::error::{IdentityError, Result};
use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey};
use zeroize::Zeroize;
pub trait TrustAnchorSigner {
fn sign(&self, message: &[u8]) -> Result<Signature>;
fn verifying_key(&self) -> VerifyingKey;
}
pub trait TrustAnchorVerifier {
fn verify(&self, message: &[u8], signature: &Signature) -> Result<()>;
}
pub struct Ed25519SingleSigner {
signing_key: SigningKey,
}
impl Ed25519SingleSigner {
pub fn new(signing_key: SigningKey) -> Self {
Self { signing_key }
}
pub fn from_seed(mut seed: [u8; 32]) -> Self {
let signing_key = SigningKey::from_bytes(&seed);
seed.zeroize();
Self { signing_key }
}
}
impl TrustAnchorSigner for Ed25519SingleSigner {
fn sign(&self, message: &[u8]) -> Result<Signature> {
Ok(self.signing_key.sign(message))
}
fn verifying_key(&self) -> VerifyingKey {
self.signing_key.verifying_key()
}
}
pub struct Ed25519Verifier {
verifying_key: VerifyingKey,
}
impl Ed25519Verifier {
pub fn new(verifying_key: VerifyingKey) -> Self {
Self { verifying_key }
}
pub fn from_bytes(bytes: &[u8; 32]) -> Result<Self> {
let key = VerifyingKey::from_bytes(bytes).map_err(|_| IdentityError::InvalidPublicKey)?;
Ok(Self { verifying_key: key })
}
}
impl TrustAnchorVerifier for Ed25519Verifier {
fn verify(&self, message: &[u8], signature: &Signature) -> Result<()> {
self.verifying_key
.verify(message, signature)
.map_err(|_| IdentityError::InvalidSignature)
}
}
pub struct FrostThresholdSigner {
pub t: u16,
pub n: u16,
}
impl TrustAnchorSigner for FrostThresholdSigner {
fn sign(&self, _message: &[u8]) -> Result<Signature> {
unimplemented!("FROST threshold signing not yet implemented (planned for H1)")
}
fn verifying_key(&self) -> VerifyingKey {
unimplemented!("FROST group key not yet available (planned for H1)")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ed25519_single_roundtrip() {
let signer = Ed25519SingleSigner::from_seed([42u8; 32]);
let message = b"policy data to sign";
let signature = signer.sign(message).unwrap();
let verifier = Ed25519Verifier::new(signer.verifying_key());
assert!(verifier.verify(message, &signature).is_ok());
}
#[test]
fn test_ed25519_rejects_wrong_message() {
let signer = Ed25519SingleSigner::from_seed([42u8; 32]);
let signature = signer.sign(b"correct message").unwrap();
let verifier = Ed25519Verifier::new(signer.verifying_key());
assert!(verifier.verify(b"wrong message", &signature).is_err());
}
#[test]
fn test_ed25519_rejects_wrong_key() {
let signer = Ed25519SingleSigner::from_seed([42u8; 32]);
let signature = signer.sign(b"message").unwrap();
let other = Ed25519SingleSigner::from_seed([99u8; 32]);
let verifier = Ed25519Verifier::new(other.verifying_key());
assert!(verifier.verify(b"message", &signature).is_err());
}
}