use ed25519_dalek::{Signature, VerifyingKey};
use crate::proto::ids::{Key32, Sig64};
#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
#[non_exhaustive]
pub enum IntegrityError {
#[error("the {0} signature does not verify")]
BadSignature(&'static str),
#[error("the {0} does not match the pinned vault")]
KeyMismatch(&'static str),
#[error("the {0} does not match what was signed")]
BindingMismatch(&'static str),
#[error("version rollback: this client saw version {known}, the server now shows {got}")]
VersionRollback { known: u64, got: u64 },
#[error("generation rollback: this client saw generation {known}, the server now shows {got}")]
GenerationRollback { known: u32, got: u32 },
#[error("the {0} is malformed")]
Malformed(&'static str),
}
pub fn verify_ed25519(
public: &Key32,
message: &[u8],
sig: &Sig64,
what: &'static str,
) -> Result<(), IntegrityError> {
let key =
VerifyingKey::from_bytes(&public.0).map_err(|_| IntegrityError::BadSignature(what))?;
key.verify_strict(message, &Signature::from_bytes(&sig.0))
.map_err(|_| IntegrityError::BadSignature(what))
}