@@ -41,12 +41,18 @@ 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 (
4752 schemaOnEncrypt : DDB .CreateTableInput,
4853 globalRecords : seq <Record >,
4954 tableEncryptionConfigs : map <ConfigName , TableConfig>,
55+ largeEncryptionConfigs : map <ConfigName , TableConfig>,
5056 queries : seq <SimpleQuery >,
5157 names : DDB .ExpressionAttributeNameMap,
5258 values : DDB .ExpressionAttributeValueMap,
@@ -58,7 +64,8 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
5864 writeTests : seq <WriteTest >,
5965 roundTripTests : seq <RoundTripTest >,
6066 decryptTests : seq <DecryptTest >,
61- strings : seq <string >
67+ strings : seq <string >,
68+ large : seq <LargeRecord >
6269 ) {
6370
6471 method RunAllTests (keyVectors: KeyVectors .KeyVectorsClient)
@@ -69,6 +76,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
6976 print "DBE Test Vectors\n";
7077 print |globalRecords|, " records. \n";
7178 print |tableEncryptionConfigs|, " tableEncryptionConfigs. \n";
79+ print |largeEncryptionConfigs|, " largeEncryptionConfigs. \n";
7280 print |queries|, " queries. \n";
7381 print |names|, " names. \n";
7482 print |values|, " values. \n";
@@ -78,6 +86,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
7886 print |configsForIoTest|, " configsForIoTest. \n";
7987 print |configsForModTest|, " configsForModTest. \n";
8088 print |strings|, " strings. \n";
89+ print |large|, " large. \n";
8190 if |roundTripTests| != 0 {
8291 print |roundTripTests[0]. configs|, " configs and ", |roundTripTests[0]. records|, " records for round trip. \n";
8392 }
@@ -107,6 +116,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
107116 return ;
108117 }
109118 StringOrdering ();
119+ LargeTests ();
110120 BasicIoTest ();
111121 RunIoTests ();
112122 BasicQueryTest ();
@@ -484,6 +494,87 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
484494 }
485495 }
486496
497+ const TestConfigs : set < string > := {"all"}
498+ const TestRecords : set < string > := {"all"}
499+
500+ predicate DoTestConfig (name : string )
501+ {
502+ "all" in TestConfigs || name in TestConfigs
503+ }
504+
505+ predicate DoTestRecord (name : string )
506+ {
507+ "all" in TestRecords || name in TestRecords
508+ }
509+
510+ method LargeTests ()
511+ {
512+ print "LargeTests\n";
513+ DoLargeTest ("do_nothing");
514+ DoLargeTest ("do_nothing_nosign");
515+ DoLargeTest ("full_encrypt");
516+ DoLargeTest ("full_encrypt_nosign");
517+ DoLargeTest ("full_sign");
518+ DoLargeTest ("full_sign_nosign");
519+ }
520+
521+ method DoLargeTest (config : string )
522+ {
523+ if ! DoTestConfig (config) {
524+ return ;
525+ }
526+ expect config in largeEncryptionConfigs;
527+ var tconfig := largeEncryptionConfigs[config];
528+ var configs := Types. DynamoDbTablesEncryptionConfig (
529+ tableEncryptionConfigs := map[TableName := tconfig.config]
530+ );
531+ // because there are lots of pre-conditions on configs
532+ assume {:axiom} false ;
533+ var client :- expect DynamoDbEncryptionTransforms. DynamoDbEncryptionTransforms (configs);
534+ LargeTestsClient (client, config);
535+ }
536+
537+ method LargeTestsClient (client : Trans .IDynamoDbEncryptionTransformsClient, config : string )
538+ requires client. ValidState ()
539+ ensures client. ValidState ()
540+ modifies client. Modifies
541+ {
542+ for i := 0 to |large| {
543+ RunLargeTest (large[i], client, config);
544+ }
545+ }
546+
547+ method RunLargeTest (record : LargeRecord , client : Trans .IDynamoDbEncryptionTransformsClient, config : string )
548+ requires client. ValidState ()
549+ ensures client. ValidState ()
550+ modifies client. Modifies
551+ {
552+ if ! DoTestRecord (record.name) {
553+ return ;
554+ }
555+
556+ var time := Time. GetAbsoluteTime ();
557+ for i := 0 to record. count {
558+ var put_input_input := Trans. PutItemInputTransformInput ( sdkInput := DDB.PutItemInput (TableName := TableName, Item := record.item));
559+ var put_input_output :- expect client. PutItemInputTransform (put_input_input);
560+ }
561+ var elapsed := Time. TimeSince (time);
562+ Time. PrintTimeLong (elapsed, "Large Encrypt " + record.name + "(" + Base10Int2String(record.count) + ") " + config);
563+
564+ var put_input_input := Trans. PutItemInputTransformInput ( sdkInput := DDB.PutItemInput (TableName := TableName, Item := record.item));
565+ var put_input_output :- expect client. PutItemInputTransform (put_input_input);
566+ time := Time. GetAbsoluteTime ();
567+ for i := 0 to record. count {
568+ var orig_get_input := DDB. GetItemInput (TableName := TableName, Key := map[]);
569+ var get_output := DDB. GetItemOutput (Item := Some(put_input_output.transformedInput.Item));
570+ var trans_get_input := Trans. GetItemOutputTransformInput (sdkOutput := get_output, originalInput := orig_get_input);
571+ var put_output :- expect client. GetItemOutputTransform (trans_get_input);
572+
573+ }
574+ elapsed := Time. TimeSince (time);
575+ Time. PrintTimeLong (elapsed, "Large Decrypt " + record.name + "(" + Base10Int2String(record.count) + ") " + config);
576+ }
577+
487578 method RoundTripTests ()
488579 {
489580 print "RoundTripTests\n";
@@ -999,7 +1090,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
9991090
10001091 function MakeEmptyTestVector () : TestVectorConfig
10011092 {
1002- TestVectorConfig (MakeCreateTableInput(), [], map [], [], map [], map [], [], [], [], [], [], [], [], [], [])
1093+ TestVectorConfig (MakeCreateTableInput(), [], map [], map [], [], map [], map [], [], [], [], [], [], [], [], [], [], [])
10031094 }
10041095
10051096 method ParseTestVector (data : JSON , prev : TestVectorConfig , keyVectors: KeyVectors .KeyVectorsClient)
@@ -1020,10 +1111,12 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
10201111 var ioTests : seq < IoTest> := [];
10211112 var gsi : seq < DDB. GlobalSecondaryIndex> := [];
10221113 var tableEncryptionConfigs : map < string , TableConfig> := map [];
1114+ var largeEncryptionConfigs : map < string , TableConfig> := map [];
10231115 var writeTests : seq < WriteTest> := [];
10241116 var roundTripTests : seq < RoundTripTest> := [];
10251117 var decryptTests : seq < DecryptTest> := [];
10261118 var strings : seq < string > := [];
1119+ var large : seq < LargeRecord> := [];
10271120
10281121 for i := 0 to |data. obj| {
10291122 match data. obj[i]. 0 {
@@ -1038,10 +1131,12 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
10381131 case "IoTests" => ioTests :- GetIoTests (data.obj[i].1, keyVectors);
10391132 case "GSI" => gsi :- GetGSIs (data.obj[i].1);
10401133 case "tableEncryptionConfigs" => tableEncryptionConfigs :- GetTableConfigs (data.obj[i].1, keyVectors);
1134+ case "largeEncryptionConfigs" => largeEncryptionConfigs :- GetTableConfigs (data.obj[i].1, keyVectors);
10411135 case "WriteTests" => writeTests :- GetWriteTests (data.obj[i].1, keyVectors);
10421136 case "RoundTripTest" => roundTripTests :- GetRoundTripTests (data.obj[i].1, keyVectors);
10431137 case "DecryptTests" => decryptTests :- GetDecryptTests (data.obj[i].1, keyVectors);
10441138 case "Strings" => strings :- GetStrings (data.obj[i].1);
1139+ case "Large" => large :- GetLarges (data.obj[i].1);
10451140 case _ => return Failure ("Unexpected top level tag " + data.obj[i].0);
10461141 }
10471142 }
@@ -1052,6 +1147,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
10521147 schemaOnEncrypt := newSchema,
10531148 globalRecords := prev.globalRecords + records,
10541149 tableEncryptionConfigs := prev.tableEncryptionConfigs + tableEncryptionConfigs,
1150+ largeEncryptionConfigs := prev.largeEncryptionConfigs + largeEncryptionConfigs,
10551151 queries := prev.queries + queries,
10561152 failingQueries := prev.failingQueries + failingQueries,
10571153 names := prev.names + names,
@@ -1063,7 +1159,8 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
10631159 writeTests := prev.writeTests + writeTests,
10641160 roundTripTests := prev.roundTripTests + roundTripTests,
10651161 decryptTests := prev.decryptTests + decryptTests,
1066- strings := prev.strings + strings
1162+ strings := prev.strings + strings,
1163+ large := prev.large + large
10671164 )
10681165 );
10691166 }
0 commit comments