use std::io::Error;
use x509_cert::Certificate;
pub trait RootCertVerifier {
fn verify(&self, candidate: &Certificate) -> Result<(), Error>;
}
pub struct TrustAny;
impl RootCertVerifier for TrustAny {
fn verify(&self, _candidate: &Certificate) -> Result<(), Error> {
Ok(())
}
}
pub struct TrustCerts(Vec<Certificate>);
impl TrustCerts {
pub fn new(certs: Vec<Certificate>) -> Self {
Self(certs)
}
}
impl RootCertVerifier for TrustCerts {
fn verify(&self, candidate: &Certificate) -> Result<(), Error> {
for cert in self.0.iter() {
if candidate
.tbs_certificate
.subject_public_key_info
.subject_public_key
== cert
.tbs_certificate
.subject_public_key_info
.subject_public_key
{
return Ok(());
}
}
Err(Error::other("untrusted root certificate"))
}
}