@@ -16,7 +16,7 @@ module Canonize {
16
16
import SortCanon
17
17
import Relations
18
18
19
- predicate method {:opaque} IsValidPath (path : Path )
19
+ predicate {:opaque} IsValidPath (path : Path )
20
20
{
21
21
Paths. ValidPath (path)
22
22
}
@@ -163,11 +163,13 @@ module Canonize {
163
163
function method {:opaque} ForEncrypt (tableName : GoodString , data : CryptoList )
164
164
: (ret : Result< CanonCryptoList, Error> )
165
165
requires CryptoListHasNoDuplicates (data)
166
+ requires ! exists x | x in data :: x. key in HeaderPaths
166
167
ensures ret. Success? ==>
167
168
&& CanonCryptoMatchesCryptoList (tableName, data, ret.value)
168
169
&& IsCryptoSorted (ret.value)
169
170
{
170
- :- Need (forall k <- data :: IsValidPath (k.key), E ("Invalid Paths"));
171
+ reveal IsValidPath ();
172
+ :- Need (forall k <- data :: Paths .ValidPath(k.key), E ("Invalid Paths"));
171
173
var canonList := CryptoToCanonCrypto (tableName, data);
172
174
Success (CryptoSort(canonList, tableName, data))
173
175
}
@@ -234,6 +236,8 @@ module Canonize {
234
236
235
237
predicate {:opaque} CanonAuthMatchesAuthList (tableName : GoodString , data : AuthList , canonList : CanonAuthList )
236
238
{
239
+ && (exists x :: x in data && x. key == HeaderPath)
240
+ && (exists x :: x in data && x. key == FooterPath)
237
241
&& (forall k < - data :: AuthExistsInCanonAuth (k, canonList))
238
242
&& (forall k < - canonList :: CanonAuthExistsInAuth (k, data))
239
243
&& |data| == |canonList|
@@ -244,6 +248,8 @@ module Canonize {
244
248
245
249
predicate {:opaque} CanonCryptoMatchesAuthList (tableName : GoodString , data : AuthList , canonList : CanonCryptoList )
246
250
{
251
+ && (exists x :: x in data && x. key == HeaderPath)
252
+ && (exists x :: x in data && x. key == FooterPath)
247
253
&& (forall k < - data :: AuthExistsInCanonCrypto (k, canonList))
248
254
&& (forall k < - canonList :: CanonCryptoExistsInAuth (k, data))
249
255
&& |data| == |canonList|
@@ -294,6 +300,8 @@ module Canonize {
294
300
295
301
predicate {:opaque} CanonCryptoUpdatedAuthList (tableName : GoodString , data : AuthList , canonList : CanonCryptoList )
296
302
{
303
+ && (exists x :: x in data && x. key == HeaderPath)
304
+ && (exists x :: x in data && x. key == FooterPath)
297
305
&& (forall k < - data :: AuthUpdatedCanonCrypto (k, canonList))
298
306
&& (forall k < - canonList :: CanonCryptoUpdatedAuth (k, data))
299
307
&& |data| == |canonList|
@@ -304,6 +312,8 @@ module Canonize {
304
312
305
313
predicate {:opaque} CryptoUpdatedAuthList (data : AuthList , canonList : CryptoList )
306
314
{
315
+ && (exists x :: x in data && x. key == HeaderPath)
316
+ && (exists x :: x in data && x. key == FooterPath)
307
317
&& (forall k < - data :: AuthUpdatedCrypto (k, canonList))
308
318
&& (forall k < - canonList :: CryptoUpdatedAuth (k, data))
309
319
&& |data| == |canonList|
@@ -322,6 +332,7 @@ module Canonize {
322
332
323
333
predicate {:opaque} CanonCryptoMatchesCryptoList (tableName : GoodString , data : CryptoList , canonList : CanonCryptoList )
324
334
{
335
+ && (! exists x | x in data :: x. key in HeaderPaths)
325
336
&& (forall k < - data :: CryptoExistsInCanonCrypto (k, canonList))
326
337
&& (forall k < - canonList :: CanonCryptoExistsInCrypto (k, data))
327
338
&& |data| == |canonList|
@@ -332,6 +343,7 @@ module Canonize {
332
343
333
344
predicate {:opaque} CanonCryptoUpdatedCryptoList (tableName : GoodString , data : CryptoList , canonList : CanonCryptoList )
334
345
{
346
+ && (! exists x | x in data :: x. key in HeaderPaths)
335
347
&& (forall k < - data :: CryptoUpdatedCanonCrypto (k, canonList))
336
348
&& (forall k < - canonList :: CanonCryptoUpdatedCrypto (k, data))
337
349
&& |data| == |canonList|
@@ -342,15 +354,28 @@ module Canonize {
342
354
343
355
predicate {:opaque} CryptoUpdatedCryptoList (data : CryptoList , canonList : CryptoList )
344
356
{
357
+ && (! exists x | x in data :: x. key in HeaderPaths)
345
358
&& (forall k < - data :: CryptoUpdatedNewCrypto (k, canonList))
346
359
&& (forall k < - canonList :: NewCryptoUpdatedCrypto (k, data))
347
360
&& |data| == |canonList|
348
361
&& (forall k < - canonList :: IsValidPath (k.key))
349
362
&& CryptoListHasNoDuplicates (canonList)
350
363
}
351
364
365
+ predicate {:opaque} CryptoUpdatedCryptoListHeader (data : CryptoList , canonList : CryptoList )
366
+ {
367
+ && (forall k < - data :: CryptoUpdatedNewCrypto (k, canonList))
368
+ && (forall k < - canonList :: NewCryptoUpdatedCrypto (k, data))
369
+ && |data| == |canonList|
370
+ && (forall k < - canonList :: IsValidPath (k.key))
371
+ && CryptoListHasNoDuplicates (canonList)
372
+ }
373
+
374
+
352
375
function method {:opaque} AuthToCanonAuth (tableName : GoodString , data : AuthList ) : (ret : CanonAuthList)
353
376
requires forall k < - data :: IsValidPath (k.key)
377
+ requires exists x :: x in data && x. key == HeaderPath
378
+ requires exists x :: x in data && x. key == FooterPath
354
379
requires AuthListHasNoDuplicates (data)
355
380
ensures CanonAuthMatchesAuthList (tableName, data, ret)
356
381
{
@@ -379,6 +404,7 @@ module Canonize {
379
404
function method {:opaque} CryptoToCanonCrypto (tableName : GoodString , data : CryptoList ) : (ret : CanonCryptoList)
380
405
requires forall k < - data :: IsValidPath (k.key)
381
406
requires CryptoListHasNoDuplicates (data)
407
+ requires ! exists x | x in data :: x. key in HeaderPaths
382
408
ensures CanonCryptoMatchesCryptoList (tableName, data, ret)
383
409
{
384
410
reveal CanonCryptoMatchesCryptoList ();
@@ -448,7 +474,7 @@ module Canonize {
448
474
assert (forall k < - canonSorted :: IsValidPath (k.origKey));
449
475
assert (forall k < - canonSorted :: IsCanonPath (tableName, k.origKey, k.key));
450
476
assert CanonAuthListHasNoDuplicates (canonSorted);
451
- assume {:axiom} CanonAuthMatchesAuthList (tableName, data, canonSorted);
477
+ assert CanonAuthMatchesAuthList (tableName, data, canonSorted);
452
478
453
479
canonSorted
454
480
}
@@ -488,7 +514,7 @@ module Canonize {
488
514
assert (forall k < - canonSorted :: IsValidPath (k.origKey));
489
515
assert (forall k < - canonSorted :: IsCanonPath (tableName, k.origKey, k.key));
490
516
assert CanonCryptoListHasNoDuplicates (canonSorted);
491
- assume {:axiom} CanonCryptoMatchesCryptoList (tableName, data, canonSorted);
517
+ assert CanonCryptoMatchesCryptoList (tableName, data, canonSorted);
492
518
493
519
canonSorted
494
520
}
@@ -568,11 +594,14 @@ module Canonize {
568
594
function method {:opaque} ForDecrypt (tableName : GoodString , data : AuthList , legend: Header .Legend)
569
595
: (ret : Result< CanonCryptoList, Error> )
570
596
requires AuthListHasNoDuplicates (data)
597
+ requires exists x :: x in data && x. key == HeaderPath
598
+ requires exists x :: x in data && x. key == FooterPath
571
599
ensures ret. Success? ==>
572
600
&& CanonCryptoMatchesAuthList (tableName, data, ret.value)
573
601
&& IsCryptoSorted (ret.value)
574
602
{
575
- :- Need (forall k <- data :: IsValidPath (k.key), E ("Invalid Paths"));
603
+ reveal IsValidPath ();
604
+ :- Need (forall k <- data :: Paths .ValidPath(k.key), E ("Invalid Paths"));
576
605
var canonList := AuthToCanonAuth (tableName, data);
577
606
var canonSorted := AuthSort (canonList, tableName, data);
578
607
DoResolveLegend (canonSorted, legend, tableName, data)
@@ -598,15 +627,71 @@ module Canonize {
598
627
[newItem] + UnCanon (input[1..])
599
628
}
600
629
630
+ /*
631
+ predicate method SameUnCanon(x : CanonCryptoItem, y : CryptoItem)
632
+ && x.origKey == y.key
633
+ && x.data == y.data
634
+ && x.action == y.action
635
+ */
636
+
637
+ lemma SameUnCanonUpdatedAll23 ()
638
+ ensures forall oldVal : AuthItem, x : CanonCryptoItem, y : CryptoItem ::
639
+ SameUnCanon (x, y) && Updated2 (oldVal, x, DoDecrypt) ==> Updated3 (oldVal, y, DoDecrypt)
640
+ {}
641
+
642
+ lemma SameUnCanonUpdatedAll32 ()
643
+ ensures forall oldVal : AuthItem, x : CryptoItem, y : CanonCryptoItem ::
644
+ SameUnCanon (y, x) && Updated3 (oldVal, x, DoDecrypt) ==> Updated2 (oldVal, y, DoDecrypt)
645
+ {}
646
+
647
+ // predicate Updated2(oldVal : AuthItem, newVal : CanonCryptoItem, mode : EncryptionSelector)
648
+ // predicate Updated3(oldVal : AuthItem, newVal : CryptoItem, mode : EncryptionSelector)
649
+
650
+ lemma AuthUpdatedCryptoMaps (origData : AuthList , input : CanonCryptoList , output : CryptoList )
651
+ requires |input| == |output|
652
+ requires forall k < - origData :: AuthUpdatedCanonCrypto (k, input)
653
+ requires forall i | 0 <= i < |input| :: SameUnCanon (input[i], output[i])
654
+ ensures forall k < - origData :: AuthUpdatedCrypto (k, output)
655
+ {
656
+ reveal AuthUpdatedCanonCrypto ();
657
+ reveal AuthUpdatedCrypto ();
658
+ assert forall k < - origData :: exists x :: x in output && Updated3 (k, x, DoDecrypt) by {
659
+ SameUnCanonUpdatedAll23 ();
660
+ }
661
+ }
662
+
663
+ lemma CryptoUpdatedAuthMaps (origData : AuthList , input : CanonCryptoList , output : CryptoList )
664
+ requires |input| == |output|
665
+ requires forall k < - input :: CanonCryptoUpdatedAuth (k, origData)
666
+ requires forall i | 0 <= i < |input| :: SameUnCanon (input[i], output[i])
667
+ ensures forall k < - output :: CryptoUpdatedAuth (k, origData)
668
+ {
669
+ reveal CanonCryptoUpdatedAuth ();
670
+ reveal CryptoUpdatedAuth ();
671
+ assume {:axiom} forall k < - output :: exists x :: x in origData && Updated3 (x, k, DoDecrypt);
672
+ // I don't know why this same trick doesn't work here.
673
+ // by {
674
+ // assert forall k <- input :: exists x :: x in origData && Updated2(x, k, DoDecrypt);
675
+ // SameUnCanonUpdatedAll23();
676
+ // }
677
+ }
678
+
601
679
function method UnCanonDecrypt (input : CanonCryptoList , ghost tableName : GoodString , ghost origData : AuthList )
602
680
: (ret : CryptoList)
603
681
requires CanonCryptoUpdatedAuthList (tableName, origData, input)
604
682
ensures CryptoUpdatedAuthList (origData, ret)
605
683
{
606
684
reveal CanonCryptoUpdatedAuthList ();
607
685
reveal CryptoUpdatedAuthList ();
686
+
687
+
608
688
var results := UnCanon (input);
609
- assume {:axiom} CryptoUpdatedAuthList (origData, results);
689
+ assert (forall k < - origData :: AuthUpdatedCrypto (k, results)) by {
690
+ AuthUpdatedCryptoMaps (origData, input, results);
691
+ }
692
+ assert (forall k < - results :: CryptoUpdatedAuth (k, origData)) by {
693
+ CryptoUpdatedAuthMaps (origData, input, results);
694
+ }
610
695
results
611
696
}
612
697
@@ -617,28 +702,29 @@ module Canonize {
617
702
{
618
703
reveal CanonCryptoUpdatedCryptoList ();
619
704
reveal CryptoUpdatedCryptoList ();
705
+
620
706
var results := UnCanon (input);
621
- assume {:axiom} CryptoUpdatedCryptoList (origData, results);
707
+ assume {:axiom} (forall k < - origData :: CryptoUpdatedNewCrypto (k, results));
708
+ assume {:axiom} (forall k < - results :: NewCryptoUpdatedCrypto (k, origData));
622
709
results
623
710
}
624
711
625
712
predicate {:opaque} EncryptPathFinal (origData : CryptoList , finalData : CryptoList )
626
713
{
627
714
&& |finalData| == |origData| + 2
628
- && CryptoUpdatedCryptoList (origData, finalData[..(|finalData|-2)])
715
+ && CryptoUpdatedCryptoListHeader (origData, finalData[..(|finalData|-2)])
629
716
&& finalData[|finalData|- 2]. key == HeaderPath
630
717
&& finalData[|finalData|- 1]. key == FooterPath
631
718
}
632
719
633
720
function method AddHeaders (input : CryptoList , headerData : StructuredDataTerminal , footerData : StructuredDataTerminal , ghost origData : CryptoList )
634
721
: (ret : CryptoList)
635
722
requires CryptoUpdatedCryptoList (origData, input)
636
- // requires !exists x :: x in input && x.key == HeaderPath
637
- // requires !exists x :: x in input && x.key == FooterPath
638
723
ensures EncryptPathFinal (origData, ret)
639
724
{
640
725
reveal EncryptPathFinal ();
641
726
reveal CryptoUpdatedCryptoList ();
727
+ reveal CryptoUpdatedCryptoListHeader ();
642
728
var headItem := Types. CryptoItem (key := HeaderPath, data := headerData, action := DO_NOTHING);
643
729
var footItem := Types. CryptoItem (key := FooterPath, data := footerData, action := DO_NOTHING);
644
730
var largeResult := input + [headItem, footItem];
@@ -647,7 +733,6 @@ module Canonize {
647
733
648
734
predicate {:opaque} DecryptPathFinal (origData : AuthList , finalData : CryptoList )
649
735
{
650
- && |finalData| == |origData| - 2
651
736
&& (! exists x :: x in finalData && x. key == HeaderPath)
652
737
&& (! exists x :: x in finalData && x. key == FooterPath)
653
738
&& (forall k < - origData :: (k. key in [HeaderPath, FooterPath]) || AuthUpdatedCrypto (k, finalData))
@@ -672,16 +757,14 @@ module Canonize {
672
757
function method RemoveHeaders (input : CryptoList , ghost origData : AuthList )
673
758
: (ret : CryptoList)
674
759
requires CryptoUpdatedAuthList (origData, input)
675
- // requires exists x :: x in input && x.key == HeaderPath
676
- // requires exists x :: x in input && x.key == FooterPath
677
760
678
761
ensures DecryptPathFinal (origData, ret)
679
762
{
680
763
reveal CryptoUpdatedAuthList ();
681
764
reveal DecryptPathFinal ();
765
+ reveal AuthUpdatedCrypto ();
682
766
var finalData := RemoveHeaderPaths (input);
683
- assume {:axiom} |finalData| == |origData| - 2;
684
- assume {:axiom} forall k < - origData :: (k. key in [HeaderPath, FooterPath]) || AuthUpdatedCrypto (k, finalData);
767
+ assert forall k < - origData :: (k. key in [HeaderPath, FooterPath]) || AuthUpdatedCrypto (k, finalData);
685
768
finalData
686
769
}
687
770
}
0 commit comments