@@ -8,7 +8,10 @@ module QueryTransformTest {
8
8
import opened DynamoDbEncryptionTransforms
9
9
import opened TestFixtures
10
10
import DDB = ComAmazonawsDynamodbTypes
11
- import AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes
11
+ import DBT = AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes
12
+ import DBE = AwsCryptographyDbEncryptionSdkDynamoDbTypes
13
+ import Types = AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptorTypes
14
+ import AwsCryptographyDbEncryptionSdkStructuredEncryptionTypes
12
15
13
16
method {:test} TestQueryInputPassthrough () {
14
17
var middlewareUnderTest := TestFixtures. GetDynamoDbEncryptionTransforms ();
@@ -53,23 +56,7 @@ module QueryTransformTest {
53
56
);
54
57
var tableName := GetTableName ("no_such_table");
55
58
var input := DDB. QueryInput (
56
- TableName := tableName,
57
- IndexName := None(),
58
- Select := None (),
59
- AttributesToGet := None (),
60
- Limit := None (),
61
- ConsistentRead := None (),
62
- KeyConditions := None (),
63
- QueryFilter := None (),
64
- ConditionalOperator := None (),
65
- ScanIndexForward := None (),
66
- ExclusiveStartKey := None (),
67
- ReturnConsumedCapacity := None (),
68
- ProjectionExpression := None (),
69
- FilterExpression := None (),
70
- KeyConditionExpression := None (),
71
- ExpressionAttributeNames := None (),
72
- ExpressionAttributeValues := None ()
59
+ TableName := tableName
73
60
);
74
61
var transformed := middlewareUnderTest. QueryOutputTransform (
75
62
AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes.QueryOutputTransformInput(
@@ -81,4 +68,152 @@ module QueryTransformTest {
81
68
expect_ok ("QueryOutput", transformed);
82
69
expect_equal ("QueryOutput", transformed.value.transformedOutput, output);
83
70
}
71
+
72
+ function method DDBS (x : string ) : DDB. AttributeValue {
73
+ DDB. AttributeValue. S (x)
74
+ }
75
+
76
+ const Actions1 : DBE. AttributeActions := map [
77
+ GetAttrName ("bar") := CSE. SIGN_ONLY,
78
+ GetAttrName ("sortKey") := CSE. SIGN_ONLY,
79
+ GetAttrName ("encrypt1") := CSE. ENCRYPT_AND_SIGN,
80
+ GetAttrName ("encrypt2") := CSE. ENCRYPT_AND_SIGN,
81
+ GetAttrName ("sign1") := CSE. SIGN_ONLY,
82
+ GetAttrName ("sign2") := CSE. SIGN_ONLY
83
+ ]
84
+
85
+ method {:test} TestDecryptErrorWithSortKey () {
86
+ var config := TestFixtures. GetEncryptorConfigFromActions (Actions1, Some("sortKey"));
87
+ var encryptor := TestFixtures. GetDynamoDbItemEncryptorFrom (config);
88
+
89
+ var inputItem : map < DDB. AttributeName, DDB. AttributeValue> := map [
90
+ "bar" := DDB. AttributeValue. N ("00001234"),
91
+ "sortKey" := DDB. AttributeValue. B ([1,2,3,4]),
92
+ "encrypt1" := DDBS ("some text"),
93
+ "encrypt2" := DDBS ("more text"),
94
+ "sign1" := DDBS ("stuff"),
95
+ "sign2" := DDB. AttributeValue. BOOL (false)
96
+ ];
97
+
98
+ var encryptRes :- expect encryptor. EncryptItem (
99
+ Types.EncryptItemInput(
100
+ plaintextItem:=inputItem
101
+ )
102
+ );
103
+ var item1 := encryptRes. encryptedItem;
104
+ expect "encrypt1" in item1;
105
+ expect item1["encrypt1"] != DDBS ("some text");
106
+
107
+ inputItem := map [
108
+ "bar" := DDB. AttributeValue. N ("567"),
109
+ "sortKey" := DDB. AttributeValue. B ([5,6,7]),
110
+ "encrypt1" := DDBS ("some text"),
111
+ "encrypt2" := DDBS ("more text"),
112
+ "sign1" := DDBS ("stuff"),
113
+ "sign2" := DDB. AttributeValue. BOOL (false)
114
+ ];
115
+ encryptRes :- expect encryptor. EncryptItem (
116
+ Types.EncryptItemInput(
117
+ plaintextItem:=inputItem
118
+ )
119
+ );
120
+ var item2 := encryptRes. encryptedItem;
121
+ expect "encrypt1" in item2;
122
+ expect item2["encrypt1"] != DDBS ("some text");
123
+
124
+ inputItem := map [
125
+ "bar" := DDB. AttributeValue. N ("890"),
126
+ "sortKey" := DDB. AttributeValue. B ([3,1,4]),
127
+ "encrypt1" := DDBS ("some text"),
128
+ "encrypt2" := DDBS ("more text"),
129
+ "sign1" := DDBS ("stuff"),
130
+ "sign2" := DDB. AttributeValue. BOOL (false)
131
+ ];
132
+ encryptRes :- expect encryptor. EncryptItem (
133
+ Types.EncryptItemInput(
134
+ plaintextItem:=inputItem
135
+ )
136
+ );
137
+ var item3 := encryptRes. encryptedItem;
138
+ expect "encrypt1" in item3;
139
+ expect item3["encrypt1"] != DDBS ("some text");
140
+
141
+ var middlewareUnderTest := TestFixtures. GetDynamoDbEncryptionTransforms2 (Actions1, Some("sortKey"));
142
+ var tableName := GetTableName ("foo");
143
+ var input := DDB. QueryInput (
144
+ TableName := tableName
145
+ );
146
+
147
+ var transformed := middlewareUnderTest. QueryOutputTransform (
148
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes.QueryOutputTransformInput(
149
+ sdkOutput := DDB.QueryOutput(Items := Some([item1, item2, item3])),
150
+ originalInput := input
151
+ )
152
+ );
153
+
154
+ TestFixtures. expect_ok ("QueryOutput", transformed);
155
+ expect transformed. value. transformedOutput. Items. Some?;
156
+ var itemList := transformed. value. transformedOutput. Items. value;
157
+ expect |itemList| == 3;
158
+ expect "encrypt1" in itemList[0];
159
+ expect itemList[0]["encrypt1"] == DDBS ("some text");
160
+
161
+
162
+ // / now do some damage
163
+ item1 := item1["encrypt1" := item2["encrypt1"]];
164
+ transformed := middlewareUnderTest. QueryOutputTransform (
165
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes.QueryOutputTransformInput(
166
+ sdkOutput := DDB.QueryOutput(Items := Some([item1, item2, item3])),
167
+ originalInput := input
168
+ )
169
+ );
170
+ expect transformed. Failure?;
171
+ print "\n", transformed. error, "\n";
172
+ expect transformed. error ==
173
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes. Error. CollectionOfErrors (
174
+ [
175
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes.Error.AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptor(AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptorTypes.Error.AwsCryptographyDbEncryptionSdkDynamoDb(AwsCryptographyDbEncryptionSdkDynamoDbTypes.Error.AwsCryptographyDbEncryptionSdkStructuredEncryption(AwsCryptographyDbEncryptionSdkStructuredEncryptionTypes.Error.StructuredEncryptionException(message := "No recipient tag matched.")))),
176
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes. Error. DynamoDbEncryptionTransformsException (message := "bar = 1234\nsortKey = 01020304")
177
+ ],
178
+ message := "Error (s) found decrypting Query results. "
179
+ );
180
+
181
+ // / do more damage
182
+ item3 := item3["encrypt1" := item2["encrypt1"]];
183
+ transformed := middlewareUnderTest. QueryOutputTransform (
184
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes.QueryOutputTransformInput(
185
+ sdkOutput := DDB.QueryOutput(Items := Some([item1, item2, item3])),
186
+ originalInput := input
187
+ )
188
+ );
189
+ expect transformed. Failure?;
190
+ print "\n", transformed. error, "\n";
191
+ expect transformed. error ==
192
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes. Error. CollectionOfErrors (
193
+ [
194
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes.Error.AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptor(AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptorTypes.Error.AwsCryptographyDbEncryptionSdkDynamoDb(AwsCryptographyDbEncryptionSdkDynamoDbTypes.Error.AwsCryptographyDbEncryptionSdkStructuredEncryption(AwsCryptographyDbEncryptionSdkStructuredEncryptionTypes.Error.StructuredEncryptionException(message := "No recipient tag matched.")))),
195
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes. Error. DynamoDbEncryptionTransformsException (message := "bar = 1234\nsortKey = 01020304"),
196
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes. Error. DynamoDbEncryptionTransformsException (message := "bar = 890\nsortKey = 030104")
197
+ ],
198
+ message := "Error (s) found decrypting Query results. "
199
+ );
200
+
201
+ var transformed_scan := middlewareUnderTest. ScanOutputTransform (
202
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes.ScanOutputTransformInput(
203
+ sdkOutput := DDB.ScanOutput(Items := Some([item1, item2, item3])),
204
+ originalInput := DDB. ScanInput (TableName := tableName)
205
+ )
206
+ );
207
+ expect transformed_scan. Failure?;
208
+ print "\n", transformed_scan. error, "\n";
209
+ expect transformed_scan. error ==
210
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes. Error. CollectionOfErrors (
211
+ [
212
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes.Error.AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptor(AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptorTypes.Error.AwsCryptographyDbEncryptionSdkDynamoDb(AwsCryptographyDbEncryptionSdkDynamoDbTypes.Error.AwsCryptographyDbEncryptionSdkStructuredEncryption(AwsCryptographyDbEncryptionSdkStructuredEncryptionTypes.Error.StructuredEncryptionException(message := "No recipient tag matched.")))),
213
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes. Error. DynamoDbEncryptionTransformsException (message := "bar = 1234\nsortKey = 01020304"),
214
+ AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes. Error. DynamoDbEncryptionTransformsException (message := "bar = 890\nsortKey = 030104")
215
+ ],
216
+ message := "Error (s) found decrypting Scan results. "
217
+ );
218
+ }
84
219
}
0 commit comments