Skip to content

Commit 3d93e85

Browse files
authored
der: add doc examples for Tag, Length and Header (#2051)
1 parent 9cc6cc9 commit 3d93e85

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

der/src/header.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,27 @@ use crate::{Decode, DerOrd, Encode, Error, ErrorKind, Length, Reader, Result, Ta
77
use core::cmp::Ordering;
88

99
/// ASN.1 DER headers: tag + length component of TLV-encoded values
10+
///
11+
///
12+
/// ## Examples
13+
/// ```
14+
/// use der::{Decode, Header, Length, Reader, SliceReader, Tag};
15+
///
16+
/// let mut reader = SliceReader::new(&[0x04, 0x02, 0x31, 0x32]).unwrap();
17+
/// let header = Header::decode(&mut reader).expect("valid header");
18+
///
19+
/// assert_eq!(header, Header::new(Tag::OctetString, Length::new(2)));
20+
///
21+
/// assert_eq!(reader.read_slice(2u8.into()).unwrap(), b"12");
22+
/// ```
23+
///
24+
/// ```
25+
/// use der::{Encode, Header, Length, Tag};
26+
/// let header = Header::new(Tag::Sequence, Length::new(256));
27+
///
28+
/// // Header of 256-byte SEQUENCE is 4-byte long
29+
/// assert_eq!(header.encoded_len(), Ok(Length::new(4)));
30+
/// ```
1031
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
1132
pub struct Header {
1233
/// Tag representing the type of the encoded value

der/src/length.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,33 @@ use core::{
1818
};
1919

2020
/// ASN.1-encoded length.
21+
///
22+
/// ## Examples
23+
/// ```
24+
/// use der::{Decode, Length, SliceReader};
25+
///
26+
/// let mut reader = SliceReader::new(&[0x82, 0xAA, 0xBB]).unwrap();
27+
/// let length = Length::decode(&mut reader).expect("valid length");
28+
///
29+
/// assert_eq!(length, Length::new(0xAABB));
30+
/// ```
31+
///
32+
/// 5-byte lengths are supported:
33+
/// ```
34+
/// use der::{Encode, Length};
35+
/// let length = Length::new(0x10000000);
36+
///
37+
/// assert_eq!(length.encoded_len(), Ok(Length::new(5)));
38+
/// ```
39+
///
40+
/// Invalid lengths produce an error:
41+
/// ```
42+
/// use der::{Decode, Length, SliceReader};
43+
///
44+
/// let mut reader = SliceReader::new(&[0x81, 0x7F]).unwrap();
45+
///
46+
/// Length::decode(&mut reader).expect_err("non-canonical length should be rejected");
47+
/// ```
2148
#[derive(Copy, Clone, Default, Eq, Hash, PartialEq, PartialOrd, Ord)]
2249
pub struct Length {
2350
/// Inner length as a `u32`. Note that the decoder and encoder also support a maximum length

der/src/tag.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,34 @@ impl<T: FixedTag + ?Sized> IsConstructed for T {
6262
/// - Bits 8/7: [`Class`]
6363
/// - Bit 6: primitive (0) or constructed (1)
6464
/// - Bits 5-1: tag number
65+
///
66+
/// ## Examples
67+
/// ```
68+
/// use der::{Decode, Tag, SliceReader};
69+
///
70+
/// let mut reader = SliceReader::new(&[0x30]).unwrap();
71+
/// let tag = Tag::decode(&mut reader).expect("valid tag");
72+
///
73+
/// assert_eq!(tag, Tag::Sequence);
74+
/// ```
75+
///
76+
/// Invalid tags produce an error:
77+
/// ```
78+
/// use der::{Decode, Tag};
79+
///
80+
/// // 0x21 is an invalid CONSTRUCTED BOOLEAN
81+
/// Tag::from_der(&[0x21]).expect_err("invalid tag");
82+
/// ```
83+
///
84+
/// `APPLICATION`, `CONTEXT-SPECIFIC` and `PRIVATE` tags are supported:
85+
/// ```
86+
/// use der::{Decode, Tag, TagNumber};
87+
///
88+
/// // `APPLICATION [33] (constructed)`
89+
/// let tag = Tag::from_der(&[0x7F, 0x21]).expect("valid tag");
90+
///
91+
/// assert_eq!(tag, Tag::Application { constructed: true, number: TagNumber(33) });
92+
/// ```
6593
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
6694
#[derive(Copy, Clone, Eq, Hash, PartialEq, PartialOrd, Ord)]
6795
#[non_exhaustive]

0 commit comments

Comments
 (0)