1#![allow(unused_variables)]
3
4use crate::asn1::set_of::*;
5use crate::asn1::tag::TAG_FMT_MAX_BYTE_LEN;
6use crate::asn1::{
7 ASN1Fmt, Any, AnyFmt, AnySpec, BitString, BitStringFmt, BitStringSpec, BmpStringFmt,
8 BmpStringSpec, BoolFmt, DefaultedFmt, EnumeratedFmt, GeneralizedTime, GeneralizedTimeFmt,
9 GeneralizedTimeSpec, Ia5String, Ia5StringFmt, Ia5StringSpec, ImplicitlyTaggedFmt, Integer,
10 Integer16Fmt, Integer8Fmt, IntegerFmt, LengthFmt, ObjectIdentifierFmt, ObjectIdentifierSpec,
11 PrintableString, PrintableStringFmt, PrintableStringSpec, Real, RealFmt, Retaggable, SetOfFmt,
12 Tag, TagFmt, TeletexString, TeletexStringFmt, TeletexStringSpec, UniversalStringFmt, UtcTime,
13 UtcTimeFmt, Utf8StringFmt,
14};
15#[cfg(feature = "alloc")]
16use crate::asn1::{BmpString, ObjectIdentifier, UniversalString};
17use crate::combinators::choice::Sum;
18use crate::combinators::mapped::spec::{BiMap, SpecMap};
19use crate::combinators::{
20 Choice, Empty, Eof, Mapped, Opt, Optional, Pair, Ref, Refined, RepeatTillEnd, Star, Tail, U8,
21};
22use crate::core::exec::fns::{Map, Pred};
23use crate::core::exec::serializer::{ByteLen, SerializerExt};
24use crate::core::spec::{Consistency, GoodSerializer, SpecByteLen, SpecSerializer};
25use crate::primitives::base128::{Base128Fmt, BASE128_MAX_BYTES};
26#[cfg(feature = "alloc")]
27use alloc::vec::Vec;
28use vstd::calc;
29use vstd::prelude::*;
30#[cfg(feature = "alloc")]
31use vstd::string::StrSliceExecFns;
32
33verus! {
34
35pub trait DerState {
37 type State: Copy + Default;
38}
39
40pub trait DeepViewIdentity: DeepView<V = Self> + Copy {
45 proof fn lemma_deep_view_identity(&self)
46 ensures
47 self.deep_view() == *self,
48 ;
49}
50
51impl DeepViewIdentity for bool {
52 proof fn lemma_deep_view_identity(&self) {
53 }
54}
55
56impl DeepViewIdentity for i8 {
57 proof fn lemma_deep_view_identity(&self) {
58 }
59}
60
61impl DeepViewIdentity for i16 {
62 proof fn lemma_deep_view_identity(&self) {
63 }
64}
65
66impl DeepViewIdentity for u8 {
67 proof fn lemma_deep_view_identity(&self) {
68 }
69}
70
71impl DeepViewIdentity for UtcTime {
72 proof fn lemma_deep_view_identity(&self) {
73 crate::asn1::utctime::lemma_utc_time_deep_view(self);
74 }
75}
76
77pub trait DerOrd<T>: DerState + SpecSerializer<SVal = T::V> + SpecByteLen<T = T::V> + Consistency<
82 Val = T::V,
83> where T: DeepView + ?Sized {
84 proof fn lemma_der_serialize_len(&self, value: T::V)
89 requires
90 self.consistent(value),
91 ensures
92 self.spec_serialize(value).len() == self.byte_len(value),
93 ;
94
95 spec fn der_remaining(&self, value: T::V, state: <Self as DerState>::State) -> Seq<u8>;
97
98 spec fn der_state_valid(&self, value: T::V, state: <Self as DerState>::State) -> bool;
100
101 fn der_start(&self, value: &T) -> (state: <Self as DerState>::State)
103 requires
104 self.consistent(value.deep_view()),
105 ensures
106 self.der_state_valid(value.deep_view(), state),
107 self.der_remaining(value.deep_view(), state) == self.spec_serialize(value.deep_view()),
108 ;
109
110 fn der_next(&self, value: &T, state: &mut <Self as DerState>::State) -> (next: Option<u8>)
112 requires
113 self.consistent(value.deep_view()),
114 self.der_state_valid(value.deep_view(), *old(state)),
115 ensures
116 self.der_state_valid(value.deep_view(), *final(state)),
117 match next {
118 Some(byte) => {
119 self.der_remaining(value.deep_view(), *old(state)) == seq![byte]
120 + self.der_remaining(value.deep_view(), *final(state))
121 },
122 None => {
123 &&& self.der_remaining(value.deep_view(), *old(state)).len() == 0
124 &&& self.der_remaining(value.deep_view(), *final(state)).len() == 0
125 },
126 },
127 ;
128
129 #[verifier::loop_isolation(false)]
131 fn der_leq(&self, left: &T, right: &T) -> (leq: bool)
132 requires
133 self.consistent(left.deep_view()),
134 self.consistent(right.deep_view()),
135 ensures
136 leq == der_octets_leq(
137 self.spec_serialize(left.deep_view()),
138 self.spec_serialize(right.deep_view()),
139 ),
140 {
141 let mut left_state = self.der_start(left);
142 let mut right_state = self.der_start(right);
143 let ghost leftvv = left.deep_view();
144 let ghost rightvv = right.deep_view();
145 let ghost left_encoding = self.spec_serialize(leftvv);
146 let ghost right_encoding = self.spec_serialize(right.deep_view());
147
148 loop
149 invariant
150 self.der_state_valid(leftvv, left_state),
151 self.der_state_valid(right.deep_view(), right_state),
152 der_octets_leq(left_encoding, right_encoding) == der_octets_leq(
153 self.der_remaining(leftvv, left_state),
154 self.der_remaining(rightvv, right_state),
155 ),
156 decreases
157 self.der_remaining(leftvv, left_state).len() + self.der_remaining(
158 rightvv,
159 right_state,
160 ).len(),
161 {
162 let ghost old_l = self.der_remaining(leftvv, left_state);
163 let ghost old_r = self.der_remaining(rightvv, right_state);
164 let left_next = self.der_next(left, &mut left_state);
165 let right_next = self.der_next(right, &mut right_state);
166 let left_byte = match left_next {
167 Some(byte) => byte,
168 None => 0,
169 };
170 let right_byte = match right_next {
171 Some(byte) => byte,
172 None => 0,
173 };
174
175 if left_next.is_none() && right_next.is_none() {
176 return true;
177 }
178 proof {
179 assert(der_octets_drop_head(old_l) == self.der_remaining(leftvv, left_state));
180 assert(der_octets_drop_head(old_r) == self.der_remaining(rightvv, right_state));
181 lemma_der_octets_leq_step(old_l, old_r);
182 }
183
184 if left_byte < right_byte {
185 return true;
186 }
187 if left_byte > right_byte {
188 return false;
189 }
190 }
191 }
192}
193
194} #[allow(unused_macros)]
197macro_rules! good_start {
198 ($fmt:expr, $value:expr, $state:expr) => {
199 ::vstd::prelude::assert_(::vstd::prelude::ext_equal(
200 $fmt.der_remaining($value, $state),
201 $fmt.spec_serialize($value),
202 ));
203 ::vstd::prelude::assert_($fmt.der_state_valid($value, $state));
204 };
205}
206
207verus! {
208
209#[derive(Copy, Clone)]
211pub struct TagDerState {
212 pub bytes: [u8; TAG_FMT_MAX_BYTE_LEN],
213 pub len: usize,
214 pub pos: usize,
215}
216
217impl Default for TagDerState {
218 fn default() -> (state: Self) {
219 Self { bytes: [0u8;TAG_FMT_MAX_BYTE_LEN], len: 0, pos: 0 }
220 }
221}
222
223#[derive(Copy, Clone)]
228pub struct LengthDerState {
229 pub bytes: [u8; 9],
230 pub len: usize,
231 pub pos: usize,
232}
233
234impl Default for LengthDerState {
235 fn default() -> (state: Self) {
236 Self { bytes: [0u8;9], len: 0, pos: 0 }
237 }
238}
239
240impl DerState for TagFmt {
241 type State = TagDerState;
242}
243
244impl DerOrd<Tag> for TagFmt {
245 proof fn lemma_der_serialize_len(&self, tag: Tag) {
246 self.lemma_serialize_len(tag);
247 }
248
249 open spec fn der_remaining(&self, tag: Tag, state: TagDerState) -> Seq<u8> {
250 self.spec_serialize(tag).skip(state.pos as int)
251 }
252
253 open spec fn der_state_valid(&self, tag: Tag, state: TagDerState) -> bool {
254 &&& state.pos <= state.len
255 &&& state.len <= state.bytes@.len()
256 &&& state.len == self.spec_serialize(tag).len()
257 &&& state.bytes@.take(state.len as int) == self.spec_serialize(tag)
258 }
259
260 fn der_start(&self, t: &Tag) -> (state: TagDerState) {
261 proof {
262 crate::asn1::tag::lemma_tag_fmt_byte_len_bound(*t);
263 self.lemma_serialize_len(*t);
264 }
265 let len = self.length(t);
266 let mut bytes = [0u8;TAG_FMT_MAX_BYTE_LEN];
267 let (encoded, tail) = bytes.split_at_mut(len);
268 self.serialize(t, encoded);
269 let state = TagDerState { bytes, len, pos: 0 };
270 proof {
271 vstd::seq_lib::lemma_seq_append_take_skip(encoded@, tail@, len as int);
272 good_start!(self, *t, state);
273 }
274 state
275 }
276
277 fn der_next(&self, t: &Tag, state: &mut TagDerState) -> (next: Option<u8>) {
278 if state.pos == state.len {
279 None
280 } else {
281 let byte = state.bytes[state.pos];
282 state.pos += 1;
283 Some(byte)
284 }
285 }
286}
287
288impl DerState for LengthFmt<true> {
289 type State = LengthDerState;
290}
291
292impl DerOrd<usize> for LengthFmt<true> {
293 proof fn lemma_der_serialize_len(&self, value: usize) {
294 self.lemma_serialize_len(value);
295 }
296
297 open spec fn der_remaining(&self, value: usize, state: LengthDerState) -> Seq<u8> {
298 self.spec_serialize(value).skip(state.pos as int)
299 }
300
301 open spec fn der_state_valid(&self, value: usize, state: LengthDerState) -> bool {
302 &&& state.pos <= state.len
303 &&& state.len <= 9
304 &&& state.len == self.spec_serialize(value).len()
305 &&& state.bytes@.take(state.len as int) == self.spec_serialize(value)
306 }
307
308 fn der_start(&self, l: &usize) -> (state: LengthDerState) {
309 proof {
310 crate::asn1::length::lemma_length_fmt_byte_len_bound::<true>(*l);
311 self.lemma_serialize_len(*l);
312 }
313 let len = self.length(l);
314 let mut bytes = [0u8;9];
315 let (encoded, tail) = bytes.split_at_mut(len);
316 self.serialize(l, encoded);
317 let state = LengthDerState { bytes, len, pos: 0 };
318 proof {
319 vstd::seq_lib::lemma_seq_append_take_skip(encoded@, tail@, len as int);
320 good_start!(self, *l, state);
321 }
322 state
323 }
324
325 fn der_next(&self, l: &usize, state: &mut LengthDerState) -> (next: Option<u8>) {
326 if state.pos == state.len {
327 None
328 } else {
329 let byte = state.bytes[state.pos];
330 state.pos += 1;
331 Some(byte)
332 }
333 }
334}
335
336#[derive(Copy, Clone)]
338pub struct Base128DerState {
339 pub bytes: [u8; BASE128_MAX_BYTES],
340 pub len: usize,
341 pub pos: usize,
342}
343
344impl Default for Base128DerState {
345 fn default() -> (state: Self) {
346 Self { bytes: [0u8;BASE128_MAX_BYTES], len: 0, pos: 0 }
347 }
348}
349
350impl DerState for Base128Fmt<true> {
351 type State = Base128DerState;
352}
353
354impl DerOrd<u64> for Base128Fmt<true> {
355 proof fn lemma_der_serialize_len(&self, value: u64) {
356 assert(self.serialize_inv());
357 self.lemma_serialize_len(value);
358 }
359
360 open spec fn der_remaining(&self, value: u64, state: Base128DerState) -> Seq<u8> {
361 self.spec_serialize(value).skip(state.pos as int)
362 }
363
364 open spec fn der_state_valid(&self, value: u64, state: Base128DerState) -> bool {
365 &&& state.pos <= state.len
366 &&& state.len <= state.bytes@.len()
367 &&& state.len == self.spec_serialize(value).len()
368 &&& state.bytes@.take(state.len as int) == self.spec_serialize(value)
369 }
370
371 fn der_start(&self, i: &u64) -> (state: Base128DerState) {
372 proof {
373 self.lemma_der_serialize_len(*i);
374 crate::primitives::base128::lemma_base128_fmt_consistent_byte_len_bound::<true>(*i);
375 }
376 let len = self.length(i);
377 let mut bytes = [0u8;BASE128_MAX_BYTES];
378 let (encoded, tail) = bytes.split_at_mut(len);
379 self.serialize(i, encoded);
380 let state = Base128DerState { bytes, len, pos: 0 };
381 proof {
382 vstd::seq_lib::lemma_seq_append_take_skip(encoded@, tail@, len as int);
383 good_start!(self, *i, state);
384 }
385 state
386 }
387
388 fn der_next(&self, i: &u64, state: &mut Base128DerState) -> (next: Option<u8>) {
389 if state.pos == state.len {
390 None
391 } else {
392 let byte = state.bytes[state.pos];
393 state.pos += 1;
394 Some(byte)
395 }
396 }
397}
398
399#[verifier::allow(autoderive_clone_without_spec)]
401#[derive(Copy, Clone, Default)]
402pub struct TlvDerState<Content> {
403 pub tag: TagDerState,
404 pub length: LengthDerState,
405 pub content: Content,
406 pub content_len: usize,
407 pub phase: u8,
409}
410
411impl<Content: DerState> DerState for ASN1Fmt<Content, true> {
412 type State = TlvDerState<Content::State>;
413}
414
415impl<Content, T> DerOrd<T> for ASN1Fmt<Content, true> where
416 T: DeepView + ?Sized,
417 Content: crate::core::spec::SpecCombinator<T = T::V> + DerOrd<T>,
418 {
419 proof fn lemma_der_serialize_len(&self, value: T::V) {
420 self.1.lemma_der_serialize_len(value);
421 TagFmt.lemma_der_serialize_len(self.0);
422 LengthFmt::<true>.lemma_der_serialize_len(self.1.byte_len(value) as usize);
423 }
424
425 #[verusfmt::skip]
426 open spec fn der_remaining(&self, value: T::V, state: TlvDerState<Content::State>) -> Seq<u8> {
427 match state.phase {
428 0 => {
429 TagFmt.der_remaining(self.0, state.tag)
430 + LengthFmt::<true>.der_remaining(state.content_len, state.length)
431 + self.1.der_remaining(value, state.content)
432 },
433 1 => {
434 LengthFmt::<true>.der_remaining(state.content_len, state.length)
435 + self.1.der_remaining(value, state.content)
436 },
437 _ => self.1.der_remaining(value, state.content),
438 }
439 }
440
441 #[verusfmt::skip]
442 open spec fn der_state_valid(&self, value: T::V, state: TlvDerState<Content::State>) -> bool {
443 &&& TagFmt.der_state_valid(self.0, state.tag)
444 &&& LengthFmt::<true>.der_state_valid(state.content_len, state.length)
445 &&& self.1.der_state_valid(value, state.content)
446 &&& state.content_len as nat == self.1.byte_len(value)
447 &&& state.phase <= 2
448 &&& state.phase >= 1 ==> TagFmt.der_remaining(self.0, state.tag).len() == 0
449 &&& state.phase >= 2 ==> LengthFmt::<true>.der_remaining(state.content_len, state.length).len() == 0
450 }
451
452 fn der_start(&self, v: &T) -> (state: TlvDerState<Content::State>) {
453 #[verifier::loop_isolation(false)]
455 fn der_len<F, T>(fmt: &F, v: &T) -> (len: usize) where T: DeepView + ?Sized, F: DerOrd<T>
456 requires
457 fmt.consistent(v.deep_view()),
458 fmt.spec_serialize(v.deep_view()).len() <= usize::MAX,
459 ensures
460 len == fmt.spec_serialize(v.deep_view()).len(),
461 {
462 let mut state = fmt.der_start(v);
463 let mut len = 0usize;
464 let ghost encoding = fmt.spec_serialize(v.deep_view());
465 loop
466 invariant
467 fmt.der_state_valid(v.deep_view(), state),
468 len as nat + fmt.der_remaining(v.deep_view(), state).len() == encoding.len(),
469 decreases fmt.der_remaining(v.deep_view(), state).len(),
470 {
471 if let None = fmt.der_next(v, &mut state) {
472 return len;
473 }
474 len += 1;
475 }
476 }
477 proof {
478 self.1.lemma_der_serialize_len(v.deep_view());
479 }
480 let content_len = der_len(&self.1, v);
481 let state = TlvDerState {
482 tag: TagFmt.der_start(&self.0),
483 length: LengthFmt::<true>.der_start(&content_len),
484 content: self.1.der_start(v),
485 content_len,
486 phase: 0,
487 };
488 proof {
489 good_start!(self, v.deep_view(), state);
490 }
491 state
492 }
493
494 fn der_next(&self, v: &T, state: &mut TlvDerState<Content::State>) -> (next: Option<u8>) {
495 if state.phase == 0 {
496 match TagFmt.der_next(&self.0, &mut state.tag) {
497 Some(byte) => {
498 return Some(byte);
499 },
500 None => {
501 state.phase = 1;
502 },
503 }
504 }
505 if state.phase == 1 {
506 match LengthFmt::<true>.der_next(&state.content_len, &mut state.length) {
507 Some(byte) => {
508 return Some(byte);
509 },
510 None => {
511 state.phase = 2;
512 },
513 }
514 }
515 let next = self.1.der_next(v, &mut state.content);
516 next
517 }
518}
519
520impl DerState for BoolFmt<true> {
521 type State = bool;
522}
523
524impl DerOrd<bool> for BoolFmt<true> {
525 proof fn lemma_der_serialize_len(&self, value: bool) {
526 self.lemma_serialize_len(value);
527 }
528
529 open spec fn der_remaining(&self, value: bool, state: bool) -> Seq<u8> {
530 if state {
531 Seq::empty()
532 } else {
533 self.spec_serialize(value)
534 }
535 }
536
537 open spec fn der_state_valid(&self, _value: bool, _state: bool) -> bool {
538 true
539 }
540
541 fn der_start(&self, b: &bool) -> (state: bool) {
542 let state = false;
543 proof {
544 good_start!(self, *b, state);
545 }
546 state
547 }
548
549 fn der_next(&self, b: &bool, state: &mut bool) -> (next: Option<u8>) {
550 if *state {
551 None
552 } else {
553 *state = true;
554 let mut bytes = [0u8;1];
555 self.serialize(b, &mut bytes);
556 Some(bytes[0])
557 }
558 }
559}
560
561impl DerState for Integer8Fmt {
562 type State = bool;
563}
564
565impl DerOrd<i8> for Integer8Fmt {
566 proof fn lemma_der_serialize_len(&self, value: i8) {
567 self.lemma_serialize_len(value);
568 }
569
570 open spec fn der_remaining(&self, value: i8, state: bool) -> Seq<u8> {
571 if state {
572 Seq::empty()
573 } else {
574 self.spec_serialize(value)
575 }
576 }
577
578 open spec fn der_state_valid(&self, _value: i8, _state: bool) -> bool {
579 true
580 }
581
582 fn der_start(&self, i: &i8) -> (state: bool) {
583 let state = false;
584 proof {
585 good_start!(self, *i, state);
586 }
587 state
588 }
589
590 fn der_next(&self, i: &i8, state: &mut bool) -> (next: Option<u8>) {
591 if *state {
592 None
593 } else {
594 *state = true;
595 let mut bytes = [0u8;1];
596 self.serialize(i, &mut bytes);
597 Some(bytes[0])
598 }
599 }
600}
601
602#[derive(Copy, Clone)]
604pub struct Integer16DerState {
605 pub bytes: [u8; 2],
606 pub len: usize,
607 pub pos: usize,
608}
609
610impl Default for Integer16DerState {
611 fn default() -> (state: Self) {
612 Self { bytes: [0u8;2], len: 0, pos: 0 }
613 }
614}
615
616impl DerState for Integer16Fmt {
617 type State = Integer16DerState;
618}
619
620impl DerOrd<i16> for Integer16Fmt {
621 proof fn lemma_der_serialize_len(&self, value: i16) {
622 self.lemma_serialize_len(value);
623 }
624
625 open spec fn der_remaining(&self, value: i16, state: Integer16DerState) -> Seq<u8> {
626 self.spec_serialize(value).skip(state.pos as int)
627 }
628
629 open spec fn der_state_valid(&self, value: i16, state: Integer16DerState) -> bool {
630 &&& state.pos <= state.len <= 2
631 &&& state.len == self.spec_serialize(value).len()
632 &&& state.bytes@.take(state.len as int) == self.spec_serialize(value)
633 }
634
635 fn der_start(&self, i: &i16) -> (state: Integer16DerState) {
636 proof {
637 crate::asn1::integer::lemma_integer16_fmt_byte_len_bound(*i);
638 self.lemma_serialize_len(*i);
639 }
640 let len = self.length(i);
641 let mut bytes = [0u8;2];
642 let (encoded, tail) = bytes.split_at_mut(len);
643 self.serialize(i, encoded);
644 let state = Integer16DerState { bytes, len, pos: 0 };
645 proof {
646 vstd::seq_lib::lemma_seq_append_take_skip(encoded@, tail@, len as int);
647 good_start!(self, *i, state);
648 }
649 state
650 }
651
652 fn der_next(&self, i: &i16, state: &mut Integer16DerState) -> (next: Option<u8>) {
653 if state.pos == state.len {
654 None
655 } else {
656 let byte = state.bytes[state.pos];
657 state.pos += 1;
658 Some(byte)
659 }
660 }
661}
662
663#[derive(Copy, Clone)]
664pub struct UtcTimeDerState {
665 pub bytes: [u8; 13],
666 pub pos: usize,
667}
668
669impl Default for UtcTimeDerState {
670 fn default() -> (state: Self) {
671 Self { bytes: [0u8;13], pos: 0 }
672 }
673}
674
675impl DerState for UtcTimeFmt<true> {
676 type State = UtcTimeDerState;
677}
678
679proof fn lemma_utc_time_der_serialized_len(value: UtcTime)
681 requires
682 UtcTimeFmt::<true>.consistent(value),
683 ensures
684 UtcTimeFmt::<true>.spec_serialize(value).len() == 13,
685 UtcTimeFmt::<true>.byte_len(value) == 13,
686{
687}
688
689impl DerOrd<UtcTime> for UtcTimeFmt<true> {
690 proof fn lemma_der_serialize_len(&self, value: UtcTime) {
691 lemma_utc_time_der_serialized_len(value);
692 }
693
694 open spec fn der_remaining(&self, value: UtcTime, state: UtcTimeDerState) -> Seq<u8> {
695 self.spec_serialize(value).skip(state.pos as int)
696 }
697
698 open spec fn der_state_valid(&self, value: UtcTime, state: UtcTimeDerState) -> bool {
699 &&& state.pos <= 13
700 &&& state.bytes@ == self.spec_serialize(value)
701 }
702
703 fn der_start(&self, t: &UtcTime) -> (state: UtcTimeDerState) {
704 proof {
705 t.lemma_deep_view_identity();
706 assert(UtcTimeFmt::<true>.consistent(*t));
707 lemma_utc_time_der_serialized_len(*t);
708 }
709 let mut bytes = [0u8;13];
710 self.serialize(t, &mut bytes);
711 let state = UtcTimeDerState { bytes, pos: 0 };
712 proof {
713 good_start!(self, t.deep_view(), state);
714 }
715 state
716 }
717
718 fn der_next(&self, t: &UtcTime, state: &mut UtcTimeDerState) -> (next: Option<u8>) {
719 if state.pos == 13 {
720 None
721 } else {
722 let byte = state.bytes[state.pos];
723 state.pos += 1;
724 Some(byte)
725 }
726 }
727}
728
729#[derive(Copy, Clone)]
730pub struct GeneralizedTimeDerState {
731 pub prefix: [u8; 14],
732 pub pos: usize,
733}
734
735impl Default for GeneralizedTimeDerState {
736 fn default() -> (state: Self) {
737 Self { prefix: [0u8;14], pos: 0 }
738 }
739}
740
741impl DerState for GeneralizedTimeFmt<true> {
742 type State = GeneralizedTimeDerState;
743}
744
745impl<'a> DerOrd<GeneralizedTime<'a>> for GeneralizedTimeFmt<true> {
746 proof fn lemma_der_serialize_len(&self, value: GeneralizedTimeSpec) {
747 crate::asn1::generalizedtime::lemma_der_generalized_time_model(value);
748 }
749
750 open spec fn der_remaining(
751 &self,
752 value: GeneralizedTimeSpec,
753 state: GeneralizedTimeDerState,
754 ) -> Seq<u8> {
755 self.spec_serialize(value).skip(state.pos as int)
756 }
757
758 open spec fn der_state_valid(
759 &self,
760 value: GeneralizedTimeSpec,
761 state: GeneralizedTimeDerState,
762 ) -> bool {
763 &&& state.pos <= self.spec_serialize(value).len()
764 &&& state.prefix@ == crate::asn1::generalizedtime::generalized_time_prefix(value)
765 }
766
767 fn der_start(&self, t: &GeneralizedTime<'a>) -> (state: GeneralizedTimeDerState) {
768 proof {
769 crate::asn1::generalizedtime::lemma_der_generalized_time_model(t.deep_view());
770 }
771 let prefix = crate::asn1::generalizedtime::generalized_time_der_prefix_bytes(t);
772 let state = GeneralizedTimeDerState { prefix, pos: 0 };
773 proof {
774 good_start!(self, t.deep_view(), state);
775 }
776 state
777 }
778
779 fn der_next(&self, t: &GeneralizedTime<'a>, state: &mut GeneralizedTimeDerState) -> (next:
780 Option<u8>) {
781 let ghost old_pos = state.pos;
782 proof {
783 crate::asn1::generalizedtime::lemma_der_generalized_time_model(t.deep_view());
784 crate::asn1::generalizedtime::lemma_der_generalized_time_layout(
785 t.deep_view(),
786 state.pos,
787 );
788 }
789 let fraction = t.fraction();
790 let total = if fraction.len() == 0 {
791 15usize
792 } else {
793 fraction.len() + 16
794 };
795 if state.pos == total {
796 None
797 } else {
798 let byte;
799 if state.pos < 14 {
800 byte = state.prefix[state.pos];
801 } else if fraction.len() == 0 {
802 byte = 0x5a;
803 } else if state.pos == 14 {
804 byte = 0x2e;
805 } else if state.pos < fraction.len() + 15 {
806 byte = fraction[state.pos - 15];
807 } else {
808 byte = 0x5a;
809 }
810 state.pos += 1;
811 Some(byte)
812 }
813 }
814}
815
816#[derive(Copy, Clone)]
819pub struct IntegerDerState {
820 pub bytes: [u8; 9],
821 pub len: usize,
822 pub pos: usize,
823 pub small: bool,
824}
825
826impl Default for IntegerDerState {
827 fn default() -> (state: Self) {
828 Self { bytes: [0u8;9], len: 0, pos: 0, small: false }
829 }
830}
831
832impl DerState for IntegerFmt {
833 type State = IntegerDerState;
834}
835
836impl<'a> DerOrd<Integer<'a>> for IntegerFmt {
837 proof fn lemma_der_serialize_len(&self, value: int) {
838 self.lemma_serialize_len(value);
839 }
840
841 open spec fn der_remaining(&self, value: int, state: IntegerDerState) -> Seq<u8> {
842 self.spec_serialize(value).skip(state.pos as int)
843 }
844
845 open spec fn der_state_valid(&self, value: int, state: IntegerDerState) -> bool {
846 &&& state.pos <= state.len
847 &&& state.len == self.spec_serialize(value).len()
848 &&& state.small == (i64::MIN as int <= value <= i64::MAX as int)
849 &&& state.small ==> {
850 &&& state.len <= 9
851 &&& state.bytes@.take(state.len as int) == self.spec_serialize(value)
852 }
853 }
854
855 fn der_start(&self, i: &super::Integer<'a>) -> (state: IntegerDerState) {
856 let state = match i {
857 super::Integer::Small { v } => {
858 let len = crate::asn1::integer::i64_to_be_bytes_len(*v);
859 let mut bytes = [0u8;9];
860 let (encoded, tail) = bytes.split_at_mut(len);
861 crate::asn1::integer::i64_to_be_bytes_in_place(*v, encoded);
862 proof {
863 crate::asn1::integer::lemma_integer_small_view(*v);
864 vstd::seq_lib::lemma_seq_append_take_skip(encoded@, tail@, len as int);
865 }
866 IntegerDerState { bytes, len, pos: 0, small: true }
867 },
868 super::Integer::Big { raw } => {
869 let bytes = raw.as_slice();
870 proof {
871 use_type_invariant(raw);
872 crate::asn1::integer::lemma_large_integer_outside_i64(raw.view());
873 crate::asn1::integer::lemma_integer_big_view(*raw);
874 crate::asn1::integer::lemma_integer_from_to_bytes(bytes.deep_view());
875 }
876 IntegerDerState { bytes: [0u8;9], len: bytes.len(), pos: 0, small: false }
877 },
878 };
879 proof {
880 good_start!(self, i.deep_view(), state);
881 }
882 state
883 }
884
885 fn der_next(&self, i: &super::Integer<'a>, state: &mut IntegerDerState) -> (next: Option<u8>) {
886 if state.pos == state.len {
887 None
888 } else {
889 let byte = match i {
890 super::Integer::Small { v: _v } => {
891 proof {
892 crate::asn1::integer::lemma_integer_small_view(*_v);
893 }
894 state.bytes[state.pos]
895 },
896 super::Integer::Big { raw } => {
897 let bytes = raw.as_slice();
898 proof {
899 use_type_invariant(raw);
900 crate::asn1::integer::lemma_large_integer_outside_i64(raw.view());
901 crate::asn1::integer::lemma_integer_big_view(*raw);
902 crate::asn1::integer::lemma_integer_from_to_bytes(bytes.deep_view());
903 }
904 bytes[state.pos]
905 },
906 };
907 state.pos += 1;
908 Some(byte)
909 }
910 }
911}
912
913impl DerState for EnumeratedFmt {
914 type State = IntegerDerState;
915}
916
917impl<'a> DerOrd<Integer<'a>> for EnumeratedFmt {
918 proof fn lemma_der_serialize_len(&self, value: int) {
919 IntegerFmt.lemma_der_serialize_len(value);
920 }
921
922 open spec fn der_remaining(&self, value: int, state: IntegerDerState) -> Seq<u8> {
923 IntegerFmt.der_remaining(value, state)
924 }
925
926 open spec fn der_state_valid(&self, value: int, state: IntegerDerState) -> bool {
927 IntegerFmt.der_state_valid(value, state)
928 }
929
930 fn der_start(&self, i: &Integer<'a>) -> (state: IntegerDerState) {
931 let state = IntegerFmt.der_start(i);
932 proof {
933 good_start!(self, i.deep_view(), state);
934 }
935 state
936 }
937
938 fn der_next(&self, i: &Integer<'a>, state: &mut IntegerDerState) -> (next: Option<u8>) {
939 IntegerFmt.der_next(i, state)
940 }
941}
942
943#[derive(Copy, Clone, Default)]
945pub struct BytesDerState {
946 pub pos: usize,
947}
948
949impl DerState for Tail {
950 type State = BytesDerState;
951}
952
953impl DerOrd<[u8]> for Tail {
954 proof fn lemma_der_serialize_len(&self, value: Seq<u8>) {
955 }
956
957 open spec fn der_remaining(&self, value: Seq<u8>, state: BytesDerState) -> Seq<u8> {
958 value.skip(state.pos as int)
959 }
960
961 open spec fn der_state_valid(&self, value: Seq<u8>, state: BytesDerState) -> bool {
962 state.pos <= value.len()
963 }
964
965 fn der_start(&self, b: &[u8]) -> (state: BytesDerState) {
966 let state = BytesDerState { pos: 0 };
967 proof {
968 assert(<Self as DerOrd<[u8]>>::der_remaining(self, b@, state) == self.spec_serialize(
969 b@,
970 ));
971 assert(<Self as DerOrd<[u8]>>::der_state_valid(self, b@, state));
972 }
973 state
974 }
975
976 fn der_next(&self, b: &[u8], state: &mut BytesDerState) -> (next: Option<u8>) {
977 if state.pos == b.len() {
978 None
979 } else {
980 let byte = b[state.pos];
981 state.pos += 1;
982 Some(byte)
983 }
984 }
985}
986
987impl<'a> DerOrd<&'a [u8]> for Tail {
988 proof fn lemma_der_serialize_len(&self, value: Seq<u8>) {
989 }
990
991 open spec fn der_remaining(&self, value: Seq<u8>, state: BytesDerState) -> Seq<u8> {
992 value.skip(state.pos as int)
993 }
994
995 open spec fn der_state_valid(&self, value: Seq<u8>, state: BytesDerState) -> bool {
996 state.pos <= value.len()
997 }
998
999 fn der_start(&self, b: &&'a [u8]) -> (state: BytesDerState) {
1000 let state = BytesDerState { pos: 0 };
1001 proof {
1002 assert(<Self as DerOrd<&'a [u8]>>::der_remaining(self, b.deep_view(), state)
1003 == self.spec_serialize(b.deep_view()));
1004 assert(<Self as DerOrd<&'a [u8]>>::der_state_valid(self, b.deep_view(), state));
1005 }
1006 state
1007 }
1008
1009 fn der_next(&self, b: &&'a [u8], state: &mut BytesDerState) -> (next: Option<u8>) {
1010 if state.pos == b.len() {
1011 None
1012 } else {
1013 let byte = b[state.pos];
1014 state.pos += 1;
1015 Some(byte)
1016 }
1017 }
1018}
1019
1020impl DerState for RealFmt<true> {
1021 type State = BytesDerState;
1022}
1023
1024impl<'a> DerOrd<Real<'a, true>> for RealFmt<true> {
1025 proof fn lemma_der_serialize_len(&self, value: Seq<u8>) {
1026 assert(self.serialize_inv());
1027 self.lemma_serialize_len(value);
1028 }
1029
1030 open spec fn der_remaining(&self, value: Seq<u8>, state: BytesDerState) -> Seq<u8> {
1031 self.spec_serialize(value).skip(state.pos as int)
1032 }
1033
1034 open spec fn der_state_valid(&self, value: Seq<u8>, state: BytesDerState) -> bool {
1035 state.pos <= self.spec_serialize(value).len()
1036 }
1037
1038 fn der_start(&self, r: &Real<'a, true>) -> (state: BytesDerState) {
1039 let bytes = r.contents();
1040 let state = BytesDerState { pos: 0 };
1041 proof {
1042 good_start!(self, r.deep_view(), state);
1043 }
1044 state
1045 }
1046
1047 fn der_next(&self, r: &Real<'a, true>, state: &mut BytesDerState) -> (next: Option<u8>) {
1048 let bytes = r.contents();
1049 if state.pos == bytes.len() {
1050 None
1051 } else {
1052 let byte = bytes[state.pos];
1053 state.pos += 1;
1054 Some(byte)
1055 }
1056 }
1057}
1058
1059impl DerState for Utf8StringFmt {
1060 type State = BytesDerState;
1061}
1062
1063impl<'a> DerOrd<&'a str> for Utf8StringFmt {
1064 proof fn lemma_der_serialize_len(&self, value: Seq<char>) {
1065 assert(self.serialize_inv());
1066 self.lemma_serialize_len(value);
1067 }
1068
1069 open spec fn der_remaining(&self, value: Seq<char>, state: BytesDerState) -> Seq<u8> {
1070 self.spec_serialize(value).skip(state.pos as int)
1071 }
1072
1073 open spec fn der_state_valid(&self, value: Seq<char>, state: BytesDerState) -> bool {
1074 state.pos <= self.spec_serialize(value).len()
1075 }
1076
1077 fn der_start(&self, s: &&'a str) -> (state: BytesDerState) {
1078 let bytes = s.as_bytes();
1079 let state = BytesDerState { pos: 0 };
1080 proof {
1081 good_start!(self, s.deep_view(), state);
1082 }
1083 state
1084 }
1085
1086 fn der_next(&self, s: &&'a str, state: &mut BytesDerState) -> (next: Option<u8>) {
1087 let bytes = s.as_bytes();
1088 if state.pos == bytes.len() {
1089 None
1090 } else {
1091 let byte = bytes[state.pos];
1092 state.pos += 1;
1093 Some(byte)
1094 }
1095 }
1096}
1097
1098impl DerState for PrintableStringFmt {
1099 type State = BytesDerState;
1100}
1101
1102impl<'a> DerOrd<PrintableString<'a>> for PrintableStringFmt {
1103 proof fn lemma_der_serialize_len(&self, value: PrintableStringSpec) {
1104 assert(self.serialize_inv());
1105 self.lemma_serialize_len(value);
1106 }
1107
1108 open spec fn der_remaining(&self, value: PrintableStringSpec, state: BytesDerState) -> Seq<u8> {
1109 self.spec_serialize(value).skip(state.pos as int)
1110 }
1111
1112 open spec fn der_state_valid(&self, value: PrintableStringSpec, state: BytesDerState) -> bool {
1113 state.pos <= self.spec_serialize(value).len()
1114 }
1115
1116 fn der_start(&self, s: &PrintableString<'a>) -> (state: BytesDerState) {
1117 let inner = s.inner();
1118 let bytes = inner.as_bytes();
1119 let state = BytesDerState { pos: 0 };
1120 proof {
1121 good_start!(self, s.deep_view(), state);
1122 }
1123 state
1124 }
1125
1126 fn der_next(&self, s: &PrintableString<'a>, state: &mut BytesDerState) -> (next: Option<u8>) {
1127 let inner = s.inner();
1128 let bytes = inner.as_bytes();
1129 if state.pos == bytes.len() {
1130 None
1131 } else {
1132 let byte = bytes[state.pos];
1133 state.pos += 1;
1134 Some(byte)
1135 }
1136 }
1137}
1138
1139impl DerState for Ia5StringFmt {
1140 type State = BytesDerState;
1141}
1142
1143impl<'a> DerOrd<Ia5String<'a>> for Ia5StringFmt {
1144 proof fn lemma_der_serialize_len(&self, value: Ia5StringSpec) {
1145 assert(self.serialize_inv());
1146 self.lemma_serialize_len(value);
1147 }
1148
1149 open spec fn der_remaining(&self, value: Ia5StringSpec, state: BytesDerState) -> Seq<u8> {
1150 self.spec_serialize(value).skip(state.pos as int)
1151 }
1152
1153 open spec fn der_state_valid(&self, value: Ia5StringSpec, state: BytesDerState) -> bool {
1154 state.pos <= self.spec_serialize(value).len()
1155 }
1156
1157 fn der_start(&self, s: &Ia5String<'a>) -> (state: BytesDerState) {
1158 let inner = s.inner();
1159 let bytes = inner.as_bytes();
1160 let state = BytesDerState { pos: 0 };
1161 proof {
1162 good_start!(self, s.deep_view(), state);
1163 }
1164 state
1165 }
1166
1167 fn der_next(&self, s: &Ia5String<'a>, state: &mut BytesDerState) -> (next: Option<u8>) {
1168 let inner = s.inner();
1169 let bytes = inner.as_bytes();
1170 if state.pos == bytes.len() {
1171 None
1172 } else {
1173 let byte = bytes[state.pos];
1174 state.pos += 1;
1175 Some(byte)
1176 }
1177 }
1178}
1179
1180impl DerState for TeletexStringFmt {
1181 type State = BytesDerState;
1182}
1183
1184impl<'a> DerOrd<TeletexString<'a>> for TeletexStringFmt {
1185 proof fn lemma_der_serialize_len(&self, value: TeletexStringSpec) {
1186 assert(self.serialize_inv());
1187 self.lemma_serialize_len(value);
1188 }
1189
1190 open spec fn der_remaining(&self, value: TeletexStringSpec, state: BytesDerState) -> Seq<u8> {
1191 self.spec_serialize(value).skip(state.pos as int)
1192 }
1193
1194 open spec fn der_state_valid(&self, value: TeletexStringSpec, state: BytesDerState) -> bool {
1195 state.pos <= self.spec_serialize(value).len()
1196 }
1197
1198 fn der_start(&self, s: &TeletexString<'a>) -> (state: BytesDerState) {
1199 let inner = s.inner();
1200 let bytes = inner.as_bytes();
1201 let state = BytesDerState { pos: 0 };
1202 proof {
1203 good_start!(self, s.deep_view(), state);
1204 }
1205 state
1206 }
1207
1208 fn der_next(&self, s: &TeletexString<'a>, state: &mut BytesDerState) -> (next: Option<u8>) {
1209 let inner = s.inner();
1210 let bytes = inner.as_bytes();
1211 if state.pos == bytes.len() {
1212 None
1213 } else {
1214 let byte = bytes[state.pos];
1215 state.pos += 1;
1216 Some(byte)
1217 }
1218 }
1219}
1220
1221impl DerState for U8 {
1222 type State = bool;
1223}
1224
1225impl DerOrd<u8> for U8 {
1226 proof fn lemma_der_serialize_len(&self, value: u8) {
1227 }
1228
1229 open spec fn der_remaining(&self, value: u8, state: bool) -> Seq<u8> {
1230 if state {
1231 Seq::empty()
1232 } else {
1233 seq![value]
1234 }
1235 }
1236
1237 open spec fn der_state_valid(&self, _value: u8, _state: bool) -> bool {
1238 true
1239 }
1240
1241 fn der_start(&self, v: &u8) -> (state: bool) {
1242 let state = false;
1243 proof {
1244 good_start!(self, *v, state);
1245 }
1246 state
1247 }
1248
1249 fn der_next(&self, v: &u8, state: &mut bool) -> (next: Option<u8>) {
1250 if *state {
1251 None
1252 } else {
1253 *state = true;
1254 Some(*v)
1255 }
1256 }
1257}
1258
1259impl DerState for Eof {
1260 type State = bool;
1261}
1262
1263impl DerOrd<()> for Eof {
1264 proof fn lemma_der_serialize_len(&self, _value: ()) {
1265 }
1266
1267 open spec fn der_remaining(&self, _value: (), _state: bool) -> Seq<u8> {
1268 Seq::empty()
1269 }
1270
1271 open spec fn der_state_valid(&self, _value: (), _state: bool) -> bool {
1272 true
1273 }
1274
1275 fn der_start(&self, _v: &()) -> (state: bool) {
1276 let state = false;
1277 proof {
1278 good_start!(self, *_v, state);
1279 }
1280 state
1281 }
1282
1283 fn der_next(&self, _v: &(), _state: &mut bool) -> (next: Option<u8>) {
1284 None
1285 }
1286}
1287
1288impl DerState for Empty {
1289 type State = bool;
1290}
1291
1292impl DerOrd<()> for Empty {
1293 proof fn lemma_der_serialize_len(&self, _value: ()) {
1294 }
1295
1296 open spec fn der_remaining(&self, _value: (), _state: bool) -> Seq<u8> {
1297 Seq::empty()
1298 }
1299
1300 open spec fn der_state_valid(&self, _value: (), _state: bool) -> bool {
1301 true
1302 }
1303
1304 fn der_start(&self, _v: &()) -> (state: bool) {
1305 let state = false;
1306 proof {
1307 good_start!(self, *_v, state);
1308 }
1309 state
1310 }
1311
1312 fn der_next(&self, _v: &(), _state: &mut bool) -> (next: Option<u8>) {
1313 None
1314 }
1315}
1316
1317#[verifier::allow(autoderive_clone_without_spec)]
1319#[derive(Copy, Clone, Default)]
1320pub struct PairDerState<Left, Right> {
1321 pub left: Left,
1322 pub right: Right,
1323 pub in_left: bool,
1324}
1325
1326impl<A: DerState, B: DerState> DerState for Pair<A, B> {
1327 type State = PairDerState<A::State, B::State>;
1328}
1329
1330impl<A, B, TA, TB> DerOrd<(TA, TB)> for Pair<A, B> where
1331 TA: DeepView,
1332 TB: DeepView,
1333 A: DerOrd<TA>,
1334 B: DerOrd<TB>,
1335 {
1336 proof fn lemma_der_serialize_len(&self, value: (TA::V, TB::V)) {
1337 self.0.lemma_der_serialize_len(value.0);
1338 self.1.lemma_der_serialize_len(value.1);
1339 }
1340
1341 open spec fn der_remaining(
1342 &self,
1343 value: (TA::V, TB::V),
1344 state: PairDerState<A::State, B::State>,
1345 ) -> Seq<u8> {
1346 if state.in_left {
1347 self.0.der_remaining(value.0, state.left) + self.1.der_remaining(value.1, state.right)
1348 } else {
1349 self.1.der_remaining(value.1, state.right)
1350 }
1351 }
1352
1353 open spec fn der_state_valid(
1354 &self,
1355 value: (TA::V, TB::V),
1356 state: PairDerState<A::State, B::State>,
1357 ) -> bool {
1358 &&& self.0.der_state_valid(value.0, state.left)
1359 &&& self.1.der_state_valid(value.1, state.right)
1360 &&& !state.in_left ==> self.0.der_remaining(value.0, state.left).len() == 0
1361 }
1362
1363 fn der_start(&self, v: &(TA, TB)) -> (state: PairDerState<A::State, B::State>) {
1364 let left = self.0.der_start(&v.0);
1365 let right = self.1.der_start(&v.1);
1366 let state = PairDerState { left, right, in_left: true };
1367 proof {
1368 good_start!(self, v.deep_view(), state);
1369 }
1370 state
1371 }
1372
1373 fn der_next(&self, v: &(TA, TB), state: &mut PairDerState<A::State, B::State>) -> (next: Option<
1374 u8,
1375 >) {
1376 if state.in_left {
1377 match self.0.der_next(&v.0, &mut state.left) {
1378 Some(byte) => {
1379 return Some(byte);
1380 },
1381 None => state.in_left = false,
1382 }
1383 }
1384 let next = self.1.der_next(&v.1, &mut state.right);
1385 next
1386 }
1387}
1388
1389impl DerState for BitStringFmt<true> {
1390 type State = PairDerState<bool, BytesDerState>;
1391}
1392
1393impl<'a> DerOrd<BitString<'a, true>> for BitStringFmt<true> {
1394 proof fn lemma_der_serialize_len(&self, value: BitStringSpec) {
1395 <Pair<U8, Tail> as DerOrd<(u8, &'a [u8])>>::lemma_der_serialize_len(
1396 &Pair(U8, Tail),
1397 (value.unused, value.bits),
1398 );
1399 crate::asn1::bitstring::lemma_bit_string_fmt_serialization::<true>(value);
1400 }
1401
1402 open spec fn der_remaining(
1403 &self,
1404 value: BitStringSpec,
1405 state: PairDerState<bool, BytesDerState>,
1406 ) -> Seq<u8> {
1407 <Pair<U8, Tail> as DerOrd<(u8, &'a [u8])>>::der_remaining(
1408 &Pair(U8, Tail),
1409 (value.unused, value.bits),
1410 state,
1411 )
1412 }
1413
1414 open spec fn der_state_valid(
1415 &self,
1416 value: BitStringSpec,
1417 state: PairDerState<bool, BytesDerState>,
1418 ) -> bool {
1419 <Pair<U8, Tail> as DerOrd<(u8, &'a [u8])>>::der_state_valid(
1420 &Pair(U8, Tail),
1421 (value.unused, value.bits),
1422 state,
1423 )
1424 }
1425
1426 fn der_start(&self, b: &BitString<'a, true>) -> (state: PairDerState<bool, BytesDerState>) {
1427 let pair = (b.unused(), b.bits());
1428 proof {
1429 crate::asn1::bitstring::lemma_bit_string_fmt_serialization::<true>(b.deep_view());
1430 }
1431 let state = Pair(U8, Tail).der_start(&pair);
1432 proof {
1433 good_start!(self, b.deep_view(), state);
1434 }
1435 state
1436 }
1437
1438 fn der_next(
1439 &self,
1440 b: &BitString<'a, true>,
1441 state: &mut PairDerState<bool, BytesDerState>,
1442 ) -> (next: Option<u8>) {
1443 let pair = (b.unused(), b.bits());
1444 let next = Pair(U8, Tail).der_next(&pair, state);
1445 next
1446 }
1447}
1448
1449type AnyDerInnerFmt = Pair<TagFmt, Pair<LengthFmt<true>, Tail>>;
1450
1451pub type AnyDerState = PairDerState<TagDerState, PairDerState<LengthDerState, BytesDerState>>;
1452
1453impl DerState for AnyFmt<true> {
1454 type State = AnyDerState;
1455}
1456
1457impl<'a> DerOrd<Any<'a>> for AnyFmt<true> {
1458 proof fn lemma_der_serialize_len(&self, value: AnySpec) {
1459 <AnyDerInnerFmt as DerOrd<(Tag, (usize, &'a [u8]))>>::lemma_der_serialize_len(
1460 &Pair(TagFmt, Pair(LengthFmt::<true>, Tail)),
1461 (value.tag, (value.content.len() as usize, value.content)),
1462 );
1463 }
1464
1465 open spec fn der_remaining(&self, value: AnySpec, state: AnyDerState) -> Seq<u8> {
1466 <AnyDerInnerFmt as DerOrd<(Tag, (usize, &'a [u8]))>>::der_remaining(
1467 &Pair(TagFmt, Pair(LengthFmt::<true>, Tail)),
1468 (value.tag, (value.content.len() as usize, value.content)),
1469 state,
1470 )
1471 }
1472
1473 open spec fn der_state_valid(&self, value: AnySpec, state: AnyDerState) -> bool {
1474 <AnyDerInnerFmt as DerOrd<(Tag, (usize, &'a [u8]))>>::der_state_valid(
1475 &Pair(TagFmt, Pair(LengthFmt::<true>, Tail)),
1476 (value.tag, (value.content.len() as usize, value.content)),
1477 state,
1478 )
1479 }
1480
1481 fn der_start(&self, a: &Any<'a>) -> (state: AnyDerState) {
1482 let tag = a.tag();
1483 let content = a.content();
1484 let len = content.len();
1485 let pair = (tag, (len, content));
1486 let state = Pair(TagFmt, Pair(LengthFmt::<true>, Tail)).der_start(&pair);
1487 proof {
1488 good_start!(self, a.deep_view(), state);
1489 }
1490 state
1491 }
1492
1493 fn der_next(&self, a: &Any<'a>, state: &mut AnyDerState) -> (next: Option<u8>) {
1494 let tag = a.tag();
1495 let content = a.content();
1496 let len = content.len();
1497 let pair = (tag, (len, content));
1498 let next = Pair(TagFmt, Pair(LengthFmt::<true>, Tail)).der_next(&pair, state);
1499 next
1500 }
1501}
1502
1503#[verifier::allow(autoderive_clone_without_spec)]
1505#[derive(Copy, Clone)]
1506pub enum ChoiceDerState<Left, Right> {
1507 Left(Left),
1508 Right(Right),
1509}
1510
1511impl<Left: Default, Right> Default for ChoiceDerState<Left, Right> {
1512 fn default() -> (state: Self) {
1513 ChoiceDerState::Left(Left::default())
1514 }
1515}
1516
1517impl<A: DerState, B: DerState> DerState for Choice<A, B> {
1518 type State = ChoiceDerState<A::State, B::State>;
1519}
1520
1521impl<A, B, TA, TB> DerOrd<Sum<TA, TB>> for Choice<A, B> where
1522 TA: DeepView,
1523 TB: DeepView,
1524 A: DerOrd<TA>,
1525 B: DerOrd<TB>,
1526 {
1527 proof fn lemma_der_serialize_len(&self, value: Sum<TA::V, TB::V>) {
1528 match value {
1529 Sum::Inl(value) => self.0.lemma_der_serialize_len(value),
1530 Sum::Inr(value) => self.1.lemma_der_serialize_len(value),
1531 }
1532 }
1533
1534 open spec fn der_remaining(
1535 &self,
1536 value: Sum<TA::V, TB::V>,
1537 state: ChoiceDerState<A::State, B::State>,
1538 ) -> Seq<u8> {
1539 match (value, state) {
1540 (Sum::Inl(value), ChoiceDerState::Left(state)) => { self.0.der_remaining(value, state)
1541 },
1542 (Sum::Inr(value), ChoiceDerState::Right(state)) => { self.1.der_remaining(value, state)
1543 },
1544 _ => Seq::empty(),
1545 }
1546 }
1547
1548 open spec fn der_state_valid(
1549 &self,
1550 value: Sum<TA::V, TB::V>,
1551 state: ChoiceDerState<A::State, B::State>,
1552 ) -> bool {
1553 match (value, state) {
1554 (Sum::Inl(value), ChoiceDerState::Left(state)) => { self.0.der_state_valid(value, state)
1555 },
1556 (Sum::Inr(value), ChoiceDerState::Right(state)) => {
1557 self.1.der_state_valid(value, state)
1558 },
1559 _ => false,
1560 }
1561 }
1562
1563 fn der_start(&self, v: &Sum<TA, TB>) -> (state: ChoiceDerState<A::State, B::State>) {
1564 let state = match v {
1565 Sum::Inl(value) => ChoiceDerState::Left(self.0.der_start(value)),
1566 Sum::Inr(value) => ChoiceDerState::Right(self.1.der_start(value)),
1567 };
1568 proof {
1569 good_start!(self, v.deep_view(), state);
1570 }
1571 state
1572 }
1573
1574 fn der_next(&self, v: &Sum<TA, TB>, state: &mut ChoiceDerState<A::State, B::State>) -> (next:
1575 Option<u8>) {
1576 let next = match (v, &mut *state) {
1577 (Sum::Inl(value), ChoiceDerState::Left(state)) => self.0.der_next(value, state),
1578 (Sum::Inr(value), ChoiceDerState::Right(state)) => self.1.der_next(value, state),
1579 _ => {
1580 proof {
1581 assert(false);
1582 }
1583 None
1584 },
1585 };
1586 next
1587 }
1588}
1589
1590#[verifier::allow(autoderive_clone_without_spec)]
1592#[derive(Copy, Clone)]
1593pub enum OptDerState<Inner> {
1594 Some(Inner),
1595 None,
1596}
1597
1598impl<Inner> Default for OptDerState<Inner> {
1599 fn default() -> (state: Self) {
1600 OptDerState::None
1601 }
1602}
1603
1604impl<A: DerState> DerState for Opt<A> {
1605 type State = OptDerState<A::State>;
1606}
1607
1608impl<A, T> DerOrd<Option<T>> for Opt<A> where T: DeepView, A: DerOrd<T> {
1609 proof fn lemma_der_serialize_len(&self, value: Option<T::V>) {
1610 if let Some(value) = value {
1611 self.0.lemma_der_serialize_len(value);
1612 }
1613 }
1614
1615 open spec fn der_remaining(&self, value: Option<T::V>, state: OptDerState<A::State>) -> Seq<
1616 u8,
1617 > {
1618 match (value, state) {
1619 (Some(value), OptDerState::Some(state)) => self.0.der_remaining(value, state),
1620 (None, OptDerState::None) => Seq::empty(),
1621 _ => Seq::empty(),
1622 }
1623 }
1624
1625 open spec fn der_state_valid(&self, value: Option<T::V>, state: OptDerState<A::State>) -> bool {
1626 match (value, state) {
1627 (Some(value), OptDerState::Some(state)) => self.0.der_state_valid(value, state),
1628 (None, OptDerState::None) => true,
1629 _ => false,
1630 }
1631 }
1632
1633 fn der_start(&self, o: &Option<T>) -> (state: OptDerState<A::State>) {
1634 let state = match o {
1635 Some(value) => OptDerState::Some(self.0.der_start(value)),
1636 None => OptDerState::None,
1637 };
1638 proof {
1639 good_start!(self, o.deep_view(), state);
1640 }
1641 state
1642 }
1643
1644 fn der_next(&self, o: &Option<T>, state: &mut OptDerState<A::State>) -> (next: Option<u8>) {
1645 let next = match (o, &mut *state) {
1646 (Some(value), OptDerState::Some(state)) => self.0.der_next(value, state),
1647 (None, OptDerState::None) => None,
1648 _ => {
1649 proof {
1650 assert(false);
1651 }
1652 None
1653 },
1654 };
1655 next
1656 }
1657}
1658
1659impl<A: DerState, B: DerState> DerState for Optional<A, B> {
1660 type State = PairDerState<OptDerState<A::State>, B::State>;
1661}
1662
1663impl<A, B, TA, TB> DerOrd<(Option<TA>, TB)> for Optional<A, B> where
1664 TA: DeepView,
1665 TB: DeepView,
1666 A: DerOrd<TA>,
1667 B: DerOrd<TB>,
1668 {
1669 proof fn lemma_der_serialize_len(&self, value: (Option<TA::V>, TB::V)) {
1670 if let Some(left) = value.0 {
1671 self.0.lemma_der_serialize_len(left);
1672 }
1673 self.1.lemma_der_serialize_len(value.1);
1674 }
1675
1676 open spec fn der_remaining(
1677 &self,
1678 value: (Option<TA::V>, TB::V),
1679 state: PairDerState<OptDerState<A::State>, B::State>,
1680 ) -> Seq<u8> {
1681 if state.in_left {
1682 (match (&value.0, &state.left) {
1683 (Some(value), OptDerState::Some(inner)) => { self.0.der_remaining(*value, *inner) },
1684 (None, OptDerState::None) => Seq::empty(),
1685 _ => Seq::empty(),
1686 }) + self.1.der_remaining(value.1, state.right)
1687 } else {
1688 self.1.der_remaining(value.1, state.right)
1689 }
1690 }
1691
1692 open spec fn der_state_valid(
1693 &self,
1694 value: (Option<TA::V>, TB::V),
1695 state: PairDerState<OptDerState<A::State>, B::State>,
1696 ) -> bool {
1697 &&& match (&value.0, &state.left) {
1698 (Some(value), OptDerState::Some(inner)) => self.0.der_state_valid(*value, *inner),
1699 (None, OptDerState::None) => true,
1700 _ => false,
1701 }
1702 &&& self.1.der_state_valid(value.1, state.right)
1703 &&& !state.in_left ==> {
1704 match (&value.0, &state.left) {
1705 (Some(value), OptDerState::Some(inner)) => {
1706 self.0.der_remaining(*value, *inner).len() == 0
1707 },
1708 (None, OptDerState::None) => true,
1709 _ => false,
1710 }
1711 }
1712 }
1713
1714 fn der_start(&self, o: &(Option<TA>, TB)) -> (state: PairDerState<
1715 OptDerState<A::State>,
1716 B::State,
1717 >) {
1718 let left = match &o.0 {
1719 Some(value) => OptDerState::Some(self.0.der_start(value)),
1720 None => OptDerState::None,
1721 };
1722 let right = self.1.der_start(&o.1);
1723 let state = PairDerState { left, right, in_left: true };
1724 proof {
1725 good_start!(self, o.deep_view(), state);
1726 }
1727 state
1728 }
1729
1730 fn der_next(
1731 &self,
1732 o: &(Option<TA>, TB),
1733 state: &mut PairDerState<OptDerState<A::State>, B::State>,
1734 ) -> (next: Option<u8>) {
1735 if state.in_left {
1736 let field = match (&o.0, &mut state.left) {
1737 (Some(value), OptDerState::Some(inner)) => self.0.der_next(value, inner),
1738 (None, OptDerState::None) => None,
1739 _ => {
1740 proof {
1741 assert(false);
1742 }
1743 None
1744 },
1745 };
1746 match field {
1747 Some(byte) => {
1748 return Some(byte);
1749 },
1750 None => state.in_left = false,
1751 }
1752 }
1753 let next = self.1.der_next(&o.1, &mut state.right);
1754 next
1755 }
1756}
1757
1758#[verifier::allow(autoderive_clone_without_spec)]
1760#[derive(Copy, Clone, Default)]
1761pub struct StarDerState<Inner> {
1762 pub index: usize,
1763 pub current: Inner,
1764}
1765
1766impl<A: DerState> DerState for Star<A> {
1767 type State = StarDerState<A::State>;
1768}
1769
1770broadcast proof fn lemma_star_consistent_index<A: Consistency>(
1771 inner: A,
1772 values: Seq<A::Val>,
1773 index: int,
1774)
1775 requires
1776 Star(inner).consistent(values),
1777 0 <= index < values.len(),
1778 ensures
1779 #[trigger] inner.consistent(values[index]),
1780{
1781 reveal(<Star<_> as Consistency>::consistent);
1782}
1783
1784proof fn lemma_star_der_serialize_len<A, T>(inner: A, values: Seq<T::V>) where
1785 T: DeepView,
1786 A: DerOrd<T> + Copy,
1787
1788 requires
1789 Star(inner).consistent(values),
1790 ensures
1791 Star(inner).spec_serialize(values).len() == Star(inner).byte_len(values),
1792 decreases values.len(),
1793{
1794 reveal(<Star<_> as Consistency>::consistent);
1795 reveal(<Star<_> as SpecSerializer>::spec_serialize);
1796 reveal(<Star<_> as SpecByteLen>::byte_len);
1797 broadcast use lemma_star_consistent_index;
1798
1799 if values.len() > 0 {
1800 let prefix = values.drop_last();
1801 let last = values.last();
1802 lemma_star_der_serialize_len::<A, T>(inner, prefix);
1803 inner.lemma_der_serialize_len(last);
1804 }
1805}
1806
1807#[cfg(feature = "alloc")]
1808impl<A, T> DerOrd<Vec<T>> for Star<A> where T: DeepView, A: DerOrd<T> + Copy {
1809 proof fn lemma_der_serialize_len(&self, vs: Seq<T::V>) {
1810 lemma_star_der_serialize_len::<A, T>(self.0, vs);
1811 }
1812
1813 open spec fn der_remaining(&self, vs: Seq<T::V>, state: StarDerState<A::State>) -> Seq<u8> {
1814 if state.index < vs.len() {
1815 self.0.der_remaining(vs[state.index as int], state.current) + Star(
1816 self.0,
1817 ).spec_serialize(vs.skip(state.index as int + 1))
1818 } else {
1819 Seq::empty()
1820 }
1821 }
1822
1823 open spec fn der_state_valid(&self, vs: Seq<T::V>, state: StarDerState<A::State>) -> bool {
1824 &&& state.index <= vs.len()
1825 &&& state.index < vs.len() ==> {
1826 self.0.der_state_valid(vs[state.index as int], state.current)
1827 }
1828 }
1829
1830 fn der_start(&self, v: &Vec<T>) -> (state: StarDerState<A::State>) {
1831 reveal(<Star<_> as SpecSerializer>::spec_serialize);
1832
1833 let state = if v.len() == 0 {
1834 let current = A::State::default();
1835 StarDerState { index: 0, current }
1836 } else {
1837 proof {
1838 lemma_star_consistent_index(self.0, v.deep_view(), 0);
1839 }
1840 let state = StarDerState { index: 0, current: self.0.der_start(&v[0]) };
1841 proof {
1842 let vv = v.deep_view();
1843 Star(self.0).lemma_spec_serialize_suffix_step(vv, 0);
1844 assert(self.0.der_remaining(vv[0], state.current) == self.0.spec_serialize(vv[0]));
1845 assert(vv.skip(0) == vv);
1846 }
1847 state
1848 };
1849 proof {
1850 good_start!(self, v.deep_view(), state);
1851 }
1852 state
1853 }
1854
1855 #[verifier::loop_isolation(false)]
1856 fn der_next(&self, v: &Vec<T>, state: &mut StarDerState<A::State>) -> (next: Option<u8>) {
1857 broadcast use lemma_star_consistent_index;
1858
1859 let ghost vv = v.deep_view();
1860
1861 loop
1862 invariant
1863 self.der_state_valid(vv, *state),
1864 self.der_remaining(vv, *state) == self.der_remaining(vv, *old(state)),
1865 state.index <= v.len(),
1866 decreases v.len() - state.index,
1867 {
1868 if state.index == v.len() {
1869 return None;
1870 }
1871 let idx = state.index;
1872 if let Some(byte) = self.0.der_next(&v[idx], &mut state.current) {
1873 return Some(byte);
1874 } else {
1875 let new_idx = idx + 1;
1876 state.index = new_idx;
1877 if new_idx < v.len() {
1878 proof {
1879 lemma_star_consistent_index(self.0, vv, new_idx as int);
1880 }
1881 state.current = self.0.der_start(&v[new_idx]);
1882 }
1883 proof {
1884 if new_idx < vv.len() {
1885 assert(self.0.der_remaining(vv[new_idx as int], state.current)
1886 == self.0.spec_serialize(vv[new_idx as int]));
1887 Star(self.0).lemma_spec_serialize_suffix_step(vv, new_idx as int);
1888 } else {
1889 reveal(<Star<_> as SpecSerializer>::spec_serialize);
1890 }
1891 }
1892 }
1893 }
1894 }
1895}
1896
1897impl<Inner: DerState, P> DerState for Refined<Inner, P> {
1898 type State = Inner::State;
1899}
1900
1901impl<Inner, P, T> DerOrd<T> for Refined<Inner, P> where T: DeepView, Inner: DerOrd<T>, P: Pred<T> {
1902 proof fn lemma_der_serialize_len(&self, value: T::V) {
1903 self.0.lemma_der_serialize_len(value);
1904 }
1905
1906 open spec fn der_remaining(&self, value: T::V, state: Inner::State) -> Seq<u8> {
1907 self.0.der_remaining(value, state)
1908 }
1909
1910 open spec fn der_state_valid(&self, value: T::V, state: Inner::State) -> bool {
1911 self.0.der_state_valid(value, state)
1912 }
1913
1914 fn der_start(&self, v: &T) -> (state: Inner::State) {
1915 let state = self.0.der_start(v);
1916 proof {
1917 good_start!(self, v.deep_view(), state);
1918 }
1919 state
1920 }
1921
1922 fn der_next(&self, v: &T, state: &mut Inner::State) -> (next: Option<u8>) {
1923 let next = self.0.der_next(v, state);
1924 next
1925 }
1926}
1927
1928impl<Inner: DerState> DerState for Ref<Inner> {
1929 type State = Inner::State;
1930}
1931
1932impl<Inner, T> DerOrd<&T> for Ref<Inner> where T: DeepView + ?Sized, Inner: DerOrd<T> {
1933 proof fn lemma_der_serialize_len(&self, value: T::V) {
1934 self.0.lemma_der_serialize_len(value);
1935 }
1936
1937 open spec fn der_remaining(&self, value: T::V, state: Inner::State) -> Seq<u8> {
1938 self.0.der_remaining(value, state)
1939 }
1940
1941 open spec fn der_state_valid(&self, value: T::V, state: Inner::State) -> bool {
1942 self.0.der_state_valid(value, state)
1943 }
1944
1945 fn der_start(&self, v: &&T) -> (state: Inner::State) {
1946 let state = self.0.der_start(*v);
1947 proof {
1948 good_start!(self, v.deep_view(), state);
1949 }
1950 state
1951 }
1952
1953 fn der_next(&self, v: &&T, state: &mut Inner::State) -> (next: Option<u8>) {
1954 let next = self.0.der_next(*v, state);
1955 next
1956 }
1957}
1958
1959impl<Inner: DerState, M, MRev> DerState for Mapped<Inner, BiMap<M, MRev>> {
1960 type State = Inner::State;
1961}
1962
1963impl<Inner, M, MRev, T> DerOrd<T> for Mapped<Inner, BiMap<M, MRev>> where
1964 T: DeepView,
1965 M: SpecMap<Input = MRev::Output, Output = T::V>,
1966 MRev: SpecMap<Input = T::V> + for <'x>Map<&'x T>,
1967 Inner: DerState,
1968 for <'x>Inner: DerOrd<<MRev as Map<&'x T>>::O>,
1969 {
1970 proof fn lemma_der_serialize_len(&self, value: T::V) {
1971 let inner = self.mapper.1.spec_map(value);
1972 self.inner.lemma_der_serialize_len(inner);
1973 }
1974
1975 open spec fn der_remaining(&self, value: T::V, state: Inner::State) -> Seq<u8> {
1976 self.inner.der_remaining(self.mapper.1.spec_map(value), state)
1977 }
1978
1979 open spec fn der_state_valid(&self, value: T::V, state: Inner::State) -> bool {
1980 self.inner.der_state_valid(self.mapper.1.spec_map(value), state)
1981 }
1982
1983 fn der_start(&self, v: &T) -> (state: Inner::State) {
1984 let inner = self.mapper.1.map(v);
1985 let state = self.inner.der_start(&inner);
1986 proof {
1987 good_start!(self, v.deep_view(), state);
1988 }
1989 state
1990 }
1991
1992 fn der_next(&self, v: &T, state: &mut Inner::State) -> (next: Option<u8>) {
1993 let inner = self.mapper.1.map(v);
1994 let next = self.inner.der_next(&inner, state);
1995 next
1996 }
1997}
1998
1999#[cfg(feature = "alloc")]
2000impl<A: DerState> DerState for RepeatTillEnd<A> {
2001 type State = StarDerState<A::State>;
2002}
2003
2004#[cfg(feature = "alloc")]
2005impl<A, T> DerOrd<Vec<T>> for RepeatTillEnd<A> where T: DeepView, A: DerOrd<T> + Copy {
2006 proof fn lemma_der_serialize_len(&self, values: Seq<T::V>) {
2007 Star(self.0).lemma_der_serialize_len(values);
2008 }
2009
2010 open spec fn der_remaining(&self, values: Seq<T::V>, state: StarDerState<A::State>) -> Seq<u8> {
2011 Star(self.0).der_remaining(values, state)
2012 }
2013
2014 open spec fn der_state_valid(&self, values: Seq<T::V>, state: StarDerState<A::State>) -> bool {
2015 Star(self.0).der_state_valid(values, state)
2016 }
2017
2018 fn der_start(&self, v: &Vec<T>) -> (state: StarDerState<A::State>) {
2019 let state = Star(self.0).der_start(v);
2020 proof {
2021 good_start!(self, v.deep_view(), state);
2022 }
2023 state
2024 }
2025
2026 fn der_next(&self, v: &Vec<T>, state: &mut StarDerState<A::State>) -> (next: Option<u8>) {
2027 let next = Star(self.0).der_next(v, state);
2028 next
2029 }
2030}
2031
2032#[cfg(feature = "alloc")]
2033#[derive(Copy, Clone, Default)]
2034pub struct BmpStringDerState {
2035 pub char_index: usize,
2036 pub second_octet: bool,
2037}
2038
2039#[cfg(feature = "alloc")]
2040impl DerState for BmpStringFmt {
2041 type State = BmpStringDerState;
2042}
2043
2044#[cfg(feature = "alloc")]
2045pub open spec fn bmp_string_der_position(state: BmpStringDerState) -> nat {
2046 state.char_index as nat * 2 + if state.second_octet {
2047 1nat
2048 } else {
2049 0nat
2050 }
2051}
2052
2053#[cfg(feature = "alloc")]
2054impl DerOrd<BmpString> for BmpStringFmt {
2055 proof fn lemma_der_serialize_len(&self, value: BmpStringSpec) {
2056 crate::asn1::bmpstring::lemma_bmp_string_fmt_serialization(value);
2057 }
2058
2059 open spec fn der_remaining(&self, value: BmpStringSpec, state: BmpStringDerState) -> Seq<u8> {
2060 self.spec_serialize(value).skip(bmp_string_der_position(state) as int)
2061 }
2062
2063 open spec fn der_state_valid(&self, value: BmpStringSpec, state: BmpStringDerState) -> bool {
2064 &&& state.char_index <= value.inner.len()
2065 &&& state.char_index == value.inner.len() ==> !state.second_octet
2066 }
2067
2068 fn der_start(&self, s: &BmpString) -> (state: BmpStringDerState) {
2069 let state = BmpStringDerState { char_index: 0, second_octet: false };
2070 proof {
2071 crate::asn1::bmpstring::lemma_bmp_string_fmt_serialization(s.deep_view());
2072 good_start!(self, s.deep_view(), state);
2073 }
2074 state
2075 }
2076
2077 fn der_next(&self, s: &BmpString, state: &mut BmpStringDerState) -> (next: Option<u8>) {
2078 proof {
2079 crate::asn1::bmpstring::lemma_bmp_string_fmt_serialization(s.deep_view());
2080 }
2081 let inner = s.inner();
2082 let len = inner.unicode_len();
2083 if state.char_index == len {
2084 None
2085 } else {
2086 let c = inner.get_char(state.char_index);
2087 let encoded = crate::combinators::uints::exec::u16_to_be_bytes(c as u16);
2088 let byte;
2089 if state.second_octet {
2090 byte = encoded[1];
2091 state.char_index += 1;
2092 state.second_octet = false;
2093 } else {
2094 byte = encoded[0];
2095 state.second_octet = true;
2096 }
2097 Some(byte)
2098 }
2099 }
2100}
2101
2102#[cfg(feature = "alloc")]
2103#[derive(Copy, Clone, Default)]
2104pub struct UniversalStringDerState {
2105 pub char_index: usize,
2106 pub octet_index: u8,
2107}
2108
2109#[cfg(feature = "alloc")]
2110impl DerState for UniversalStringFmt {
2111 type State = UniversalStringDerState;
2112}
2113
2114#[cfg(feature = "alloc")]
2115pub open spec fn universal_string_der_position(state: UniversalStringDerState) -> nat {
2116 state.char_index as nat * 4 + state.octet_index as nat
2117}
2118
2119#[cfg(feature = "alloc")]
2120impl DerOrd<UniversalString> for UniversalStringFmt {
2121 proof fn lemma_der_serialize_len(&self, value: Seq<char>) {
2122 crate::asn1::universalstring::lemma_universal_string_fmt_serialization(value);
2123 }
2124
2125 open spec fn der_remaining(&self, value: Seq<char>, state: UniversalStringDerState) -> Seq<u8> {
2126 self.spec_serialize(value).skip(universal_string_der_position(state) as int)
2127 }
2128
2129 open spec fn der_state_valid(&self, value: Seq<char>, state: UniversalStringDerState) -> bool {
2130 &&& state.char_index <= value.len()
2131 &&& state.octet_index < 4
2132 &&& state.char_index == value.len() ==> state.octet_index == 0
2133 }
2134
2135 fn der_start(&self, value: &UniversalString) -> (state: UniversalStringDerState) {
2136 let state = UniversalStringDerState { char_index: 0, octet_index: 0 };
2137 proof {
2138 crate::asn1::universalstring::lemma_universal_string_fmt_serialization(
2139 value.deep_view(),
2140 );
2141 good_start!(self, value.deep_view(), state);
2142 }
2143 state
2144 }
2145
2146 fn der_next(&self, value: &UniversalString, state: &mut UniversalStringDerState) -> (next:
2147 Option<u8>) {
2148 proof {
2149 crate::asn1::universalstring::lemma_universal_string_fmt_serialization(
2150 value.deep_view(),
2151 );
2152 }
2153 let inner = value.as_str();
2154 let len = inner.unicode_len();
2155 if state.char_index == len {
2156 None
2157 } else {
2158 let c = inner.get_char(state.char_index);
2159 let encoded = crate::combinators::uints::exec::u32_to_be_bytes(c as u32);
2160 let byte = encoded[state.octet_index as usize];
2161 if state.octet_index == 3 {
2162 state.char_index += 1;
2163 state.octet_index = 0;
2164 } else {
2165 state.octet_index += 1;
2166 }
2167 Some(byte)
2168 }
2169 }
2170}
2171
2172#[cfg(feature = "alloc")]
2173pub type ObjectIdentifierDerState = PairDerState<Base128DerState, StarDerState<Base128DerState>>;
2174
2175#[cfg(feature = "alloc")]
2176impl DerState for ObjectIdentifierFmt {
2177 type State = ObjectIdentifierDerState;
2178}
2179
2180#[cfg(feature = "alloc")]
2181impl DerOrd<ObjectIdentifier> for ObjectIdentifierFmt {
2182 proof fn lemma_der_serialize_len(&self, value: ObjectIdentifierSpec) {
2183 <crate::asn1::oid::ObjectIdentifierInnerFmt as DerOrd<
2184 (u64, Vec<u64>),
2185 >>::lemma_der_serialize_len(
2186 &crate::asn1::oid::object_identifier_inner(),
2187 crate::asn1::oid::oid_to_subidentifiers(value),
2188 );
2189 }
2190
2191 open spec fn der_remaining(
2192 &self,
2193 value: ObjectIdentifierSpec,
2194 state: ObjectIdentifierDerState,
2195 ) -> Seq<u8> {
2196 if state.in_left {
2197 Base128Fmt::<true>.der_remaining(
2198 crate::asn1::oid::oid_first_subidentifier(value),
2199 state.left,
2200 ) + RepeatTillEnd(Base128Fmt::<true>).der_remaining(value.rest, state.right)
2201 } else {
2202 RepeatTillEnd(Base128Fmt::<true>).der_remaining(value.rest, state.right)
2203 }
2204 }
2205
2206 open spec fn der_state_valid(
2207 &self,
2208 value: ObjectIdentifierSpec,
2209 state: ObjectIdentifierDerState,
2210 ) -> bool {
2211 &&& Base128Fmt::<true>.der_state_valid(
2212 crate::asn1::oid::oid_first_subidentifier(value),
2213 state.left,
2214 )
2215 &&& RepeatTillEnd(Base128Fmt::<true>).der_state_valid(value.rest, state.right)
2216 &&& !state.in_left ==> Base128Fmt::<true>.der_remaining(
2217 crate::asn1::oid::oid_first_subidentifier(value),
2218 state.left,
2219 ).len() == 0
2220 }
2221
2222 fn der_start(&self, o: &ObjectIdentifier) -> (state: ObjectIdentifierDerState) {
2223 let combined = o.combined_first_subidentifier();
2224 let rest = o.rest_vec();
2225 let left = Base128Fmt::<true>.der_start(&combined);
2226 let right = RepeatTillEnd(Base128Fmt::<true>).der_start(rest);
2227 let state = PairDerState { left, right, in_left: true };
2228 proof {
2229 good_start!(self, o.deep_view(), state);
2230 }
2231 state
2232 }
2233
2234 fn der_next(&self, o: &ObjectIdentifier, state: &mut ObjectIdentifierDerState) -> (next: Option<
2235 u8,
2236 >) {
2237 let combined = o.combined_first_subidentifier();
2238 let rest = o.rest_vec();
2239 if state.in_left {
2240 match Base128Fmt::<true>.der_next(&combined, &mut state.left) {
2241 Some(byte) => {
2242 return Some(byte);
2243 },
2244 None => state.in_left = false,
2245 }
2246 }
2247 let next = RepeatTillEnd(Base128Fmt::<true>).der_next(rest, &mut state.right);
2248 next
2249 }
2250}
2251
2252#[cfg(feature = "alloc")]
2253impl<A: DerState> DerState for SetOfFmt<A> {
2254 type State = StarDerState<A::State>;
2255}
2256
2257#[cfg(feature = "alloc")]
2258impl<A, T> DerOrd<Vec<T>> for SetOfFmt<A> where T: DeepView, A: DerOrd<T> + Copy {
2259 proof fn lemma_der_serialize_len(&self, values: Seq<T::V>) {
2260 Star(self.0).lemma_der_serialize_len(values);
2261 }
2262
2263 open spec fn der_remaining(&self, values: Seq<T::V>, state: StarDerState<A::State>) -> Seq<u8> {
2264 Star(self.0).der_remaining(values, state)
2265 }
2266
2267 open spec fn der_state_valid(&self, values: Seq<T::V>, state: StarDerState<A::State>) -> bool {
2268 Star(self.0).der_state_valid(values, state)
2269 }
2270
2271 fn der_start(&self, v: &Vec<T>) -> (state: StarDerState<A::State>) {
2272 let state = Star(self.0).der_start(v);
2273 proof {
2274 good_start!(self, v.deep_view(), state);
2275 }
2276 state
2277 }
2278
2279 fn der_next(&self, v: &Vec<T>, state: &mut StarDerState<A::State>) -> (next: Option<u8>) {
2280 let next = Star(self.0).der_next(v, state);
2281 next
2282 }
2283}
2284
2285impl<F> DerState for ImplicitlyTaggedFmt<F> where F: Retaggable + DerState {
2286 type State = <F as DerState>::State;
2287}
2288
2289impl<F, T> DerOrd<T> for ImplicitlyTaggedFmt<F> where
2290 T: DeepView + ?Sized,
2291 F: Retaggable + DerOrd<T>,
2292 {
2293 proof fn lemma_der_serialize_len(&self, value: T::V) {
2294 self.1.spec_retagged(self.0).lemma_der_serialize_len(value);
2295 }
2296
2297 open spec fn der_remaining(&self, value: T::V, state: <F as DerState>::State) -> Seq<u8> {
2298 self.1.spec_retagged(self.0).der_remaining(value, state)
2299 }
2300
2301 open spec fn der_state_valid(&self, value: T::V, state: <F as DerState>::State) -> bool {
2302 self.1.spec_retagged(self.0).der_state_valid(value, state)
2303 }
2304
2305 fn der_start(&self, v: &T) -> (state: <F as DerState>::State) {
2306 let retagged = self.1.retagged(self.0);
2307 let state = retagged.der_start(v);
2308 proof {
2309 good_start!(self, v.deep_view(), state);
2310 }
2311 state
2312 }
2313
2314 fn der_next(&self, v: &T, state: &mut <F as DerState>::State) -> (next: Option<u8>) {
2315 let retagged = self.1.retagged(self.0);
2316 let next = retagged.der_next(v, state);
2317 next
2318 }
2319}
2320
2321impl<Field: DerState, Rest: DerState, Default> DerState for DefaultedFmt<
2322 Field,
2323 Default,
2324 Rest,
2325 true,
2326> {
2327 type State = PairDerState<OptDerState<Field::State>, Rest::State>;
2328}
2329
2330impl<Field, Default, Rest, R> DerOrd<(Default, R)> for DefaultedFmt<
2331 Field,
2332 Default,
2333 Rest,
2334 true,
2335> where
2336 Default: DeepViewIdentity + PartialEq + Structural,
2337 R: DeepView,
2338 Field: DerOrd<Default>,
2339 Rest: DerOrd<R>,
2340 {
2341 proof fn lemma_der_serialize_len(&self, value: (Default, R::V)) {
2342 if value.0 != self.1 {
2343 self.0.lemma_der_serialize_len(value.0);
2344 }
2345 self.2.lemma_der_serialize_len(value.1);
2346 }
2347
2348 open spec fn der_remaining(
2349 &self,
2350 value: (Default, R::V),
2351 state: PairDerState<OptDerState<Field::State>, Rest::State>,
2352 ) -> Seq<u8> {
2353 if state.in_left {
2354 (match (&value.0, &state.left) {
2355 (field, OptDerState::Some(inner)) if *field != self.1 => {
2356 self.0.der_remaining(*field, *inner)
2357 },
2358 (field, OptDerState::None) if *field == self.1 => Seq::empty(),
2359 _ => Seq::empty(),
2360 }) + self.2.der_remaining(value.1, state.right)
2361 } else {
2362 self.2.der_remaining(value.1, state.right)
2363 }
2364 }
2365
2366 open spec fn der_state_valid(
2367 &self,
2368 value: (Default, R::V),
2369 state: PairDerState<OptDerState<Field::State>, Rest::State>,
2370 ) -> bool {
2371 &&& match (&value.0, &state.left) {
2372 (field, OptDerState::Some(inner)) if *field != self.1 => {
2373 self.0.der_state_valid(*field, *inner)
2374 },
2375 (field, OptDerState::None) if *field == self.1 => true,
2376 _ => false,
2377 }
2378 &&& self.2.der_state_valid(value.1, state.right)
2379 &&& !state.in_left ==> {
2380 match (&value.0, &state.left) {
2381 (field, OptDerState::Some(inner)) if *field != self.1 => {
2382 self.0.der_remaining(*field, *inner).len() == 0
2383 },
2384 (field, OptDerState::None) if *field == self.1 => true,
2385 _ => false,
2386 }
2387 }
2388 }
2389
2390 fn der_start(&self, v: &(Default, R)) -> (state: PairDerState<
2391 OptDerState<Field::State>,
2392 Rest::State,
2393 >) {
2394 proof {
2395 v.0.lemma_deep_view_identity();
2396 self.1.lemma_deep_view_identity();
2397 }
2398 let left = if v.0 == self.1 {
2399 OptDerState::None
2400 } else {
2401 OptDerState::Some(self.0.der_start(&v.0))
2402 };
2403 let state = PairDerState { left, right: self.2.der_start(&v.1), in_left: true };
2404 proof {
2405 good_start!(self, v.deep_view(), state);
2406 }
2407 state
2408 }
2409
2410 fn der_next(
2411 &self,
2412 v: &(Default, R),
2413 state: &mut PairDerState<OptDerState<Field::State>, Rest::State>,
2414 ) -> (next: Option<u8>) {
2415 proof {
2416 v.0.lemma_deep_view_identity();
2417 self.1.lemma_deep_view_identity();
2418 }
2419 if state.in_left {
2420 let next = match (&v.0, &mut state.left) {
2421 (field, OptDerState::Some(inner)) => self.0.der_next(field, inner),
2422 (_, OptDerState::None) => None,
2423 };
2424 match next {
2425 Some(byte) => {
2426 return Some(byte);
2427 },
2428 None => state.in_left = false,
2429 }
2430 }
2431 let next = self.2.der_next(&v.1, &mut state.right);
2432 next
2433 }
2434}
2435
2436}