@@ -41,6 +41,11 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
4141 import MPT = AwsCryptographyMaterialProvidersTypes
4242 import Primitives = AtomicPrimitives
4343 import ParseJsonManifests
44+ import Time
45+ import Trans = AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes
46+ import TransOp = AwsCryptographyDbEncryptionSdkDynamoDbTransformsOperations
47+ import DdbMiddlewareConfig
48+ import DynamoDbEncryptionTransforms
4449
4550
4651 datatype TestVectorConfig = TestVectorConfig (
@@ -58,7 +63,8 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
5863 writeTests : seq <WriteTest >,
5964 roundTripTests : seq <RoundTripTest >,
6065 decryptTests : seq <DecryptTest >,
61- strings : seq <string >
66+ strings : seq <string >,
67+ large : seq <LargeRecord >
6268 ) {
6369
6470 method RunAllTests (keyVectors: KeyVectors .KeyVectorsClient)
@@ -78,6 +84,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
7884 print |configsForIoTest|, " configsForIoTest. \n";
7985 print |configsForModTest|, " configsForModTest. \n";
8086 print |strings|, " strings. \n";
87+ print |large|, " large. \n";
8188 if |roundTripTests| != 0 {
8289 print |roundTripTests[0]. configs|, " configs and ", |roundTripTests[0]. records|, " records for round trip. \n";
8390 }
@@ -107,6 +114,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
107114 return ;
108115 }
109116 StringOrdering ();
117+ LargeTests ();
110118 BasicIoTest ();
111119 RunIoTests ();
112120 BasicQueryTest ();
@@ -484,6 +492,87 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
484492 }
485493 }
486494
495+ const TestConfigs : set < string > := {"all"}
496+ const TestRecords : set < string > := {"all"}
497+
498+ predicate DoTestConfig (name : string )
499+ {
500+ "all" in TestConfigs || name in TestConfigs
501+ }
502+
503+ predicate DoTestRecord (name : string )
504+ {
505+ "all" in TestRecords || name in TestRecords
506+ }
507+
508+ method LargeTests ()
509+ {
510+ print "LargeTests\n";
511+ DoLargeTest ("do_nothing");
512+ DoLargeTest ("do_nothing_nosign");
513+ DoLargeTest ("full_encrypt");
514+ DoLargeTest ("full_encrypt_nosign");
515+ DoLargeTest ("full_sign");
516+ DoLargeTest ("full_sign_nosign");
517+ }
518+
519+ method DoLargeTest (config : string )
520+ {
521+ if ! DoTestConfig (config) {
522+ return ;
523+ }
524+ expect config in tableEncryptionConfigs;
525+ var tconfig := tableEncryptionConfigs[config];
526+ var configs := Types. DynamoDbTablesEncryptionConfig (
527+ tableEncryptionConfigs := map[TableName := tconfig.config]
528+ );
529+ // because there are lots of pre-conditions on configs
530+ assume {:axiom} false ;
531+ var client :- expect DynamoDbEncryptionTransforms. DynamoDbEncryptionTransforms (configs);
532+ LargeTestsClient (client, config);
533+ }
534+
535+ method LargeTestsClient (client : Trans .IDynamoDbEncryptionTransformsClient, config : string )
536+ requires client. ValidState ()
537+ ensures client. ValidState ()
538+ modifies client. Modifies
539+ {
540+ for i := 0 to |large| {
541+ RunLargeTest (large[i], client, config);
542+ }
543+ }
544+
545+ method RunLargeTest (record : LargeRecord , client : Trans .IDynamoDbEncryptionTransformsClient, config : string )
546+ requires client. ValidState ()
547+ ensures client. ValidState ()
548+ modifies client. Modifies
549+ {
550+ if ! DoTestRecord (record.name) {
551+ return ;
552+ }
553+
554+ var time := Time. GetAbsoluteTime ();
555+ for i := 0 to record. count {
556+ var put_input_input := Trans. PutItemInputTransformInput ( sdkInput := DDB.PutItemInput (TableName := TableName, Item := record.item));
557+ var put_input_output :- expect client. PutItemInputTransform (put_input_input);
558+ }
559+ var elapsed := Time. TimeSince (time);
560+ Time. PrintTimeLong (elapsed, "Large Encrypt " + record.name + "(" + Base10Int2String(record.count) + ") " + config);
561+
562+ var put_input_input := Trans. PutItemInputTransformInput ( sdkInput := DDB.PutItemInput (TableName := TableName, Item := record.item));
563+ var put_input_output :- expect client. PutItemInputTransform (put_input_input);
564+ time := Time. GetAbsoluteTime ();
565+ for i := 0 to record. count {
566+ var orig_get_input := DDB. GetItemInput (TableName := TableName, Key := map[]);
567+ var get_output := DDB. GetItemOutput (Item := Some(put_input_output.transformedInput.Item));
568+ var trans_get_input := Trans. GetItemOutputTransformInput (sdkOutput := get_output, originalInput := orig_get_input);
569+ var put_output :- expect client. GetItemOutputTransform (trans_get_input);
570+
571+ }
572+ elapsed := Time. TimeSince (time);
573+ Time. PrintTimeLong (elapsed, "Large Decrypt " + record.name + "(" + Base10Int2String(record.count) + ") " + config);
574+ }
575+
487576 method RoundTripTests ()
488577 {
489578 print "RoundTripTests\n";
@@ -999,7 +1088,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
9991088
10001089 function MakeEmptyTestVector () : TestVectorConfig
10011090 {
1002- TestVectorConfig (MakeCreateTableInput(), [], map [], [], map [], map [], [], [], [], [], [], [], [], [], [])
1091+ TestVectorConfig (MakeCreateTableInput(), [], map [], [], map [], map [], [], [], [], [], [], [], [], [], [], [] )
10031092 }
10041093
10051094 method ParseTestVector (data : JSON , prev : TestVectorConfig , keyVectors: KeyVectors .KeyVectorsClient)
@@ -1024,6 +1113,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
10241113 var roundTripTests : seq < RoundTripTest> := [];
10251114 var decryptTests : seq < DecryptTest> := [];
10261115 var strings : seq < string > := [];
1116+ var large : seq < LargeRecord> := [];
10271117
10281118 for i := 0 to |data. obj| {
10291119 match data. obj[i]. 0 {
@@ -1042,6 +1132,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
10421132 case "RoundTripTest" => roundTripTests :- GetRoundTripTests (data.obj[i].1, keyVectors);
10431133 case "DecryptTests" => decryptTests :- GetDecryptTests (data.obj[i].1, keyVectors);
10441134 case "Strings" => strings :- GetStrings (data.obj[i].1);
1135+ case "Large" => large :- GetLarges (data.obj[i].1);
10451136 case _ => return Failure ("Unexpected top level tag " + data.obj[i].0);
10461137 }
10471138 }
@@ -1063,7 +1154,8 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
10631154 writeTests := prev.writeTests + writeTests,
10641155 roundTripTests := prev.roundTripTests + roundTripTests,
10651156 decryptTests := prev.decryptTests + decryptTests,
1066- strings := prev.strings + strings
1157+ strings := prev.strings + strings,
1158+ large := prev.large + large
10671159 )
10681160 );
10691161 }
0 commit comments