3
3
4
4
include "JsonItem. dfy"
5
5
include "CreateInterceptedDDBClient. dfy"
6
+ include "CreateWrappedItemEncryptor. dfy"
6
7
include ".. / .. / .. / .. / DynamoDbEncryption/ dafny/ DynamoDbItemEncryptor/ src/ Index. dfy"
7
8
8
9
module {:options "- functionSyntax:4"} JsonConfig {
@@ -31,10 +32,10 @@ module {:options "-functionSyntax:4"} JsonConfig {
31
32
import ParseJsonManifests
32
33
import CreateInterceptedDDBClient
33
34
import DynamoDbItemEncryptor
35
+ import CreateWrappedItemEncryptor
36
+ import Operations = AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptorOperations
34
37
35
38
36
- const DEFAULT_KEYS : string := ".. / .. / .. / submodules/ MaterialProviders/ TestVectorsAwsCryptographicMaterialProviders/ dafny/ TestVectorsAwsCryptographicMaterialProviders/ test/ keys. json"
37
-
38
39
predicate IsValidInt32 (x: int ) { - 0x8000_0000 <= x < 0x8000_0000}
39
40
type ConfigName = string
40
41
@@ -130,7 +131,11 @@ module {:options "-functionSyntax:4"} JsonConfig {
130
131
}
131
132
}
132
133
133
- method GetRoundTripTests (data : JSON ) returns (output : Result< seq < RoundTripTest> , string > )
134
+ method GetRoundTripTests (data : JSON , keys: KeyVectors .KeyVectorsClient)
135
+ returns (output : Result< seq < RoundTripTest> , string > )
136
+ requires keys. ValidState ()
137
+ modifies keys. Modifies
138
+ ensures keys. ValidState ()
134
139
{
135
140
:- Need (data.Object?, "RoundTripTest Test must be an object.");
136
141
var configs : map < string , TableConfig> := map [];
@@ -139,26 +144,34 @@ module {:options "-functionSyntax:4"} JsonConfig {
139
144
for i := 0 to |data. obj| {
140
145
var obj := data. obj[i];
141
146
match obj. 0 {
142
- case "Configs" => var src :- GetTableConfigs (obj.1); configs := src;
147
+ case "Configs" => var src :- GetTableConfigs (obj.1, keys ); configs := src;
143
148
case "Records" => var src :- GetRecords (obj.1); records := src;
144
149
case _ => return Failure ("Unexpected part of a write test : '" + obj.0 + "'");
145
150
}
146
151
}
147
152
return Success ([RoundTripTest(configs, records)]);
148
153
}
149
154
150
- method GetWriteTests (data : JSON ) returns (output : Result< seq < WriteTest> , string > )
155
+ method GetWriteTests (data : JSON , keys: KeyVectors .KeyVectorsClient)
156
+ returns (output : Result< seq < WriteTest> , string > )
157
+ requires keys. ValidState ()
158
+ modifies keys. Modifies
159
+ ensures keys. ValidState ()
151
160
{
152
161
:- Need (data.Array?, "Write Test list must be an array.");
153
162
var results : seq < WriteTest> := [];
154
163
for i := 0 to |data. arr| {
155
164
var obj := data. arr[i];
156
- var item :- GetOneWriteTest (obj);
165
+ var item :- GetOneWriteTest (obj, keys );
157
166
results := results + [item];
158
167
}
159
168
return Success (results);
160
169
}
161
- method GetOneWriteTest (data : JSON ) returns (output : Result< WriteTest, string > )
170
+ method GetOneWriteTest (data : JSON , keys: KeyVectors .KeyVectorsClient)
171
+ returns (output : Result< WriteTest, string > )
172
+ requires keys. ValidState ()
173
+ modifies keys. Modifies
174
+ ensures keys. ValidState ()
162
175
{
163
176
:- Need (data.Object?, "A Write Test must be an object.");
164
177
var config : Option< TableConfig> := None;
@@ -168,7 +181,7 @@ module {:options "-functionSyntax:4"} JsonConfig {
168
181
for i := 0 to |data. obj| {
169
182
var obj := data. obj[i];
170
183
match obj. 0 {
171
- case "Config" => var src :- GetOneTableConfig ("foo", obj.1); config := Some (src);
184
+ case "Config" => var src :- GetOneTableConfig ("foo", obj.1, keys ); config := Some (src);
172
185
case "FileName" =>
173
186
:- Need (obj.1.String?, "Write Test file name must be a string.");
174
187
fileName := obj. 1. str;
@@ -181,18 +194,26 @@ module {:options "-functionSyntax:4"} JsonConfig {
181
194
return Success (WriteTest(config.value, records, fileName));
182
195
}
183
196
184
- method GetDecryptTests (data : JSON ) returns (output : Result< seq < DecryptTest> , string > )
197
+ method GetDecryptTests (data : JSON , keys: KeyVectors .KeyVectorsClient)
198
+ returns (output : Result< seq < DecryptTest> , string > )
199
+ requires keys. ValidState ()
200
+ modifies keys. Modifies
201
+ ensures keys. ValidState ()
185
202
{
186
203
:- Need (data.Array?, "Decrypt Test list must be an array.");
187
204
var results : seq < DecryptTest> := [];
188
205
for i := 0 to |data. arr| {
189
206
var obj := data. arr[i];
190
- var item :- GetOneDecryptTest (obj);
207
+ var item :- GetOneDecryptTest (obj, keys );
191
208
results := results + [item];
192
209
}
193
210
return Success (results);
194
211
}
195
- method GetOneDecryptTest (data : JSON ) returns (output : Result< DecryptTest, string > )
212
+ method GetOneDecryptTest (data : JSON , keys: KeyVectors .KeyVectorsClient)
213
+ returns (output : Result< DecryptTest, string > )
214
+ requires keys. ValidState ()
215
+ modifies keys. Modifies
216
+ ensures keys. ValidState ()
196
217
{
197
218
:- Need (data.Object?, "A Decrypt Test must be an object.");
198
219
var config : Option< TableConfig> := None;
@@ -202,7 +223,7 @@ module {:options "-functionSyntax:4"} JsonConfig {
202
223
for i := 0 to |data. obj| {
203
224
var obj := data. obj[i];
204
225
match obj. 0 {
205
- case "Config" => var src :- GetOneTableConfig ("foo", obj.1); config := Some (src);
226
+ case "Config" => var src :- GetOneTableConfig ("foo", obj.1, keys ); config := Some (src);
206
227
case "EncryptedRecords" => encRecords :- GetRecords (obj.1);
207
228
case "PlainTextRecords" => plainRecords :- GetRecords (obj.1);
208
229
case _ => return Failure ("Unexpected part of a encrypt test : '" + obj.0 + "'");
@@ -214,24 +235,31 @@ module {:options "-functionSyntax:4"} JsonConfig {
214
235
return Success (DecryptTest(config.value, encRecords, plainRecords));
215
236
}
216
237
217
- method GetTableConfigs (data : JSON ) returns (output : Result< map < string , TableConfig> , string > )
238
+ method GetTableConfigs (data : JSON , keys: KeyVectors .KeyVectorsClient)
239
+ returns (output : Result< map < string , TableConfig> , string > )
240
+ requires keys. ValidState ()
241
+ modifies keys. Modifies
242
+ ensures keys. ValidState ()
218
243
{
219
244
:- Need (data.Object?, "Search Config list must be an object.");
220
245
var results : map < string , TableConfig> := map [];
221
246
for i := 0 to |data. obj| {
222
247
var obj := data. obj[i];
223
- var item :- GetOneTableConfig (obj.0, obj.1);
248
+ var item :- GetOneTableConfig (obj.0, obj.1, keys );
224
249
results := results[obj. 0 := item];
225
250
}
226
251
return Success (results);
227
252
}
228
253
229
- method GetItemEncryptor (name : string , data : JSON )
254
+ method GetItemEncryptor (name : string , data : JSON , keys: KeyVectors .KeyVectorsClient )
230
255
returns (encryptor : Result< DynamoDbItemEncryptor. DynamoDbItemEncryptorClient, string > )
256
+ requires keys. ValidState ()
257
+ modifies keys. Modifies
258
+ ensures keys. ValidState ()
231
259
ensures encryptor. Success? ==>
232
260
&& encryptor. value. ValidState ()
233
261
&& fresh (encryptor. value)
234
- && fresh (encryptor. value. Modifies)
262
+ && fresh (encryptor. value. Modifies - Operations . ModifiesInternalConfig (encryptor.value.config) )
235
263
{
236
264
:- Need (data.Object?, "A Table Config must be an object.");
237
265
var logicalTableName := TableName;
@@ -296,11 +324,6 @@ module {:options "-functionSyntax:4"} JsonConfig {
296
324
}
297
325
}
298
326
299
- var keys :- expect KeyVectors. KeyVectors (
300
- KeyVectorsTypes.KeyVectorsConfig(
301
- keyManifestPath := DEFAULT_KEYS
302
- )
303
- );
304
327
var keyDescription :-
305
328
if |key| == 0 then
306
329
Success (KeyVectorsTypes.Hierarchy(KeyVectorsTypes.HierarchyKeyring(
@@ -327,13 +350,20 @@ module {:options "-functionSyntax:4"} JsonConfig {
327
350
legacyOverride := legacyOverride,
328
351
plaintextOverride := plaintextOverride
329
352
);
330
- var enc : ENC. IDynamoDbItemEncryptorClient :- expect DynamoDbItemEncryptor. DynamoDbItemEncryptor (encryptorConfig);
353
+ var enc : ENC. IDynamoDbItemEncryptorClient :- expect CreateWrappedItemEncryptor. CreateWrappedItemEncryptor (encryptorConfig);
354
+ // var enc : ENC.IDynamoDbItemEncryptorClient :- expect DynamoDbItemEncryptor.DynamoDbItemEncryptor(encryptorConfig);
331
355
assert enc is DynamoDbItemEncryptor. DynamoDbItemEncryptorClient;
332
356
var encr := enc as DynamoDbItemEncryptor. DynamoDbItemEncryptorClient;
333
357
return Success (encr);
334
358
}
335
359
336
- method GetOneTableConfig (name : string , data : JSON ) returns (output : Result< TableConfig, string > )
360
+
361
+
362
+ method GetOneTableConfig (name : string , data : JSON , keys: KeyVectors .KeyVectorsClient)
363
+ returns (output : Result< TableConfig, string > )
364
+ requires keys. ValidState ()
365
+ modifies keys. Modifies
366
+ ensures keys. ValidState ()
337
367
{
338
368
:- Need (data.Object?, "A Table Config must be an object.");
339
369
var logicalTableName := TableName;
@@ -400,11 +430,6 @@ module {:options "-functionSyntax:4"} JsonConfig {
400
430
}
401
431
}
402
432
403
- var keys :- expect KeyVectors. KeyVectors (
404
- KeyVectorsTypes.KeyVectorsConfig(
405
- keyManifestPath := DEFAULT_KEYS
406
- )
407
- );
408
433
var keyDescription :-
409
434
if |key| == 0 then
410
435
Success (KeyVectorsTypes.Hierarchy(KeyVectorsTypes.HierarchyKeyring(
@@ -1114,19 +1139,27 @@ module {:options "-functionSyntax:4"} JsonConfig {
1114
1139
));
1115
1140
}
1116
1141
1117
- method GetIoTests (data : JSON ) returns (output : Result< seq < IoTest> , string > )
1142
+ method GetIoTests (data : JSON , keys: KeyVectors .KeyVectorsClient)
1143
+ returns (output : Result< seq < IoTest> , string > )
1144
+ requires keys. ValidState ()
1145
+ modifies keys. Modifies
1146
+ ensures keys. ValidState ()
1118
1147
{
1119
1148
:- Need (data.Object?, "IoTests must be an object.");
1120
1149
var results : seq < IoTest> := [];
1121
1150
for i := 0 to |data. obj| {
1122
1151
var obj := data. obj[i];
1123
- var item :- GetOneIoTest (obj.0, obj.1);
1152
+ var item :- GetOneIoTest (obj.0, obj.1, keys );
1124
1153
results := results + [item];
1125
1154
}
1126
1155
return Success (results);
1127
1156
}
1128
1157
1129
- method GetOneIoTest (name : string , data : JSON ) returns (output : Result< IoTest, string > )
1158
+ method GetOneIoTest (name : string , data : JSON , keys: KeyVectors .KeyVectorsClient)
1159
+ returns (output : Result< IoTest, string > )
1160
+ requires keys. ValidState ()
1161
+ modifies keys. Modifies
1162
+ ensures keys. ValidState ()
1130
1163
{
1131
1164
:- Need (data.Object?, "IoTest must be an object.");
1132
1165
var readConfig : Option< TableConfig> := None;
@@ -1138,8 +1171,8 @@ module {:options "-functionSyntax:4"} JsonConfig {
1138
1171
for i := 0 to |data. obj| {
1139
1172
var obj := data. obj[i];
1140
1173
match obj. 0 {
1141
- case "WriteConfig" => var config :- GetOneTableConfig (obj.0, obj.1); writeConfig := Some (config);
1142
- case "ReadConfig" => var config :- GetOneTableConfig (obj.0, obj.1); readConfig := Some (config);
1174
+ case "WriteConfig" => var config :- GetOneTableConfig (obj.0, obj.1, keys ); writeConfig := Some (config);
1175
+ case "ReadConfig" => var config :- GetOneTableConfig (obj.0, obj.1, keys ); readConfig := Some (config);
1143
1176
case "Records" => records :- GetRecords (obj.1);
1144
1177
case "Values" => values :- GetValueMap (data.obj[i].1);
1145
1178
case "Queries" => queries :- GetSimpleQueries (data.obj[i].1);
0 commit comments