@@ -8,7 +8,10 @@ module QueryTransformTest {
88 import opened DynamoDbEncryptionTransforms
99 import opened TestFixtures
1010 import DDB = ComAmazonawsDynamodbTypes
11- import AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes
11+ import DBT = AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes
12+ import DBE = AwsCryptographyDbEncryptionSdkDynamoDbTypes
13+ import Types = AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptorTypes
14+ import AwsCryptographyDbEncryptionSdkStructuredEncryptionTypes
1215
1316 method {:test} TestQueryInputPassthrough () {
1417 var middlewareUnderTest := TestFixtures. GetDynamoDbEncryptionTransforms ();
@@ -53,23 +56,7 @@ module QueryTransformTest {
5356 );
5457 var tableName := GetTableName ("no_such_table");
5558 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
7360 );
7461 var transformed := middlewareUnderTest. QueryOutputTransform (
7562 AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes.QueryOutputTransformInput(
@@ -81,4 +68,152 @@ module QueryTransformTest {
8168 expect_ok ("QueryOutput", transformed);
8269 expect_equal ("QueryOutput", transformed.value.transformedOutput, output);
8370 }
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+ }
84219}
0 commit comments