-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathbasic_choice.rs
512 lines (460 loc) · 11.5 KB
/
basic_choice.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
#![recursion_limit = "512"]
mod test_utils;
use test_utils::*;
asn_to_rust!(
r"BasicChoice DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Basic ::= CHOICE {
abc UTF8String,
def UTF8String,
ghi INTEGER
}
Extensible ::= CHOICE {
abc UTF8String,
def INTEGER,
..., -- whatever reserved blubber comment
ghi INTEGER,
jkl Basic,
mno UTF8String
}
MoreThan63Extensions ::= CHOICE {
abc UTF8String,
..., -- whatever reserved blubber comment
e00 INTEGER,
e01 INTEGER,
e02 INTEGER,
e03 INTEGER,
e04 INTEGER,
e05 INTEGER,
e06 INTEGER,
e07 INTEGER,
e08 INTEGER,
e09 INTEGER,
e10 INTEGER,
e11 INTEGER,
e12 INTEGER,
e13 INTEGER,
e14 INTEGER,
e15 INTEGER,
e16 INTEGER,
e17 INTEGER,
e18 INTEGER,
e19 INTEGER,
e20 INTEGER,
e21 INTEGER,
e22 INTEGER,
e23 INTEGER,
e24 INTEGER,
e25 INTEGER,
e26 INTEGER,
e27 INTEGER,
e28 INTEGER,
e29 INTEGER,
e30 INTEGER,
e31 INTEGER,
e32 INTEGER,
e33 INTEGER,
e34 INTEGER,
e35 INTEGER,
e36 INTEGER,
e37 INTEGER,
e38 INTEGER,
e39 INTEGER,
e40 INTEGER,
e41 INTEGER,
e42 INTEGER,
e43 INTEGER,
e44 INTEGER,
e45 INTEGER,
e46 INTEGER,
e47 INTEGER,
e48 INTEGER,
e49 INTEGER,
e50 INTEGER,
e51 INTEGER,
e52 INTEGER,
e53 INTEGER,
e54 INTEGER,
e55 INTEGER,
e56 INTEGER,
e57 INTEGER,
e58 INTEGER,
e59 INTEGER,
e60 INTEGER,
e61 INTEGER,
e62 INTEGER,
e63 INTEGER,
e64 INTEGER,
e65 INTEGER,
e66 INTEGER,
e67 INTEGER,
e68 INTEGER,
e69 INTEGER,
e70 INTEGER,
e71 INTEGER,
e72 INTEGER,
e73 INTEGER,
e74 INTEGER,
e75 INTEGER,
e76 INTEGER,
e77 INTEGER,
e78 INTEGER,
e79 INTEGER,
e80 INTEGER,
e81 INTEGER,
e82 INTEGER,
e83 INTEGER,
e84 INTEGER,
e85 INTEGER,
e86 INTEGER,
e87 INTEGER,
e88 INTEGER,
e89 INTEGER,
e90 INTEGER,
e91 INTEGER,
e92 INTEGER,
e93 INTEGER,
e94 INTEGER,
e95 INTEGER,
e96 INTEGER,
e97 INTEGER,
e98 INTEGER,
e99 INTEGER,
e100 INTEGER,
e101 INTEGER,
e102 INTEGER,
e103 INTEGER,
e104 INTEGER,
e105 INTEGER,
e106 INTEGER,
e107 INTEGER,
e108 INTEGER,
e109 INTEGER,
e110 INTEGER,
e111 INTEGER,
e112 INTEGER,
e113 INTEGER,
e114 INTEGER,
e115 INTEGER,
e116 INTEGER,
e117 INTEGER,
e118 INTEGER,
e119 INTEGER,
e120 INTEGER,
e121 INTEGER,
e122 INTEGER,
e123 INTEGER,
e124 INTEGER,
e125 INTEGER,
e126 INTEGER,
e127 INTEGER,
e128 INTEGER,
e129 INTEGER,
e130 INTEGER,
e131 INTEGER,
e132 INTEGER,
e133 INTEGER,
e134 INTEGER,
e135 INTEGER,
e136 INTEGER,
e137 INTEGER,
e138 INTEGER,
e139 INTEGER,
e140 INTEGER,
e141 INTEGER,
e142 INTEGER,
e143 INTEGER,
e144 INTEGER,
e145 INTEGER,
e146 INTEGER,
e147 INTEGER,
e148 INTEGER,
e149 INTEGER,
e150 INTEGER,
e151 INTEGER,
e152 INTEGER,
e153 INTEGER,
e154 INTEGER,
e155 INTEGER,
e156 INTEGER,
e157 INTEGER,
e158 INTEGER,
e159 INTEGER,
e160 INTEGER,
e161 INTEGER,
e162 INTEGER,
e163 INTEGER,
e164 INTEGER,
e165 INTEGER,
e166 INTEGER,
e167 INTEGER,
e168 INTEGER,
e169 INTEGER,
e170 INTEGER,
e171 INTEGER,
e172 INTEGER,
e173 INTEGER,
e174 INTEGER,
e175 INTEGER,
e176 INTEGER,
e177 INTEGER,
e178 INTEGER,
e179 INTEGER,
e180 INTEGER,
e181 INTEGER,
e182 INTEGER,
e183 INTEGER,
e184 INTEGER,
e185 INTEGER,
e186 INTEGER,
e187 INTEGER,
e188 INTEGER,
e189 INTEGER,
e190 INTEGER,
e191 INTEGER,
e192 INTEGER,
e193 INTEGER,
e194 INTEGER,
e195 INTEGER,
e196 INTEGER,
e197 INTEGER,
e198 INTEGER,
e199 INTEGER,
e200 INTEGER,
e201 INTEGER,
e202 INTEGER,
e203 INTEGER,
e204 INTEGER,
e205 INTEGER,
e206 INTEGER,
e207 INTEGER,
e208 INTEGER,
e209 INTEGER,
e210 INTEGER,
e211 INTEGER,
e212 INTEGER,
e213 INTEGER,
e214 INTEGER,
e215 INTEGER,
e216 INTEGER,
e217 INTEGER,
e218 INTEGER,
e219 INTEGER,
e220 INTEGER,
e221 INTEGER,
e222 INTEGER,
e223 INTEGER,
e224 INTEGER,
e225 INTEGER,
e226 INTEGER,
e227 INTEGER,
e228 INTEGER,
e229 INTEGER,
e230 INTEGER,
e231 INTEGER,
e232 INTEGER,
e233 INTEGER,
e234 INTEGER,
e235 INTEGER,
e236 INTEGER,
e237 INTEGER,
e238 INTEGER,
e239 INTEGER,
e240 INTEGER,
e241 INTEGER,
e242 INTEGER,
e243 INTEGER,
e244 INTEGER,
e245 INTEGER,
e246 INTEGER,
e247 INTEGER,
e248 INTEGER,
e249 INTEGER,
e250 INTEGER,
e251 INTEGER,
e252 INTEGER,
e253 INTEGER,
e254 INTEGER,
e255 INTEGER,
e256 INTEGER,
e257 INTEGER,
e258 INTEGER,
e259 INTEGER,
e260 INTEGER,
e261 INTEGER,
e262 INTEGER,
e263 INTEGER,
e264 INTEGER,
e265 INTEGER,
e266 INTEGER,
e267 INTEGER,
e268 INTEGER,
e269 INTEGER,
e270 INTEGER,
e271 INTEGER,
e272 INTEGER,
e273 INTEGER,
e274 INTEGER,
e275 INTEGER,
e276 INTEGER,
e277 INTEGER,
e278 INTEGER,
e279 INTEGER
}
END"
);
#[test]
fn test_whether_it_compiles_at_all() {}
#[test]
fn test_extensible_more_than_63_extensions_uper() {
// from playground
// this tests effectively
// - UperWriter::write_int_max_unsigned
// - UperReader::read_int_max_unsigned
serialize_and_deserialize_uper(
42,
&[0xC0, 0x51, 0x40, 0x80, 0x40, 0x00],
&MoreThan63Extensions::E69(0),
);
serialize_and_deserialize_uper(
42,
&[0xC0, 0x51, 0x40, 0x80, 0x45, 0x80],
&MoreThan63Extensions::E69(22),
);
serialize_and_deserialize_uper(
32,
&[0x93, 0x02, 0x01, 0x16],
&MoreThan63Extensions::E19(22),
);
}
#[test]
fn test_extensible_more_than_63_extensions_uper_e126() {
serialize_and_deserialize_uper(
5 * 8 + 2,
&[0xC0, 0x5F, 0x80, 0x80, 0x5F, 0x80],
&MoreThan63Extensions::E126(126),
);
}
#[test]
fn test_extensible_more_than_63_extensions_uper_e127() {
serialize_and_deserialize_uper(
5 * 8 + 2,
&[0xC0, 0x5F, 0xC0, 0x80, 0x5F, 0xC0],
&MoreThan63Extensions::E127(127),
);
}
#[test]
fn test_extensible_more_than_63_extensions_uper_e128() {
serialize_and_deserialize_uper(
6 * 8 + 2,
&[0xC0, 0x60, 0x00, 0xC0, 0x80, 0x20, 0x00],
&MoreThan63Extensions::E128(128),
);
}
#[test]
fn test_extensible_more_than_63_extensions_uper_e129() {
serialize_and_deserialize_uper(
6 * 8 + 2,
&[0xC0, 0x60, 0x40, 0xC0, 0x80, 0x20, 0x40],
&MoreThan63Extensions::E129(129),
);
}
#[test]
fn test_extensible_more_than_63_extensions_uper_e254() {
serialize_and_deserialize_uper(
6 * 8 + 2,
&[0xC0, 0x7F, 0x80, 0xC0, 0x80, 0x3F, 0x80],
&MoreThan63Extensions::E254(254),
);
}
#[test]
fn test_extensible_more_than_63_extensions_uper_e255() {
serialize_and_deserialize_uper(
6 * 8 + 2,
&[0xC0, 0x7F, 0xC0, 0xC0, 0x80, 0x3F, 0xC0],
&MoreThan63Extensions::E255(255),
);
}
#[test]
fn test_extensible_more_than_63_extensions_uper_e256() {
serialize_and_deserialize_uper(
7 * 8 + 2,
&[0xC0, 0x80, 0x40, 0x00, 0xC0, 0x80, 0x40, 0x00],
&MoreThan63Extensions::E256(256),
);
}
#[test]
fn test_extensible_more_than_63_extensions_uper_e257() {
serialize_and_deserialize_uper(
7 * 8 + 2,
&[0xC0, 0x80, 0x40, 0x40, 0xC0, 0x80, 0x40, 0x40],
&MoreThan63Extensions::E257(257),
);
}
#[test]
fn test_extensible_uper() {
// https://asn1.io/asn1playground/
// value Extensible ::= abc { "" }
serialize_and_deserialize_uper(10, &[0x00, 0x00], &Extensible::Abc(String::default()));
serialize_and_deserialize_uper(
106,
&[
0x03, 0x12, 0x19, 0x5b, 0x1b, 0x1b, 0xc8, 0x15, 0xdb, 0xdc, 0x9b, 0x19, 0x08, 0x40,
],
&Extensible::Abc("Hello World!".to_string()),
);
serialize_and_deserialize_uper(18, &[0x40, 0x40, 0x00], &Extensible::Def(0));
serialize_and_deserialize_uper(26, &[0x40, 0x81, 0x4e, 0x40], &Extensible::Def(1337));
// value Extensible ::= ghi:0
serialize_and_deserialize_uper(32, &[0x80_u8, 0x02, 0x01, 0x00], &Extensible::Ghi(0));
// value Extensible ::= ghi:27
serialize_and_deserialize_uper(32, &[0x80_u8, 0x02, 0x01, 0x1B], &Extensible::Ghi(27));
serialize_and_deserialize_uper(
40,
&[0x80_u8, 0x03, 0x02, 0x05, 0x39],
&Extensible::Ghi(1337),
);
serialize_and_deserialize_uper(
120,
&[
0x82, 0x0d, 0x0c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e,
0x21,
],
&Extensible::Mno("Hello again!".to_string()),
);
}
#[test]
pub fn test_basic_uper() {
serialize_and_deserialize_uper(
106,
&[
0x03, 0x12, 0x19, 0x5b, 0x1b, 0x1b, 0xc8, 0x15, 0xdb, 0xdc, 0x9b, 0x19, 0x08, 0x40,
],
&Basic::Abc("Hello World!".to_string()),
);
serialize_and_deserialize_uper(
106,
&[
0x43, 0x12, 0x19, 0x5b, 0x1b, 0x1b, 0xc8, 0x18, 0x59, 0xd8, 0x5a, 0x5b, 0x88, 0x40,
],
&Basic::Def("Hello again!".to_string()),
);
serialize_and_deserialize_uper(26, &[0x80, 0x81, 0x4e, 0x40], &Basic::Ghi(1337));
}
#[test]
fn test_extensible_choice_inner_complex() {
let jkl = Extensible::Jkl(Basic::Ghi(1337));
let (bits, buffer) = serialize_uper(&jkl);
let jkl_deserialized = deserialize_uper(&buffer[..], bits);
assert_eq!(jkl, jkl_deserialized);
}
#[test]
fn test_basic_variants_parsed() {
let _abc = Basic::Abc(String::default());
let _def = Basic::Def(String::default());
let _ghi = Basic::Ghi(123_u64);
match Basic::Abc(String::default()) {
// this does not compile if there are additional unexpected variants
Basic::Abc(_) | Basic::Def(_) | Basic::Ghi(_) => {}
}
}