use super::Timed;
use crate::{
material, pki,
xml::{Access, Xml},
};
use structured_asn1::memory::Work;
pub struct LongTerm<'a, T, M, C> {
timed: &'a T,
x509: &'a M,
credentials: &'a C,
material_complete: bool,
}
impl<T, M, C> LongTerm<'_, T, M, C> {
#[must_use]
pub fn timed(&self) -> &T {
self.timed
}
#[must_use]
pub fn x509(&self) -> &M {
self.x509
}
#[must_use]
pub fn credentials(&self) -> &C {
self.credentials
}
#[must_use]
pub fn all_material_requirements_met(&self) -> bool {
self.material_complete
}
}
type TimedFor<'a, 'r, 'p, 'v, 'c, 'd, X> =
Timed<'a, 'r, 'p, 'v, 'c, 'd, <X as Xml>::Id, <X as Xml>::Document, <X as Xml>::Generation>;
type ChecksFor<'a, 'r, 'v, 'c, 'd, X> = material::Checks<
'a,
'r,
'v,
'c,
'd,
<X as Xml>::Id,
<X as Xml>::Document,
<X as Xml>::Generation,
>;
type CredentialsFor<'a, 'v, 'd, A, X> = material::credentials::Report<
'a,
'v,
'd,
A,
<X as Xml>::Id,
<X as Xml>::Document,
<X as Xml>::Generation,
>;
pub type MaterialResult<'a, T, M, C, X> =
Result<LongTerm<'a, T, M, C>, pki::ParticipantError<<X as Xml>::Error, <X as Xml>::Id>>;
pub fn long_term<'s, 'a, 'r, 'p, 'v, 'c, 'd, 'cl, 'rq, 'mv, 'mc, 'au, 'cv, A, X: Xml, W: Work>(
timed: &'s TimedFor<'a, 'r, 'p, 'v, 'c, 'd, X>,
x509: &'s ChecksFor<'cl, 'rq, 'mv, 'mc, 'd, X>,
credentials: &'s CredentialsFor<'au, 'cv, 'd, A, X>,
access: &Access<'_, X, W>,
) -> MaterialResult<
's,
TimedFor<'a, 'r, 'p, 'v, 'c, 'd, X>,
ChecksFor<'cl, 'rq, 'mv, 'mc, 'd, X>,
CredentialsFor<'au, 'cv, 'd, A, X>,
X,
> {
let requirements = x509.timestamps().inputs().requirements();
if !matches!(
requirements.scope(),
crate::timestamp::TimestampScope::All(_)
) || !matches!(
credentials.scope(),
crate::timestamp::TimestampScope::All(_)
) {
return Err(pki::ParticipantError::Foreign {
signature: requirements.signature(),
});
}
let basic = timed.basic().inputs();
requirements.require_inputs(
basic.certificate,
basic.counters,
credentials.credentials(),
timed.paths(),
access,
)?;
Ok(LongTerm {
timed,
x509,
credentials,
material_complete: x509.all_x509_requirements_met() && credentials.all_requirements_met(),
})
}