1 use {CborError, CborType};
2 use decoder::{decode, MAX_ARRAY_SIZE};
3 use std::collections::BTreeMap;
4
5 // First test all the basic types
test_decoder(bytes: Vec<u8>, expected: CborType)6 fn test_decoder(bytes: Vec<u8>, expected: CborType) {
7 let result = decode(&bytes);
8 assert!(result.is_ok());
9 assert_eq!(result.unwrap(), expected);
10 }
11
test_decoder_error(bytes: Vec<u8>, expected_error: CborError)12 fn test_decoder_error(bytes: Vec<u8>, expected_error: CborError) {
13 let result = decode(&bytes);
14 assert!(result.is_err());
15 assert_eq!(result.unwrap_err(), expected_error);
16 }
17
test_integer(bytes: Vec<u8>, expected: u64)18 fn test_integer(bytes: Vec<u8>, expected: u64) {
19 let decoded = decode(&bytes).unwrap();
20 match decoded {
21 CborType::Integer(val) => assert_eq!(val, expected),
22 _ => assert_eq!(1, 0),
23 }
24 }
25
test_integer_all(bytes: Vec<u8>, expected_value: u64)26 fn test_integer_all(bytes: Vec<u8>, expected_value: u64) {
27 let expected = CborType::Integer(expected_value);
28 test_decoder(bytes.clone(), expected);
29 test_integer(bytes, expected_value);
30 }
31
32 #[test]
test_integer_objects()33 fn test_integer_objects() {
34 let bytes: Vec<u8> = vec![0x00];
35 test_integer_all(bytes, 0);
36
37 let bytes = vec![0x01];
38 test_integer_all(bytes, 1);
39
40 let bytes = vec![0x0A];
41 test_integer_all(bytes, 10);
42
43 let bytes = vec![0x17];
44 test_integer_all(bytes, 23);
45
46 let bytes = vec![0x18, 0x18];
47 test_integer_all(bytes, 24);
48
49 let bytes = vec![0x18, 0x19];
50 test_integer_all(bytes, 25);
51
52 let bytes = vec![0x18, 0x64];
53 test_integer_all(bytes, 100);
54
55 let bytes = vec![0x19, 0x03, 0xe8];
56 test_integer_all(bytes, 1000);
57
58 let bytes = vec![0x1a, 0x00, 0x0f, 0x42, 0x40];
59 test_integer_all(bytes, 1000000);
60
61 let bytes = vec![0x1b, 0x00, 0x00, 0x00, 0xe8, 0xd4, 0xa5, 0x10, 0x00];
62 test_integer_all(bytes, 1000000000000);
63
64 let bytes = vec![0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff];
65 test_integer_all(bytes, 18446744073709551615);
66 }
67
68 #[cfg(test)]
test_tag(bytes: Vec<u8>, expected_tag: u64, expected_value: CborType)69 fn test_tag(bytes: Vec<u8>, expected_tag: u64, expected_value: CborType) {
70 let decoded = decode(&bytes).unwrap();
71 match decoded {
72 CborType::Tag(tag, value) => {
73 assert_eq!(expected_tag, tag);
74 assert_eq!(expected_value, *value);
75 }
76 _ => assert_eq!(1, 0),
77 }
78 }
79
80 #[test]
test_tagged_objects()81 fn test_tagged_objects() {
82 let bytes: Vec<u8> = vec![0xD2, 0x02];
83 let expected_tag_value = 0x12;
84 let expected_value = CborType::Integer(2);
85 let expected = CborType::Tag(expected_tag_value, Box::new(expected_value.clone()));
86 test_decoder(bytes.clone(), expected);
87 test_tag(bytes, expected_tag_value, expected_value);
88 }
89
90 #[test]
91 #[cfg_attr(rustfmt, rustfmt_skip)]
test_arrays()92 fn test_arrays() {
93 // []
94 let bytes: Vec<u8> = vec![0x80];
95 let expected = CborType::Array(vec![]);
96 test_decoder(bytes, expected);
97
98 // [1, 2, 3]
99 let bytes: Vec<u8> = vec![0x83, 0x01, 0x02, 0x03];
100 let tmp = vec![
101 CborType::Integer(1),
102 CborType::Integer(2),
103 CborType::Integer(3),
104 ];
105 let expected = CborType::Array(tmp);
106 test_decoder(bytes, expected);
107
108 // [1, [2, 3], [4, 5]]
109 let bytes: Vec<u8> = vec![0x83, 0x01, 0x82, 0x02, 0x03, 0x82, 0x04, 0x05];
110 let tmp1 = vec![CborType::Integer(2), CborType::Integer(3)];
111 let tmp2 = vec![CborType::Integer(4), CborType::Integer(5)];
112 let tmp = vec![
113 CborType::Integer(1),
114 CborType::Array(tmp1),
115 CborType::Array(tmp2),
116 ];
117 let expected = CborType::Array(tmp);
118 test_decoder(bytes, expected);
119
120 // [1, [[[[1]]]], [1]]
121 let bytes: Vec<u8> = vec![0x83, 0x01, 0x81, 0x81, 0x81, 0x81, 0x01, 0x81, 0x02];
122 let tmp = vec![
123 CborType::Integer(1),
124 CborType::Array(vec![
125 CborType::Array(vec![
126 CborType::Array(vec![
127 CborType::Array(vec![
128 CborType::Integer(1)])])])]),
129 CborType::Array(vec![CborType::Integer(2)]),
130 ];
131 let expected = CborType::Array(tmp);
132 test_decoder(bytes, expected);
133
134 let bytes: Vec<u8> = vec![0x98, 0x1A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
135 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
136 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
137 0x17, 0x18, 0x18, 0x18, 0x19, 0x82, 0x81, 0x81,
138 0x81, 0x05, 0x81, 0x1A, 0x49, 0x96, 0x02, 0xD2];
139 // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
140 // 21, 22, 23, 24, 25, [[[[5]]], [1234567890]]]
141 let tmp = vec![
142 CborType::Integer(1),
143 CborType::Integer(2),
144 CborType::Integer(3),
145 CborType::Integer(4),
146 CborType::Integer(5),
147 CborType::Integer(6),
148 CborType::Integer(7),
149 CborType::Integer(8),
150 CborType::Integer(9),
151 CborType::Integer(10),
152 CborType::Integer(11),
153 CborType::Integer(12),
154 CborType::Integer(13),
155 CborType::Integer(14),
156 CborType::Integer(15),
157 CborType::Integer(16),
158 CborType::Integer(17),
159 CborType::Integer(18),
160 CborType::Integer(19),
161 CborType::Integer(20),
162 CborType::Integer(21),
163 CborType::Integer(22),
164 CborType::Integer(23),
165 CborType::Integer(24),
166 CborType::Integer(25),
167 CborType::Array(vec![
168 CborType::Array(vec![
169 CborType::Array(vec![
170 CborType::Array(vec![
171 CborType::Integer(5)])])]),
172 CborType::Array(vec![CborType::Integer(1234567890)])])
173 ];
174 let expected = CborType::Array(tmp);
175 test_decoder(bytes, expected);
176 }
177
178 #[test]
test_signed_integer()179 fn test_signed_integer() {
180 let bytes: Vec<u8> = vec![0x20];
181 let expected = CborType::SignedInteger(-1);
182 test_decoder(bytes, expected);
183
184 let bytes = vec![0x29];
185 let expected = CborType::SignedInteger(-10);
186 test_decoder(bytes, expected);
187
188 let bytes = vec![0x38, 0x63];
189 let expected = CborType::SignedInteger(-100);
190 test_decoder(bytes, expected);
191
192 let bytes = vec![0x39, 0x03, 0xe7];
193 let expected = CborType::SignedInteger(-1000);
194 test_decoder(bytes, expected);
195
196 let bytes = vec![0x39, 0x27, 0x0F];
197 let expected = CborType::SignedInteger(-10000);
198 test_decoder(bytes, expected);
199
200 let bytes = vec![0x3A, 0x00, 0x01, 0x86, 0x9F];
201 let expected = CborType::SignedInteger(-100000);
202 test_decoder(bytes, expected);
203
204 let bytes = vec![0x3B, 0x00, 0x00, 0x00, 0xE8, 0xD4, 0xA5, 0x0F, 0xFF];
205 let expected = CborType::SignedInteger(-1000000000000);
206 test_decoder(bytes, expected);
207 }
208
209 #[test]
test_byte_strings()210 fn test_byte_strings() {
211 let bytes: Vec<u8> = vec![0x40];
212 let expected = CborType::Bytes(vec![]);
213 test_decoder(bytes, expected);
214
215 // 01020304
216 let bytes: Vec<u8> = vec![0x44, 0x01, 0x02, 0x03, 0x04];
217 let expected = CborType::Bytes(vec![0x01, 0x02, 0x03, 0x04]);
218 test_decoder(bytes, expected);
219
220 // 0102030405060708090A0B0C0D0E0F10203040506070
221 let bytes: Vec<u8> = vec![
222 0x56, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
223 0x0f, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
224 ];
225 let expected = CborType::Bytes(vec![
226 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
227 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
228 ]);
229 test_decoder(bytes, expected);
230
231 let bytes: Vec<u8> = vec![
232 0x59, 0x01, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
233 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
234 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
235 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
236 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
237 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
238 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
239 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
240 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
241 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
242 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
243 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
244 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
245 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
246 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
247 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
248 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
249 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
250 0xFF, 0xFF, 0xFF,
251 ];
252 let expected = CborType::Bytes(vec![
253 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
254 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
255 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
256 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
257 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
258 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
259 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
260 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
261 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
262 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
263 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
264 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
265 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
266 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
267 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
268 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
269 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
270 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
271 ]);
272 test_decoder(bytes, expected);
273 }
274
275 #[test]
test_maps()276 fn test_maps() {
277 // {}
278 let bytes: Vec<u8> = vec![0xa0];
279 let expected: BTreeMap<CborType, CborType> = BTreeMap::new();
280 test_decoder(bytes, CborType::Map(expected));
281
282 // {1: 2, 3: 4}
283 let bytes: Vec<u8> = vec![0xa2, 0x01, 0x02, 0x03, 0x04];
284 let mut expected: BTreeMap<CborType, CborType> = BTreeMap::new();
285 expected.insert(CborType::Integer(1), CborType::Integer(2));
286 expected.insert(CborType::Integer(3), CborType::Integer(4));
287 test_decoder(bytes, CborType::Map(expected));
288
289 // TODO: strings aren't properly supported as keys yet.
290 // {"a": 1, "b": [2, 3]}
291 // let bytes: Vec<u8> = vec![0xa2, 0x61, 0x61, 0x01, 0x61, 0x62, 0x82, 0x02, 0x03];
292 // let expected =
293 // CborType::Map(vec![
294 // CborMap{key: CborType::Integer(1), value: CborType::Integer(2)},
295 // CborMap{key: CborType::Integer(3), value: CborType::Integer(4)}]);
296 // test_decoder(bytes, expected);
297
298 // let bytes: Vec<u8> = vec![0x82, 0x61, 0x61, 0xa1, 0x61, 0x62, 0x61, 0x63];
299 // test_decoder(bytes, "[a, {b: c}]");
300
301 // let bytes: Vec<u8> = vec![0xa5, 0x61, 0x61, 0x61, 0x41, 0x61, 0x62, 0x61,
302 // 0x42, 0x61, 0x63, 0x61, 0x43, 0x61, 0x64, 0x61,
303 // 0x44, 0x61, 0x65, 0x61, 0x45];
304 // test_decoder(bytes, "{a: A, b: B, c: C, d: D, e: E}");
305 }
306
307 #[test]
test_map_duplicate_keys()308 fn test_map_duplicate_keys() {
309 let bytes: Vec<u8> = vec![0xa4, 0x01, 0x02, 0x02, 0x03, 0x01, 0x03, 0x04, 0x04];
310 test_decoder_error(bytes, CborError::DuplicateMapKey);
311 }
312
313 #[test]
test_tag_with_no_value()314 fn test_tag_with_no_value() {
315 let bytes: Vec<u8> = vec![0xc0];
316 test_decoder_error(bytes, CborError::TruncatedInput);
317 }
318
319 #[test]
test_truncated_int()320 fn test_truncated_int() {
321 let bytes: Vec<u8> = vec![0x19, 0x03];
322 test_decoder_error(bytes, CborError::TruncatedInput);
323 }
324
325 #[test]
test_truncated_array()326 fn test_truncated_array() {
327 let bytes: Vec<u8> = vec![0x83, 0x01, 0x02];
328 test_decoder_error(bytes, CborError::TruncatedInput);
329 }
330
331 #[test]
test_truncated_map()332 fn test_truncated_map() {
333 let bytes: Vec<u8> = vec![0xa2, 0x01, 0x02, 0x00];
334 test_decoder_error(bytes, CborError::TruncatedInput);
335 }
336
337 #[test]
test_malformed_integer()338 fn test_malformed_integer() {
339 let bytes: Vec<u8> = vec![0x1c];
340 test_decoder_error(bytes, CborError::MalformedInput);
341 }
342
343 #[test]
test_signed_integer_too_large()344 fn test_signed_integer_too_large() {
345 let bytes = vec![0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff];
346 test_decoder_error(bytes, CborError::InputValueOutOfRange);
347 }
348
349 #[test]
test_null()350 fn test_null() {
351 let bytes = vec![0xf6];
352 test_decoder(bytes, CborType::Null);
353 }
354
355 #[test]
test_null_in_array()356 fn test_null_in_array() {
357 let bytes = vec![0x82, 0xf6, 0xf6];
358 test_decoder(bytes, CborType::Array(vec![CborType::Null, CborType::Null]));
359 }
360
361 #[test]
test_major_type_7()362 fn test_major_type_7() {
363 for i in 0..0x20 {
364 if i != 22 {
365 let bytes = vec![0xe0 | i];
366 test_decoder_error(bytes, CborError::UnsupportedType);
367 }
368 }
369 }
370
371 #[test]
test_large_input()372 fn test_large_input() {
373 let array = vec![0xFF; MAX_ARRAY_SIZE];
374 let expected = CborType::Bytes(array.clone());
375 let mut bytes = vec![0x5A, 0x08, 0x00, 0x00, 0x00];
376 bytes.extend_from_slice(&array);
377 test_decoder(bytes, expected);
378 }
379
380 #[test]
test_too_large_input()381 fn test_too_large_input() {
382 let array = vec![0xFF; MAX_ARRAY_SIZE + 1];
383 let mut bytes = vec![0x5A, 0x08, 0x00, 0x00, 0x01];
384 bytes.extend_from_slice(&array);
385 test_decoder_error(bytes, CborError::InputTooLarge);
386 }
387
388 // We currently don't support CBOR strings (issue #39).
389 #[test]
test_invalid_input()390 fn test_invalid_input() {
391 let bytes = vec![0x60];
392 test_decoder_error(bytes, CborError::UnsupportedType);
393 }
394
395 #[test]
test_avoid_stack_exhaustion_with_arrays()396 fn test_avoid_stack_exhaustion_with_arrays() {
397 let mut bytes: Vec<u8> = Vec::new();
398 // Create a payload representing Array(Array(Array(Array(...(Array(0))))))
399 // If the implementation is not careful, this will exhaust the stack.
400 for _ in 1..10000 {
401 bytes.push(0b1000_0001);
402 }
403 bytes.push(0);
404 test_decoder_error(bytes, CborError::MalformedInput);
405 }
406
407 #[test]
test_avoid_stack_exhaustion_with_maps_1()408 fn test_avoid_stack_exhaustion_with_maps_1() {
409 let mut bytes: Vec<u8> = Vec::new();
410 // Create a payload representing Map(0: Map(0: Map(0: Map(...Map()))))
411 // If the implementation is not careful, this will exhaust the stack.
412 for _ in 1..10000 {
413 bytes.push(0b1010_0001);
414 bytes.push(0);
415 }
416 bytes.push(0b1010_0000);
417 test_decoder_error(bytes, CborError::MalformedInput);
418 }
419
420 #[test]
test_avoid_stack_exhaustion_with_maps_2()421 fn test_avoid_stack_exhaustion_with_maps_2() {
422 let mut bytes: Vec<u8> = Vec::new();
423 // Create a payload representing Map(Map(Map(...(Map(): 0): 0): 0): 0)
424 // If the implementation is not careful, this will exhaust the stack.
425 for _ in 1..10000 {
426 bytes.push(0b1010_0001);
427 }
428 bytes.push(0b1010_0000);
429 for _ in 1..9999 {
430 bytes.push(0);
431 }
432 test_decoder_error(bytes, CborError::MalformedInput);
433 }
434
435 #[test]
test_avoid_stack_exhaustion_with_tags()436 fn test_avoid_stack_exhaustion_with_tags() {
437 let mut bytes: Vec<u8> = Vec::new();
438 // Create a payload representing Tag(6: Tag(6: Tag(6: Tag(...Tag(0)))))
439 // If the implementation is not careful, this will exhaust the stack.
440 for _ in 1..10000 {
441 bytes.push(0b1100_0110);
442 }
443 bytes.push(0);
444 test_decoder_error(bytes, CborError::MalformedInput);
445 }
446