1use crate::certificate::{CertificateInner, Profile, Rfc5280, TbsCertificateInner};
4use crate::ext::pkix::{NameConstraints, certpolicy::CertificatePolicies};
5use crate::{ext::Extensions, name::Name};
6
7use crate::SubjectPublicKeyInfo;
8use alloc::string::String;
9use der::{
10 Choice, Enumerated, Sequence,
11 asn1::OctetString,
12 flagset::{FlagSet, flags},
13};
14
15#[derive(Clone, Debug, Default, Copy, PartialEq, Eq, Enumerated)]
17#[asn1(type = "INTEGER")]
18#[repr(u8)]
19pub enum Version {
20 #[default]
22 V1 = 0,
23}
24
25#[derive(Clone, Debug, PartialEq, Eq, Sequence)]
41#[allow(missing_docs)]
42pub struct TrustAnchorInfo<P: Profile = Rfc5280> {
43 #[asn1(default = "Default::default")]
44 pub version: Version,
45
46 pub pub_key: SubjectPublicKeyInfo,
47
48 pub key_id: OctetString,
49
50 #[asn1(optional = "true")]
51 pub ta_title: Option<String>,
52
53 #[asn1(optional = "true")]
54 pub cert_path: Option<CertPathControls<P>>,
55
56 #[asn1(context_specific = "1", tag_mode = "EXPLICIT", optional = "true")]
57 pub extensions: Option<Extensions>,
58
59 #[asn1(context_specific = "2", tag_mode = "IMPLICIT", optional = "true")]
60 pub ta_title_lang_tag: Option<String>,
61}
62
63#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
74#[allow(missing_docs)]
75pub struct CertPathControls<P: Profile = Rfc5280> {
76 pub ta_name: Name,
77
78 #[asn1(context_specific = "0", tag_mode = "IMPLICIT", optional = "true")]
79 pub certificate: Option<CertificateInner<P>>,
80
81 #[asn1(context_specific = "1", tag_mode = "IMPLICIT", optional = "true")]
82 pub policy_set: Option<CertificatePolicies>,
83
84 #[asn1(context_specific = "2", tag_mode = "IMPLICIT", optional = "true")]
85 pub policy_flags: Option<CertPolicyFlags>,
86
87 #[asn1(context_specific = "3", tag_mode = "IMPLICIT", optional = "true")]
88 pub name_constr: Option<NameConstraints>,
89
90 #[asn1(context_specific = "4", tag_mode = "IMPLICIT", optional = "true")]
91 pub path_len_constraint: Option<u32>,
92}
93
94flags! {
95 #[allow(missing_docs)]
107 pub enum CertPolicies: u8 {
108 InhibitPolicyMapping = 1 << 0,
109 RequireExplicitPolicy = 1 << 1,
110 InhibitAnyPolicy = 1 << 2,
111 }
112}
113
114pub type CertPolicyFlags = FlagSet<CertPolicies>;
118
119#[derive(Clone, Debug, PartialEq, Eq, Choice)]
132#[allow(clippy::large_enum_variant)]
133#[allow(missing_docs)]
134pub enum TrustAnchorChoice<P: Profile = Rfc5280> {
135 Certificate(CertificateInner<P>),
136
137 #[asn1(context_specific = "1", tag_mode = "EXPLICIT", constructed = "true")]
138 TbsCertificate(TbsCertificateInner<P>),
139
140 #[asn1(context_specific = "2", tag_mode = "EXPLICIT", constructed = "true")]
141 TaInfo(TrustAnchorInfo<P>),
142}