Skip to content

Commit 93c8be8

Browse files
authored
der: deprecate TagNumber::new (#1727)
After #1651 the inner `u32` of `TagNumber` is now `pub` and the `TagNumber::new` function no longer maintains an invariant (which it previously did by panicking when tag numbers are out-of-range). With the field now `pub` there is no longer a need to call a function to construct a `TagNumber`, instead it can be done directly.
1 parent 500cd65 commit 93c8be8

File tree

7 files changed

+57
-53
lines changed

7 files changed

+57
-53
lines changed

der/src/asn1/context_specific.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ mod tests {
281281

282282
#[test]
283283
fn context_specific_with_explicit_field() {
284-
let tag_number = TagNumber::new(0);
284+
let tag_number = TagNumber(0);
285285

286286
// Empty message
287287
let mut reader = SliceReader::new(&[]).unwrap();
@@ -319,7 +319,7 @@ mod tests {
319319
let context_specific_implicit_bytes =
320320
hex!("81210019BF44096984CDFE8541BAC167DC3B96C85086AA30B6B6CB0C5C38AD703166E1");
321321

322-
let tag_number = TagNumber::new(1);
322+
let tag_number = TagNumber(1);
323323

324324
let mut reader = SliceReader::new(&context_specific_implicit_bytes).unwrap();
325325
let field = ContextSpecific::<BitStringRef<'_>>::decode_implicit(&mut reader, tag_number)
@@ -336,7 +336,7 @@ mod tests {
336336

337337
#[test]
338338
fn context_specific_skipping_unknown_field() {
339-
let tag = TagNumber::new(1);
339+
let tag = TagNumber(1);
340340
let mut reader = SliceReader::new(&hex!("A003020100A103020101")).unwrap();
341341
let field = ContextSpecific::<u8>::decode_explicit(&mut reader, tag)
342342
.unwrap()
@@ -346,7 +346,7 @@ mod tests {
346346

347347
#[test]
348348
fn context_specific_returns_none_on_greater_tag_number() {
349-
let tag = TagNumber::new(0);
349+
let tag = TagNumber(0);
350350
let mut reader = SliceReader::new(&hex!("A103020101")).unwrap();
351351
assert_eq!(
352352
ContextSpecific::<u8>::decode_explicit(&mut reader, tag).unwrap(),

der/src/tag.rs

+27-27
Original file line numberDiff line numberDiff line change
@@ -201,27 +201,27 @@ impl Tag {
201201
/// Get the [`TagNumber`] for this tag.
202202
pub const fn number(self) -> TagNumber {
203203
match self {
204-
Tag::Boolean => TagNumber::new(1),
205-
Tag::Integer => TagNumber::new(2),
206-
Tag::BitString => TagNumber::new(3),
207-
Tag::OctetString => TagNumber::new(4),
208-
Tag::Null => TagNumber::new(5),
209-
Tag::ObjectIdentifier => TagNumber::new(6),
210-
Tag::Real => TagNumber::new(9),
211-
Tag::Enumerated => TagNumber::new(10),
212-
Tag::Utf8String => TagNumber::new(12),
213-
Tag::Sequence => TagNumber::new(16),
214-
Tag::Set => TagNumber::new(17),
215-
Tag::NumericString => TagNumber::new(18),
216-
Tag::PrintableString => TagNumber::new(19),
217-
Tag::TeletexString => TagNumber::new(20),
218-
Tag::VideotexString => TagNumber::new(21),
219-
Tag::Ia5String => TagNumber::new(22),
220-
Tag::UtcTime => TagNumber::new(23),
221-
Tag::GeneralizedTime => TagNumber::new(24),
222-
Tag::VisibleString => TagNumber::new(26),
223-
Tag::GeneralString => TagNumber::new(27),
224-
Tag::BmpString => TagNumber::new(30),
204+
Tag::Boolean => TagNumber(1),
205+
Tag::Integer => TagNumber(2),
206+
Tag::BitString => TagNumber(3),
207+
Tag::OctetString => TagNumber(4),
208+
Tag::Null => TagNumber(5),
209+
Tag::ObjectIdentifier => TagNumber(6),
210+
Tag::Real => TagNumber(9),
211+
Tag::Enumerated => TagNumber(10),
212+
Tag::Utf8String => TagNumber(12),
213+
Tag::Sequence => TagNumber(16),
214+
Tag::Set => TagNumber(17),
215+
Tag::NumericString => TagNumber(18),
216+
Tag::PrintableString => TagNumber(19),
217+
Tag::TeletexString => TagNumber(20),
218+
Tag::VideotexString => TagNumber(21),
219+
Tag::Ia5String => TagNumber(22),
220+
Tag::UtcTime => TagNumber(23),
221+
Tag::GeneralizedTime => TagNumber(24),
222+
Tag::VisibleString => TagNumber(26),
223+
Tag::GeneralString => TagNumber(27),
224+
Tag::BmpString => TagNumber(30),
225225
Tag::Application { number, .. } => number,
226226
Tag::ContextSpecific { number, .. } => number,
227227
Tag::Private { number, .. } => number,
@@ -353,7 +353,7 @@ fn parse_parts<'a, R: Reader<'a>>(first_byte: u8, reader: &mut R) -> Result<(boo
353353
let first_number_part = first_byte & TagNumber::MASK;
354354

355355
if first_number_part != TagNumber::MASK {
356-
return Ok((constructed, TagNumber::new(first_number_part.into())));
356+
return Ok((constructed, TagNumber(first_number_part.into())));
357357
}
358358

359359
let mut multi_byte_tag_number = 0;
@@ -367,7 +367,7 @@ fn parse_parts<'a, R: Reader<'a>>(first_byte: u8, reader: &mut R) -> Result<(boo
367367
return Err(ErrorKind::TagNumberInvalid.into());
368368
}
369369

370-
return Ok((constructed, TagNumber::new(multi_byte_tag_number)));
370+
return Ok((constructed, TagNumber(multi_byte_tag_number)));
371371
} else if i == 0 && multi_byte_tag_number == 0 {
372372
// 8.1.2.4.2c says "bits 7 to 1 of the first subsequent octet shall not all be zero"
373373
return Err(ErrorKind::TagNumberInvalid.into());
@@ -530,7 +530,7 @@ mod tests {
530530

531531
for num in 0..=30 {
532532
for &constructed in &[false, true] {
533-
let number = TagNumber::new(num);
533+
let number = TagNumber(num);
534534

535535
assert_eq!(
536536
Tag::Application {
@@ -567,21 +567,21 @@ mod tests {
567567
assert_eq!(
568568
Tag::Application {
569569
constructed: false,
570-
number: TagNumber::new(0x4001)
570+
number: TagNumber(0x4001)
571571
},
572572
Tag::from_der(&hex!("5F818001")).expect("bits 7 to 1 are zero")
573573
);
574574
assert_eq!(
575575
Tag::ContextSpecific {
576576
constructed: false,
577-
number: TagNumber::new(0x200001)
577+
number: TagNumber(0x200001)
578578
},
579579
Tag::from_der(&hex!("9F81808001")).expect("bits 7 to 1 are zero two times")
580580
);
581581
assert_eq!(
582582
Tag::Private {
583583
constructed: false,
584-
number: TagNumber::new(u32::MAX)
584+
number: TagNumber(u32::MAX)
585585
},
586586
Tag::from_der(&hex!("DF8FFFFFFF7F")).expect("private tag 2^32-1")
587587
);

der/src/tag/number.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ impl TagNumber {
2323
/// Mask value used to obtain the tag number from a tag octet.
2424
pub(super) const MASK: u8 = 0b11111;
2525

26-
/// Create a new tag number (const-friendly).
26+
/// Create a new tag number.
27+
#[deprecated(
28+
since = "0.8.0",
29+
note = "use TagNumber(value) directly as inner field is now pub"
30+
)]
2731
pub const fn new(value: u32) -> Self {
2832
Self(value)
2933
}
@@ -69,7 +73,7 @@ impl fmt::Display for TagNumber {
6973
#[cfg(feature = "arbitrary")]
7074
impl<'a> arbitrary::Arbitrary<'a> for TagNumber {
7175
fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
72-
Ok(Self::new(u.int_in_range(0..=30)?))
76+
Ok(Self(u.int_in_range(0..=30)?))
7377
}
7478

7579
fn size_hint(depth: usize) -> (usize, Option<usize>) {

pkcs1/src/params.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ impl<'a> RsaPssParams<'a> {
122122
None
123123
} else {
124124
Some(ContextSpecificRef {
125-
tag_number: TagNumber::new(0),
125+
tag_number: TagNumber(0),
126126
tag_mode: TagMode::Explicit,
127127
value: &self.hash,
128128
})
@@ -136,7 +136,7 @@ impl<'a> RsaPssParams<'a> {
136136
None
137137
} else {
138138
Some(ContextSpecificRef {
139-
tag_number: TagNumber::new(1),
139+
tag_number: TagNumber(1),
140140
tag_mode: TagMode::Explicit,
141141
value: &self.mask_gen,
142142
})
@@ -148,7 +148,7 @@ impl<'a> RsaPssParams<'a> {
148148
None
149149
} else {
150150
Some(ContextSpecificRef {
151-
tag_number: TagNumber::new(2),
151+
tag_number: TagNumber(2),
152152
tag_mode: TagMode::Explicit,
153153
value: &self.salt_len,
154154
})
@@ -160,7 +160,7 @@ impl<'a> RsaPssParams<'a> {
160160
None
161161
} else {
162162
Some(ContextSpecificRef {
163-
tag_number: TagNumber::new(3),
163+
tag_number: TagNumber(3),
164164
tag_mode: TagMode::Explicit,
165165
value: &self.trailer_field,
166166
})
@@ -186,16 +186,16 @@ impl<'a> DecodeValue<'a> for RsaPssParams<'a> {
186186
reader.read_nested(header.length, |reader| {
187187
Ok(Self {
188188
hash: reader
189-
.context_specific(TagNumber::new(0), TagMode::Explicit)?
189+
.context_specific(TagNumber(0), TagMode::Explicit)?
190190
.unwrap_or(SHA_1_AI),
191191
mask_gen: reader
192-
.context_specific(TagNumber::new(1), TagMode::Explicit)?
192+
.context_specific(TagNumber(1), TagMode::Explicit)?
193193
.unwrap_or_else(default_mgf1_sha1),
194194
salt_len: reader
195-
.context_specific(TagNumber::new(2), TagMode::Explicit)?
195+
.context_specific(TagNumber(2), TagMode::Explicit)?
196196
.unwrap_or(RsaPssParams::SALT_LEN_DEFAULT),
197197
trailer_field: reader
198-
.context_specific(TagNumber::new(3), TagMode::Explicit)?
198+
.context_specific(TagNumber(3), TagMode::Explicit)?
199199
.unwrap_or_default(),
200200
})
201201
})
@@ -299,7 +299,7 @@ impl<'a> RsaOaepParams<'a> {
299299
None
300300
} else {
301301
Some(ContextSpecificRef {
302-
tag_number: TagNumber::new(0),
302+
tag_number: TagNumber(0),
303303
tag_mode: TagMode::Explicit,
304304
value: &self.hash,
305305
})
@@ -313,7 +313,7 @@ impl<'a> RsaOaepParams<'a> {
313313
None
314314
} else {
315315
Some(ContextSpecificRef {
316-
tag_number: TagNumber::new(1),
316+
tag_number: TagNumber(1),
317317
tag_mode: TagMode::Explicit,
318318
value: &self.mask_gen,
319319
})
@@ -327,7 +327,7 @@ impl<'a> RsaOaepParams<'a> {
327327
None
328328
} else {
329329
Some(ContextSpecificRef {
330-
tag_number: TagNumber::new(2),
330+
tag_number: TagNumber(2),
331331
tag_mode: TagMode::Explicit,
332332
value: &self.p_source,
333333
})
@@ -351,13 +351,13 @@ impl<'a> DecodeValue<'a> for RsaOaepParams<'a> {
351351
reader.read_nested(header.length, |reader| {
352352
Ok(Self {
353353
hash: reader
354-
.context_specific(TagNumber::new(0), TagMode::Explicit)?
354+
.context_specific(TagNumber(0), TagMode::Explicit)?
355355
.unwrap_or(SHA_1_AI),
356356
mask_gen: reader
357-
.context_specific(TagNumber::new(1), TagMode::Explicit)?
357+
.context_specific(TagNumber(1), TagMode::Explicit)?
358358
.unwrap_or_else(default_mgf1_sha1),
359359
p_source: reader
360-
.context_specific(TagNumber::new(2), TagMode::Explicit)?
360+
.context_specific(TagNumber(2), TagMode::Explicit)?
361361
.unwrap_or_else(default_pempty_string),
362362
})
363363
})

pkcs12/Cargo.lock

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkcs8/src/private_key_info.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use der::pem::PemLabel;
2727
use subtle::{Choice, ConstantTimeEq};
2828

2929
/// Context-specific tag number for the public key.
30-
const PUBLIC_KEY_TAG: TagNumber = TagNumber::new(1);
30+
const PUBLIC_KEY_TAG: TagNumber = TagNumber(1);
3131

3232
/// PKCS#8 `PrivateKeyInfo`.
3333
///

sec1/src/private_key.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ use der::pem::PemLabel;
3131
const VERSION: u8 = 1;
3232

3333
/// Context-specific tag number for the elliptic curve parameters.
34-
const EC_PARAMETERS_TAG: TagNumber = TagNumber::new(0);
34+
const EC_PARAMETERS_TAG: TagNumber = TagNumber(0);
3535

3636
/// Context-specific tag number for the public key.
37-
const PUBLIC_KEY_TAG: TagNumber = TagNumber::new(1);
37+
const PUBLIC_KEY_TAG: TagNumber = TagNumber(1);
3838

3939
/// SEC1 elliptic curve private key.
4040
///

0 commit comments

Comments
 (0)