1 //! PKIX distribution point types
2 
3 use const_oid::{db::rfc5280::ID_PE_SUBJECT_INFO_ACCESS, AssociatedOid, ObjectIdentifier};
4 use der::flagset::{flags, FlagSet};
5 use der::{Sequence, ValueOrd};
6 
7 use crate::ext::pkix::name::{DistributionPointName, GeneralNames};
8 
9 /// IssuingDistributionPoint as defined in [RFC 5280 Section 5.2.5].
10 ///
11 /// ```text
12 /// IssuingDistributionPoint ::= SEQUENCE {
13 ///     distributionPoint          [0] DistributionPointName OPTIONAL,
14 ///     onlyContainsUserCerts      [1] BOOLEAN DEFAULT FALSE,
15 ///     onlyContainsCACerts        [2] BOOLEAN DEFAULT FALSE,
16 ///     onlySomeReasons            [3] ReasonFlags OPTIONAL,
17 ///     indirectCRL                [4] BOOLEAN DEFAULT FALSE,
18 ///     onlyContainsAttributeCerts [5] BOOLEAN DEFAULT FALSE
19 ///     -- at most one of onlyContainsUserCerts, onlyContainsCACerts,
20 ///     -- and onlyContainsAttributeCerts may be set to TRUE.
21 /// }
22 /// ```
23 ///
24 /// [RFC 5280 Section 5.2.5]: https://datatracker.ietf.org/doc/html/rfc5280#section-5.2.5
25 #[derive(Clone, Debug, Eq, PartialEq, Sequence)]
26 #[allow(missing_docs)]
27 pub struct IssuingDistributionPoint {
28     #[asn1(context_specific = "0", tag_mode = "EXPLICIT", optional = "true")]
29     pub distribution_point: Option<DistributionPointName>,
30 
31     #[asn1(
32         context_specific = "1",
33         tag_mode = "IMPLICIT",
34         default = "Default::default"
35     )]
36     pub only_contains_user_certs: bool,
37 
38     #[asn1(
39         context_specific = "2",
40         tag_mode = "IMPLICIT",
41         default = "Default::default"
42     )]
43     pub only_contains_ca_certs: bool,
44 
45     #[asn1(context_specific = "3", tag_mode = "IMPLICIT", optional = "true")]
46     pub only_some_reasons: Option<ReasonFlags>,
47 
48     #[asn1(
49         context_specific = "4",
50         tag_mode = "IMPLICIT",
51         default = "Default::default"
52     )]
53     pub indirect_crl: bool,
54 
55     #[asn1(
56         context_specific = "5",
57         tag_mode = "IMPLICIT",
58         default = "Default::default"
59     )]
60     pub only_contains_attribute_certs: bool,
61 }
62 
63 impl AssociatedOid for IssuingDistributionPoint {
64     const OID: ObjectIdentifier = ID_PE_SUBJECT_INFO_ACCESS;
65 }
66 
67 impl_extension!(IssuingDistributionPoint, critical = true);
68 
69 /// DistributionPoint as defined in [RFC 5280 Section 4.2.1.13].
70 ///
71 /// ```text
72 /// DistributionPoint ::= SEQUENCE {
73 ///      distributionPoint       [0]     DistributionPointName OPTIONAL,
74 ///      reasons                 [1]     ReasonFlags OPTIONAL,
75 ///      cRLIssuer               [2]     GeneralNames OPTIONAL }
76 /// ```
77 ///
78 /// [RFC 5280 Section 4.2.1.13]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.13
79 #[derive(Clone, Debug, PartialEq, Eq, Sequence, ValueOrd)]
80 #[allow(missing_docs)]
81 pub struct DistributionPoint {
82     #[asn1(context_specific = "0", tag_mode = "EXPLICIT", optional = "true")]
83     pub distribution_point: Option<DistributionPointName>,
84 
85     #[asn1(context_specific = "1", tag_mode = "IMPLICIT", optional = "true")]
86     pub reasons: Option<ReasonFlags>,
87 
88     #[asn1(context_specific = "2", tag_mode = "IMPLICIT", optional = "true")]
89     pub crl_issuer: Option<GeneralNames>,
90 }
91 
92 /// ReasonFlags as defined in [RFC 5280 Section 4.2.1.13].
93 ///
94 /// [RFC 5280 Section 4.2.1.13]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.13
95 pub type ReasonFlags = FlagSet<Reasons>;
96 
97 flags! {
98     /// ReasonFlags values as defined in [RFC 5280 Section 4.2.1.13].
99     ///
100     /// ```text
101     /// ReasonFlags ::= BIT STRING {
102     ///      unused                  (0),
103     ///      keyCompromise           (1),
104     ///      cACompromise            (2),
105     ///      affiliationChanged      (3),
106     ///      superseded              (4),
107     ///      cessationOfOperation    (5),
108     ///      certificateHold         (6),
109     ///      privilegeWithdrawn      (7),
110     ///      aACompromise            (8)
111     /// }
112     /// ```
113     ///
114     /// [RFC 5280 Section 4.2.1.13]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.13
115     #[allow(missing_docs)]
116     pub enum Reasons: u16 {
117         Unused = 1 << 0,
118         KeyCompromise = 1 << 1,
119         CaCompromise = 1 << 2,
120         AffiliationChanged = 1 << 3,
121         Superseded = 1 << 4,
122         CessationOfOperation = 1 << 5,
123         CertificateHold = 1 << 6,
124         PrivilegeWithdrawn = 1 << 7,
125         AaCompromise = 1 << 8,
126     }
127 }
128