//! Trust anchor-related structures as defined in RFC 5914 use crate::ext::pkix::{certpolicy::CertificatePolicies, NameConstraints}; use crate::{ext::Extensions, name::Name}; use crate::{Certificate, TbsCertificate}; use alloc::string::String; use der::asn1::OctetString; use der::flagset::{flags, FlagSet}; use der::{Choice, Enumerated, Sequence}; use spki::SubjectPublicKeyInfoOwned; /// Version identifier for TrustAnchorInfo #[derive(Clone, Debug, Default, Copy, PartialEq, Eq, Enumerated)] #[asn1(type = "INTEGER")] #[repr(u8)] pub enum Version { /// Version 1 (default) #[default] V1 = 0, } /// ```text /// TrustAnchorInfo ::= SEQUENCE { /// version TrustAnchorInfoVersion DEFAULT v1, /// pubKey SubjectPublicKeyInfo, /// keyId KeyIdentifier, /// taTitle TrustAnchorTitle OPTIONAL, /// certPath CertPathControls OPTIONAL, /// exts [1] EXPLICIT Extensions OPTIONAL, /// taTitleLangTag [2] UTF8String OPTIONAL /// } /// /// TrustAnchorInfoVersion ::= INTEGER { v1(1) } /// /// TrustAnchorTitle ::= UTF8String (SIZE (1..64)) /// ``` #[derive(Clone, Debug, PartialEq, Eq, Sequence)] #[allow(missing_docs)] pub struct TrustAnchorInfo { #[asn1(default = "Default::default")] pub version: Version, pub pub_key: SubjectPublicKeyInfoOwned, pub key_id: OctetString, #[asn1(optional = "true")] pub ta_title: Option, #[asn1(optional = "true")] pub cert_path: Option, #[asn1(context_specific = "1", tag_mode = "EXPLICIT", optional = "true")] pub extensions: Option, #[asn1(context_specific = "2", tag_mode = "IMPLICIT", optional = "true")] pub ta_title_lang_tag: Option, } /// ```text /// CertPathControls ::= SEQUENCE { /// taName Name, /// certificate [0] Certificate OPTIONAL, /// policySet [1] CertificatePolicies OPTIONAL, /// policyFlags [2] CertPolicyFlags OPTIONAL, /// nameConstr [3] NameConstraints OPTIONAL, /// pathLenConstraint [4] INTEGER (0..MAX) OPTIONAL /// } /// ``` #[derive(Clone, Debug, Eq, PartialEq, Sequence)] #[allow(missing_docs)] pub struct CertPathControls { pub ta_name: Name, #[asn1(context_specific = "0", tag_mode = "IMPLICIT", optional = "true")] pub certificate: Option, #[asn1(context_specific = "1", tag_mode = "IMPLICIT", optional = "true")] pub policy_set: Option, #[asn1(context_specific = "2", tag_mode = "IMPLICIT", optional = "true")] pub policy_flags: Option, #[asn1(context_specific = "3", tag_mode = "IMPLICIT", optional = "true")] pub name_constr: Option, #[asn1(context_specific = "4", tag_mode = "IMPLICIT", optional = "true")] pub path_len_constraint: Option, } flags! { /// Certificate policies as defined in [RFC 5280 Section 4.2.1.13]. /// /// ```text /// CertPolicyFlags ::= BIT STRING { /// inhibitPolicyMapping (0), /// requireExplicitPolicy (1), /// inhibitAnyPolicy (2) /// } /// ``` /// /// [RFC 5280 Section 4.2.1.13]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.13 #[allow(missing_docs)] pub enum CertPolicies: u8 { InhibitPolicyMapping = 1 << 0, RequireExplicitPolicy = 1 << 1, InhibitAnyPolicy = 1 << 2, } } /// Certificate policy flags as defined in [RFC 5280 Section 4.2.1.13]. /// /// [RFC 5280 Section 4.2.1.13]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.13 pub type CertPolicyFlags = FlagSet; /// ```text /// TrustAnchorChoice ::= CHOICE { /// certificate Certificate, /// tbsCert [1] EXPLICIT TBSCertificate, /// taInfo [2] EXPLICIT TrustAnchorInfo /// } /// ``` #[derive(Clone, Debug, PartialEq, Eq, Choice)] #[allow(clippy::large_enum_variant)] #[allow(missing_docs)] pub enum TrustAnchorChoice { Certificate(Certificate), #[asn1(context_specific = "1", tag_mode = "EXPLICIT", constructed = "true")] TbsCertificate(TbsCertificate), #[asn1(context_specific = "2", tag_mode = "EXPLICIT", constructed = "true")] TaInfo(TrustAnchorInfo), }