structured_ltv/pki/
reading.rs1use super::{CheckedPath, CrlAuthorities, CrlBindingError, CrlBindingFailure};
4use structured_asn1::memory::Work;
5use structured_pkix::{
6 Certificate,
7 crl::{CompleteFacts, DeltaFacts, EvidenceSource},
8 temporal::{LeapTable, Reading},
9};
10
11#[derive(Clone, Copy)]
14pub enum CrlReading<'view, 'certificate, 'document> {
15 Complete(&'view CompleteFacts<'view, 'certificate, 'document>),
17 Delta(&'view DeltaFacts<'view, 'certificate, 'document>),
19}
20
21impl<'certificate, 'document> CrlReading<'_, 'certificate, 'document> {
22 #[must_use]
24 pub fn target(self) -> &'certificate Certificate<'document> {
25 match self {
26 Self::Complete(value) => value.target(),
27 Self::Delta(value) => value.target(),
28 }
29 }
30 #[must_use]
32 pub fn evaluated_at(self) -> Reading {
33 match self {
34 Self::Complete(value) => value.evaluated_at(),
35 Self::Delta(value) => value.evaluated_at(),
36 }
37 }
38 #[must_use]
41 pub fn source(self) -> EvidenceSource<'certificate, 'document> {
42 match self {
43 Self::Complete(value) => EvidenceSource::Complete(*value.source()),
44 Self::Delta(value) => EvidenceSource::Delta {
45 base: *value.pair().base(),
46 delta: *value.pair().delta(),
47 },
48 }
49 }
50}
51
52pub struct CrlReadingTarget<'view, 'certificate, 'document> {
55 path: &'view CheckedPath<'document>,
56 member: usize,
57 reading: CrlReading<'view, 'certificate, 'document>,
58 authorities: CrlAuthorities<'view, 'document>,
59}
60
61impl<'view, 'certificate, 'document> CrlReadingTarget<'view, 'certificate, 'document> {
62 #[must_use]
64 pub fn path(&self) -> &'view CheckedPath<'document> {
65 self.path
66 }
67 #[must_use]
69 pub fn member(&self) -> usize {
70 self.member
71 }
72 #[must_use]
74 pub fn reading(&self) -> CrlReading<'view, 'certificate, 'document> {
75 self.reading
76 }
77 #[must_use]
79 pub fn authorities(&self) -> CrlAuthorities<'view, 'document> {
80 self.authorities
81 }
82}
83
84pub enum CrlReadingBinding<'view, 'certificate, 'document> {
86 Bound(CrlReadingTarget<'view, 'certificate, 'document>),
88 Rejected(CrlBindingFailure),
90}
91
92impl<'document> CheckedPath<'document> {
93 pub fn bind_crl_reading<'view, 'certificate, W: Work>(
97 &'view self,
98 member: usize,
99 reading: CrlReading<'view, 'certificate, 'document>,
100 authorities: CrlAuthorities<'view, 'document>,
101 utc: &LeapTable<'_>,
102 execution: &W,
103 ) -> Result<CrlReadingBinding<'view, 'certificate, 'document>, CrlBindingError> {
104 if let Some(cause) = self.bind_crl_source(
105 member,
106 super::crl::CrlSource::Reading(reading),
107 authorities,
108 utc,
109 execution,
110 )? {
111 return Ok(CrlReadingBinding::Rejected(cause));
112 }
113 Ok(CrlReadingBinding::Bound(CrlReadingTarget {
114 path: self,
115 member,
116 reading,
117 authorities,
118 }))
119 }
120}