use alloc::sync::Arc;
use super::{Algorithm, PublicKey, rdata::RRSIG, tbs::TBS};
use crate::{
error::ProtoResult,
rr::{DNSClass, Name, Record},
};
pub trait Verifier {
fn algorithm(&self) -> Algorithm;
fn key(&self) -> ProtoResult<Arc<dyn PublicKey + '_>>;
fn verify(&self, hash: &[u8], signature: &[u8]) -> ProtoResult<()> {
self.key()?.verify(hash, signature)
}
fn verify_rrsig<'a>(
&self,
name: &Name,
dns_class: DNSClass,
sig: &RRSIG,
records: impl Iterator<Item = &'a Record>,
) -> ProtoResult<()> {
let rrset_tbs = TBS::from_input(name, dns_class, sig.input(), records)?;
self.verify(rrset_tbs.as_ref(), sig.sig())
}
}