@@ -139,8 +139,8 @@ module DynamoDbItemEncryptorTest {
139
139
print "\n", decryptRes. error, "\n";
140
140
}
141
141
expect decryptRes. Success?;
142
- if decryptRes. value. plaintextItem != inputItem {
143
- print "\nInput Item :\n", inputItem , "\n";
142
+ if decryptRes. value. plaintextItem != expectedOutputItem {
143
+ print "\nexpectedOutputItem :\n", expectedOutputItem , "\n";
144
144
print "\nOutput Item :\n", decryptRes. value. plaintextItem, "\n";
145
145
}
146
146
expect decryptRes. value. plaintextItem == expectedOutputItem;
@@ -406,6 +406,148 @@ module DynamoDbItemEncryptorTest {
406
406
];
407
407
}
408
408
409
+ method {:test} TestV2RoundTripSpecial () {
410
+ var actions : DDBE. AttributeActions :=
411
+ map [
412
+ "bar" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
413
+ "a. b" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
414
+ ". a" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
415
+ "a. " := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
416
+ ". a. " := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
417
+ "a[2]" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
418
+ "a#b" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
419
+ "$" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
420
+ "$a" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
421
+ "$a. b" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
422
+ "$[a]" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
423
+ "$['a']" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
424
+ "$[\"a\"]" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
425
+ "(a)" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
426
+ "$['" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
427
+ "$'a'" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
428
+ "$\"a\"" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
429
+ "$(a)" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
430
+ "$(a" := CSE. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT
431
+
432
+ ];
433
+ var config := TestFixtures. GetEncryptorConfigFromActions (actions);
434
+ var encryptor := TestFixtures. GetDynamoDbItemEncryptorFrom (config);
435
+
436
+ var inputItem := map [
437
+ "bar" := DDBS ("key"),
438
+ "a. b" := DDBS ("aaa"),
439
+ ". a" := DDBS ("bbb"),
440
+ "a. " := DDBS ("ccc"),
441
+ ". a. " := DDBS ("ddd"),
442
+ "a[2]" := DDBS ("eee"),
443
+ "a#b" := DDBS ("fff"),
444
+ "$" := DDBS ("ggg"),
445
+ "$a" := DDBS ("hhh"),
446
+ "$a. b" := DDBS ("iii"),
447
+ "$[a]" := DDBS ("jjj"),
448
+ "$['a']" := DDBS ("kkk"),
449
+ "$[\"a\"]" := DDBS ("lll"),
450
+ "(a)" := DDBS ("mmm"),
451
+ "$['" := DDBS ("nnn"),
452
+ "$'a'" := DDBS ("ooo"),
453
+ "$\"a\"" := DDBS ("ppp"),
454
+ "$(a)" := DDBS ("qqq"),
455
+ "$(a" := DDBS ("rrr")
456
+ ];
457
+
458
+ var encryptRes := encryptor. EncryptItem (
459
+ Types.EncryptItemInput(
460
+ plaintextItem:=inputItem
461
+ )
462
+ );
463
+
464
+ if encryptRes. Failure? {
465
+ print "\n\n", encryptRes, "\n\n";
466
+ }
467
+ expect encryptRes. Success?;
468
+ expect encryptRes. value. encryptedItem. Keys == inputItem. Keys + {SE. HeaderField, SE. FooterField};
469
+ var smallEncrypted := encryptRes. value. encryptedItem - {SE. HeaderField, SE. FooterField};
470
+ expect smallEncrypted == inputItem;
471
+
472
+ var decryptRes := encryptor. DecryptItem (
473
+ Types.DecryptItemInput(
474
+ encryptedItem:=encryptRes.value.encryptedItem
475
+ )
476
+ );
477
+
478
+ if decryptRes. Failure? {
479
+ print "\n", decryptRes. error, "\n";
480
+ }
481
+ expect decryptRes. Success?;
482
+ if decryptRes. value. plaintextItem != inputItem {
483
+ print "\nInput Item :\n", inputItem, "\n";
484
+ print "\nOutput Item :\n", decryptRes. value. plaintextItem, "\n";
485
+ }
486
+ expect decryptRes. value. plaintextItem == inputItem;
487
+
488
+ var parsedHeader := decryptRes. value. parsedHeader;
489
+ expect parsedHeader. Some?;
490
+ expect parsedHeader. value. algorithmSuiteId == AlgorithmSuites. DBE_ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_ECDSA_P384_SYMSIG_HMAC_SHA384. id. DBE;
491
+ expect parsedHeader. value. attributeActionsOnEncrypt == actions - {"nothing"};
492
+ // Expect the verification key in the context
493
+ expect |parsedHeader. value. storedEncryptionContext| == 1;
494
+ expect PublicKeyUtf8 in parsedHeader. value. storedEncryptionContext. Keys;
495
+ expect |parsedHeader. value. encryptedDataKeys| == 1;
496
+
497
+ var strEC := SE. EcAsString (parsedHeader.value.encryptionContext);
498
+ expect "aws- crypto- public- key" in strEC. Keys;
499
+ strEC := strEC - {"aws- crypto- public- key"};
500
+ expect strEC ==
501
+ map [
502
+ "aws- crypto- legend" := "SSSSSSSSSSSSSSSSSSS",
503
+ "aws- crypto- attr. bar" := "key",
504
+ "aws- crypto- attr. a. b" := "aaa",
505
+ "aws- crypto- attr.. a" := "bbb",
506
+ "aws- crypto- attr. a. " := "ccc",
507
+ "aws- crypto- attr.. a. " := "ddd",
508
+ "aws- crypto- attr. a[2]" := "eee",
509
+ "aws- crypto- attr. a#b" := "fff",
510
+ "aws- crypto- attr. $" := "ggg",
511
+ "aws- crypto- attr. $a" := "hhh",
512
+ "aws- crypto- attr. $a. b" := "iii",
513
+ "aws- crypto- attr. $[a]" := "jjj",
514
+ "aws- crypto- attr. $['a']" := "kkk",
515
+ "aws- crypto- attr. $[\"a\"]" := "lll",
516
+ "aws- crypto- attr. (a)" := "mmm",
517
+ "aws- crypto- attr. $['" := "nnn",
518
+ "aws- crypto- attr. $'a'" := "ooo",
519
+ "aws- crypto- attr. $\"a\"" := "ppp",
520
+ "aws- crypto- attr. $(a)" := "qqq",
521
+ "aws- crypto- attr. $(a" := "rrr",
522
+ "aws- crypto- partition- name" := "bar",
523
+ "aws- crypto- table- name" := "foo"
524
+ ];
525
+ expect parsedHeader. value. selectorContext ==
526
+ map [
527
+ "bar" := DDBS ("key"),
528
+ "a. b" := DDBS ("aaa"),
529
+ ". a" := DDBS ("bbb"),
530
+ "a. " := DDBS ("ccc"),
531
+ ". a. " := DDBS ("ddd"),
532
+ "a[2]" := DDBS ("eee"),
533
+ "a#b" := DDBS ("fff"),
534
+ "$" := DDBS ("ggg"),
535
+ "$a" := DDBS ("hhh"),
536
+ "$a. b" := DDBS ("iii"),
537
+ "$[a]" := DDBS ("jjj"),
538
+ "$['a']" := DDBS ("kkk"),
539
+ "$[\"a\"]" := DDBS ("lll"),
540
+ "(a)" := DDBS ("mmm"),
541
+ "$['" := DDBS ("nnn"),
542
+ "$'a'" := DDBS ("ooo"),
543
+ "$\"a\"" := DDBS ("ppp"),
544
+ "$(a)" := DDBS ("qqq"),
545
+ "$(a" := DDBS ("rrr"),
546
+ "aws_dbe_table_name" := DDB. AttributeValue. S ("foo"),
547
+ "aws_dbe_partition_name" := DDB. AttributeValue. S ("bar")
548
+ ];
549
+ }
550
+
409
551
method {:test} TestRoundTrip () {
410
552
var encryptor := TestFixtures. GetDynamoDbItemEncryptor ();
411
553
var inputItem := map [
0 commit comments