use crate::der_parser::Oid;
use crate::unverified_chain::UnverifiedCertificateChain;
use crate::{PolicyEvaluationResult, PolicyFailureReason, ValidationPolicy};
pub type Timestamp = i64;
pub struct ExpiryPolicy {
validation_time: Timestamp,
}
impl ExpiryPolicy {
pub fn new(validation_time: Timestamp) -> Self {
Self { validation_time }
}
}
impl ValidationPolicy for ExpiryPolicy {
fn verifying_critical_extensions(&self) -> Vec<Oid<'static>> {
vec![]
}
fn chain_meets_policy_requirements(
&self,
chain: &UnverifiedCertificateChain<'_>,
) -> PolicyEvaluationResult {
for cert in chain.iter() {
let validity = cert.tbs_certificate.validity();
let not_before = validity.not_before.timestamp();
let not_after = validity.not_after.timestamp();
if not_before > not_after {
return Err(PolicyFailureReason::new(format!(
"certificate {:?} has invalid expiry, not_after is earlier than not_before",
cert
)));
}
if self.validation_time < not_before {
return Err(PolicyFailureReason::new(format!(
"certificate {:?} is not yet valid",
cert
)));
}
if self.validation_time > not_after {
return Err(PolicyFailureReason::new("certificate has expired"));
}
}
Ok(())
}
}