Skip to content

Commit 57b15ea

Browse files
committed
Make TagNumber support tags beyond 30.
1 parent cbb1439 commit 57b15ea

File tree

12 files changed

+272
-172
lines changed

12 files changed

+272
-172
lines changed

Diff for: der/src/asn1/context_specific.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,7 @@ impl<T> ContextSpecific<T> {
8989
F: FnOnce(&mut R) -> Result<Self, E>,
9090
E: From<Error>,
9191
{
92-
while let Some(octet) = reader.peek_byte() {
93-
let tag = Tag::try_from(octet)?;
94-
92+
while let Some(tag) = Tag::peek_optional(reader)? {
9593
if !tag.is_context_specific() || (tag.number() > tag_number) {
9694
break;
9795
} else if tag.number() == tag_number {

Diff for: der/src/asn1/optional.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ where
1010
type Error = T::Error;
1111

1212
fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Option<T>, Self::Error> {
13-
if let Some(byte) = reader.peek_byte() {
14-
if T::can_decode(Tag::try_from(byte)?) {
13+
if let Some(tag) = Tag::peek_optional(reader)? {
14+
if T::can_decode(tag) {
1515
return T::decode(reader).map(Some);
1616
}
1717
}

Diff for: der/src/encode.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ where
7373
{
7474
/// Compute the length of this value in bytes when encoded as ASN.1 DER.
7575
fn encoded_len(&self) -> Result<Length> {
76-
self.value_len().and_then(|len| len.for_tlv())
76+
self.value_len().and_then(|len| len.for_tlv(self.tag()))
7777
}
7878

7979
/// Encode this value as ASN.1 DER using the provided [`Writer`].

Diff for: der/src/header.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ pub struct Header {
1515

1616
impl Header {
1717
/// Maximum number of DER octets a header can be in this crate.
18-
pub(crate) const MAX_SIZE: usize = 1 + Length::MAX_SIZE;
18+
pub(crate) const MAX_SIZE: usize = Tag::MAX_SIZE + Length::MAX_SIZE;
1919

2020
/// Create a new [`Header`] from a [`Tag`] and a specified length.
2121
///

Diff for: der/src/length.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Length calculations for encoded ASN.1 DER values
22
3-
use crate::{Decode, DerOrd, Encode, Error, ErrorKind, Reader, Result, SliceWriter, Writer};
3+
use crate::{Decode, DerOrd, Encode, Error, ErrorKind, Reader, Result, SliceWriter, Tag, Writer};
44
use core::{
55
cmp::Ordering,
66
fmt,
@@ -51,8 +51,8 @@ impl Length {
5151

5252
/// Get the length of DER Tag-Length-Value (TLV) encoded data if `self`
5353
/// is the length of the inner "value" portion of the message.
54-
pub fn for_tlv(self) -> Result<Self> {
55-
Self::ONE + self.encoded_len()? + self
54+
pub fn for_tlv(self, tag: Tag) -> Result<Self> {
55+
tag.encoded_len()? + self.encoded_len()? + self
5656
}
5757

5858
/// Perform saturating addition of two lengths.

Diff for: der/src/reader.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,10 @@ pub trait Reader<'r>: Sized {
115115
Header::peek(self)
116116
}
117117

118-
/// Peek at the next byte in the reader.
118+
/// Peek at the next tag in the reader.
119119
#[deprecated(since = "0.8.0-rc.1", note = "use `Tag::peek` instead")]
120120
fn peek_tag(&self) -> Result<Tag, Error> {
121-
match self.peek_byte() {
122-
Some(byte) => byte.try_into(),
123-
None => Err(Error::incomplete(self.input_len())),
124-
}
121+
Tag::peek(self)
125122
}
126123

127124
/// Read a single byte.

0 commit comments

Comments
 (0)