use crate::{
calendar::{DateTime, Instant, Utc},
x509::{
CvCrl, CvPolicyMode,
cv::{cv_crl_expiration::CvCrlExpiration, cv_evaluation_depth::CvEvaluationDepth},
extensions::{ExtendedKeyUsage, KeyUsage},
},
};
#[derive(Debug, PartialEq)]
pub struct CvPolicy<'any, 'bytes> {
cep: CvCrlExpiration,
crls: &'any [CvCrl<'any, 'bytes>],
extended_key_usage: &'any ExtendedKeyUsage,
evaluation_depth: CvEvaluationDepth,
key_usage: KeyUsage,
mode: CvPolicyMode,
validation_time: DateTime<Utc>,
}
impl<'any, 'bytes> CvPolicy<'any, 'bytes> {
pub fn from_crls(crls: &'any [CvCrl<'any, 'bytes>]) -> crate::Result<Self> {
Ok(Self {
cep: CvCrlExpiration::Enforce,
crls,
extended_key_usage: const { &ExtendedKeyUsage::SERVER },
evaluation_depth: CvEvaluationDepth::Chain(10),
key_usage: KeyUsage::default(),
mode: CvPolicyMode::Strict,
validation_time: Instant::now_date_time(0)?,
})
}
}
impl<'any, 'bytes> CvPolicy<'any, 'bytes> {
#[inline]
pub const fn crls(&self) -> &'any [CvCrl<'any, 'bytes>] {
self.crls
}
#[inline]
pub const fn crls_mut(&mut self) -> &mut &'any [CvCrl<'any, 'bytes>] {
&mut self.crls
}
#[inline]
pub const fn extended_key_usage(&self) -> &ExtendedKeyUsage {
self.extended_key_usage
}
#[inline]
pub const fn extended_key_usage_mut(&mut self) -> &mut &'any ExtendedKeyUsage {
&mut self.extended_key_usage
}
#[inline]
pub const fn evaluation_depth(&self) -> CvEvaluationDepth {
self.evaluation_depth
}
#[inline]
pub const fn evaluation_depth_mut(&mut self) -> &mut CvEvaluationDepth {
&mut self.evaluation_depth
}
#[inline]
pub const fn expiration_policy(&self) -> CvCrlExpiration {
self.cep
}
#[inline]
pub const fn expiration_policy_mut(&mut self) -> &mut CvCrlExpiration {
&mut self.cep
}
#[inline]
pub const fn key_usage(&self) -> &KeyUsage {
&self.key_usage
}
#[inline]
pub const fn key_usage_mut(&mut self) -> &mut KeyUsage {
&mut self.key_usage
}
#[inline]
pub const fn mode(&self) -> CvPolicyMode {
self.mode
}
#[inline]
pub const fn mode_mut(&mut self) -> &mut CvPolicyMode {
&mut self.mode
}
#[inline]
pub const fn set_validation_time(&mut self, value: DateTime<Utc>) {
self.validation_time = value.trunc_to_sec();
}
#[inline]
pub const fn validation_time(&self) -> &DateTime<Utc> {
&self.validation_time
}
}