use crypto_core::Algorithm;
use crypto_dispatch::AlgorithmError;
use crate::{Verifier, VerifierError, VerifierFailureKind};
#[derive(Debug)]
pub struct DispatchVerifier {
alg: Algorithm,
public_key: Vec<u8>,
}
impl DispatchVerifier {
pub fn new(alg: Algorithm, public_key: Vec<u8>) -> Self {
Self { alg, public_key }
}
pub fn public_key(&self) -> &[u8] {
&self.public_key
}
}
impl Verifier for DispatchVerifier {
fn alg(&self) -> Algorithm {
self.alg
}
fn verify(&self, message: &[u8], signature: &[u8]) -> Result<(), VerifierError> {
crypto_dispatch::verify(self.alg, &self.public_key, message, signature).map_err(|source| {
let kind = match &source {
AlgorithmError::SignatureInvalid(_) => VerifierFailureKind::SignatureInvalid,
_ => VerifierFailureKind::DispatchRejected,
};
VerifierError::VerifyFailed {
algorithm: self.alg,
kind,
source,
}
})
}
}