1 use super::name::GeneralNames;
2 use crate::serial_number::SerialNumber;
3 
4 use const_oid::db::rfc5280::ID_CE_AUTHORITY_KEY_IDENTIFIER;
5 use const_oid::{AssociatedOid, ObjectIdentifier};
6 use der::asn1::OctetString;
7 use der::Sequence;
8 
9 /// AuthorityKeyIdentifier as defined in [RFC 5280 Section 4.2.1.1].
10 ///
11 /// ```text
12 /// AuthorityKeyIdentifier ::= SEQUENCE {
13 ///     keyIdentifier             [0] KeyIdentifier           OPTIONAL,
14 ///     authorityCertIssuer       [1] GeneralNames            OPTIONAL,
15 ///     authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL
16 /// }
17 ///
18 /// KeyIdentifier ::= OCTET STRING
19 /// ```
20 ///
21 /// [RFC 5280 Section 4.2.1.1]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.1
22 #[derive(Clone, Debug, Eq, PartialEq, Sequence, Default)]
23 #[allow(missing_docs)]
24 pub struct AuthorityKeyIdentifier {
25     #[asn1(context_specific = "0", tag_mode = "IMPLICIT", optional = "true")]
26     pub key_identifier: Option<OctetString>,
27 
28     #[asn1(context_specific = "1", tag_mode = "IMPLICIT", optional = "true")]
29     pub authority_cert_issuer: Option<GeneralNames>,
30 
31     #[asn1(context_specific = "2", tag_mode = "IMPLICIT", optional = "true")]
32     pub authority_cert_serial_number: Option<SerialNumber>,
33 }
34 
35 impl AssociatedOid for AuthorityKeyIdentifier {
36     const OID: ObjectIdentifier = ID_CE_AUTHORITY_KEY_IDENTIFIER;
37 }
38 
39 impl_extension!(AuthorityKeyIdentifier, critical = false);
40 impl_key_identifier!(
41     AuthorityKeyIdentifier,
42     (|result: &[u8]| Ok(Self {
43         key_identifier: Some(OctetString::new(result)?),
44         ..Default::default()
45     }))
46 );
47