diff --git a/der/src/tag.rs b/der/src/tag.rs index 3930665b8..bc85e85a9 100644 --- a/der/src/tag.rs +++ b/der/src/tag.rs @@ -189,7 +189,7 @@ impl Tag { } /// Get the [`Class`] that corresponds to this [`Tag`]. - pub fn class(self) -> Class { + pub const fn class(self) -> Class { match self { Tag::Application { .. } => Class::Application, Tag::ContextSpecific { .. } => Class::ContextSpecific, @@ -199,29 +199,29 @@ impl Tag { } /// Get the [`TagNumber`] for this tag. - pub fn number(self) -> TagNumber { + pub const fn number(self) -> TagNumber { match self { - Tag::Boolean => TagNumber::N1, - Tag::Integer => TagNumber::N2, - Tag::BitString => TagNumber::N3, - Tag::OctetString => TagNumber::N4, - Tag::Null => TagNumber::N5, - Tag::ObjectIdentifier => TagNumber::N6, - Tag::Real => TagNumber::N9, - Tag::Enumerated => TagNumber::N10, - Tag::Utf8String => TagNumber::N12, - Tag::Sequence => TagNumber::N16, - Tag::Set => TagNumber::N17, - Tag::NumericString => TagNumber::N18, - Tag::PrintableString => TagNumber::N19, - Tag::TeletexString => TagNumber::N20, - Tag::VideotexString => TagNumber::N21, - Tag::Ia5String => TagNumber::N22, - Tag::UtcTime => TagNumber::N23, - Tag::GeneralizedTime => TagNumber::N24, - Tag::VisibleString => TagNumber::N26, - Tag::GeneralString => TagNumber::N27, - Tag::BmpString => TagNumber::N30, + Tag::Boolean => TagNumber::new(1), + Tag::Integer => TagNumber::new(2), + Tag::BitString => TagNumber::new(3), + Tag::OctetString => TagNumber::new(4), + Tag::Null => TagNumber::new(5), + Tag::ObjectIdentifier => TagNumber::new(6), + Tag::Real => TagNumber::new(9), + Tag::Enumerated => TagNumber::new(10), + Tag::Utf8String => TagNumber::new(12), + Tag::Sequence => TagNumber::new(16), + Tag::Set => TagNumber::new(17), + Tag::NumericString => TagNumber::new(18), + Tag::PrintableString => TagNumber::new(19), + Tag::TeletexString => TagNumber::new(20), + Tag::VideotexString => TagNumber::new(21), + Tag::Ia5String => TagNumber::new(22), + Tag::UtcTime => TagNumber::new(23), + Tag::GeneralizedTime => TagNumber::new(24), + Tag::VisibleString => TagNumber::new(26), + Tag::GeneralString => TagNumber::new(27), + Tag::BmpString => TagNumber::new(30), Tag::Application { number, .. } => number, Tag::ContextSpecific { number, .. } => number, Tag::Private { number, .. } => number, diff --git a/der/src/tag/number.rs b/der/src/tag/number.rs index bce0fea84..3b2f6525b 100644 --- a/der/src/tag/number.rs +++ b/der/src/tag/number.rs @@ -20,99 +20,6 @@ use core::fmt; pub struct TagNumber(pub u32); impl TagNumber { - /// Tag number `0` - pub const N0: Self = Self(0); - - /// Tag number `1` - pub const N1: Self = Self(1); - - /// Tag number `2` - pub const N2: Self = Self(2); - - /// Tag number `3` - pub const N3: Self = Self(3); - - /// Tag number `4` - pub const N4: Self = Self(4); - - /// Tag number `5` - pub const N5: Self = Self(5); - - /// Tag number `6` - pub const N6: Self = Self(6); - - /// Tag number `7` - pub const N7: Self = Self(7); - - /// Tag number `8` - pub const N8: Self = Self(8); - - /// Tag number `9` - pub const N9: Self = Self(9); - - /// Tag number `10` - pub const N10: Self = Self(10); - - /// Tag number `11` - pub const N11: Self = Self(11); - - /// Tag number `12` - pub const N12: Self = Self(12); - - /// Tag number `13` - pub const N13: Self = Self(13); - - /// Tag number `14` - pub const N14: Self = Self(14); - - /// Tag number `15` - pub const N15: Self = Self(15); - - /// Tag number `16` - pub const N16: Self = Self(16); - - /// Tag number `17` - pub const N17: Self = Self(17); - - /// Tag number `18` - pub const N18: Self = Self(18); - - /// Tag number `19` - pub const N19: Self = Self(19); - - /// Tag number `20` - pub const N20: Self = Self(20); - - /// Tag number `21` - pub const N21: Self = Self(21); - - /// Tag number `22` - pub const N22: Self = Self(22); - - /// Tag number `23` - pub const N23: Self = Self(23); - - /// Tag number `24` - pub const N24: Self = Self(24); - - /// Tag number `25` - pub const N25: Self = Self(25); - - /// Tag number `26` - pub const N26: Self = Self(26); - - /// Tag number `27` - pub const N27: Self = Self(27); - - /// Tag number `28` - pub const N28: Self = Self(28); - - /// Tag number `29` - pub const N29: Self = Self(29); - - /// Tag number `30` - pub const N30: Self = Self(30); - /// Mask value used to obtain the tag number from a tag octet. pub(super) const MASK: u8 = 0b11111; diff --git a/der_derive/src/sequence/field.rs b/der_derive/src/sequence/field.rs index 1b2923ba8..6d3928660 100644 --- a/der_derive/src/sequence/field.rs +++ b/der_derive/src/sequence/field.rs @@ -348,11 +348,11 @@ mod tests { quote! { let implicit_field = ::der::asn1::ContextSpecific::<>::decode_implicit( reader, - ::der::TagNumber::N0 + ::der::TagNumber(0u32) )? .ok_or_else(|| { der::Tag::ContextSpecific { - number: ::der::TagNumber::N0, + number: ::der::TagNumber(0u32), constructed: false } .value_error() @@ -366,7 +366,7 @@ mod tests { field.to_encode_tokens().to_string(), quote! { ::der::asn1::ContextSpecificRef { - tag_number: ::der::TagNumber::N0, + tag_number: ::der::TagNumber(0u32), tag_mode: ::der::TagMode::Implicit, value: &self.implicit_field, } diff --git a/der_derive/src/tag.rs b/der_derive/src/tag.rs index 9889ce4ee..17b1bd66a 100644 --- a/der_derive/src/tag.rs +++ b/der_derive/src/tag.rs @@ -117,48 +117,13 @@ impl Display for TagMode { /// ASN.1 tag numbers (i.e. lower 5 bits of a [`Tag`]). #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] -pub(crate) struct TagNumber(pub u8); +pub(crate) struct TagNumber(pub u32); impl TagNumber { - /// Maximum tag number supported (inclusive). - pub const MAX: u8 = 30; - /// Get tokens describing this tag. pub fn to_tokens(self) -> TokenStream { - match self.0 { - 0 => quote!(::der::TagNumber::N0), - 1 => quote!(::der::TagNumber::N1), - 2 => quote!(::der::TagNumber::N2), - 3 => quote!(::der::TagNumber::N3), - 4 => quote!(::der::TagNumber::N4), - 5 => quote!(::der::TagNumber::N5), - 6 => quote!(::der::TagNumber::N6), - 7 => quote!(::der::TagNumber::N7), - 8 => quote!(::der::TagNumber::N8), - 9 => quote!(::der::TagNumber::N9), - 10 => quote!(::der::TagNumber::N10), - 11 => quote!(::der::TagNumber::N11), - 12 => quote!(::der::TagNumber::N12), - 13 => quote!(::der::TagNumber::N13), - 14 => quote!(::der::TagNumber::N14), - 15 => quote!(::der::TagNumber::N15), - 16 => quote!(::der::TagNumber::N16), - 17 => quote!(::der::TagNumber::N17), - 18 => quote!(::der::TagNumber::N18), - 19 => quote!(::der::TagNumber::N19), - 20 => quote!(::der::TagNumber::N20), - 21 => quote!(::der::TagNumber::N21), - 22 => quote!(::der::TagNumber::N22), - 23 => quote!(::der::TagNumber::N23), - 24 => quote!(::der::TagNumber::N24), - 25 => quote!(::der::TagNumber::N25), - 26 => quote!(::der::TagNumber::N26), - 27 => quote!(::der::TagNumber::N27), - 28 => quote!(::der::TagNumber::N28), - 29 => quote!(::der::TagNumber::N29), - 30 => quote!(::der::TagNumber::N30), - _ => unreachable!("tag number out of range: {}", self), - } + let num = self.0; + quote!(::der::TagNumber(#num)) } } @@ -166,13 +131,7 @@ impl FromStr for TagNumber { type Err = ParseError; fn from_str(s: &str) -> Result { - let n = s.parse::().map_err(|_| ParseError)?; - - if n <= Self::MAX { - Ok(Self(n)) - } else { - Err(ParseError) - } + s.parse::().map(Self).map_err(|_| ParseError) } } diff --git a/gss-api/src/lib.rs b/gss-api/src/lib.rs index af20163f0..82c46c1ec 100644 --- a/gss-api/src/lib.rs +++ b/gss-api/src/lib.rs @@ -140,7 +140,7 @@ mod tests { AnyRef::new( Tag::ContextSpecific { constructed: true, - number: TagNumber::N0 + number: TagNumber::new(0) }, &inner_bytes ) @@ -153,7 +153,7 @@ mod tests { inner_context_token: AnyRef::new( Tag::ContextSpecific { constructed: true, - number: TagNumber::N0, + number: TagNumber::new(0), }, &inner_bytes, ) diff --git a/pkcs1/src/params.rs b/pkcs1/src/params.rs index 53ceff974..d23a3bbe4 100644 --- a/pkcs1/src/params.rs +++ b/pkcs1/src/params.rs @@ -122,7 +122,7 @@ impl<'a> RsaPssParams<'a> { None } else { Some(ContextSpecificRef { - tag_number: TagNumber::N0, + tag_number: TagNumber::new(0), tag_mode: TagMode::Explicit, value: &self.hash, }) @@ -136,7 +136,7 @@ impl<'a> RsaPssParams<'a> { None } else { Some(ContextSpecificRef { - tag_number: TagNumber::N1, + tag_number: TagNumber::new(1), tag_mode: TagMode::Explicit, value: &self.mask_gen, }) @@ -148,7 +148,7 @@ impl<'a> RsaPssParams<'a> { None } else { Some(ContextSpecificRef { - tag_number: TagNumber::N2, + tag_number: TagNumber::new(2), tag_mode: TagMode::Explicit, value: &self.salt_len, }) @@ -160,7 +160,7 @@ impl<'a> RsaPssParams<'a> { None } else { Some(ContextSpecificRef { - tag_number: TagNumber::N3, + tag_number: TagNumber::new(3), tag_mode: TagMode::Explicit, value: &self.trailer_field, }) @@ -186,16 +186,16 @@ impl<'a> DecodeValue<'a> for RsaPssParams<'a> { reader.read_nested(header.length, |reader| { Ok(Self { hash: reader - .context_specific(TagNumber::N0, TagMode::Explicit)? + .context_specific(TagNumber::new(0), TagMode::Explicit)? .unwrap_or(SHA_1_AI), mask_gen: reader - .context_specific(TagNumber::N1, TagMode::Explicit)? + .context_specific(TagNumber::new(1), TagMode::Explicit)? .unwrap_or_else(default_mgf1_sha1), salt_len: reader - .context_specific(TagNumber::N2, TagMode::Explicit)? + .context_specific(TagNumber::new(2), TagMode::Explicit)? .unwrap_or(RsaPssParams::SALT_LEN_DEFAULT), trailer_field: reader - .context_specific(TagNumber::N3, TagMode::Explicit)? + .context_specific(TagNumber::new(3), TagMode::Explicit)? .unwrap_or_default(), }) }) @@ -299,7 +299,7 @@ impl<'a> RsaOaepParams<'a> { None } else { Some(ContextSpecificRef { - tag_number: TagNumber::N0, + tag_number: TagNumber::new(0), tag_mode: TagMode::Explicit, value: &self.hash, }) @@ -313,7 +313,7 @@ impl<'a> RsaOaepParams<'a> { None } else { Some(ContextSpecificRef { - tag_number: TagNumber::N1, + tag_number: TagNumber::new(1), tag_mode: TagMode::Explicit, value: &self.mask_gen, }) @@ -327,7 +327,7 @@ impl<'a> RsaOaepParams<'a> { None } else { Some(ContextSpecificRef { - tag_number: TagNumber::N2, + tag_number: TagNumber::new(2), tag_mode: TagMode::Explicit, value: &self.p_source, }) @@ -351,13 +351,13 @@ impl<'a> DecodeValue<'a> for RsaOaepParams<'a> { reader.read_nested(header.length, |reader| { Ok(Self { hash: reader - .context_specific(TagNumber::N0, TagMode::Explicit)? + .context_specific(TagNumber::new(0), TagMode::Explicit)? .unwrap_or(SHA_1_AI), mask_gen: reader - .context_specific(TagNumber::N1, TagMode::Explicit)? + .context_specific(TagNumber::new(1), TagMode::Explicit)? .unwrap_or_else(default_mgf1_sha1), p_source: reader - .context_specific(TagNumber::N2, TagMode::Explicit)? + .context_specific(TagNumber::new(2), TagMode::Explicit)? .unwrap_or_else(default_pempty_string), }) }) diff --git a/pkcs12/src/safe_bag.rs b/pkcs12/src/safe_bag.rs index 86cfffe62..91ca4f238 100644 --- a/pkcs12/src/safe_bag.rs +++ b/pkcs12/src/safe_bag.rs @@ -65,7 +65,7 @@ impl ::der::EncodeValue for SafeBag { [ self.bag_id.encoded_len()?, ::der::asn1::ContextSpecificRef { - tag_number: ::der::TagNumber::N0, + tag_number: ::der::TagNumber::new(0), tag_mode: ::der::TagMode::Explicit, value: &content, } @@ -80,7 +80,7 @@ impl ::der::EncodeValue for SafeBag { self.bag_id.encode(writer)?; let content = AnyRef::from_der(&self.bag_value)?; ::der::asn1::ContextSpecificRef { - tag_number: ::der::TagNumber::N0, + tag_number: ::der::TagNumber::new(0), tag_mode: ::der::TagMode::Explicit, value: &content, } diff --git a/pkcs8/src/private_key_info.rs b/pkcs8/src/private_key_info.rs index 343ce25c2..a9681c3a5 100644 --- a/pkcs8/src/private_key_info.rs +++ b/pkcs8/src/private_key_info.rs @@ -27,7 +27,7 @@ use der::pem::PemLabel; use subtle::{Choice, ConstantTimeEq}; /// Context-specific tag number for the public key. -const PUBLIC_KEY_TAG: TagNumber = TagNumber::N1; +const PUBLIC_KEY_TAG: TagNumber = TagNumber::new(1); /// PKCS#8 `PrivateKeyInfo`. /// diff --git a/x509-cert/tests/certificate.rs b/x509-cert/tests/certificate.rs index 87b001a36..18870e9bf 100644 --- a/x509-cert/tests/certificate.rs +++ b/x509-cert/tests/certificate.rs @@ -90,7 +90,7 @@ impl<'a> DecodeValue<'a> for DeferDecodeTbsCertificate<'a> { header: Header, ) -> der::Result> { reader.read_nested(header.length, |reader| { - let version = ContextSpecific::decode_explicit(reader, ::der::TagNumber::N0)? + let version = ContextSpecific::decode_explicit(reader, ::der::TagNumber::new(0))? .map(|cs| cs.value) .unwrap_or_else(Default::default);