1use super::{
4 ConditionalError, ConditionalPlacement, ExclusivePlacement, ExclusivityError, Index, Placement,
5 TimestampPlacement, TimestampPlacementError, conditional_placement, exclusivity,
6 timestamp_placement,
7};
8use crate::Xades;
9use crate::pki::CounterPaths;
10use crate::prepare::Prepared;
11use crate::xml::{Access, Xml};
12use structured_asn1::memory::Work;
13use structured_ltv::baseline::X509Material;
14use structured_ltv::material::{Incorporation, IncorporationError, artifact_uses, incorporation};
15use structured_ltv::pki::{ParticipantClosure, ParticipantRequirements, UsesError, authority_uses};
16
17pub struct Checks<'closure, 'requirements, 'view, 'certificate, 'document, N, D, G> {
25 presence: Incorporation<'certificate, 'document, N, D, G, Placement<N>>,
26 conditional: ConditionalPlacement<'certificate, 'document, N, D, G>,
27 exclusive: ExclusivePlacement<'certificate, 'document, N, D, G>,
28 timestamps:
29 TimestampPlacement<'closure, 'requirements, 'view, 'certificate, 'document, N, D, G>,
30}
31
32impl<N: Copy, D: Copy, G: Copy> Checks<'_, '_, '_, '_, '_, N, D, G> {
33 #[must_use]
35 pub fn presence(&self) -> &Incorporation<'_, '_, N, D, G, Placement<N>> {
36 &self.presence
37 }
38
39 #[must_use]
41 pub fn conditional(&self) -> &ConditionalPlacement<'_, '_, N, D, G> {
42 &self.conditional
43 }
44
45 #[must_use]
47 pub fn exclusive(&self) -> &ExclusivePlacement<'_, '_, N, D, G> {
48 &self.exclusive
49 }
50
51 #[must_use]
53 pub fn timestamps(&self) -> &TimestampPlacement<'_, '_, '_, '_, '_, N, D, G> {
54 &self.timestamps
55 }
56
57 #[must_use]
60 pub fn all_x509_requirements_met(&self) -> bool {
61 self.presence.all_present()
62 && self.conditional.findings().is_empty()
63 && self.exclusive.findings().is_empty()
64 && self.timestamps.findings().is_empty()
65 }
66}
67
68impl<'v, 'd, N: Copy, D: Copy, G: Copy> X509Material<'v, 'd>
69 for Checks<'_, '_, 'v, '_, 'd, N, D, G>
70{
71 type Id = N;
72 type Document = D;
73 type Generation = G;
74 type Issuer = Xades;
75
76 fn requirements(&self) -> &ParticipantRequirements<'v, 'd, N, D, G, Xades> {
77 self.timestamps.inputs().requirements()
78 }
79 fn all_x509_requirements_met(&self) -> bool {
80 Checks::all_x509_requirements_met(self)
81 }
82}
83
84#[derive(Debug)]
86pub enum CheckError<'certificate, 'document, E, N> {
87 Conditional(ConditionalError<E, N>),
89 Uses(UsesError<N>),
91 Presence(IncorporationError<N>),
93 Exclusive(ExclusivityError<'certificate, 'document, N>),
95 Timestamp(TimestampPlacementError<N>),
97}
98
99pub type CheckResult<'closure, 'requirements, 'view, 'certificate, 'document, X> = Result<
101 Checks<
102 'closure,
103 'requirements,
104 'view,
105 'certificate,
106 'document,
107 <X as Xml>::Id,
108 <X as Xml>::Document,
109 <X as Xml>::Generation,
110 >,
111 CheckError<'certificate, 'document, <X as Xml>::Error, <X as Xml>::Id>,
112>;
113
114pub fn check_participants<
126 'closure,
127 'requirements,
128 'view,
129 'certificate,
130 'document,
131 X: Xml,
132 W: Work,
133 Q: Work,
134>(
135 prepared: &Prepared<X>,
136 inputs: &'closure ParticipantClosure<
137 'requirements,
138 'view,
139 'certificate,
140 'document,
141 X::Id,
142 X::Document,
143 X::Generation,
144 Xades,
145 >,
146 counters: &CounterPaths<'_, 'document, X::Id, X::Document, X::Generation>,
147 index: &Index<'_, X::Id, X::Document, X::Generation, W>,
148 access: &Access<'_, X, Q>,
149) -> CheckResult<'closure, 'requirements, 'view, 'certificate, 'document, X> {
150 let conditional = conditional_placement(prepared, inputs, counters, index, access)
151 .map_err(CheckError::Conditional)?;
152 let purposes = authority_uses(inputs, access).map_err(CheckError::Uses)?;
153 let artifacts = artifact_uses(&purposes, access).map_err(CheckError::Uses)?;
154 let presence = incorporation(&artifacts, index, access).map_err(CheckError::Presence)?;
155 let exclusive = exclusivity(&artifacts, index, access).map_err(CheckError::Exclusive)?;
156 let timestamps = timestamp_placement(inputs, index, access).map_err(CheckError::Timestamp)?;
157 Ok(Checks {
158 presence,
159 conditional,
160 exclusive,
161 timestamps,
162 })
163}