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