x509_cert/ext/pkix/name/dirstr.rs
1use alloc::string::String;
2use der::asn1::{PrintableString, TeletexString};
3use der::{Choice, ValueOrd};
4
5/// DirectoryString as defined in [RFC 5280 Section 4.2.1.4].
6///
7/// ASN.1 structure for DirectoryString is below.
8///
9/// ```text
10/// DirectoryString ::= CHOICE {
11/// teletexString TeletexString (SIZE (1..MAX)),
12/// printableString PrintableString (SIZE (1..MAX)),
13/// universalString UniversalString (SIZE (1..MAX)),
14/// utf8String UTF8String (SIZE (1..MAX)),
15/// bmpString BMPString (SIZE (1..MAX))
16/// }
17/// ```
18///
19/// Further, [RFC 5280 Section 4.2.1.4] states:
20///
21/// ```text
22/// The DirectoryString type is defined as a choice of PrintableString,
23/// TeletexString, BMPString, UTF8String, and UniversalString. CAs
24/// conforming to this profile MUST use either the PrintableString or
25/// UTF8String encoding of DirectoryString, with two exceptions. When
26/// CAs have previously issued certificates with issuer fields with
27/// attributes encoded using TeletexString, BMPString, or
28/// UniversalString, then the CA MAY continue to use these encodings of
29/// the DirectoryString to preserve backward compatibility. Also, new
30/// CAs that are added to a domain where existing CAs issue certificates
31/// with issuer fields with attributes encoded using TeletexString,
32/// BMPString, or UniversalString MAY encode attributes that they share
33/// with the existing CAs using the same encodings as the existing CAs
34/// use.
35/// ```
36///
37/// The implication of the above paragraph is that `PrintableString` and
38/// `UTF8String` are the new types and the other types are legacy. Until
39/// the need arises, we only support `PrintableString` and `UTF8String`.
40///
41/// [RFC 5280 Section 4.2.1.4]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.4
42#[derive(Clone, Debug, Eq, PartialEq, Choice, ValueOrd)]
43#[allow(missing_docs)]
44pub enum DirectoryString {
45 #[asn1(type = "PrintableString")]
46 PrintableString(PrintableString),
47
48 #[asn1(type = "TeletexString")]
49 TeletexString(TeletexString),
50
51 #[asn1(type = "UTF8String")]
52 Utf8String(String),
53}