structured_pkix/
identifier.rs1use crate::error::{Error, ErrorCode, Located, Result};
10use crate::extension::{self, Extension};
11use crate::general_name::{self, GeneralName};
12use structured_asn1::memory::{OwnedVec, Work};
13use structured_asn1::{Element, Integer, Reader, ScopedReader, Tag, universal};
14
15#[derive(Debug, Clone, Copy)]
17pub struct SubjectKeyIdentifier<'a> {
18 bytes: &'a [u8],
19}
20
21impl<'a> SubjectKeyIdentifier<'a> {
22 #[must_use]
26 pub fn as_bytes(self) -> &'a [u8] {
27 self.bytes
28 }
29
30 pub fn read<W: Work>(extension: &Extension<'a>, execution: &W) -> Result<Self> {
32 Self::read_value(
33 extension,
34 extension
35 .reader_scoped(execution)
36 .field("extensions.subjectKeyIdentifier")?,
37 )
38 }
39
40 pub fn read_in<'query>(extension: &Extension<'a>, query: &Reader<'query>) -> Result<Self>
43 where
44 'a: 'query,
45 {
46 Self::read_value(
47 extension,
48 extension
49 .reader_in(query)
50 .field("extensions.subjectKeyIdentifier")?,
51 )
52 }
53
54 fn read_value(extension: &Extension<'a>, mut reader: ScopedReader<'_, '_>) -> Result<Self> {
55 const FIELD: &str = "extensions.subjectKeyIdentifier";
56 let fail = |code| Error::new(code, FIELD, extension.span().start);
57
58 let element = reader
59 .next_element()
60 .field(FIELD)?
61 .ok_or_else(|| fail(ErrorCode::MissingField))?;
62 if element.tag() != Tag::primitive(universal::OCTET_STRING) {
63 return Err(fail(ErrorCode::Encoding(
64 structured_asn1::ErrorCode::UnexpectedTag,
65 )));
66 }
67 if !reader.is_empty() {
68 return Err(fail(ErrorCode::TrailingData));
69 }
70
71 let original = extension.value();
76 let from = original.len() - element.contents().len();
77 Ok(Self {
78 bytes: &original[from..],
79 })
80 }
81}
82
83#[derive(Debug)]
85pub struct AuthorityKeyIdentifier<'a> {
86 key_id: Option<&'a [u8]>,
87 issuer: OwnedVec<GeneralName<'a>>,
88 serial: Option<Integer<'a>>,
89}
90
91impl<'a> AuthorityKeyIdentifier<'a> {
92 #[must_use]
94 pub fn key_id(&self) -> Option<&'a [u8]> {
95 self.key_id
96 }
97
98 #[must_use]
101 pub fn issuer(&self) -> &[GeneralName<'a>] {
102 &self.issuer
103 }
104
105 #[must_use]
108 pub fn serial(&self) -> Option<Integer<'a>> {
109 self.serial
110 }
111
112 pub fn read<W: Work>(extension: &Extension<'a>, execution: &W) -> Result<Self> {
114 const FIELD: &str = "extensions.authorityKeyIdentifier";
115 let fail = |code| Error::new(code, FIELD, extension.span().start);
116
117 let mut inside = extension::sequence(extension, FIELD, execution)?;
118 let mut identifier = Self {
119 key_id: None,
120 issuer: inside.memory().vector(),
121 serial: None,
122 };
123
124 let mut last_number = None;
127 while let Some(field) = inside.next_element().field(FIELD)? {
128 let tag = extension::context_of(field.tag());
129 match tag {
130 Some((0, false)) if last_number.is_none() => {
131 identifier.key_id = Some(field.contents());
132 }
133 Some((1, true)) if last_number < Some(1) => {
134 identifier.issuer = general_name::read_all(&inside, &field, FIELD)?;
135 }
136 Some((2, false)) if last_number < Some(2) => {
137 identifier.serial = Some(inside.integer(&field).field(FIELD)?);
138 }
139 _ => return Err(at(FIELD, ErrorCode::UnexpectedField, &field)),
140 }
141 last_number = tag.map(|(number, _)| number);
142 }
143
144 if identifier.issuer.is_empty() != identifier.serial.is_none() {
148 return Err(fail(ErrorCode::MalformedValue));
149 }
150
151 if !identifier.issuer.is_empty()
156 && !identifier
157 .issuer
158 .iter()
159 .any(|name| matches!(name, general_name::GeneralName::Directory(_)))
160 {
161 return Err(fail(ErrorCode::MalformedValue));
162 }
163
164 if identifier.key_id.is_none() && identifier.serial.is_none() {
168 return Err(fail(ErrorCode::MalformedValue));
169 }
170
171 Ok(identifier)
172 }
173}
174
175fn at(field: &'static str, code: ErrorCode, element: &Element<'_>) -> Error {
176 Error::new(code, field, element.span().start)
177}
178
179#[cfg(test)]
180mod tests;