Coverage Report

Created: 2026-03-31 07:45

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