der_parser/ber/
multi.rs

1use crate::ber::*;
2use crate::error::*;
3use nom::bytes::complete::take;
4use nom::combinator::{all_consuming, complete, cut, map};
5use nom::error::ParseError;
6use nom::multi::many0;
7use nom::{Err, IResult};
8
9/// Parse a SEQUENCE OF object
10///
11/// Given a subparser for a BER type, parse a sequence of identical objects.
12///
13/// ```rust
14/// # use der_parser::ber::{parse_ber_integer, parse_ber_sequence_of, BerObject};
15/// # use der_parser::error::BerResult;
16/// #
17/// /// Read a SEQUENCE OF INTEGER
18/// fn parser(i:&[u8]) -> BerResult<BerObject> {
19///     parse_ber_sequence_of(parse_ber_integer)(i)
20/// }
21///
22/// # let empty = &b""[..];
23/// # let bytes = [ 0x30, 0x0a,
24/// #               0x02, 0x03, 0x01, 0x00, 0x01,
25/// #               0x02, 0x03, 0x01, 0x00, 0x00,
26/// # ];
27/// # let expected  = BerObject::from_seq(vec![
28/// #     BerObject::from_int_slice(b"\x01\x00\x01"),
29/// #     BerObject::from_int_slice(b"\x01\x00\x00"),
30/// # ]);
31/// # assert_eq!(parser(&bytes), Ok((empty, expected)));
32/// let (rem, v) = parser(&bytes).expect("parsing failed");
33/// ```
34pub fn parse_ber_sequence_of<'a, F>(f: F) -> impl FnMut(&'a [u8]) -> BerResult<'a>
35where
36    F: Fn(&'a [u8]) -> BerResult<'a>,
37{
38    map(parse_ber_sequence_of_v(f), BerObject::from_seq)
39}
40
41/// Parse a SEQUENCE OF object (returning a vec)
42///
43/// Given a subparser for a BER type, parse a sequence of identical objects.
44///
45/// This differs from `parse_ber_sequence_of` in the parse function and return type.
46///
47/// ```rust
48/// # use der_parser::ber::{parse_ber_integer, parse_ber_sequence_of_v, BerObject};
49/// # use der_parser::error::BerResult;
50/// #
51/// /// Read a SEQUENCE OF INTEGER
52/// fn parser(i:&[u8]) -> BerResult<Vec<BerObject>> {
53///     parse_ber_sequence_of_v(parse_ber_integer)(i)
54/// }
55///
56/// # let empty = &b""[..];
57/// # let bytes = [ 0x30, 0x0a,
58/// #               0x02, 0x03, 0x01, 0x00, 0x01,
59/// #               0x02, 0x03, 0x01, 0x00, 0x00,
60/// # ];
61/// # let expected  = vec![
62/// #     BerObject::from_int_slice(b"\x01\x00\x01"),
63/// #     BerObject::from_int_slice(b"\x01\x00\x00"),
64/// # ];
65/// let (rem, v) = parser(&bytes).expect("parsing failed");
66/// # assert_eq!(v, expected);
67/// ```
68pub fn parse_ber_sequence_of_v<'a, T, F, E>(
69    f: F,
70) -> impl FnMut(&'a [u8]) -> IResult<&'a [u8], Vec<T>, E>
71where
72    F: FnMut(&'a [u8]) -> IResult<&'a [u8], T, E>,
73    E: ParseError<&'a [u8]> + From<BerError>,
74{
75    let mut subparser = all_consuming(many0(complete(cut(f))));
76    parse_ber_sequence_defined_g(move |data, _| subparser(data))
77}
78
79/// Parse a defined sequence of DER elements (function version)
80///
81/// Given a list of expected parsers, apply them to build a DER sequence and
82/// return the remaining bytes and the built object.
83///
84/// The remaining bytes point *after* the sequence: any bytes that are part of the sequence but not
85/// parsed are ignored.
86///
87/// The object header is not available to the parsing function, and the returned type is always a
88/// `BerObject`.
89/// For a generic version, see
90/// [`parse_ber_sequence_defined_g`](fn.parse_ber_sequence_defined_g.html).
91///
92/// # Examples
93///
94/// Parsing a sequence of identical types (same as `parse_ber_sequence_of`):
95///
96/// ```rust
97/// # use der_parser::ber::{parse_ber_integer, parse_ber_sequence_defined, BerObject};
98/// # use der_parser::error::BerResult;
99/// use nom::combinator::complete;
100/// use nom::multi::many1;
101///
102/// fn localparse_seq(i:&[u8]) -> BerResult {
103///     parse_ber_sequence_defined(
104///         many1(complete(parse_ber_integer))
105///     )(i)
106/// }
107///
108/// # let empty = &b""[..];
109/// # let bytes = [ 0x30, 0x0a,
110/// #               0x02, 0x03, 0x01, 0x00, 0x01,
111/// #               0x02, 0x03, 0x01, 0x00, 0x00,
112/// # ];
113/// # let expected  = BerObject::from_seq(vec![
114/// #     BerObject::from_int_slice(b"\x01\x00\x01"),
115/// #     BerObject::from_int_slice(b"\x01\x00\x00"),
116/// # ]);
117/// # assert_eq!(localparse_seq(&bytes), Ok((empty, expected)));
118/// let (rem, v) = localparse_seq(&bytes).expect("parsing failed");
119/// ```
120///
121/// Parsing a defined sequence with different types:
122///
123/// ```rust
124/// # use der_parser::ber::*;
125/// # use der_parser::error::BerResult;
126/// use nom::combinator::map;
127/// use nom::sequence::tuple;
128///
129/// /// Read a DER-encoded object:
130/// /// SEQUENCE {
131/// ///     a INTEGER,
132/// ///     b OCTETSTRING
133/// /// }
134/// fn localparse_seq(i:&[u8]) -> BerResult {
135///     parse_ber_sequence_defined(
136///         // the nom `tuple` combinator returns a tuple, so we have to map it
137///         // to a list
138///         map(
139///             tuple((parse_ber_integer, parse_ber_octetstring)),
140///             |(a, b)| vec![a, b]
141///         )
142///     )(i)
143/// }
144///
145/// # let empty = &b""[..];
146/// # let bytes = [ 0x30, 0x0a,
147/// #               0x02, 0x03, 0x01, 0x00, 0x01,
148/// #               0x04, 0x03, 0x01, 0x00, 0x00,
149/// # ];
150/// # let expected  = BerObject::from_seq(vec![
151/// #     BerObject::from_int_slice(b"\x01\x00\x01"),
152/// #     BerObject::from_obj(BerObjectContent::OctetString(b"\x01\x00\x00")),
153/// # ]);
154/// # assert_eq!(localparse_seq(&bytes), Ok((empty, expected)));
155/// let (rem, v) = localparse_seq(&bytes).expect("parsing failed");
156/// ```
157pub fn parse_ber_sequence_defined<'a, F>(mut f: F) -> impl FnMut(&'a [u8]) -> BerResult<'a>
158where
159    F: FnMut(&'a [u8]) -> BerResult<'a, Vec<BerObject<'a>>>,
160{
161    map(
162        parse_ber_sequence_defined_g(move |data, _| f(data)),
163        BerObject::from_seq,
164    )
165}
166
167/// Parse a defined SEQUENCE object (generic function)
168///
169/// Given a parser for sequence content, apply it to build a DER sequence and
170/// return the remaining bytes and the built object.
171///
172/// The remaining bytes point *after* the sequence: any bytes that are part of the sequence but not
173/// parsed are ignored.
174///
175/// Unlike `parse_ber_sequence_defined`, this function allows returning any object or error type,
176/// and also passes the object header to the callback.
177///
178/// # Examples
179///
180/// Parsing a defined sequence with different types:
181///
182/// ```rust
183/// # use der_parser::ber::*;
184/// # use der_parser::error::BerResult;
185/// #
186/// # #[derive(Debug, PartialEq)]
187/// pub struct MyObject<'a> {
188///     a: u32,
189///     b: &'a [u8],
190/// }
191///
192/// /// Read a DER-encoded object:
193/// /// SEQUENCE {
194/// ///     a INTEGER (0..4294967295),
195/// ///     b OCTETSTRING
196/// /// }
197/// fn parse_myobject(i: &[u8]) -> BerResult<MyObject> {
198///     parse_ber_sequence_defined_g(
199///         |i:&[u8], _| {
200///             let (i, a) = parse_ber_u32(i)?;
201///             let (i, obj) = parse_ber_octetstring(i)?;
202///             let b = obj.as_slice().unwrap();
203///             Ok((i, MyObject{ a, b }))
204///         }
205///     )(i)
206/// }
207///
208/// # let empty = &b""[..];
209/// # let bytes = [ 0x30, 0x0a,
210/// #               0x02, 0x03, 0x01, 0x00, 0x01,
211/// #               0x04, 0x03, 0x01, 0x00, 0x00,
212/// # ];
213/// # let expected  = MyObject {
214/// #   a: 0x010001,
215/// #   b: &[01, 00, 00]
216/// # };
217/// # assert_eq!(parse_myobject(&bytes), Ok((empty, expected)));
218/// let (rem, v) = parse_myobject(&bytes).expect("parsing failed");
219/// ```
220pub fn parse_ber_sequence_defined_g<'a, O, F, E>(
221    mut f: F,
222) -> impl FnMut(&'a [u8]) -> IResult<&'a [u8], O, E>
223where
224    F: FnMut(&'a [u8], Header<'a>) -> IResult<&'a [u8], O, E>,
225    E: ParseError<&'a [u8]> + From<BerError>,
226{
227    parse_ber_container(move |i, hdr| {
228        hdr.assert_tag(Tag::Sequence)
229            .map_err(|e| Err::Error(e.into()))?;
230        f(i, hdr)
231    })
232}
233
234/// Parse a SET OF object
235///
236/// Given a subparser for a BER type, parse a set of identical objects.
237///
238/// ```rust
239/// # use der_parser::ber::{parse_ber_integer, parse_ber_set_of, BerObject};
240/// # use der_parser::error::BerResult;
241/// #
242/// /// Read a SET OF INTEGER
243/// fn parser(i:&[u8]) -> BerResult<BerObject> {
244///     parse_ber_set_of(parse_ber_integer)(i)
245/// }
246///
247/// # let empty = &b""[..];
248/// # let bytes = [ 0x31, 0x0a,
249/// #               0x02, 0x03, 0x01, 0x00, 0x01,
250/// #               0x02, 0x03, 0x01, 0x00, 0x00,
251/// # ];
252/// # let expected  = BerObject::from_set(vec![
253/// #     BerObject::from_int_slice(b"\x01\x00\x01"),
254/// #     BerObject::from_int_slice(b"\x01\x00\x00"),
255/// # ]);
256/// # assert_eq!(parser(&bytes), Ok((empty, expected)));
257/// let (rem, v) = parser(&bytes).expect("parsing failed");
258/// ```
259pub fn parse_ber_set_of<'a, F>(f: F) -> impl FnMut(&'a [u8]) -> BerResult<'a>
260where
261    F: Fn(&'a [u8]) -> BerResult<'a>,
262{
263    map(parse_ber_set_of_v(f), BerObject::from_set)
264}
265
266/// Parse a SET OF object (returning a vec)
267///
268/// Given a subparser for a BER type, parse a set of identical objects.
269///
270/// This differs from `parse_ber_set_of` in the parse function and return type.
271///
272/// ```rust
273/// # use der_parser::ber::{parse_ber_integer, parse_ber_set_of_v, BerObject};
274/// # use der_parser::error::BerResult;
275/// #
276/// /// Read a SET OF INTEGER
277/// fn parser(i:&[u8]) -> BerResult<Vec<BerObject>> {
278///     parse_ber_set_of_v(parse_ber_integer)(i)
279/// }
280///
281/// # let empty = &b""[..];
282/// # let bytes = [ 0x31, 0x0a,
283/// #               0x02, 0x03, 0x01, 0x00, 0x01,
284/// #               0x02, 0x03, 0x01, 0x00, 0x00,
285/// # ];
286/// # let expected  = vec![
287/// #     BerObject::from_int_slice(b"\x01\x00\x01"),
288/// #     BerObject::from_int_slice(b"\x01\x00\x00"),
289/// # ];
290/// let (rem, v) = parser(&bytes).expect("parsing failed");
291/// # assert_eq!(v, expected);
292/// ```
293pub fn parse_ber_set_of_v<'a, T, F, E>(f: F) -> impl FnMut(&'a [u8]) -> IResult<&'a [u8], Vec<T>, E>
294where
295    F: FnMut(&'a [u8]) -> IResult<&'a [u8], T, E>,
296    E: ParseError<&'a [u8]> + From<BerError>,
297{
298    let mut subparser = all_consuming(many0(complete(cut(f))));
299    parse_ber_set_defined_g(move |data, _| subparser(data))
300}
301
302/// Parse a defined set of DER elements (function version)
303///
304/// Given a list of expected parsers, apply them to build a DER set and
305/// return the remaining bytes and the built object.
306///
307/// The remaining bytes point *after* the set: any bytes that are part of the sequence but not
308/// parsed are ignored.
309/// The nom combinator `all_consuming` can be used to ensure all the content is parsed.
310///
311/// The object header is not available to the parsing function, and the returned type is always a
312/// `BerObject`.
313/// For a generic version, see [`parse_ber_set_defined_g`](fn.parse_ber_set_defined_g.html).
314///
315/// # Examples
316///
317/// Parsing a set of identical types (same as `parse_ber_set_of`):
318///
319/// ```rust
320/// # use der_parser::ber::{parse_ber_integer, parse_ber_set_defined, BerObject};
321/// # use der_parser::error::BerResult;
322/// use nom::combinator::complete;
323/// use nom::multi::many1;
324///
325/// fn localparse_seq(i:&[u8]) -> BerResult {
326///     parse_ber_set_defined(
327///         many1(complete(parse_ber_integer))
328///     )(i)
329/// }
330///
331/// # let empty = &b""[..];
332/// # let bytes = [ 0x31, 0x0a,
333/// #               0x02, 0x03, 0x01, 0x00, 0x01,
334/// #               0x02, 0x03, 0x01, 0x00, 0x00,
335/// # ];
336/// # let expected  = BerObject::from_set(vec![
337/// #     BerObject::from_int_slice(b"\x01\x00\x01"),
338/// #     BerObject::from_int_slice(b"\x01\x00\x00"),
339/// # ]);
340/// # assert_eq!(localparse_seq(&bytes), Ok((empty, expected)));
341/// let (rem, v) = localparse_seq(&bytes).expect("parsing failed");
342/// ```
343///
344/// Parsing a defined set with different types:
345///
346/// ```rust
347/// # use der_parser::ber::*;
348/// # use der_parser::error::BerResult;
349/// use nom::combinator::map;
350/// use nom::sequence::tuple;
351///
352/// /// Read a DER-encoded object:
353/// /// SET {
354/// ///     a INTEGER,
355/// ///     b OCTETSTRING
356/// /// }
357/// fn localparse_set(i:&[u8]) -> BerResult {
358///     parse_ber_set_defined(
359///         // the nom `tuple` combinator returns a tuple, so we have to map it
360///         // to a list
361///         map(
362///             tuple((parse_ber_integer, parse_ber_octetstring)),
363///             |(a, b)| vec![a, b]
364///         )
365///     )(i)
366/// }
367///
368/// # let empty = &b""[..];
369/// # let bytes = [ 0x31, 0x0a,
370/// #               0x02, 0x03, 0x01, 0x00, 0x01,
371/// #               0x04, 0x03, 0x01, 0x00, 0x00,
372/// # ];
373/// # let expected  = BerObject::from_set(vec![
374/// #     BerObject::from_int_slice(b"\x01\x00\x01"),
375/// #     BerObject::from_obj(BerObjectContent::OctetString(b"\x01\x00\x00")),
376/// # ]);
377/// # assert_eq!(localparse_set(&bytes), Ok((empty, expected)));
378/// let (rem, v) = localparse_set(&bytes).expect("parsing failed");
379/// ```
380pub fn parse_ber_set_defined<'a, F>(mut f: F) -> impl FnMut(&'a [u8]) -> BerResult<'a>
381where
382    F: FnMut(&'a [u8]) -> BerResult<'a, Vec<BerObject<'a>>>,
383{
384    map(
385        parse_ber_set_defined_g(move |data, _| f(data)),
386        BerObject::from_set,
387    )
388}
389
390/// Parse a defined SET object (generic version)
391///
392/// Given a parser for set content, apply it to build a DER set and
393/// return the remaining bytes and the built object.
394///
395/// The remaining bytes point *after* the set: any bytes that are part of the sequence but not
396/// parsed are ignored.
397/// The nom combinator `all_consuming` can be used to ensure all the content is parsed.
398///
399/// Unlike `parse_ber_set_defined`, this function allows returning any object or error type,
400/// and also passes the object header to the callback.
401///
402/// # Examples
403///
404/// Parsing a defined set with different types:
405///
406/// ```rust
407/// # use der_parser::ber::*;
408/// # use der_parser::error::BerResult;
409/// #
410/// # #[derive(Debug, PartialEq)]
411/// pub struct MyObject<'a> {
412///     a: u32,
413///     b: &'a [u8],
414/// }
415///
416/// /// Read a DER-encoded object:
417/// /// SET {
418/// ///     a INTEGER (0..4294967295),
419/// ///     b OCTETSTRING
420/// /// }
421/// fn parse_myobject(i: &[u8]) -> BerResult<MyObject> {
422///     parse_ber_set_defined_g(
423///         |i:&[u8], _| {
424///             let (i, a) = parse_ber_u32(i)?;
425///             let (i, obj) = parse_ber_octetstring(i)?;
426///             let b = obj.as_slice().unwrap();
427///             Ok((i, MyObject{ a, b }))
428///         }
429///     )(i)
430/// }
431///
432/// # let empty = &b""[..];
433/// # let bytes = [ 0x31, 0x0a,
434/// #               0x02, 0x03, 0x01, 0x00, 0x01,
435/// #               0x04, 0x03, 0x01, 0x00, 0x00,
436/// # ];
437/// # let expected  = MyObject {
438/// #   a: 0x010001,
439/// #   b: &[01, 00, 00]
440/// # };
441/// # assert_eq!(parse_myobject(&bytes), Ok((empty, expected)));
442/// let (rem, v) = parse_myobject(&bytes).expect("parsing failed");
443/// ```
444pub fn parse_ber_set_defined_g<'a, O, F, E>(
445    mut f: F,
446) -> impl FnMut(&'a [u8]) -> IResult<&'a [u8], O, E>
447where
448    F: FnMut(&'a [u8], Header<'a>) -> IResult<&'a [u8], O, E>,
449    E: ParseError<&'a [u8]> + From<BerError>,
450{
451    parse_ber_container(move |i, hdr| {
452        hdr.assert_tag(Tag::Set).map_err(|e| Err::Error(e.into()))?;
453        f(i, hdr)
454    })
455}
456
457/// Parse a BER object and apply provided function to content
458///
459/// Given a parser for content, read BER object header and apply parser to
460/// return the remaining bytes and the parser result.
461///
462/// The remaining bytes point *after* the content: any bytes that are part of the content but not
463/// parsed are ignored.
464/// The nom combinator `all_consuming` can be used to ensure all the content is parsed.
465///
466/// This function is mostly intended for constructed objects, but can be used for any valid BER
467/// object.
468///
469/// # Examples
470///
471/// Parsing a defined sequence with different types:
472///
473/// ```rust
474/// # use der_parser::ber::*;
475/// # use der_parser::error::{BerError, BerResult};
476/// #
477/// # #[derive(Debug, PartialEq)]
478/// pub struct MyObject<'a> {
479///     a: u32,
480///     b: &'a [u8],
481/// }
482///
483/// /// Read a DER-encoded object:
484/// /// SEQUENCE {
485/// ///     a INTEGER (0..4294967295),
486/// ///     b OCTETSTRING
487/// /// }
488/// fn parse_myobject(i: &[u8]) -> BerResult<MyObject> {
489///     parse_ber_container(
490///         |i: &[u8], hdr: Header| {
491///             if hdr.tag() != Tag::Sequence {
492///                 return Err(nom::Err::Error(BerError::BerTypeError.into()));
493///             }
494///             let (i, a) = parse_ber_u32(i)?;
495///             let (i, obj) = parse_ber_octetstring(i)?;
496///             let b = obj.as_slice().unwrap();
497///             Ok((i, MyObject{ a, b }))
498///         }
499///     )(i)
500/// }
501///
502/// # let empty = &b""[..];
503/// # let bytes = [ 0x30, 0x0a,
504/// #               0x02, 0x03, 0x01, 0x00, 0x01,
505/// #               0x04, 0x03, 0x01, 0x00, 0x00,
506/// # ];
507/// # let expected  = MyObject {
508/// #   a: 0x010001,
509/// #   b: &[01, 00, 00]
510/// # };
511/// # assert_eq!(parse_myobject(&bytes), Ok((empty, expected)));
512/// let (rem, v) = parse_myobject(&bytes).expect("parsing failed");
513/// ```
514pub fn parse_ber_container<'a, O, F, E>(mut f: F) -> impl FnMut(&'a [u8]) -> IResult<&'a [u8], O, E>
515where
516    F: FnMut(&'a [u8], Header<'a>) -> IResult<&'a [u8], O, E>,
517    E: ParseError<&'a [u8]> + From<BerError>,
518{
519    move |i: &[u8]| {
520        let (i, hdr) = ber_read_element_header(i).map_err(Err::convert)?;
521        let (i, data) = match hdr.length() {
522            Length::Definite(len) => take(len)(i)?,
523            Length::Indefinite => {
524                ber_get_object_content(i, &hdr, MAX_RECURSION).map_err(Err::convert)?
525            }
526        };
527        let (_rest, v) = f(data, hdr)?;
528        Ok((i, v))
529    }
530}