1#[cfg(feature = "alloc")]
16use alloc::vec::Vec;
17use core::marker::PhantomData;
18
19use crate::{error::DerTypeId, Error};
20
21#[derive(Debug)]
22pub struct DerIterator<'a, T> {
23 reader: untrusted::Reader<'a>,
24 marker: PhantomData<T>,
25}
26
27impl<'a, T> DerIterator<'a, T> {
28 pub(crate) fn new(input: untrusted::Input<'a>) -> Self {
30 Self {
31 reader: untrusted::Reader::new(input),
32 marker: PhantomData,
33 }
34 }
35}
36
37impl<'a, T: FromDer<'a>> Iterator for DerIterator<'a, T> {
38 type Item = Result<T, Error>;
39
40 fn next(&mut self) -> Option<Self::Item> {
41 (!self.reader.at_end()).then(|| T::from_der(&mut self.reader))
42 }
43}
44
45pub(crate) trait FromDer<'a>: Sized + 'a {
46 fn from_der(reader: &mut untrusted::Reader<'a>) -> Result<Self, Error>;
48
49 const TYPE_ID: DerTypeId;
50}
51
52pub(crate) fn read_all<'a, T: FromDer<'a>>(input: untrusted::Input<'a>) -> Result<T, Error> {
53 input.read_all(Error::TrailingData(T::TYPE_ID), T::from_der)
54}
55
56#[allow(clippy::upper_case_acronyms)]
58#[derive(Clone, Copy, Eq, PartialEq)]
59#[repr(u8)]
60pub(crate) enum Tag {
61 Boolean = 0x01,
62 Integer = 0x02,
63 BitString = 0x03,
64 OctetString = 0x04,
65 OID = 0x06,
66 Enum = 0x0A,
67 Sequence = CONSTRUCTED | 0x10, UTCTime = 0x17,
69 GeneralizedTime = 0x18,
70
71 #[allow(clippy::identity_op)]
72 ContextSpecificConstructed0 = CONTEXT_SPECIFIC | CONSTRUCTED | 0,
73 ContextSpecificConstructed1 = CONTEXT_SPECIFIC | CONSTRUCTED | 1,
74 ContextSpecificConstructed3 = CONTEXT_SPECIFIC | CONSTRUCTED | 3,
75}
76
77pub(crate) const CONSTRUCTED: u8 = 0x20;
78pub(crate) const CONTEXT_SPECIFIC: u8 = 0x80;
79
80impl From<Tag> for usize {
81 #[allow(clippy::as_conversions)]
82 fn from(tag: Tag) -> Self {
83 tag as Self
84 }
85}
86
87impl From<Tag> for u8 {
88 #[allow(clippy::as_conversions)]
89 fn from(tag: Tag) -> Self {
90 tag as Self
91 } }
93
94#[inline(always)]
95pub(crate) fn expect_tag_and_get_value_limited<'a>(
96 input: &mut untrusted::Reader<'a>,
97 tag: Tag,
98 size_limit: usize,
99) -> Result<untrusted::Input<'a>, Error> {
100 let (actual_tag, inner) = read_tag_and_get_value_limited(input, size_limit)?;
101 if usize::from(tag) != usize::from(actual_tag) {
102 return Err(Error::BadDer);
103 }
104 Ok(inner)
105}
106
107pub(crate) fn nested_limited<'a, R>(
108 input: &mut untrusted::Reader<'a>,
109 tag: Tag,
110 error: Error,
111 decoder: impl FnOnce(&mut untrusted::Reader<'a>) -> Result<R, Error>,
112 size_limit: usize,
113) -> Result<R, Error> {
114 expect_tag_and_get_value_limited(input, tag, size_limit)
115 .map_err(|_| error)?
116 .read_all(error, decoder)
117}
118
119pub(crate) fn nested<'a, R>(
122 input: &mut untrusted::Reader<'a>,
123 tag: Tag,
124 error: Error,
125 decoder: impl FnOnce(&mut untrusted::Reader<'a>) -> Result<R, Error>,
126) -> Result<R, Error> {
127 nested_limited(input, tag, error, decoder, TWO_BYTE_DER_SIZE)
128}
129
130pub(crate) fn expect_tag<'a>(
131 input: &mut untrusted::Reader<'a>,
132 tag: Tag,
133) -> Result<untrusted::Input<'a>, Error> {
134 let (actual_tag, value) = read_tag_and_get_value_limited(input, TWO_BYTE_DER_SIZE)?;
135 if usize::from(tag) != usize::from(actual_tag) {
136 return Err(Error::BadDer);
137 }
138
139 Ok(value)
140}
141
142#[inline(always)]
143pub(crate) fn read_tag_and_get_value<'a>(
144 input: &mut untrusted::Reader<'a>,
145) -> Result<(u8, untrusted::Input<'a>), Error> {
146 read_tag_and_get_value_limited(input, TWO_BYTE_DER_SIZE)
147}
148
149#[inline(always)]
150pub(crate) fn read_tag_and_get_value_limited<'a>(
151 input: &mut untrusted::Reader<'a>,
152 size_limit: usize,
153) -> Result<(u8, untrusted::Input<'a>), Error> {
154 let tag = input.read_byte().map_err(end_of_input_err)?;
155 if (tag & HIGH_TAG_RANGE_START) == HIGH_TAG_RANGE_START {
156 return Err(Error::BadDer); }
158
159 let length = match input.read_byte().map_err(end_of_input_err)? {
163 n if (n & SHORT_FORM_LEN_MAX) == 0 => usize::from(n),
164 LONG_FORM_LEN_ONE_BYTE => {
165 let length_byte = input.read_byte().map_err(end_of_input_err)?;
166 if length_byte < SHORT_FORM_LEN_MAX {
167 return Err(Error::BadDer); }
169 usize::from(length_byte)
170 }
171 LONG_FORM_LEN_TWO_BYTES => {
172 let length_byte_one = usize::from(input.read_byte().map_err(end_of_input_err)?);
173 let length_byte_two = usize::from(input.read_byte().map_err(end_of_input_err)?);
174 let combined = (length_byte_one << 8) | length_byte_two;
175 if combined <= LONG_FORM_LEN_ONE_BYTE_MAX {
176 return Err(Error::BadDer); }
178 combined
179 }
180 LONG_FORM_LEN_THREE_BYTES => {
181 let length_byte_one = usize::from(input.read_byte().map_err(end_of_input_err)?);
182 let length_byte_two = usize::from(input.read_byte().map_err(end_of_input_err)?);
183 let length_byte_three = usize::from(input.read_byte().map_err(end_of_input_err)?);
184 let combined = (length_byte_one << 16) | (length_byte_two << 8) | length_byte_three;
185 if combined <= LONG_FORM_LEN_TWO_BYTES_MAX {
186 return Err(Error::BadDer); }
188 combined
189 }
190 LONG_FORM_LEN_FOUR_BYTES => {
191 let length_byte_one = usize::from(input.read_byte().map_err(end_of_input_err)?);
192 let length_byte_two = usize::from(input.read_byte().map_err(end_of_input_err)?);
193 let length_byte_three = usize::from(input.read_byte().map_err(end_of_input_err)?);
194 let length_byte_four = usize::from(input.read_byte().map_err(end_of_input_err)?);
195 let combined = (length_byte_one << 24)
196 | (length_byte_two << 16)
197 | (length_byte_three << 8)
198 | length_byte_four;
199 if combined <= LONG_FORM_LEN_THREE_BYTES_MAX {
200 return Err(Error::BadDer); }
202 combined
203 }
204 _ => {
205 return Err(Error::BadDer); }
207 };
208
209 if length >= size_limit {
210 return Err(Error::BadDer); }
212
213 let inner = input.read_bytes(length).map_err(end_of_input_err)?;
214 Ok((tag, inner))
215}
216
217#[cfg(feature = "alloc")]
220#[allow(clippy::as_conversions)]
221pub(crate) fn asn1_wrap(tag: Tag, bytes: &[u8]) -> Vec<u8> {
222 let len = bytes.len();
223 if len < SHORT_FORM_LEN_MAX.into() {
225 let mut ret = Vec::with_capacity(2 + len);
228 ret.push(tag.into()); ret.push(len as u8); ret.extend_from_slice(bytes); ret
232 } else {
233 let size = len.to_be_bytes();
238 let leading_zero_bytes = size
241 .iter()
242 .position(|&byte| byte != 0)
243 .unwrap_or(size.len());
244 assert!(leading_zero_bytes < size.len());
245 let encoded_bytes = size.len() - leading_zero_bytes;
247 let mut ret = Vec::with_capacity(2 + encoded_bytes + len);
248 let number_of_length_bytes_byte = SHORT_FORM_LEN_MAX + encoded_bytes as u8;
250 ret.push(tag.into()); ret.push(number_of_length_bytes_byte); ret.extend_from_slice(&size[leading_zero_bytes..]); ret.extend_from_slice(bytes); ret
255 }
256}
257
258pub(crate) const TWO_BYTE_DER_SIZE: usize = LONG_FORM_LEN_TWO_BYTES_MAX;
264
265pub(crate) const MAX_DER_SIZE: usize = LONG_FORM_LEN_FOUR_BYTES_MAX;
270
271const HIGH_TAG_RANGE_START: u8 = 31;
276
277const SHORT_FORM_LEN_MAX: u8 = 128;
281
282const LONG_FORM_LEN_ONE_BYTE: u8 = 0x81;
284
285const LONG_FORM_LEN_ONE_BYTE_MAX: usize = 0xff;
287
288const LONG_FORM_LEN_TWO_BYTES: u8 = 0x82;
290
291const LONG_FORM_LEN_TWO_BYTES_MAX: usize = 0xff_ff;
293
294const LONG_FORM_LEN_THREE_BYTES: u8 = 0x83;
296
297const LONG_FORM_LEN_THREE_BYTES_MAX: usize = 0xff_ff_ff;
299
300const LONG_FORM_LEN_FOUR_BYTES: u8 = 0x84;
302
303const LONG_FORM_LEN_FOUR_BYTES_MAX: usize = 0xff_ff_ff_ff;
305
306pub(crate) fn nested_of_mut<'a>(
309 input: &mut untrusted::Reader<'a>,
310 outer_tag: Tag,
311 inner_tag: Tag,
312 error: Error,
313 mut decoder: impl FnMut(&mut untrusted::Reader<'a>) -> Result<(), Error>,
314) -> Result<(), Error> {
315 nested(input, outer_tag, error, |outer| {
316 loop {
317 nested(outer, inner_tag, error, |inner| decoder(inner))?;
318 if outer.at_end() {
319 break;
320 }
321 }
322 Ok(())
323 })
324}
325
326pub(crate) fn bit_string_with_no_unused_bits<'a>(
327 input: &mut untrusted::Reader<'a>,
328) -> Result<untrusted::Input<'a>, Error> {
329 nested(
330 input,
331 Tag::BitString,
332 Error::TrailingData(DerTypeId::BitString),
333 |value| {
334 let unused_bits_at_end = value.read_byte().map_err(|_| Error::BadDer)?;
335 if unused_bits_at_end != 0 {
336 return Err(Error::BadDer);
337 }
338 Ok(value.read_bytes_to_end())
339 },
340 )
341}
342
343pub(crate) struct BitStringFlags<'a> {
344 raw_bits: &'a [u8],
345}
346
347impl<'a> BitStringFlags<'a> {
348 pub(crate) fn bit_set(&self, bit: usize) -> bool {
349 let byte_index = bit / 8;
350 let bit_shift = 7 - (bit % 8);
351
352 if self.raw_bits.len() < (byte_index + 1) {
353 false
354 } else {
355 ((self.raw_bits[byte_index] >> bit_shift) & 1) != 0
356 }
357 }
358}
359
360pub(crate) fn bit_string_flags(input: untrusted::Input<'_>) -> Result<BitStringFlags<'_>, Error> {
368 input.read_all(Error::BadDer, |bit_string| {
369 let padding_bits = bit_string.read_byte().map_err(|_| Error::BadDer)?;
374 let raw_bits = bit_string.read_bytes_to_end().as_slice_less_safe();
375
376 if padding_bits > 7 || (raw_bits.is_empty() && padding_bits != 0) {
379 return Err(Error::BadDer);
380 }
381
382 let last_byte = raw_bits[raw_bits.len() - 1];
385 let padding_mask = (1 << padding_bits) - 1;
386
387 match padding_bits > 0 && (last_byte & padding_mask) != 0 {
388 true => Err(Error::BadDer),
389 false => Ok(BitStringFlags { raw_bits }),
390 }
391 })
392}
393
394impl<'a> FromDer<'a> for u8 {
395 fn from_der(reader: &mut untrusted::Reader<'a>) -> Result<Self, Error> {
396 match *nonnegative_integer(reader)?.as_slice_less_safe() {
397 [b] => Ok(b),
398 _ => Err(Error::BadDer),
399 }
400 }
401
402 const TYPE_ID: DerTypeId = DerTypeId::U8;
403}
404
405pub(crate) fn nonnegative_integer<'a>(
406 input: &mut untrusted::Reader<'a>,
407) -> Result<untrusted::Input<'a>, Error> {
408 let value = expect_tag(input, Tag::Integer)?;
409 match value
410 .as_slice_less_safe()
411 .split_first()
412 .ok_or(Error::BadDer)?
413 {
414 (0, rest) => {
416 match rest.first() {
417 None => Ok(value),
419 Some(&second) if second & 0x80 == 0x80 => Ok(untrusted::Input::from(rest)),
421 _ => Err(Error::BadDer),
423 }
424 }
425 (first, _) if first & 0x80 == 0x00 => Ok(value),
427 (_, _) => Err(Error::BadDer),
429 }
430}
431
432pub(crate) fn end_of_input_err(_: untrusted::EndOfInput) -> Error {
433 Error::BadDer
434}
435
436impl<'a> FromDer<'a> for bool {
439 fn from_der(reader: &mut untrusted::Reader<'a>) -> Result<Self, Error> {
440 if !reader.peek(Tag::Boolean.into()) {
441 return Ok(false);
442 }
443
444 nested(
445 reader,
446 Tag::Boolean,
447 Error::TrailingData(Self::TYPE_ID),
448 |input| match input.read_byte() {
449 Ok(0xff) => Ok(true),
450 Ok(0x00) => Ok(false),
451 _ => Err(Error::BadDer),
452 },
453 )
454 }
455
456 const TYPE_ID: DerTypeId = DerTypeId::Bool;
457}
458
459macro_rules! oid {
460 ( $first:expr, $second:expr, $( $tail:expr ),* ) =>
461 (
462 [(40 * $first) + $second, $( $tail ),*]
463 )
464}
465
466#[cfg(test)]
467mod tests {
468 use super::DerTypeId;
469 use std::prelude::v1::*;
470
471 #[cfg(feature = "alloc")]
472 #[test]
473 fn test_asn1_wrap() {
474 let wrap_in_sequence = |bytes: &[u8]| super::asn1_wrap(super::Tag::Sequence, bytes);
476
477 assert_eq!(vec![0x30, 0x00], wrap_in_sequence(&[]));
479
480 assert_eq!(
482 vec![0x30, 0x04, 0x00, 0x11, 0x22, 0x33],
483 wrap_in_sequence(&[0x00, 0x11, 0x22, 0x33])
484 );
485
486 let mut val = Vec::new();
488 val.resize(255, 0x12);
489 assert_eq!(
490 vec![0x30, 0x81, 0xff, 0x12, 0x12, 0x12],
491 wrap_in_sequence(&val)[..6]
492 );
493
494 let mut val = Vec::new();
496 val.resize(4660, 0x12);
497 wrap_in_sequence(&val);
498 assert_eq!(
499 vec![0x30, 0x82, 0x12, 0x34, 0x12, 0x12],
500 wrap_in_sequence(&val)[..6]
501 );
502
503 let mut val = Vec::new();
505 val.resize(0xffff, 0x12);
506 let result = wrap_in_sequence(&val);
507 assert_eq!(vec![0x30, 0x82, 0xff, 0xff, 0x12, 0x12], result[..6]);
508 assert_eq!(result.len(), 0xffff + 4);
509
510 let mut val = Vec::new();
512 val.resize(0x100000, 0x12);
513 let result = wrap_in_sequence(&val);
514 assert_eq!(vec![0x30, 0x83, 0x10, 0x00, 0x00, 0x12, 0x12], result[..7]);
515 assert_eq!(result.len(), 0x100000 + 5);
516
517 let mut val = Vec::new();
519 val.resize(0x1000000, 0x12);
520 let result = wrap_in_sequence(&val);
521 assert_eq!(
522 vec![0x30, 0x84, 0x01, 0x00, 0x00, 0x00, 0x12, 0x12],
523 result[..8]
524 );
525 assert_eq!(result.len(), 0x1000000 + 6);
526 }
527
528 #[test]
529 fn test_optional_boolean() {
530 use super::{Error, FromDer};
531
532 assert!(!bool::from_der(&mut bytes_reader(&[])).unwrap());
534
535 assert!(!bool::from_der(&mut bytes_reader(&[0x05, 0x00])).unwrap());
537
538 assert_eq!(
540 Err(Error::BadDer),
541 bool::from_der(&mut bytes_reader(&[0x01, 0x01, 0x42]))
542 );
543
544 assert!(bool::from_der(&mut bytes_reader(&[0x01, 0x01, 0xff])).unwrap());
546
547 assert!(!bool::from_der(&mut bytes_reader(&[0x01, 0x01, 0x00])).unwrap());
549 }
550
551 #[test]
552 fn test_bit_string_with_no_unused_bits() {
553 use super::{bit_string_with_no_unused_bits, Error};
554
555 assert_eq!(
557 bit_string_with_no_unused_bits(&mut bytes_reader(&[0x01, 0x01, 0xff])).unwrap_err(),
558 Error::TrailingData(DerTypeId::BitString),
559 );
560
561 assert_eq!(
563 bit_string_with_no_unused_bits(&mut bytes_reader(&[0x42, 0xff, 0xff])).unwrap_err(),
564 Error::TrailingData(DerTypeId::BitString),
565 );
566
567 assert_eq!(
569 bit_string_with_no_unused_bits(&mut bytes_reader(&[])).unwrap_err(),
570 Error::TrailingData(DerTypeId::BitString),
571 );
572
573 assert_eq!(
575 bit_string_with_no_unused_bits(&mut bytes_reader(&[0x03, 0x03, 0x04, 0x12, 0x34]))
576 .unwrap_err(),
577 Error::BadDer,
578 );
579
580 assert_eq!(
582 bit_string_with_no_unused_bits(&mut bytes_reader(&[0x03, 0x03, 0x00, 0x12, 0x34]))
583 .unwrap()
584 .as_slice_less_safe(),
585 &[0x12, 0x34],
586 );
587 }
588
589 fn bytes_reader(bytes: &[u8]) -> untrusted::Reader<'_> {
590 return untrusted::Reader::new(untrusted::Input::from(bytes));
591 }
592
593 #[test]
594 fn read_tag_and_get_value_default_limit() {
595 use super::{read_tag_and_get_value, Error};
596
597 let inputs = &[
598 &[EXAMPLE_TAG, 0x83, 0xFF, 0xFF, 0xFF].as_slice(),
600 &[EXAMPLE_TAG, 0x84, 0xFF, 0xFF, 0xFF, 0xFF].as_slice(),
602 ];
603
604 for input in inputs {
605 let mut bytes = untrusted::Reader::new(untrusted::Input::from(input));
606 assert!(matches!(
609 read_tag_and_get_value(&mut bytes),
610 Err(Error::BadDer)
611 ));
612 }
613 }
614
615 #[test]
616 fn read_tag_and_get_value_limited_high_form() {
617 use super::{read_tag_and_get_value_limited, Error, LONG_FORM_LEN_TWO_BYTES_MAX};
618
619 let mut bytes = untrusted::Reader::new(untrusted::Input::from(&[0xFF]));
620 assert!(matches!(
622 read_tag_and_get_value_limited(&mut bytes, LONG_FORM_LEN_TWO_BYTES_MAX),
623 Err(Error::BadDer)
624 ));
625 }
626
627 #[test]
628 fn read_tag_and_get_value_limited_non_canonical() {
629 use super::{read_tag_and_get_value_limited, Error, LONG_FORM_LEN_TWO_BYTES_MAX};
630
631 let inputs = &[
632 &[EXAMPLE_TAG, 0x81, 0x01].as_slice(),
634 &[EXAMPLE_TAG, 0x82, 0x00, 0x01].as_slice(),
636 &[EXAMPLE_TAG, 0x83, 0x00, 0x00, 0x01].as_slice(),
638 &[EXAMPLE_TAG, 0x84, 0x00, 0x00, 0x00, 0x01].as_slice(),
640 ];
641
642 for input in inputs {
643 let mut bytes = untrusted::Reader::new(untrusted::Input::from(input));
644 assert!(matches!(
646 read_tag_and_get_value_limited(&mut bytes, LONG_FORM_LEN_TWO_BYTES_MAX),
647 Err(Error::BadDer)
648 ));
649 }
650 }
651
652 #[test]
653 #[cfg(feature = "alloc")]
654 fn read_tag_and_get_value_limited_limits() {
655 use super::{read_tag_and_get_value_limited, Error};
656
657 let short_input = &[0xFF];
658 let short_input_encoded = &[
659 &[EXAMPLE_TAG],
660 der_encode_length(short_input.len()).as_slice(),
661 short_input,
662 ]
663 .concat();
664
665 let long_input = &[1_u8; 65537];
666 let long_input_encoded = &[
667 &[EXAMPLE_TAG],
668 der_encode_length(long_input.len()).as_slice(),
669 long_input,
670 ]
671 .concat();
672
673 struct Testcase<'a> {
674 input: &'a [u8],
675 limit: usize,
676 err: Option<Error>,
677 }
678
679 let testcases = &[
680 Testcase {
681 input: short_input_encoded,
682 limit: 1,
683 err: Some(Error::BadDer),
684 },
685 Testcase {
686 input: short_input_encoded,
687 limit: short_input_encoded.len() + 1,
688 err: None,
689 },
690 Testcase {
691 input: long_input_encoded,
692 limit: long_input.len(),
693 err: Some(Error::BadDer),
694 },
695 Testcase {
696 input: long_input_encoded,
697 limit: long_input.len() + 1,
698 err: None,
699 },
700 ];
701
702 for tc in testcases {
703 let mut bytes = untrusted::Reader::new(untrusted::Input::from(tc.input));
704
705 let res = read_tag_and_get_value_limited(&mut bytes, tc.limit);
706 match tc.err {
707 None => assert!(res.is_ok()),
708 Some(e) => {
709 let actual = res.unwrap_err();
710 assert_eq!(actual, e)
711 }
712 }
713 }
714 }
715
716 #[allow(clippy::as_conversions)] const EXAMPLE_TAG: u8 = super::Tag::Sequence as u8;
718
719 #[cfg(feature = "alloc")]
720 #[allow(clippy::as_conversions)] fn der_encode_length(length: usize) -> Vec<u8> {
722 if length < 128 {
723 vec![length as u8]
724 } else {
725 let mut encoded: Vec<u8> = Vec::new();
726 let mut remaining_length = length;
727
728 while remaining_length > 0 {
729 let byte = (remaining_length & 0xFF) as u8;
730 encoded.insert(0, byte);
731 remaining_length >>= 8;
732 }
733
734 let length_octet = encoded.len() as u8 | 0x80;
735 encoded.insert(0, length_octet);
736
737 encoded
738 }
739 }
740
741 #[test]
742 fn misencoded_bit_string_flags() {
743 use super::{bit_string_flags, Error};
744
745 let bad_padding_example = untrusted::Input::from(&[
746 0x08, 0x06, ]);
749 assert!(matches!(
750 bit_string_flags(bad_padding_example),
751 Err(Error::BadDer)
752 ));
753
754 let bad_padding_example = untrusted::Input::from(&[
755 0x01, ]);
758 assert!(matches!(
759 bit_string_flags(bad_padding_example),
760 Err(Error::BadDer)
761 ));
762 }
763
764 #[test]
765 fn valid_bit_string_flags() {
766 use super::bit_string_flags;
767
768 let example_key_usage = untrusted::Input::from(&[
769 0x01, 0x06, ]);
772 let res = bit_string_flags(example_key_usage).unwrap();
773
774 assert!(!res.bit_set(0));
775 assert!(!res.bit_set(1));
776 assert!(!res.bit_set(2));
777 assert!(!res.bit_set(3));
778 assert!(!res.bit_set(4));
779 assert!(res.bit_set(5));
781 assert!(res.bit_set(6));
782 assert!(!res.bit_set(7));
783 assert!(!res.bit_set(8));
784 assert!(!res.bit_set(256));
786 }
787
788 #[test]
789 fn test_small_nonnegative_integer() {
790 use super::{Error, FromDer, Tag};
791
792 for value in 0..=127 {
793 let data = [Tag::Integer.into(), 1, value];
794 let mut rd = untrusted::Reader::new(untrusted::Input::from(&data));
795 assert_eq!(u8::from_der(&mut rd), Ok(value),);
796 }
797
798 for value in 128..=255 {
799 let data = [Tag::Integer.into(), 2, 0x00, value];
800 let mut rd = untrusted::Reader::new(untrusted::Input::from(&data));
801 assert_eq!(u8::from_der(&mut rd), Ok(value),);
802 }
803
804 assert_eq!(
806 u8::from_der(&mut untrusted::Reader::new(untrusted::Input::from(&[
807 Tag::Sequence.into(),
808 1,
809 1
810 ]))),
811 Err(Error::BadDer)
812 );
813
814 assert_eq!(
816 u8::from_der(&mut untrusted::Reader::new(untrusted::Input::from(&[
817 Tag::Integer.into(),
818 1,
819 0xff
820 ]))),
821 Err(Error::BadDer)
822 );
823
824 assert_eq!(
826 u8::from_der(&mut untrusted::Reader::new(untrusted::Input::from(&[
827 Tag::Integer.into(),
828 2,
829 0x01,
830 0x00
831 ]))),
832 Err(Error::BadDer)
833 );
834
835 assert_eq!(
837 u8::from_der(&mut untrusted::Reader::new(untrusted::Input::from(&[
838 Tag::Integer.into(),
839 2,
840 0x00,
841 0x05
842 ]))),
843 Err(Error::BadDer)
844 );
845
846 assert_eq!(
848 u8::from_der(&mut untrusted::Reader::new(untrusted::Input::from(&[]))),
849 Err(Error::BadDer)
850 );
851
852 assert_eq!(
853 u8::from_der(&mut untrusted::Reader::new(untrusted::Input::from(&[
854 Tag::Integer.into(),
855 ]))),
856 Err(Error::BadDer)
857 );
858
859 assert_eq!(
860 u8::from_der(&mut untrusted::Reader::new(untrusted::Input::from(&[
861 Tag::Integer.into(),
862 1,
863 ]))),
864 Err(Error::BadDer)
865 );
866
867 assert_eq!(
868 u8::from_der(&mut untrusted::Reader::new(untrusted::Input::from(&[
869 Tag::Integer.into(),
870 2,
871 0
872 ]))),
873 Err(Error::BadDer)
874 );
875 }
876}