From 72f7ce6b89d44d3fc7495351b2c43447536b0b16 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Wed, 11 Mar 2026 22:31:14 -0700 Subject: [PATCH 01/60] Add hash only test --- .../dynamodbv2/datamodeling/sdkv2/HolisticIT.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 8e7f600b20..fdafee1dd0 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -1123,8 +1123,18 @@ private void assertVersionCompatibility( assertTrue( new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decryptedRecord) ); + + // Atleast decrypt one item with only hash key. + EncryptionContext hashOnlyContext = EncryptionContext + .builder() + .tableName("HashKeyOnly") + .hashKeyName("hashKey") + .build(); + Map> hashOnlyActions = new HashMap<>(); + hashOnlyActions.put("hashKey", signOnly); - assertEquals("Foo", getItems(hashKey1, "HashKeyOnly").get("hashKey").s()); + Map decryptedHashOnlyRecord = encryptor.decryptRecord(getItems(hashKey1, "HashKeyOnly"), hashOnlyActions, hashOnlyContext); + assertEquals("Foo", decryptedHashOnlyRecord.get("hashKey").s()); assertEquals("Bar", getItems(hashKey2, "HashKeyOnly").get("hashKey").s()); assertEquals("Baz", getItems(hashKey3, "HashKeyOnly").get("hashKey").s()); From b2c464fea84d18ffe4d09d6f98d475b0a41e1ddd Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 11:00:11 -0700 Subject: [PATCH 02/60] ec test --- .../datamodeling/sdkv2/HolisticIT.java | 219 +++++++++++++++++- 1 file changed, 218 insertions(+), 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index fdafee1dd0..a3608c9ec8 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -16,7 +16,10 @@ import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.WrappedMaterialsProvider; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.MetaStore; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.ProviderStore; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.*; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.LocalDynamoDb; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.DdbRecordMatcher; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueDeserializer; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest.KeyData; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest.Keys; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest.Scenario; @@ -535,6 +538,220 @@ public static Object[][] getDecryptTestVectors() throws IOException { .toArray(Object[][]::new); } + @Test + public void generateNullTableNameVector() throws Exception { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = EncryptionContext.builder() + .tableName(null) + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); + + Map> actions = new HashMap<>(); + for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { + switch (attr) { + case "hashKey": case "rangeKey": case "version": + actions.put(attr, signOnly); break; + default: + actions.put(attr, encryptAndSign); break; + } + } + + Map encrypted = + encryptor.encryptRecord(ENCRYPTED_TEST_VALUE, actions, ctx); + + printJSON(encrypted); + + client.close(); + localDynamoDb.stop(); + } + + @Test + public void generateNonBmpHashKeyVector() throws Exception { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, new TypeReference() {}); + loadKeyData(scenarioManifest.keyDataPath); + + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( + new DirectKmsMaterialsProvider(kmsClient, keyDataMap.get("awsKmsUsWest2").keyId)); + EncryptionContext ctx = EncryptionContext.builder() + .tableName("HashKeyOnly") + .hashKeyName("hashKey") + .build(); + + String nonBmpKey = "test\uD83D\uDE00\u03A8key"; + Map item = new HashMap<>(); + item.put("hashKey", AttributeValue.builder().s(nonBmpKey).build()); + + Map> actions = new HashMap<>(); + actions.put("hashKey", signOnly); + + Map encrypted = encryptor.encryptRecord(item, actions, ctx); + + printJSON(encrypted); + + client.close(); + localDynamoDb.stop(); + } + + @Test + public void generateNonAsciiTableNameVector() throws Exception { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = EncryptionContext.builder() + .tableName("テーブル\uD83D\uDE00") + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); + + Map> actions = new HashMap<>(); + for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { + switch (attr) { + case "hashKey": case "rangeKey": case "version": + actions.put(attr, signOnly); break; + default: + actions.put(attr, encryptAndSign); break; + } + } + + Map encrypted = encryptor.encryptRecord(ENCRYPTED_TEST_VALUE, actions, ctx); + + printJSON(encrypted); + + client.close(); + localDynamoDb.stop(); + } + + public void printJSON(Map encrypted) { + StringBuilder sb = new StringBuilder(); + sb.append("{\n \"TableName\": [\n {\n"); + for (Map.Entry e : encrypted.entrySet()) { + AttributeValue v = e.getValue(); + sb.append(" \"").append(e.getKey()).append("\": {\n"); + if (v.n() != null) { + sb.append(" \"N\": \"").append(v.n()).append("\"\n"); + } else if (v.b() != null) { + sb.append(" \"B\": \"").append(Base64.encodeAsString(v.b().asByteArray())).append("\"\n"); + } else if (v.s() != null) { + sb.append(" \"S\": \"").append(v.s()).append("\"\n"); + } + sb.append(" },\n"); + } + sb.append(" }\n ]\n}"); + System.out.println(sb); + } + + // This test configures EC with various combination. This is different from other tests as other test run in same hardcoded EC. + @Test + public void decryptWithECConfigTest() throws IOException, GeneralSecurityException { + final String nullTableNameInECCipherFile = "file://ciphertext/java/static-aes-hmac-null-table-1.json"; + final String nonBMPinECCipherFile = "file://ciphertext/java/kms-nonbmp-hashkey-1.json"; + final String nonAsciiTableInECCipherFile = "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; + + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + decryptNullTableNameInEC(nullTableNameInECCipherFile); + decryptNonBmpHashKeyVector(nonBMPinECCipherFile); + decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); + + client.close(); + localDynamoDb.stop(); + } + + public void decryptNullTableNameInEC(String nullTableNameInECCipherFile) throws IOException, GeneralSecurityException { + putDataFromFile(client, nullTableNameInECCipherFile); + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = EncryptionContext.builder() + .tableName(null) + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); + + Map> actions = new HashMap<>(); + for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { + switch (attr) { + case "hashKey": case "rangeKey": case "version": + actions.put(attr, signOnly); break; + default: + actions.put(attr, encryptAndSign); break; + } + } + + HashMap key = new HashMap<>(); + key.put("hashKey", ENCRYPTED_TEST_VALUE.get("hashKey")); + key.put("rangeKey", ENCRYPTED_TEST_VALUE.get("rangeKey")); + Map response = getItems(key, tableName); + Map decrypted = + encryptor.decryptRecord(response, actions, ctx); + assertTrue(new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted)); + } + + public void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) throws IOException, GeneralSecurityException { + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, new TypeReference() {}); + loadKeyData(scenarioManifest.keyDataPath); + + putDataFromFile(client, nonBMPinECCipherFile); + + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( + new DirectKmsMaterialsProvider(kmsClient, keyDataMap.get("awsKmsUsWest2").keyId)); + EncryptionContext ctx = EncryptionContext.builder() + .tableName("HashKeyOnly") + .hashKeyName("hashKey") + .build(); + + Map> actions = new HashMap<>(); + actions.put("hashKey", signOnly); + + String nonBmpKey = "test\uD83D\uDE00Ψkey"; + HashMap key = new HashMap<>(); + key.put("hashKey", AttributeValue.builder().s(nonBmpKey).build()); + + Map response = getItems(key, "HashKeyOnly"); + Map decrypted = encryptor.decryptRecord(response, actions, ctx); + assertEquals(nonBmpKey, decrypted.get("hashKey").s()); + } + + public void decryptNonAsciiTableNameVector(String nonAsciiTableInECCipherFile) throws IOException, GeneralSecurityException { + putDataFromFile(client, nonAsciiTableInECCipherFile); + + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = EncryptionContext.builder() + .tableName("テーブル\uD83D\uDE00") + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); + + Map> actions = new HashMap<>(); + for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { + switch (attr) { + case "hashKey": case "rangeKey": case "version": + actions.put(attr, signOnly); break; + default: + actions.put(attr, encryptAndSign); break; + } + } + + HashMap key = new HashMap<>(); + key.put("hashKey", ENCRYPTED_TEST_VALUE.get("hashKey")); + key.put("rangeKey", ENCRYPTED_TEST_VALUE.get("rangeKey")); + Map response = getItems(key, tableName); + Map decrypted = encryptor.decryptRecord(response, actions, ctx); + assertTrue(new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted)); + } + @Test(dataProvider = "getDecryptTestVectors") public void decryptTestVector(Scenario scenario) throws IOException, GeneralSecurityException { From 40d075a7e4d772b1c80368fd5d010aefdb091316 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 12:17:30 -0700 Subject: [PATCH 03/60] refactoring --- .../datamodeling/sdkv2/HolisticIT.java | 63 ++++++++----------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index a3608c9ec8..7f700234bf 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -671,40 +671,32 @@ public void decryptWithECConfigTest() throws IOException, GeneralSecurityExcepti } public void decryptNullTableNameInEC(String nullTableNameInECCipherFile) throws IOException, GeneralSecurityException { - putDataFromFile(client, nullTableNameInECCipherFile); DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); EncryptionContext ctx = EncryptionContext.builder() - .tableName(null) - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); + .tableName(null) + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); Map> actions = new HashMap<>(); for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { - switch (attr) { - case "hashKey": case "rangeKey": case "version": - actions.put(attr, signOnly); break; - default: - actions.put(attr, encryptAndSign); break; - } + switch (attr) { + case "hashKey": case "rangeKey": case "version": + actions.put(attr, signOnly); break; + default: + actions.put(attr, encryptAndSign); break; + } } - HashMap key = new HashMap<>(); - key.put("hashKey", ENCRYPTED_TEST_VALUE.get("hashKey")); - key.put("rangeKey", ENCRYPTED_TEST_VALUE.get("rangeKey")); - Map response = getItems(key, tableName); - Map decrypted = - encryptor.decryptRecord(response, actions, ctx); - assertTrue(new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted)); + Map>> manifest = + getCiphertextManifestFromFile(nullTableNameInECCipherFile); + for (Map encryptedItem : manifest.get(tableName)) { + Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); + assertTrue(new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted)); + } } public void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) throws IOException, GeneralSecurityException { - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, new TypeReference() {}); - loadKeyData(scenarioManifest.keyDataPath); - - putDataFromFile(client, nonBMPinECCipherFile); - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( new DirectKmsMaterialsProvider(kmsClient, keyDataMap.get("awsKmsUsWest2").keyId)); EncryptionContext ctx = EncryptionContext.builder() @@ -716,17 +708,16 @@ public void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) throws IOExc actions.put("hashKey", signOnly); String nonBmpKey = "test\uD83D\uDE00Ψkey"; - HashMap key = new HashMap<>(); - key.put("hashKey", AttributeValue.builder().s(nonBmpKey).build()); - Map response = getItems(key, "HashKeyOnly"); - Map decrypted = encryptor.decryptRecord(response, actions, ctx); - assertEquals(nonBmpKey, decrypted.get("hashKey").s()); + Map>> manifest = + getCiphertextManifestFromFile(nonBMPinECCipherFile); + for (Map encryptedItem : manifest.get(tableName)) { + Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); + assertEquals(nonBmpKey, decrypted.get("hashKey").s()); + } } public void decryptNonAsciiTableNameVector(String nonAsciiTableInECCipherFile) throws IOException, GeneralSecurityException { - putDataFromFile(client, nonAsciiTableInECCipherFile); - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); EncryptionContext ctx = EncryptionContext.builder() .tableName("テーブル\uD83D\uDE00") @@ -744,12 +735,12 @@ public void decryptNonAsciiTableNameVector(String nonAsciiTableInECCipherFile) t } } - HashMap key = new HashMap<>(); - key.put("hashKey", ENCRYPTED_TEST_VALUE.get("hashKey")); - key.put("rangeKey", ENCRYPTED_TEST_VALUE.get("rangeKey")); - Map response = getItems(key, tableName); - Map decrypted = encryptor.decryptRecord(response, actions, ctx); + Map>> manifest = + getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); + for (Map encryptedItem : manifest.get(tableName)) { + Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); assertTrue(new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted)); + } } @Test(dataProvider = "getDecryptTestVectors") From e8e816ac3826da3cb8a0d940a27e554677b06f14 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 14:30:28 -0700 Subject: [PATCH 04/60] m --- .../ciphertext/java/kms-nonbmp-hashkey-1.json | 15 +++ .../static-aes-hmac-nonascii-table-1.json | 36 +++++++ .../java/static-aes-hmac-null-table-1.json | 36 +++++++ .../datamodeling/TransformerHolisticIT.java | 100 ++++++++++++++++++ .../datamodeling/sdkv2/HolisticIT.java | 10 +- 5 files changed, 191 insertions(+), 6 deletions(-) create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/kms-nonbmp-hashkey-1.json create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonascii-table-1.json create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-null-table-1.json diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/kms-nonbmp-hashkey-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/kms-nonbmp-hashkey-1.json new file mode 100644 index 0000000000..ad124268e8 --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/kms-nonbmp-hashkey-1.json @@ -0,0 +1,15 @@ +{ + "TableName": [ + { + "hashKey": { + "S": "test😀Ψkey" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREWlBYZGxDVHY2VlBCVUNFZ0lCRUlBN045Q1RjRHowSzd1RVNUUGxxU3MxdjRZQTVEU2tJQmVWc0lpN2FQTllVeW9xMm4xazZJUUlINnZGc3pmeFZSeFdLdUhxejZ0MkNtV1BlUFU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "+01tpVk8ZvuIFh+ZA02PkhFhEBs2vYePEgcM/qZ6JFw=" + } + } + ] +} \ No newline at end of file diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonascii-table-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonascii-table-1.json new file mode 100644 index 0000000000..126ce9588c --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonascii-table-1.json @@ -0,0 +1,36 @@ +{ + "TableName": [ + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "leseMgRescbtfi/CZCmfW0Lk1jkv6Md5cqAtBTEP1AQyTB25+xVF7UjWR1DbeA8Y" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "rf/00OwnLb/FlqMWDjvcdiX1AqzRQfLOuSSaTDZX7nSQrkDyqyxHxKYPWGnZOPOI3P2fOjVvYV0BSlmCIvP5kQ==" + }, + "byteArrayValue": { + "B": "DwzxA9QJrucdFE8nPIEaiAdggInKUH4CvumuBNZxcQc=" + }, + "intValue": { + "B": "b6tg6Vm7pzdcmlT0pc/4q/cecHZaiENJG/Hv+IU+6Lg=" + }, + "stringSet": { + "B": "HHIUXDDb2gMeGMfUs9cW0CtvPohceTRyOQ1GI/voY6vImFe1AJKNCy5Shx/PmMYH+rEzjryVsd8EVmcCco0PGA==" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "EQXY4c3O2NSyRpPPuR9RzZ+CnLxn7jgb12RRmivNYZA=" + } + } + ] +} \ No newline at end of file diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-null-table-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-null-table-1.json new file mode 100644 index 0000000000..b233607f48 --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-null-table-1.json @@ -0,0 +1,36 @@ +{ + "TableName": [ + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "6Z0SJgkzw3Ij0RNpHzrdH5o9+3tGJVVr3G66OL4+q7nfh/7AEg3wHnRuBiO2z3F/" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "E2PmJ8DFDYXCYlAssQzJCFPkeoZqyDDpXI0qJe5iXIIkGE1Ltn+J++OzKDZ+Gvkvno1eNERWplptL22HH2+kjQ==" + }, + "byteArrayValue": { + "B": "263KRNe2DxnFKltNMXgxr95crOtbOziyqaI2rVdiUco=" + }, + "intValue": { + "B": "5rYFQHJpwVusKp4zIcJkNgQpzrz3Gwk+sb3aQsmJWRs=" + }, + "stringSet": { + "B": "Yii7PxCMKEefXMIEXeLl20YMm7WhKxxNlCJzv18QCLhmrVEL15xvTzAkcPMXVud7YIJFx1XzcVTjK0wwn5htSw==" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "I/fHzON+4U01BsJA8hU6ebKn+TftiuaVAGDsn/ykAO8=" + } + } + ] + } \ No newline at end of file diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index c37fdf9643..e90bcf582c 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 package com.amazonaws.services.dynamodbv2.datamodeling; +import static com.amazonaws.services.dynamodbv2.datamodeling.LegacyTestVectors.baseClassToV1AttrMap; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNull; @@ -11,6 +12,8 @@ import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig.SaveBehavior; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.DynamoDBEncryptor; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.AsymmetricStaticProvider; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.CachingMostRecentProvider; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.DirectKmsMaterialProvider; @@ -33,6 +36,7 @@ import com.amazonaws.services.dynamodbv2.testing.types.Mixed; import com.amazonaws.services.dynamodbv2.testing.types.SignOnly; import com.amazonaws.services.dynamodbv2.testing.types.Untouched; +import com.amazonaws.services.dynamodbv2.testing.DdbRecordMatcher; import com.amazonaws.services.kms.AWSKMS; import com.amazonaws.services.kms.AWSKMSClientBuilder; import com.amazonaws.util.Base64; @@ -326,6 +330,102 @@ public void setUp() { createCiphertextTables(client); } + // This test configures EC with various combination. This is different from other tests as other test run in same hardcoded EC. + @Test + public void decryptWithECConfigTest() throws IOException, GeneralSecurityException { + final String nullTableNameInECCipherFile = "file://ciphertext/java/static-aes-hmac-null-table-1.json"; + final String nonBMPinECCipherFile = "file://ciphertext/java/kms-nonbmp-hashkey-1.json"; + final String nonAsciiTableInECCipherFile = "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; + + decryptNullTableNameInEC(nullTableNameInECCipherFile); + decryptNonBmpHashKeyVector(nonBMPinECCipherFile); + decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); + } + + private void decryptNullTableNameInEC(String nullTableNameInECCipherFile) throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = + new EncryptionContext.Builder() + .withTableName(null) + .withHashKeyName("hashKey") + .withRangeKeyName("rangeKey") + .build(); + + Map expectedAttrMap = baseClassToV1AttrMap(ENCRYPTED_TEST_VALUE); + Map> actions = new HashMap<>(); + for (String attr : expectedAttrMap.keySet()) { + switch (attr) { + case "hashKey": case "rangeKey": case "version": + actions.put(attr, EnumSet.of(EncryptionFlags.SIGN)); break; + default: + actions.put(attr, EnumSet.of(EncryptionFlags.ENCRYPT, + EncryptionFlags.SIGN)); break; + } + } + + Map>> manifest = + getCiphertextManifestFromFile(nullTableNameInECCipherFile); + + for (Map encryptedItem : manifest.get(BASE_CLASS_TABLE_NAME)) { + Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); + assertTrue(new DdbRecordMatcher(expectedAttrMap, false).matches(decrypted)); + } + } + + private void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) throws IOException, GeneralSecurityException { + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, new TypeReference() {}); + loadKeyData(scenarioManifest.keyDataPath); + + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( + new DirectKmsMaterialProvider(kmsClient, keyDataMap.get("awsKmsUsWest2").keyId)); + EncryptionContext ctx = + new EncryptionContext.Builder() + .withTableName("HashKeyOnly") + .withHashKeyName("hashKey") + .build(); + + Map> actions = new HashMap<>(); + actions.put("hashKey", EnumSet.of(EncryptionFlags.SIGN)); + + String nonBmpKey = "test\uD83D\uDE00Ψkey"; + Map>> manifest = + getCiphertextManifestFromFile(nonBMPinECCipherFile); + for (Map encryptedItem : manifest.get(BASE_CLASS_TABLE_NAME)) { + Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); + assertEquals(nonBmpKey, decrypted.get("hashKey").getS()); + } + } + + private void decryptNonAsciiTableNameVector(String nonAsciiTableInECCipherFile) throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext ctx = + new com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext.Builder() + .withTableName("テーブル\uD83D\uDE00") + .withHashKeyName("hashKey") + .withRangeKeyName("rangeKey") + .build(); + + Map expectedAttrMap = baseClassToV1AttrMap(ENCRYPTED_TEST_VALUE); + Map> actions = new HashMap<>(); + for (String attr : expectedAttrMap.keySet()) { + switch (attr) { + case "hashKey": case "rangeKey": case "version": + actions.put(attr, EnumSet.of(com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN)); break; + default: + actions.put(attr, EnumSet.of(com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.ENCRYPT, + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN)); break; + } + } + + Map>> manifest = + getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); + for (Map encryptedItem : manifest.get(BASE_CLASS_TABLE_NAME)) { + Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); + assertTrue(new DdbRecordMatcher(expectedAttrMap, false).matches(decrypted)); + } + } + @Test(dataProvider = "getDecryptTestVectors") public void decryptTestVector(Scenario scenario) throws IOException { client = DynamoDBEmbedded.create().amazonDynamoDB(); diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 7f700234bf..8567154b9d 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -659,15 +659,9 @@ public void decryptWithECConfigTest() throws IOException, GeneralSecurityExcepti final String nonBMPinECCipherFile = "file://ciphertext/java/kms-nonbmp-hashkey-1.json"; final String nonAsciiTableInECCipherFile = "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); decryptNullTableNameInEC(nullTableNameInECCipherFile); decryptNonBmpHashKeyVector(nonBMPinECCipherFile); decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); - - client.close(); - localDynamoDb.stop(); } public void decryptNullTableNameInEC(String nullTableNameInECCipherFile) throws IOException, GeneralSecurityException { @@ -697,6 +691,10 @@ public void decryptNullTableNameInEC(String nullTableNameInECCipherFile) throws } public void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) throws IOException, GeneralSecurityException { + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, new TypeReference() {}); + loadKeyData(scenarioManifest.keyDataPath); + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( new DirectKmsMaterialsProvider(kmsClient, keyDataMap.get("awsKmsUsWest2").keyId)); EncryptionContext ctx = EncryptionContext.builder() From 872c66992cd0367150ebc7bfa735bde0d3e1167f Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 14:38:49 -0700 Subject: [PATCH 05/60] formatting --- .../ciphertext/java/kms-nonbmp-hashkey-1.json | 28 +- .../static-aes-hmac-nonascii-table-1.json | 46 +-- .../java/static-aes-hmac-null-table-1.json | 46 +-- .../datamodeling/LegacyTestVectors.java | 41 +++ .../datamodeling/TransformerHolisticIT.java | 165 ++++++--- .../datamodeling/sdkv2/HolisticIT.java | 341 +++++++++++------- 6 files changed, 424 insertions(+), 243 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/kms-nonbmp-hashkey-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/kms-nonbmp-hashkey-1.json index ad124268e8..773f9bbe92 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/kms-nonbmp-hashkey-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/kms-nonbmp-hashkey-1.json @@ -1,15 +1,15 @@ { - "TableName": [ - { - "hashKey": { - "S": "test😀Ψkey" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREWlBYZGxDVHY2VlBCVUNFZ0lCRUlBN045Q1RjRHowSzd1RVNUUGxxU3MxdjRZQTVEU2tJQmVWc0lpN2FQTllVeW9xMm4xazZJUUlINnZGc3pmeFZSeFdLdUhxejZ0MkNtV1BlUFU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "+01tpVk8ZvuIFh+ZA02PkhFhEBs2vYePEgcM/qZ6JFw=" - } - } - ] -} \ No newline at end of file + "TableName": [ + { + "hashKey": { + "S": "test😀Ψkey" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREWlBYZGxDVHY2VlBCVUNFZ0lCRUlBN045Q1RjRHowSzd1RVNUUGxxU3MxdjRZQTVEU2tJQmVWc0lpN2FQTllVeW9xMm4xazZJUUlINnZGc3pmeFZSeFdLdUhxejZ0MkNtV1BlUFU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "+01tpVk8ZvuIFh+ZA02PkhFhEBs2vYePEgcM/qZ6JFw=" + } + } + ] +} diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonascii-table-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonascii-table-1.json index 126ce9588c..ce9c3d7026 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonascii-table-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonascii-table-1.json @@ -1,36 +1,36 @@ { - "TableName": [ + "TableName": [ { - "rangeKey": { + "rangeKey": { "N": "7" - }, - "hashKey": { + }, + "hashKey": { "N": "5" - }, - "stringValue": { + }, + "stringValue": { "B": "leseMgRescbtfi/CZCmfW0Lk1jkv6Md5cqAtBTEP1AQyTB25+xVF7UjWR1DbeA8Y" - }, - "*amzn-ddb-map-desc*": { + }, + "*amzn-ddb-map-desc*": { "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "intSet": { + }, + "intSet": { "B": "rf/00OwnLb/FlqMWDjvcdiX1AqzRQfLOuSSaTDZX7nSQrkDyqyxHxKYPWGnZOPOI3P2fOjVvYV0BSlmCIvP5kQ==" - }, - "byteArrayValue": { + }, + "byteArrayValue": { "B": "DwzxA9QJrucdFE8nPIEaiAdggInKUH4CvumuBNZxcQc=" - }, - "intValue": { + }, + "intValue": { "B": "b6tg6Vm7pzdcmlT0pc/4q/cecHZaiENJG/Hv+IU+6Lg=" - }, - "stringSet": { + }, + "stringSet": { "B": "HHIUXDDb2gMeGMfUs9cW0CtvPohceTRyOQ1GI/voY6vImFe1AJKNCy5Shx/PmMYH+rEzjryVsd8EVmcCco0PGA==" - }, - "version": { + }, + "version": { "N": "0" - }, - "*amzn-ddb-map-sig*": { + }, + "*amzn-ddb-map-sig*": { "B": "EQXY4c3O2NSyRpPPuR9RzZ+CnLxn7jgb12RRmivNYZA=" - } + } } - ] -} \ No newline at end of file + ] +} diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-null-table-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-null-table-1.json index b233607f48..328f4b1c64 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-null-table-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-null-table-1.json @@ -1,36 +1,36 @@ { - "TableName": [ + "TableName": [ { - "rangeKey": { + "rangeKey": { "N": "7" - }, - "hashKey": { + }, + "hashKey": { "N": "5" - }, - "stringValue": { + }, + "stringValue": { "B": "6Z0SJgkzw3Ij0RNpHzrdH5o9+3tGJVVr3G66OL4+q7nfh/7AEg3wHnRuBiO2z3F/" - }, - "*amzn-ddb-map-desc*": { + }, + "*amzn-ddb-map-desc*": { "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "intSet": { + }, + "intSet": { "B": "E2PmJ8DFDYXCYlAssQzJCFPkeoZqyDDpXI0qJe5iXIIkGE1Ltn+J++OzKDZ+Gvkvno1eNERWplptL22HH2+kjQ==" - }, - "byteArrayValue": { + }, + "byteArrayValue": { "B": "263KRNe2DxnFKltNMXgxr95crOtbOziyqaI2rVdiUco=" - }, - "intValue": { + }, + "intValue": { "B": "5rYFQHJpwVusKp4zIcJkNgQpzrz3Gwk+sb3aQsmJWRs=" - }, - "stringSet": { + }, + "stringSet": { "B": "Yii7PxCMKEefXMIEXeLl20YMm7WhKxxNlCJzv18QCLhmrVEL15xvTzAkcPMXVud7YIJFx1XzcVTjK0wwn5htSw==" - }, - "version": { + }, + "version": { "N": "0" - }, - "*amzn-ddb-map-sig*": { + }, + "*amzn-ddb-map-sig*": { "B": "I/fHzON+4U01BsJA8hU6ebKn+TftiuaVAGDsn/ykAO8=" - } + } } - ] - } \ No newline at end of file + ] +} diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/LegacyTestVectors.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/LegacyTestVectors.java index aebb82e414..7bab27e430 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/LegacyTestVectors.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/LegacyTestVectors.java @@ -397,6 +397,47 @@ public static BaseClass attributeMapToBaseClass( return value; } + public static Map baseClassToV1AttrMap( + BaseClass obj + ) { + Map map = new HashMap<>(); + map.put( + HASH_KEY, + new AttributeValue().withN(String.valueOf(obj.getHashKey())) + ); + map.put( + RANGE_KEY, + new AttributeValue().withN(String.valueOf(obj.getRangeKey())) + ); + map.put( + "version", + new AttributeValue().withN(String.valueOf(obj.getVersion())) + ); + map.put( + "intValue", + new AttributeValue().withN(String.valueOf(obj.getIntValue())) + ); + map.put("stringValue", new AttributeValue().withS(obj.getStringValue())); + map.put( + "byteArrayValue", + new AttributeValue() + .withB(java.nio.ByteBuffer.wrap(obj.getByteArrayValue())) + ); + map.put("stringSet", new AttributeValue().withSS(obj.getStringSet())); + map.put( + "intSet", + new AttributeValue() + .withNS( + obj + .getIntSet() + .stream() + .map(String::valueOf) + .collect(java.util.stream.Collectors.toList()) + ) + ); + return map; + } + public static Map< String, software.amazon.awssdk.services.dynamodb.model.AttributeValue diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index e90bcf582c..f643a44c86 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -26,6 +26,7 @@ import com.amazonaws.services.dynamodbv2.model.*; import com.amazonaws.services.dynamodbv2.testing.AttributeValueDeserializer; import com.amazonaws.services.dynamodbv2.testing.AttributeValueSerializer; +import com.amazonaws.services.dynamodbv2.testing.DdbRecordMatcher; import com.amazonaws.services.dynamodbv2.testing.ScenarioManifest; import com.amazonaws.services.dynamodbv2.testing.ScenarioManifest.KeyData; import com.amazonaws.services.dynamodbv2.testing.ScenarioManifest.Keys; @@ -36,7 +37,6 @@ import com.amazonaws.services.dynamodbv2.testing.types.Mixed; import com.amazonaws.services.dynamodbv2.testing.types.SignOnly; import com.amazonaws.services.dynamodbv2.testing.types.Untouched; -import com.amazonaws.services.dynamodbv2.testing.DdbRecordMatcher; import com.amazonaws.services.kms.AWSKMS; import com.amazonaws.services.kms.AWSKMSClientBuilder; import com.amazonaws.util.Base64; @@ -332,97 +332,160 @@ public void setUp() { // This test configures EC with various combination. This is different from other tests as other test run in same hardcoded EC. @Test - public void decryptWithECConfigTest() throws IOException, GeneralSecurityException { - final String nullTableNameInECCipherFile = "file://ciphertext/java/static-aes-hmac-null-table-1.json"; - final String nonBMPinECCipherFile = "file://ciphertext/java/kms-nonbmp-hashkey-1.json"; - final String nonAsciiTableInECCipherFile = "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; + public void decryptWithECConfigTest() + throws IOException, GeneralSecurityException { + final String nullTableNameInECCipherFile = + "file://ciphertext/java/static-aes-hmac-null-table-1.json"; + final String nonBMPinECCipherFile = + "file://ciphertext/java/kms-nonbmp-hashkey-1.json"; + final String nonAsciiTableInECCipherFile = + "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; decryptNullTableNameInEC(nullTableNameInECCipherFile); decryptNonBmpHashKeyVector(nonBMPinECCipherFile); decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); } - private void decryptNullTableNameInEC(String nullTableNameInECCipherFile) throws IOException, GeneralSecurityException { + private void decryptNullTableNameInEC(String nullTableNameInECCipherFile) + throws IOException, GeneralSecurityException { DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = - new EncryptionContext.Builder() - .withTableName(null) - .withHashKeyName("hashKey") - .withRangeKeyName("rangeKey") - .build(); - - Map expectedAttrMap = baseClassToV1AttrMap(ENCRYPTED_TEST_VALUE); + EncryptionContext ctx = new EncryptionContext.Builder() + .withTableName(null) + .withHashKeyName("hashKey") + .withRangeKeyName("rangeKey") + .build(); + + Map expectedAttrMap = baseClassToV1AttrMap( + ENCRYPTED_TEST_VALUE + ); Map> actions = new HashMap<>(); for (String attr : expectedAttrMap.keySet()) { switch (attr) { - case "hashKey": case "rangeKey": case "version": - actions.put(attr, EnumSet.of(EncryptionFlags.SIGN)); break; + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, EnumSet.of(EncryptionFlags.SIGN)); + break; default: - actions.put(attr, EnumSet.of(EncryptionFlags.ENCRYPT, - EncryptionFlags.SIGN)); break; + actions.put( + attr, + EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN) + ); + break; } } Map>> manifest = - getCiphertextManifestFromFile(nullTableNameInECCipherFile); - - for (Map encryptedItem : manifest.get(BASE_CLASS_TABLE_NAME)) { - Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); - assertTrue(new DdbRecordMatcher(expectedAttrMap, false).matches(decrypted)); + getCiphertextManifestFromFile(nullTableNameInECCipherFile); + + for (Map encryptedItem : manifest.get( + BASE_CLASS_TABLE_NAME + )) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertTrue( + new DdbRecordMatcher(expectedAttrMap, false).matches(decrypted) + ); } } - private void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) throws IOException, GeneralSecurityException { + private void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) + throws IOException, GeneralSecurityException { ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, new TypeReference() {}); + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); loadKeyData(scenarioManifest.keyDataPath); DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( - new DirectKmsMaterialProvider(kmsClient, keyDataMap.get("awsKmsUsWest2").keyId)); - EncryptionContext ctx = - new EncryptionContext.Builder() - .withTableName("HashKeyOnly") - .withHashKeyName("hashKey") - .build(); + new DirectKmsMaterialProvider( + kmsClient, + keyDataMap.get("awsKmsUsWest2").keyId + ) + ); + EncryptionContext ctx = new EncryptionContext.Builder() + .withTableName("HashKeyOnly") + .withHashKeyName("hashKey") + .build(); Map> actions = new HashMap<>(); actions.put("hashKey", EnumSet.of(EncryptionFlags.SIGN)); String nonBmpKey = "test\uD83D\uDE00Ψkey"; Map>> manifest = - getCiphertextManifestFromFile(nonBMPinECCipherFile); - for (Map encryptedItem : manifest.get(BASE_CLASS_TABLE_NAME)) { - Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); + getCiphertextManifestFromFile(nonBMPinECCipherFile); + for (Map encryptedItem : manifest.get( + BASE_CLASS_TABLE_NAME + )) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); assertEquals(nonBmpKey, decrypted.get("hashKey").getS()); } } - private void decryptNonAsciiTableNameVector(String nonAsciiTableInECCipherFile) throws IOException, GeneralSecurityException { + private void decryptNonAsciiTableNameVector( + String nonAsciiTableInECCipherFile + ) throws IOException, GeneralSecurityException { DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext ctx = - new com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext.Builder() - .withTableName("テーブル\uD83D\uDE00") - .withHashKeyName("hashKey") - .withRangeKeyName("rangeKey") - .build(); - - Map expectedAttrMap = baseClassToV1AttrMap(ENCRYPTED_TEST_VALUE); - Map> actions = new HashMap<>(); + new com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext.Builder() + .withTableName("テーブル\uD83D\uDE00") + .withHashKeyName("hashKey") + .withRangeKeyName("rangeKey") + .build(); + + Map expectedAttrMap = baseClassToV1AttrMap( + ENCRYPTED_TEST_VALUE + ); + Map< + String, + Set< + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags + > + > actions = new HashMap<>(); for (String attr : expectedAttrMap.keySet()) { switch (attr) { - case "hashKey": case "rangeKey": case "version": - actions.put(attr, EnumSet.of(com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN)); break; + case "hashKey": + case "rangeKey": + case "version": + actions.put( + attr, + EnumSet.of( + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN + ) + ); + break; default: - actions.put(attr, EnumSet.of(com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.ENCRYPT, - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN)); break; + actions.put( + attr, + EnumSet.of( + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.ENCRYPT, + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN + ) + ); + break; } } Map>> manifest = - getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); - for (Map encryptedItem : manifest.get(BASE_CLASS_TABLE_NAME)) { - Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); - assertTrue(new DdbRecordMatcher(expectedAttrMap, false).matches(decrypted)); + getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); + for (Map encryptedItem : manifest.get( + BASE_CLASS_TABLE_NAME + )) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertTrue( + new DdbRecordMatcher(expectedAttrMap, false).matches(decrypted) + ); } } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 8567154b9d..9d6e5dd901 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -16,10 +16,10 @@ import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.WrappedMaterialsProvider; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.MetaStore; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.ProviderStore; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueDeserializer; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.DdbRecordMatcher; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.LocalDynamoDb; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.DdbRecordMatcher; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueDeserializer; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest.KeyData; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest.Keys; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest.Scenario; @@ -545,24 +545,32 @@ public void generateNullTableNameVector() throws Exception { createCiphertextTables(client); DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = EncryptionContext.builder() - .tableName(null) - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName(null) + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); Map> actions = new HashMap<>(); for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { - switch (attr) { - case "hashKey": case "rangeKey": case "version": - actions.put(attr, signOnly); break; - default: - actions.put(attr, encryptAndSign); break; - } + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, signOnly); + break; + default: + actions.put(attr, encryptAndSign); + break; + } } - Map encrypted = - encryptor.encryptRecord(ENCRYPTED_TEST_VALUE, actions, ctx); + Map encrypted = encryptor.encryptRecord( + ENCRYPTED_TEST_VALUE, + actions, + ctx + ); printJSON(encrypted); @@ -572,81 +580,104 @@ public void generateNullTableNameVector() throws Exception { @Test public void generateNonBmpHashKeyVector() throws Exception { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, new TypeReference() {}); - loadKeyData(scenarioManifest.keyDataPath); - - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( - new DirectKmsMaterialsProvider(kmsClient, keyDataMap.get("awsKmsUsWest2").keyId)); - EncryptionContext ctx = EncryptionContext.builder() - .tableName("HashKeyOnly") - .hashKeyName("hashKey") - .build(); - - String nonBmpKey = "test\uD83D\uDE00\u03A8key"; - Map item = new HashMap<>(); - item.put("hashKey", AttributeValue.builder().s(nonBmpKey).build()); - - Map> actions = new HashMap<>(); - actions.put("hashKey", signOnly); - - Map encrypted = encryptor.encryptRecord(item, actions, ctx); - - printJSON(encrypted); - - client.close(); - localDynamoDb.stop(); + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( + new DirectKmsMaterialsProvider( + kmsClient, + keyDataMap.get("awsKmsUsWest2").keyId + ) + ); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName("HashKeyOnly") + .hashKeyName("hashKey") + .build(); + + String nonBmpKey = "test\uD83D\uDE00\u03A8key"; + Map item = new HashMap<>(); + item.put("hashKey", AttributeValue.builder().s(nonBmpKey).build()); + + Map> actions = new HashMap<>(); + actions.put("hashKey", signOnly); + + Map encrypted = encryptor.encryptRecord( + item, + actions, + ctx + ); + + printJSON(encrypted); + + client.close(); + localDynamoDb.stop(); } @Test public void generateNonAsciiTableNameVector() throws Exception { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = EncryptionContext.builder() - .tableName("テーブル\uD83D\uDE00") - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); - - Map> actions = new HashMap<>(); - for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { - switch (attr) { - case "hashKey": case "rangeKey": case "version": - actions.put(attr, signOnly); break; - default: - actions.put(attr, encryptAndSign); break; - } + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName("テーブル\uD83D\uDE00") + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); + + Map> actions = new HashMap<>(); + for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, signOnly); + break; + default: + actions.put(attr, encryptAndSign); + break; } + } - Map encrypted = encryptor.encryptRecord(ENCRYPTED_TEST_VALUE, actions, ctx); + Map encrypted = encryptor.encryptRecord( + ENCRYPTED_TEST_VALUE, + actions, + ctx + ); - printJSON(encrypted); + printJSON(encrypted); - client.close(); - localDynamoDb.stop(); + client.close(); + localDynamoDb.stop(); } public void printJSON(Map encrypted) { StringBuilder sb = new StringBuilder(); sb.append("{\n \"TableName\": [\n {\n"); for (Map.Entry e : encrypted.entrySet()) { - AttributeValue v = e.getValue(); - sb.append(" \"").append(e.getKey()).append("\": {\n"); - if (v.n() != null) { - sb.append(" \"N\": \"").append(v.n()).append("\"\n"); - } else if (v.b() != null) { - sb.append(" \"B\": \"").append(Base64.encodeAsString(v.b().asByteArray())).append("\"\n"); - } else if (v.s() != null) { - sb.append(" \"S\": \"").append(v.s()).append("\"\n"); - } - sb.append(" },\n"); + AttributeValue v = e.getValue(); + sb.append(" \"").append(e.getKey()).append("\": {\n"); + if (v.n() != null) { + sb.append(" \"N\": \"").append(v.n()).append("\"\n"); + } else if (v.b() != null) { + sb + .append(" \"B\": \"") + .append(Base64.encodeAsString(v.b().asByteArray())) + .append("\"\n"); + } else if (v.s() != null) { + sb.append(" \"S\": \"").append(v.s()).append("\"\n"); + } + sb.append(" },\n"); } sb.append(" }\n ]\n}"); System.out.println(sb); @@ -654,90 +685,131 @@ public void printJSON(Map encrypted) { // This test configures EC with various combination. This is different from other tests as other test run in same hardcoded EC. @Test - public void decryptWithECConfigTest() throws IOException, GeneralSecurityException { - final String nullTableNameInECCipherFile = "file://ciphertext/java/static-aes-hmac-null-table-1.json"; - final String nonBMPinECCipherFile = "file://ciphertext/java/kms-nonbmp-hashkey-1.json"; - final String nonAsciiTableInECCipherFile = "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; + public void decryptWithECConfigTest() + throws IOException, GeneralSecurityException { + final String nullTableNameInECCipherFile = + "file://ciphertext/java/static-aes-hmac-null-table-1.json"; + final String nonBMPinECCipherFile = + "file://ciphertext/java/kms-nonbmp-hashkey-1.json"; + final String nonAsciiTableInECCipherFile = + "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; decryptNullTableNameInEC(nullTableNameInECCipherFile); decryptNonBmpHashKeyVector(nonBMPinECCipherFile); decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); } - public void decryptNullTableNameInEC(String nullTableNameInECCipherFile) throws IOException, GeneralSecurityException { + public void decryptNullTableNameInEC(String nullTableNameInECCipherFile) + throws IOException, GeneralSecurityException { DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = EncryptionContext.builder() - .tableName(null) - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName(null) + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); Map> actions = new HashMap<>(); for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { switch (attr) { - case "hashKey": case "rangeKey": case "version": - actions.put(attr, signOnly); break; + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, signOnly); + break; default: - actions.put(attr, encryptAndSign); break; + actions.put(attr, encryptAndSign); + break; } } Map>> manifest = - getCiphertextManifestFromFile(nullTableNameInECCipherFile); + getCiphertextManifestFromFile(nullTableNameInECCipherFile); for (Map encryptedItem : manifest.get(tableName)) { - Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); - assertTrue(new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted)); + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertTrue( + new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted) + ); } } - public void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) throws IOException, GeneralSecurityException { - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, new TypeReference() {}); - loadKeyData(scenarioManifest.keyDataPath); + public void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) + throws IOException, GeneralSecurityException { + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( - new DirectKmsMaterialsProvider(kmsClient, keyDataMap.get("awsKmsUsWest2").keyId)); - EncryptionContext ctx = EncryptionContext.builder() - .tableName("HashKeyOnly") - .hashKeyName("hashKey") - .build(); + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( + new DirectKmsMaterialsProvider( + kmsClient, + keyDataMap.get("awsKmsUsWest2").keyId + ) + ); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName("HashKeyOnly") + .hashKeyName("hashKey") + .build(); - Map> actions = new HashMap<>(); - actions.put("hashKey", signOnly); + Map> actions = new HashMap<>(); + actions.put("hashKey", signOnly); - String nonBmpKey = "test\uD83D\uDE00Ψkey"; + String nonBmpKey = "test\uD83D\uDE00Ψkey"; - Map>> manifest = - getCiphertextManifestFromFile(nonBMPinECCipherFile); - for (Map encryptedItem : manifest.get(tableName)) { - Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); - assertEquals(nonBmpKey, decrypted.get("hashKey").s()); - } + Map>> manifest = + getCiphertextManifestFromFile(nonBMPinECCipherFile); + for (Map encryptedItem : manifest.get(tableName)) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertEquals(nonBmpKey, decrypted.get("hashKey").s()); + } } - public void decryptNonAsciiTableNameVector(String nonAsciiTableInECCipherFile) throws IOException, GeneralSecurityException { - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = EncryptionContext.builder() - .tableName("テーブル\uD83D\uDE00") - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); - - Map> actions = new HashMap<>(); - for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { - switch (attr) { - case "hashKey": case "rangeKey": case "version": - actions.put(attr, signOnly); break; - default: - actions.put(attr, encryptAndSign); break; - } + public void decryptNonAsciiTableNameVector( + String nonAsciiTableInECCipherFile + ) throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName("テーブル\uD83D\uDE00") + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); + + Map> actions = new HashMap<>(); + for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, signOnly); + break; + default: + actions.put(attr, encryptAndSign); + break; } + } Map>> manifest = - getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); + getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); for (Map encryptedItem : manifest.get(tableName)) { - Map decrypted = encryptor.decryptRecord(encryptedItem, actions, ctx); - assertTrue(new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted)); + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertTrue( + new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted) + ); } } @@ -1329,7 +1401,7 @@ private void assertVersionCompatibility( assertTrue( new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decryptedRecord) ); - + // Atleast decrypt one item with only hash key. EncryptionContext hashOnlyContext = EncryptionContext .builder() @@ -1339,7 +1411,12 @@ private void assertVersionCompatibility( Map> hashOnlyActions = new HashMap<>(); hashOnlyActions.put("hashKey", signOnly); - Map decryptedHashOnlyRecord = encryptor.decryptRecord(getItems(hashKey1, "HashKeyOnly"), hashOnlyActions, hashOnlyContext); + Map decryptedHashOnlyRecord = + encryptor.decryptRecord( + getItems(hashKey1, "HashKeyOnly"), + hashOnlyActions, + hashOnlyContext + ); assertEquals("Foo", decryptedHashOnlyRecord.get("hashKey").s()); assertEquals("Bar", getItems(hashKey2, "HashKeyOnly").get("hashKey").s()); assertEquals("Baz", getItems(hashKey3, "HashKeyOnly").get("hashKey").s()); From bb63d317574f0c98c55ffdf15ca3c2464dd4348d Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 14:41:12 -0700 Subject: [PATCH 06/60] remove temp code --- .../datamodeling/sdkv2/HolisticIT.java | 145 ------------------ 1 file changed, 145 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 9d6e5dd901..dba374859d 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -538,151 +538,6 @@ public static Object[][] getDecryptTestVectors() throws IOException { .toArray(Object[][]::new); } - @Test - public void generateNullTableNameVector() throws Exception { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = EncryptionContext - .builder() - .tableName(null) - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); - - Map> actions = new HashMap<>(); - for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { - switch (attr) { - case "hashKey": - case "rangeKey": - case "version": - actions.put(attr, signOnly); - break; - default: - actions.put(attr, encryptAndSign); - break; - } - } - - Map encrypted = encryptor.encryptRecord( - ENCRYPTED_TEST_VALUE, - actions, - ctx - ); - - printJSON(encrypted); - - client.close(); - localDynamoDb.stop(); - } - - @Test - public void generateNonBmpHashKeyVector() throws Exception { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( - new DirectKmsMaterialsProvider( - kmsClient, - keyDataMap.get("awsKmsUsWest2").keyId - ) - ); - EncryptionContext ctx = EncryptionContext - .builder() - .tableName("HashKeyOnly") - .hashKeyName("hashKey") - .build(); - - String nonBmpKey = "test\uD83D\uDE00\u03A8key"; - Map item = new HashMap<>(); - item.put("hashKey", AttributeValue.builder().s(nonBmpKey).build()); - - Map> actions = new HashMap<>(); - actions.put("hashKey", signOnly); - - Map encrypted = encryptor.encryptRecord( - item, - actions, - ctx - ); - - printJSON(encrypted); - - client.close(); - localDynamoDb.stop(); - } - - @Test - public void generateNonAsciiTableNameVector() throws Exception { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = EncryptionContext - .builder() - .tableName("テーブル\uD83D\uDE00") - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); - - Map> actions = new HashMap<>(); - for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { - switch (attr) { - case "hashKey": - case "rangeKey": - case "version": - actions.put(attr, signOnly); - break; - default: - actions.put(attr, encryptAndSign); - break; - } - } - - Map encrypted = encryptor.encryptRecord( - ENCRYPTED_TEST_VALUE, - actions, - ctx - ); - - printJSON(encrypted); - - client.close(); - localDynamoDb.stop(); - } - - public void printJSON(Map encrypted) { - StringBuilder sb = new StringBuilder(); - sb.append("{\n \"TableName\": [\n {\n"); - for (Map.Entry e : encrypted.entrySet()) { - AttributeValue v = e.getValue(); - sb.append(" \"").append(e.getKey()).append("\": {\n"); - if (v.n() != null) { - sb.append(" \"N\": \"").append(v.n()).append("\"\n"); - } else if (v.b() != null) { - sb - .append(" \"B\": \"") - .append(Base64.encodeAsString(v.b().asByteArray())) - .append("\"\n"); - } else if (v.s() != null) { - sb.append(" \"S\": \"").append(v.s()).append("\"\n"); - } - sb.append(" },\n"); - } - sb.append(" }\n ]\n}"); - System.out.println(sb); - } - // This test configures EC with various combination. This is different from other tests as other test run in same hardcoded EC. @Test public void decryptWithECConfigTest() From d95c763dff6a1e3d4f35192cb37ff2364c2c9314 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 15:03:41 -0700 Subject: [PATCH 07/60] m --- .../datamodeling/sdkv2/HolisticIT.java | 29 ++-- .../datamodeling/sdkv2/HolisticITHelper.java | 137 ++++++++++++++++++ 2 files changed, 152 insertions(+), 14 deletions(-) create mode 100644 DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index dba374859d..aacb5d61e8 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -42,6 +42,7 @@ import javax.crypto.spec.SecretKeySpec; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; +import sdkv2.com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.HolisticITHelper; import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.*; @@ -95,26 +96,26 @@ public class HolisticIT { private static final PrivateKey rsaPriv; private static final PublicKey rsaPub; private static final KeyPair rsaPair; - private static final EncryptionMaterialsProvider symProv; + public static final EncryptionMaterialsProvider symProv; private static final EncryptionMaterialsProvider asymProv; private static final EncryptionMaterialsProvider symWrappedProv; private static final String HASH_KEY = "hashKey"; private static final String RANGE_KEY = "rangeKey"; private static final String RSA = "RSA"; - private static final String tableName = "TableName"; - final EnumSet signOnly = EnumSet.of(EncryptionFlags.SIGN); - final EnumSet encryptAndSign = EnumSet.of( + public static final String tableName = "TableName"; + public static final EnumSet signOnly = EnumSet.of(EncryptionFlags.SIGN); + public static final EnumSet encryptAndSign = EnumSet.of( EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN ); private final LocalDynamoDb localDynamoDb = new LocalDynamoDb(); private DynamoDbClient client; - private static KmsClient kmsClient = KmsClient.builder().build(); + public static KmsClient kmsClient = KmsClient.builder().build(); - private static Map keyDataMap = new HashMap<>(); + public static Map keyDataMap = new HashMap<>(); - private static final Map ENCRYPTED_TEST_VALUE = + public static final Map ENCRYPTED_TEST_VALUE = new HashMap<>(); private static final Map MIXED_TEST_VALUE = new HashMap<>(); @@ -134,7 +135,7 @@ public class HolisticIT { private static final String TEST_VECTOR_MANIFEST_DIR = "/vectors/encrypted_item/"; - private static final String SCENARIO_MANIFEST_PATH = + public static final String SCENARIO_MANIFEST_PATH = TEST_VECTOR_MANIFEST_DIR + "scenarios.json"; private static final String JAVA_DIR = "java"; @@ -549,9 +550,9 @@ public void decryptWithECConfigTest() final String nonAsciiTableInECCipherFile = "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; - decryptNullTableNameInEC(nullTableNameInECCipherFile); - decryptNonBmpHashKeyVector(nonBMPinECCipherFile); - decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); + HolisticITHelper.decryptNullTableNameInEC(nullTableNameInECCipherFile); + HolisticITHelper.decryptNonBmpHashKeyVector(nonBMPinECCipherFile); + HolisticITHelper.decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); } public void decryptNullTableNameInEC(String nullTableNameInECCipherFile) @@ -1023,7 +1024,7 @@ private void putDataFromFile(DynamoDbClient localDynamoDb, String filename) } } - private Map< + public static Map< String, List> > getCiphertextManifestFromFile(String filename) throws IOException { @@ -1035,7 +1036,7 @@ > getCiphertextManifestFromFile(String filename) throws IOException { ); } - private static T getManifestFromFile( + public static T getManifestFromFile( String filename, TypeReference typeRef ) throws IOException { @@ -1050,7 +1051,7 @@ private static T getManifestFromFile( return (T) manifestMapper.readValue(manifestFile, typeRef); } - private static void loadKeyData(String filename) throws IOException { + public static void loadKeyData(String filename) throws IOException { keyDataMap = getManifestFromFile( TEST_VECTOR_MANIFEST_DIR + stripFilePath(filename), diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java new file mode 100644 index 0000000000..a339cf6ee9 --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java @@ -0,0 +1,137 @@ +package com.amazonaws.services.dynamodbv2.datamodeling.sdkv2; + +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.DynamoDBEncryptor; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.EncryptionContext; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.EncryptionFlags; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.DirectKmsMaterialsProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.DdbRecordMatcher; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest; +import com.fasterxml.jackson.core.type.TypeReference; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.HolisticIT.*; +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertTrue; + +public class HolisticITHelper { + public static void decryptNonAsciiTableNameVector( + String nonAsciiTableInECCipherFile + ) throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName("テーブル\uD83D\uDE00") + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); + + Map> actions = new HashMap<>(); + for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, signOnly); + break; + default: + actions.put(attr, encryptAndSign); + break; + } + } + + Map>> manifest = + getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); + for (Map encryptedItem : manifest.get(tableName)) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertTrue( + new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted) + ); + } + } + + public static void decryptNullTableNameInEC(String nullTableNameInECCipherFile) + throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName(null) + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); + + Map> actions = new HashMap<>(); + for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, signOnly); + break; + default: + actions.put(attr, encryptAndSign); + break; + } + } + + Map>> manifest = + getCiphertextManifestFromFile(nullTableNameInECCipherFile); + for (Map encryptedItem : manifest.get(tableName)) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertTrue( + new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted) + ); + } + } + + public static void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) + throws IOException, GeneralSecurityException { + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( + new DirectKmsMaterialsProvider( + kmsClient, + keyDataMap.get("awsKmsUsWest2").keyId + ) + ); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName("HashKeyOnly") + .hashKeyName("hashKey") + .build(); + + Map> actions = new HashMap<>(); + actions.put("hashKey", signOnly); + + String nonBmpKey = "test\uD83D\uDE00Ψkey"; + + Map>> manifest = + getCiphertextManifestFromFile(nonBMPinECCipherFile); + for (Map encryptedItem : manifest.get(tableName)) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertEquals(nonBmpKey, decrypted.get("hashKey").s()); + } + } +} From 2e40b0947d99aaafcf8a8a813d15eccdfb571b1b Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 15:06:42 -0700 Subject: [PATCH 08/60] m --- .../services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index aacb5d61e8..8629b1bbc8 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -42,7 +42,7 @@ import javax.crypto.spec.SecretKeySpec; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; -import sdkv2.com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.HolisticITHelper; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.HolisticITHelper; import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.*; From 78eedbe7dd76a5e3b497c7207962cd0787879f06 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 15:06:54 -0700 Subject: [PATCH 09/60] m --- .../services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java | 1 - 1 file changed, 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 8629b1bbc8..cc0a836869 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -42,7 +42,6 @@ import javax.crypto.spec.SecretKeySpec; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.HolisticITHelper; import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.*; From cee5b6d10f19cd8d4b6fb44e9e1d5a2cfba00669 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 15:18:08 -0700 Subject: [PATCH 10/60] m --- .../datamodeling/TransformerHolisticIT.java | 18 +- .../TransformerHolisticITHelper.java | 160 ++++++++++++++++++ 2 files changed, 169 insertions(+), 9 deletions(-) create mode 100644 DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index f643a44c86..b62d6295b4 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -111,18 +111,18 @@ public class TransformerHolisticIT { private static final PrivateKey rsaPriv; private static final PublicKey rsaPub; private static final KeyPair rsaPair; - private static final EncryptionMaterialsProvider symProv; + public static final EncryptionMaterialsProvider symProv; private static final EncryptionMaterialsProvider asymProv; private static final EncryptionMaterialsProvider symWrappedProv; protected static final String HASH_KEY = "hashKey"; protected static final String RANGE_KEY = "rangeKey"; - protected static final String BASE_CLASS_TABLE_NAME = "TableName"; + public static final String BASE_CLASS_TABLE_NAME = "TableName"; private static final String RSA = "RSA"; private AmazonDynamoDB client; - private static AWSKMS kmsClient = AWSKMSClientBuilder.standard().build(); + public static AWSKMS kmsClient = AWSKMSClientBuilder.standard().build(); - private static Map keyDataMap = new HashMap<>(); + public static Map keyDataMap = new HashMap<>(); // AttributeEncryptor *must* be used with SaveBehavior.CLOBBER to avoid the risk of data // corruption. @@ -131,7 +131,7 @@ public class TransformerHolisticIT { .builder() .withSaveBehavior(SaveBehavior.CLOBBER) .build(); - private static final BaseClass ENCRYPTED_TEST_VALUE = new BaseClass(); + public static final BaseClass ENCRYPTED_TEST_VALUE = new BaseClass(); private static final Mixed MIXED_TEST_VALUE = new Mixed(); private static final SignOnly SIGNED_TEST_VALUE = new SignOnly(); private static final Untouched UNTOUCHED_TEST_VALUE = new Untouched(); @@ -143,7 +143,7 @@ public class TransformerHolisticIT { private static final String TEST_VECTOR_MANIFEST_DIR = "/vectors/encrypted_item/"; - private static final String SCENARIO_MANIFEST_PATH = + public static final String SCENARIO_MANIFEST_PATH = TEST_VECTOR_MANIFEST_DIR + "scenarios.json"; private static final String JAVA_DIR = "java"; @@ -1516,7 +1516,7 @@ private void putDataFromFile(AmazonDynamoDB client, String filename) } } - private Map< + public static Map< String, List> > getCiphertextManifestFromFile(String filename) throws IOException { @@ -1528,7 +1528,7 @@ > getCiphertextManifestFromFile(String filename) throws IOException { ); } - private static T getManifestFromFile( + public static T getManifestFromFile( String filename, TypeReference typeRef ) throws IOException { @@ -1543,7 +1543,7 @@ private static T getManifestFromFile( return (T) manifestMapper.readValue(manifestFile, typeRef); } - private static void loadKeyData(String filename) throws IOException { + static void loadKeyData(String filename) throws IOException { keyDataMap = getManifestFromFile( TEST_VECTOR_MANIFEST_DIR + stripFilePath(filename), diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java new file mode 100644 index 0000000000..56f269b220 --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java @@ -0,0 +1,160 @@ +package com.amazonaws.services.dynamodbv2.datamodeling; + +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.DynamoDBEncryptor; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.DirectKmsMaterialProvider; +import com.amazonaws.services.dynamodbv2.model.AttributeValue; +import com.fasterxml.jackson.core.type.TypeReference; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.List; + +import static com.amazonaws.services.dynamodbv2.datamodeling.LegacyTestVectors.baseClassToV1AttrMap; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.ENCRYPTED_TEST_VALUE; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.symProv; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.getCiphertextManifestFromFile; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.BASE_CLASS_TABLE_NAME; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.SCENARIO_MANIFEST_PATH; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.loadKeyData; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.kmsClient; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.keyDataMap; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.getManifestFromFile; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertTrue; + +public class TransformerHolisticITHelper { + private static void decryptNullTableNameInEC(String nullTableNameInECCipherFile) + throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = new EncryptionContext.Builder() + .withTableName(null) + .withHashKeyName("hashKey") + .withRangeKeyName("rangeKey") + .build(); + + Map expectedAttrMap = baseClassToV1AttrMap( + ENCRYPTED_TEST_VALUE + ); + Map> actions = new HashMap<>(); + for (String attr : expectedAttrMap.keySet()) { + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, EnumSet.of(EncryptionFlags.SIGN)); + break; + default: + actions.put( + attr, + EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN) + ); + break; + } + } + + Map>> manifest = + getCiphertextManifestFromFile(nullTableNameInECCipherFile); + + for (Map encryptedItem : manifest.get( + BASE_CLASS_TABLE_NAME + )) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertTrue( + new com.amazonaws.services.dynamodbv2.testing.DdbRecordMatcher(expectedAttrMap, false).matches(decrypted) + ); + } + } + + private static void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) + throws IOException, GeneralSecurityException { + com.amazonaws.services.dynamodbv2.testing.ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( + new DirectKmsMaterialProvider( + kmsClient, + keyDataMap.get("awsKmsUsWest2").keyId + ) + ); + EncryptionContext ctx = new EncryptionContext.Builder() + .withTableName("HashKeyOnly") + .withHashKeyName("hashKey") + .build(); + + Map> actions = new HashMap<>(); + actions.put("hashKey", EnumSet.of(EncryptionFlags.SIGN)); + + String nonBmpKey = "test\uD83D\uDE00Ψkey"; + Map>> manifest = + getCiphertextManifestFromFile(nonBMPinECCipherFile); + for (Map encryptedItem : manifest.get( + BASE_CLASS_TABLE_NAME + )) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertEquals(nonBmpKey, decrypted.get("hashKey").getS()); + } + } + + private static void decryptNonAsciiTableNameVector( + String nonAsciiTableInECCipherFile + ) throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext ctx = + new com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext.Builder() + .withTableName("テーブル\uD83D\uDE00") + .withHashKeyName("hashKey") + .withRangeKeyName("rangeKey") + .build(); + + Map expectedAttrMap = baseClassToV1AttrMap( + ENCRYPTED_TEST_VALUE + ); + Map< + String, + Set< + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags + > + > actions = new HashMap<>(); + for (String attr : expectedAttrMap.keySet()) { + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put( + attr, + EnumSet.of( + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN + ) + ); + break; + default: + actions.put( + attr, + EnumSet.of( + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.ENCRYPT, + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN + ) + ); + break; + } + } + } +} From e22fdf75eb056ea5caa8e6d9afe49dcc9119b382 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 15:58:29 -0700 Subject: [PATCH 11/60] m --- .../datamodeling/sdkv2/HolisticIT.java | 114 ------------------ 1 file changed, 114 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index cc0a836869..0366201ab5 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -554,120 +554,6 @@ public void decryptWithECConfigTest() HolisticITHelper.decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); } - public void decryptNullTableNameInEC(String nullTableNameInECCipherFile) - throws IOException, GeneralSecurityException { - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = EncryptionContext - .builder() - .tableName(null) - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); - - Map> actions = new HashMap<>(); - for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { - switch (attr) { - case "hashKey": - case "rangeKey": - case "version": - actions.put(attr, signOnly); - break; - default: - actions.put(attr, encryptAndSign); - break; - } - } - - Map>> manifest = - getCiphertextManifestFromFile(nullTableNameInECCipherFile); - for (Map encryptedItem : manifest.get(tableName)) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertTrue( - new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted) - ); - } - } - - public void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) - throws IOException, GeneralSecurityException { - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( - new DirectKmsMaterialsProvider( - kmsClient, - keyDataMap.get("awsKmsUsWest2").keyId - ) - ); - EncryptionContext ctx = EncryptionContext - .builder() - .tableName("HashKeyOnly") - .hashKeyName("hashKey") - .build(); - - Map> actions = new HashMap<>(); - actions.put("hashKey", signOnly); - - String nonBmpKey = "test\uD83D\uDE00Ψkey"; - - Map>> manifest = - getCiphertextManifestFromFile(nonBMPinECCipherFile); - for (Map encryptedItem : manifest.get(tableName)) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertEquals(nonBmpKey, decrypted.get("hashKey").s()); - } - } - - public void decryptNonAsciiTableNameVector( - String nonAsciiTableInECCipherFile - ) throws IOException, GeneralSecurityException { - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = EncryptionContext - .builder() - .tableName("テーブル\uD83D\uDE00") - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); - - Map> actions = new HashMap<>(); - for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { - switch (attr) { - case "hashKey": - case "rangeKey": - case "version": - actions.put(attr, signOnly); - break; - default: - actions.put(attr, encryptAndSign); - break; - } - } - - Map>> manifest = - getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); - for (Map encryptedItem : manifest.get(tableName)) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertTrue( - new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted) - ); - } - } - @Test(dataProvider = "getDecryptTestVectors") public void decryptTestVector(Scenario scenario) throws IOException, GeneralSecurityException { From 91d4b480ebc3f03d980237e608df9f5942d7b0ff Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 16:08:24 -0700 Subject: [PATCH 12/60] m --- .../services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java | 4 +++- .../dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java | 5 ++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 0366201ab5..4d2270f5c4 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -550,7 +550,9 @@ public void decryptWithECConfigTest() "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; HolisticITHelper.decryptNullTableNameInEC(nullTableNameInECCipherFile); - HolisticITHelper.decryptNonBmpHashKeyVector(nonBMPinECCipherFile); + // decryptNonBmpHashKeyVectorAndWithNullKeyId uses non bmp hash key and also does not use any KMS key id which proves + // that KMS key id is fetched from message format + HolisticITHelper.decryptNonBmpHashKeyVectorAndWithNullKeyId(nonBMPinECCipherFile); HolisticITHelper.decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java index a339cf6ee9..8f6ad6be24 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java @@ -98,7 +98,7 @@ public static void decryptNullTableNameInEC(String nullTableNameInECCipherFile) } } - public static void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) + public static void decryptNonBmpHashKeyVectorAndWithNullKeyId(String nonBMPinECCipherFile) throws IOException, GeneralSecurityException { ScenarioManifest scenarioManifest = getManifestFromFile( SCENARIO_MANIFEST_PATH, @@ -108,8 +108,7 @@ public static void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( new DirectKmsMaterialsProvider( - kmsClient, - keyDataMap.get("awsKmsUsWest2").keyId + kmsClient ) ); EncryptionContext ctx = EncryptionContext From c0624c57696ae5fc5c24b38431404044a8fe2806 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Thu, 12 Mar 2026 16:30:17 -0700 Subject: [PATCH 13/60] m --- .../datamodeling/TransformerHolisticIT.java | 152 +----------------- .../TransformerHolisticITHelper.java | 6 +- 2 files changed, 6 insertions(+), 152 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index b62d6295b4..6634613f72 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -12,8 +12,6 @@ import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig.SaveBehavior; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.DynamoDBEncryptor; -import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext; -import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.AsymmetricStaticProvider; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.CachingMostRecentProvider; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.DirectKmsMaterialProvider; @@ -26,7 +24,6 @@ import com.amazonaws.services.dynamodbv2.model.*; import com.amazonaws.services.dynamodbv2.testing.AttributeValueDeserializer; import com.amazonaws.services.dynamodbv2.testing.AttributeValueSerializer; -import com.amazonaws.services.dynamodbv2.testing.DdbRecordMatcher; import com.amazonaws.services.dynamodbv2.testing.ScenarioManifest; import com.amazonaws.services.dynamodbv2.testing.ScenarioManifest.KeyData; import com.amazonaws.services.dynamodbv2.testing.ScenarioManifest.Keys; @@ -341,152 +338,9 @@ public void decryptWithECConfigTest() final String nonAsciiTableInECCipherFile = "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; - decryptNullTableNameInEC(nullTableNameInECCipherFile); - decryptNonBmpHashKeyVector(nonBMPinECCipherFile); - decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); - } - - private void decryptNullTableNameInEC(String nullTableNameInECCipherFile) - throws IOException, GeneralSecurityException { - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = new EncryptionContext.Builder() - .withTableName(null) - .withHashKeyName("hashKey") - .withRangeKeyName("rangeKey") - .build(); - - Map expectedAttrMap = baseClassToV1AttrMap( - ENCRYPTED_TEST_VALUE - ); - Map> actions = new HashMap<>(); - for (String attr : expectedAttrMap.keySet()) { - switch (attr) { - case "hashKey": - case "rangeKey": - case "version": - actions.put(attr, EnumSet.of(EncryptionFlags.SIGN)); - break; - default: - actions.put( - attr, - EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN) - ); - break; - } - } - - Map>> manifest = - getCiphertextManifestFromFile(nullTableNameInECCipherFile); - - for (Map encryptedItem : manifest.get( - BASE_CLASS_TABLE_NAME - )) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertTrue( - new DdbRecordMatcher(expectedAttrMap, false).matches(decrypted) - ); - } - } - - private void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) - throws IOException, GeneralSecurityException { - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( - new DirectKmsMaterialProvider( - kmsClient, - keyDataMap.get("awsKmsUsWest2").keyId - ) - ); - EncryptionContext ctx = new EncryptionContext.Builder() - .withTableName("HashKeyOnly") - .withHashKeyName("hashKey") - .build(); - - Map> actions = new HashMap<>(); - actions.put("hashKey", EnumSet.of(EncryptionFlags.SIGN)); - - String nonBmpKey = "test\uD83D\uDE00Ψkey"; - Map>> manifest = - getCiphertextManifestFromFile(nonBMPinECCipherFile); - for (Map encryptedItem : manifest.get( - BASE_CLASS_TABLE_NAME - )) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertEquals(nonBmpKey, decrypted.get("hashKey").getS()); - } - } - - private void decryptNonAsciiTableNameVector( - String nonAsciiTableInECCipherFile - ) throws IOException, GeneralSecurityException { - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext ctx = - new com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext.Builder() - .withTableName("テーブル\uD83D\uDE00") - .withHashKeyName("hashKey") - .withRangeKeyName("rangeKey") - .build(); - - Map expectedAttrMap = baseClassToV1AttrMap( - ENCRYPTED_TEST_VALUE - ); - Map< - String, - Set< - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags - > - > actions = new HashMap<>(); - for (String attr : expectedAttrMap.keySet()) { - switch (attr) { - case "hashKey": - case "rangeKey": - case "version": - actions.put( - attr, - EnumSet.of( - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN - ) - ); - break; - default: - actions.put( - attr, - EnumSet.of( - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.ENCRYPT, - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN - ) - ); - break; - } - } - - Map>> manifest = - getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); - for (Map encryptedItem : manifest.get( - BASE_CLASS_TABLE_NAME - )) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertTrue( - new DdbRecordMatcher(expectedAttrMap, false).matches(decrypted) - ); - } + TransformerHolisticITHelper.decryptNullTableNameInEC(nullTableNameInECCipherFile); + TransformerHolisticITHelper.decryptNonBmpHashKeyVector(nonBMPinECCipherFile); + TransformerHolisticITHelper.decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); } @Test(dataProvider = "getDecryptTestVectors") diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java index 56f269b220..f275eab93e 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java @@ -30,7 +30,7 @@ import static org.testng.AssertJUnit.assertTrue; public class TransformerHolisticITHelper { - private static void decryptNullTableNameInEC(String nullTableNameInECCipherFile) + public static void decryptNullTableNameInEC(String nullTableNameInECCipherFile) throws IOException, GeneralSecurityException { DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); EncryptionContext ctx = new EncryptionContext.Builder() @@ -76,7 +76,7 @@ private static void decryptNullTableNameInEC(String nullTableNameInECCipherFile) } } - private static void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) + public static void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) throws IOException, GeneralSecurityException { com.amazonaws.services.dynamodbv2.testing.ScenarioManifest scenarioManifest = getManifestFromFile( SCENARIO_MANIFEST_PATH, @@ -113,7 +113,7 @@ private static void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) } } - private static void decryptNonAsciiTableNameVector( + public static void decryptNonAsciiTableNameVector( String nonAsciiTableInECCipherFile ) throws IOException, GeneralSecurityException { DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); From dbcca78553e4aee905078305f57b33b93680a7eb Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 09:47:51 -0700 Subject: [PATCH 14/60] formatting --- .../datamodeling/TransformerHolisticIT.java | 12 +- .../TransformerHolisticITHelper.java | 269 +++++++++--------- .../datamodeling/sdkv2/HolisticIT.java | 12 +- .../datamodeling/sdkv2/HolisticITHelper.java | 212 +++++++------- 4 files changed, 263 insertions(+), 242 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index 6634613f72..4efb542194 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -338,9 +338,15 @@ public void decryptWithECConfigTest() final String nonAsciiTableInECCipherFile = "file://ciphertext/java/static-aes-hmac-nonascii-table-1.json"; - TransformerHolisticITHelper.decryptNullTableNameInEC(nullTableNameInECCipherFile); - TransformerHolisticITHelper.decryptNonBmpHashKeyVector(nonBMPinECCipherFile); - TransformerHolisticITHelper.decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); + TransformerHolisticITHelper.decryptNullTableNameInEC( + nullTableNameInECCipherFile + ); + TransformerHolisticITHelper.decryptNonBmpHashKeyVector( + nonBMPinECCipherFile + ); + TransformerHolisticITHelper.decryptNonAsciiTableNameVector( + nonAsciiTableInECCipherFile + ); } @Test(dataProvider = "getDecryptTestVectors") diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java index f275eab93e..40e816a5b3 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticITHelper.java @@ -1,160 +1,167 @@ package com.amazonaws.services.dynamodbv2.datamodeling; +import static com.amazonaws.services.dynamodbv2.datamodeling.LegacyTestVectors.baseClassToV1AttrMap; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.BASE_CLASS_TABLE_NAME; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.ENCRYPTED_TEST_VALUE; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.SCENARIO_MANIFEST_PATH; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.getCiphertextManifestFromFile; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.getManifestFromFile; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.keyDataMap; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.kmsClient; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.loadKeyData; +import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.symProv; +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertTrue; + import com.amazonaws.services.dynamodbv2.datamodeling.encryption.DynamoDBEncryptor; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.DirectKmsMaterialProvider; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.fasterxml.jackson.core.type.TypeReference; - import java.io.IOException; import java.security.GeneralSecurityException; import java.util.EnumSet; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; -import java.util.List; - -import static com.amazonaws.services.dynamodbv2.datamodeling.LegacyTestVectors.baseClassToV1AttrMap; -import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.ENCRYPTED_TEST_VALUE; -import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.symProv; -import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.getCiphertextManifestFromFile; -import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.BASE_CLASS_TABLE_NAME; -import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.SCENARIO_MANIFEST_PATH; -import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.loadKeyData; -import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.kmsClient; -import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.keyDataMap; -import static com.amazonaws.services.dynamodbv2.datamodeling.TransformerHolisticIT.getManifestFromFile; - -import static org.testng.AssertJUnit.assertEquals; -import static org.testng.AssertJUnit.assertTrue; public class TransformerHolisticITHelper { - public static void decryptNullTableNameInEC(String nullTableNameInECCipherFile) - throws IOException, GeneralSecurityException { - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = new EncryptionContext.Builder() - .withTableName(null) - .withHashKeyName("hashKey") - .withRangeKeyName("rangeKey") - .build(); - Map expectedAttrMap = baseClassToV1AttrMap( - ENCRYPTED_TEST_VALUE - ); - Map> actions = new HashMap<>(); - for (String attr : expectedAttrMap.keySet()) { - switch (attr) { - case "hashKey": - case "rangeKey": - case "version": - actions.put(attr, EnumSet.of(EncryptionFlags.SIGN)); - break; - default: - actions.put( - attr, - EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN) - ); - break; - } - } + public static void decryptNullTableNameInEC( + String nullTableNameInECCipherFile + ) throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = new EncryptionContext.Builder() + .withTableName(null) + .withHashKeyName("hashKey") + .withRangeKeyName("rangeKey") + .build(); + + Map expectedAttrMap = baseClassToV1AttrMap( + ENCRYPTED_TEST_VALUE + ); + Map> actions = new HashMap<>(); + for (String attr : expectedAttrMap.keySet()) { + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, EnumSet.of(EncryptionFlags.SIGN)); + break; + default: + actions.put( + attr, + EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN) + ); + break; + } + } - Map>> manifest = - getCiphertextManifestFromFile(nullTableNameInECCipherFile); + Map>> manifest = + getCiphertextManifestFromFile(nullTableNameInECCipherFile); - for (Map encryptedItem : manifest.get( - BASE_CLASS_TABLE_NAME - )) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertTrue( - new com.amazonaws.services.dynamodbv2.testing.DdbRecordMatcher(expectedAttrMap, false).matches(decrypted) - ); - } + for (Map encryptedItem : manifest.get( + BASE_CLASS_TABLE_NAME + )) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertTrue( + new com.amazonaws.services.dynamodbv2.testing.DdbRecordMatcher( + expectedAttrMap, + false + ) + .matches(decrypted) + ); } + } - public static void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) - throws IOException, GeneralSecurityException { - com.amazonaws.services.dynamodbv2.testing.ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); + public static void decryptNonBmpHashKeyVector(String nonBMPinECCipherFile) + throws IOException, GeneralSecurityException { + com.amazonaws.services.dynamodbv2.testing.ScenarioManifest scenarioManifest = + getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference< + com.amazonaws.services.dynamodbv2.testing.ScenarioManifest + >() {} + ); + loadKeyData(scenarioManifest.keyDataPath); - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( - new DirectKmsMaterialProvider( - kmsClient, - keyDataMap.get("awsKmsUsWest2").keyId - ) - ); - EncryptionContext ctx = new EncryptionContext.Builder() - .withTableName("HashKeyOnly") - .withHashKeyName("hashKey") - .build(); + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( + new DirectKmsMaterialProvider( + kmsClient, + keyDataMap.get("awsKmsUsWest2").keyId + ) + ); + EncryptionContext ctx = new EncryptionContext.Builder() + .withTableName("HashKeyOnly") + .withHashKeyName("hashKey") + .build(); - Map> actions = new HashMap<>(); - actions.put("hashKey", EnumSet.of(EncryptionFlags.SIGN)); + Map> actions = new HashMap<>(); + actions.put("hashKey", EnumSet.of(EncryptionFlags.SIGN)); - String nonBmpKey = "test\uD83D\uDE00Ψkey"; - Map>> manifest = - getCiphertextManifestFromFile(nonBMPinECCipherFile); - for (Map encryptedItem : manifest.get( - BASE_CLASS_TABLE_NAME - )) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertEquals(nonBmpKey, decrypted.get("hashKey").getS()); - } + String nonBmpKey = "test\uD83D\uDE00Ψkey"; + Map>> manifest = + getCiphertextManifestFromFile(nonBMPinECCipherFile); + for (Map encryptedItem : manifest.get( + BASE_CLASS_TABLE_NAME + )) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertEquals(nonBmpKey, decrypted.get("hashKey").getS()); } + } - public static void decryptNonAsciiTableNameVector( - String nonAsciiTableInECCipherFile - ) throws IOException, GeneralSecurityException { - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext ctx = - new com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext.Builder() - .withTableName("テーブル\uD83D\uDE00") - .withHashKeyName("hashKey") - .withRangeKeyName("rangeKey") - .build(); + public static void decryptNonAsciiTableNameVector( + String nonAsciiTableInECCipherFile + ) throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext ctx = + new com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext.Builder() + .withTableName("テーブル\uD83D\uDE00") + .withHashKeyName("hashKey") + .withRangeKeyName("rangeKey") + .build(); - Map expectedAttrMap = baseClassToV1AttrMap( - ENCRYPTED_TEST_VALUE - ); - Map< - String, - Set< - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags - > - > actions = new HashMap<>(); - for (String attr : expectedAttrMap.keySet()) { - switch (attr) { - case "hashKey": - case "rangeKey": - case "version": - actions.put( - attr, - EnumSet.of( - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN - ) - ); - break; - default: - actions.put( - attr, - EnumSet.of( - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.ENCRYPT, - com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN - ) - ); - break; - } - } + Map expectedAttrMap = baseClassToV1AttrMap( + ENCRYPTED_TEST_VALUE + ); + Map< + String, + Set< + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags + > + > actions = new HashMap<>(); + for (String attr : expectedAttrMap.keySet()) { + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put( + attr, + EnumSet.of( + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN + ) + ); + break; + default: + actions.put( + attr, + EnumSet.of( + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.ENCRYPT, + com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionFlags.SIGN + ) + ); + break; + } } + } } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 4d2270f5c4..c17a0f44f6 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -102,7 +102,9 @@ public class HolisticIT { private static final String RANGE_KEY = "rangeKey"; private static final String RSA = "RSA"; public static final String tableName = "TableName"; - public static final EnumSet signOnly = EnumSet.of(EncryptionFlags.SIGN); + public static final EnumSet signOnly = EnumSet.of( + EncryptionFlags.SIGN + ); public static final EnumSet encryptAndSign = EnumSet.of( EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN @@ -552,8 +554,12 @@ public void decryptWithECConfigTest() HolisticITHelper.decryptNullTableNameInEC(nullTableNameInECCipherFile); // decryptNonBmpHashKeyVectorAndWithNullKeyId uses non bmp hash key and also does not use any KMS key id which proves // that KMS key id is fetched from message format - HolisticITHelper.decryptNonBmpHashKeyVectorAndWithNullKeyId(nonBMPinECCipherFile); - HolisticITHelper.decryptNonAsciiTableNameVector(nonAsciiTableInECCipherFile); + HolisticITHelper.decryptNonBmpHashKeyVectorAndWithNullKeyId( + nonBMPinECCipherFile + ); + HolisticITHelper.decryptNonAsciiTableNameVector( + nonAsciiTableInECCipherFile + ); } @Test(dataProvider = "getDecryptTestVectors") diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java index 8f6ad6be24..9ac539b162 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java @@ -1,5 +1,9 @@ package com.amazonaws.services.dynamodbv2.datamodeling.sdkv2; +import static com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.HolisticIT.*; +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertTrue; + import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.DynamoDBEncryptor; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.EncryptionContext; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.EncryptionFlags; @@ -7,130 +11,128 @@ import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.DdbRecordMatcher; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest; import com.fasterxml.jackson.core.type.TypeReference; -import software.amazon.awssdk.services.dynamodb.model.AttributeValue; - import java.io.IOException; import java.security.GeneralSecurityException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; - -import static com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.HolisticIT.*; -import static org.testng.AssertJUnit.assertEquals; -import static org.testng.AssertJUnit.assertTrue; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; public class HolisticITHelper { - public static void decryptNonAsciiTableNameVector( - String nonAsciiTableInECCipherFile - ) throws IOException, GeneralSecurityException { - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = EncryptionContext - .builder() - .tableName("テーブル\uD83D\uDE00") - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); - Map> actions = new HashMap<>(); - for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { - switch (attr) { - case "hashKey": - case "rangeKey": - case "version": - actions.put(attr, signOnly); - break; - default: - actions.put(attr, encryptAndSign); - break; - } - } + public static void decryptNonAsciiTableNameVector( + String nonAsciiTableInECCipherFile + ) throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName("テーブル\uD83D\uDE00") + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); - Map>> manifest = - getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); - for (Map encryptedItem : manifest.get(tableName)) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertTrue( - new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted) - ); - } + Map> actions = new HashMap<>(); + for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, signOnly); + break; + default: + actions.put(attr, encryptAndSign); + break; + } } - public static void decryptNullTableNameInEC(String nullTableNameInECCipherFile) - throws IOException, GeneralSecurityException { - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); - EncryptionContext ctx = EncryptionContext - .builder() - .tableName(null) - .hashKeyName("hashKey") - .rangeKeyName("rangeKey") - .build(); + Map>> manifest = + getCiphertextManifestFromFile(nonAsciiTableInECCipherFile); + for (Map encryptedItem : manifest.get(tableName)) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertTrue( + new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted) + ); + } + } + + public static void decryptNullTableNameInEC( + String nullTableNameInECCipherFile + ) throws IOException, GeneralSecurityException { + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(symProv); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName(null) + .hashKeyName("hashKey") + .rangeKeyName("rangeKey") + .build(); - Map> actions = new HashMap<>(); - for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { - switch (attr) { - case "hashKey": - case "rangeKey": - case "version": - actions.put(attr, signOnly); - break; - default: - actions.put(attr, encryptAndSign); - break; - } - } + Map> actions = new HashMap<>(); + for (String attr : ENCRYPTED_TEST_VALUE.keySet()) { + switch (attr) { + case "hashKey": + case "rangeKey": + case "version": + actions.put(attr, signOnly); + break; + default: + actions.put(attr, encryptAndSign); + break; + } + } - Map>> manifest = - getCiphertextManifestFromFile(nullTableNameInECCipherFile); - for (Map encryptedItem : manifest.get(tableName)) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertTrue( - new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted) - ); - } + Map>> manifest = + getCiphertextManifestFromFile(nullTableNameInECCipherFile); + for (Map encryptedItem : manifest.get(tableName)) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertTrue( + new DdbRecordMatcher(ENCRYPTED_TEST_VALUE, false).matches(decrypted) + ); } + } - public static void decryptNonBmpHashKeyVectorAndWithNullKeyId(String nonBMPinECCipherFile) - throws IOException, GeneralSecurityException { - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); + public static void decryptNonBmpHashKeyVectorAndWithNullKeyId( + String nonBMPinECCipherFile + ) throws IOException, GeneralSecurityException { + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference< + com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest + >() {} + ); + loadKeyData(scenarioManifest.keyDataPath); - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( - new DirectKmsMaterialsProvider( - kmsClient - ) - ); - EncryptionContext ctx = EncryptionContext - .builder() - .tableName("HashKeyOnly") - .hashKeyName("hashKey") - .build(); + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance( + new DirectKmsMaterialsProvider(kmsClient) + ); + EncryptionContext ctx = EncryptionContext + .builder() + .tableName("HashKeyOnly") + .hashKeyName("hashKey") + .build(); - Map> actions = new HashMap<>(); - actions.put("hashKey", signOnly); + Map> actions = new HashMap<>(); + actions.put("hashKey", signOnly); - String nonBmpKey = "test\uD83D\uDE00Ψkey"; + String nonBmpKey = "test\uD83D\uDE00Ψkey"; - Map>> manifest = - getCiphertextManifestFromFile(nonBMPinECCipherFile); - for (Map encryptedItem : manifest.get(tableName)) { - Map decrypted = encryptor.decryptRecord( - encryptedItem, - actions, - ctx - ); - assertEquals(nonBmpKey, decrypted.get("hashKey").s()); - } + Map>> manifest = + getCiphertextManifestFromFile(nonBMPinECCipherFile); + for (Map encryptedItem : manifest.get(tableName)) { + Map decrypted = encryptor.decryptRecord( + encryptedItem, + actions, + ctx + ); + assertEquals(nonBmpKey, decrypted.get("hashKey").s()); } + } } From 24a064f11d4b2a5bdefda2a44e0b8c0bb9c6e294 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 10:51:32 -0700 Subject: [PATCH 15/60] Don't reuse test --- DynamoDbEncryption/runtimes/java/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/DynamoDbEncryption/runtimes/java/build.gradle.kts b/DynamoDbEncryption/runtimes/java/build.gradle.kts index 0557befdbb..054334cf1c 100644 --- a/DynamoDbEncryption/runtimes/java/build.gradle.kts +++ b/DynamoDbEncryption/runtimes/java/build.gradle.kts @@ -189,6 +189,7 @@ tasks.withType() { } tasks.test { + outputs.upToDateWhen { false } useTestNG() dependsOn("CopyDynamoDb") systemProperty("java.library.path", "build/libs") From aa491773525608ad6d9b8c24a01b4bdd42da13f3 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 11:09:30 -0700 Subject: [PATCH 16/60] Revert "Don't reuse test" This reverts commit 24a064f11d4b2a5bdefda2a44e0b8c0bb9c6e294. --- DynamoDbEncryption/runtimes/java/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/build.gradle.kts b/DynamoDbEncryption/runtimes/java/build.gradle.kts index 054334cf1c..0557befdbb 100644 --- a/DynamoDbEncryption/runtimes/java/build.gradle.kts +++ b/DynamoDbEncryption/runtimes/java/build.gradle.kts @@ -189,7 +189,6 @@ tasks.withType() { } tasks.test { - outputs.upToDateWhen { false } useTestNG() dependsOn("CopyDynamoDb") systemProperty("java.library.path", "build/libs") From dbce8e0da83cbc0ea0214b996e218a07ce2f4afb Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 11:15:45 -0700 Subject: [PATCH 17/60] Add material_description field to ScenarioManifest Scenario class Add optional Map materialDescription field with @JsonProperty("material_description") to the Scenario inner class in both sdkv1 and sdkv2 ScenarioManifest. This allows test scenarios to specify a custom material description (e.g. AES/128) that gets passed through to the KMS materials provider constructor. Existing scenarios without this field will deserialize as null thanks to @JsonIgnoreProperties(ignoreUnknown = true) on Scenario. --- .../services/dynamodbv2/testing/ScenarioManifest.java | 4 ++++ .../datamodeling/sdkv2/testing/ScenarioManifest.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/testing/ScenarioManifest.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/testing/ScenarioManifest.java index 7d5fc48263..596266f2fb 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/testing/ScenarioManifest.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/testing/ScenarioManifest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) public class ScenarioManifest { @@ -34,6 +35,9 @@ public static class Scenario { public Metastore metastore; public Keys keys; + + @JsonProperty("material_description") + public Map materialDescription; } @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/ScenarioManifest.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/ScenarioManifest.java index 767f0eb2d1..947c20570a 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/ScenarioManifest.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/ScenarioManifest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) public class ScenarioManifest { @@ -34,6 +35,9 @@ public static class Scenario { public Metastore metastore; public Keys keys; + + @JsonProperty("material_description") + public Map materialDescription; } @JsonIgnoreProperties(ignoreUnknown = true) From a1c9fd4ee214c79a0756f06651a2c082ea5a5f36 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 11:16:38 -0700 Subject: [PATCH 18/60] Pass materialDescription through createProvider in sdkv2 HolisticIT Add materialDescription parameter to createProvider() and use the 3-arg DirectKmsMaterialsProvider constructor when a non-empty materialDescription is present. This enables scenarios that specify a custom encryption algorithm (e.g. AES/128) via the scenario manifest. Metastore provider calls pass null since metastores don't use custom material descriptions. Main provider calls pass scenario.materialDescription. --- .../datamodeling/sdkv2/HolisticIT.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index c17a0f44f6..0fb4927684 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -591,6 +591,7 @@ public void decryptTestVector(Scenario scenario) scenario.metastore.providerName, scenario.materialName, scenario.metastore.keys, + null, null ); metastore = @@ -606,7 +607,8 @@ public void decryptTestVector(Scenario scenario) scenario.providerName, scenario.materialName, scenario.keys, - metastore + metastore, + scenario.materialDescription ); // Verify successful decryption @@ -653,6 +655,7 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { scenario.metastore.providerName, scenario.materialName, scenario.metastore.keys, + null, null ); metastore = @@ -668,7 +671,8 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { scenario.providerName, scenario.materialName, scenario.keys, - metastore + metastore, + scenario.materialDescription ); generateStandardData(provider); client.close(); @@ -679,7 +683,8 @@ private EncryptionMaterialsProvider createProvider( String providerName, String materialName, Keys keys, - ProviderStore metastore + ProviderStore metastore, + Map materialDescription ) { switch (providerName) { case ScenarioManifest.MOST_RECENT_PROVIDER_NAME: @@ -751,6 +756,13 @@ private EncryptionMaterialsProvider createProvider( } } case ScenarioManifest.AWS_KMS_PROVIDER_NAME: + if (materialDescription != null && !materialDescription.isEmpty()) { + return new DirectKmsMaterialsProvider( + kmsClient, + keyDataMap.get(keys.decryptName).keyId, + materialDescription + ); + } return new DirectKmsMaterialsProvider( kmsClient, keyDataMap.get(keys.decryptName).keyId From a66ee86ab2524b218ec52fdf3f1281aa2f83603a Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 11:19:14 -0700 Subject: [PATCH 19/60] Pass materialDescription through createProvider in sdkv1 TransformerHolisticIT Add materialDescription parameter to createProvider() and use the 3-arg DirectKmsMaterialProvider constructor when a non-empty materialDescription is present. All 8 call sites updated: metastore provider calls pass null, main provider calls pass scenario.materialDescription. Mirrors the equivalent change in sdkv2 HolisticIT. --- .../datamodeling/TransformerHolisticIT.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index 4efb542194..1409159125 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -372,6 +372,7 @@ public void decryptTestVector(Scenario scenario) throws IOException { scenario.metastore.providerName, scenario.materialName, scenario.metastore.keys, + null, null ); metastore = @@ -387,7 +388,8 @@ public void decryptTestVector(Scenario scenario) throws IOException { scenario.providerName, scenario.materialName, scenario.keys, - metastore + metastore, + scenario.materialDescription ); DynamoDBMapper mapper = new DynamoDBMapper( client, @@ -437,6 +439,7 @@ public void decryptLegacyTestVector(Scenario scenario) throws IOException { scenario.metastore.providerName, scenario.materialName, scenario.metastore.keys, + null, null ); metastore = @@ -452,7 +455,8 @@ public void decryptLegacyTestVector(Scenario scenario) throws IOException { scenario.providerName, scenario.materialName, scenario.keys, - metastore + metastore, + scenario.materialDescription ); final DynamoDBEncryptor legacyEncryptor = DynamoDBEncryptor.getInstance( @@ -569,6 +573,7 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { scenario.metastore.providerName, scenario.materialName, scenario.metastore.keys, + null, null ); metastore = @@ -583,7 +588,8 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { scenario.providerName, scenario.materialName, scenario.keys, - metastore + metastore, + scenario.materialDescription ); generateStandardData(provider); @@ -610,6 +616,7 @@ public void encryptWithLegacyTestVector(Scenario scenario) scenario.metastore.providerName, scenario.materialName, scenario.metastore.keys, + null, null ); metastore = @@ -624,7 +631,8 @@ public void encryptWithLegacyTestVector(Scenario scenario) scenario.providerName, scenario.materialName, scenario.keys, - metastore + metastore, + scenario.materialDescription ); final DynamoDBEncryptor legacyEncryptor = DynamoDBEncryptor.getInstance( @@ -1186,7 +1194,8 @@ private EncryptionMaterialsProvider createProvider( String providerName, String materialName, Keys keys, - ProviderStore metastore + ProviderStore metastore, + Map materialDescription ) { switch (providerName) { case ScenarioManifest.MOST_RECENT_PROVIDER_NAME: @@ -1258,6 +1267,13 @@ private EncryptionMaterialsProvider createProvider( } } case ScenarioManifest.AWS_KMS_PROVIDER_NAME: + if (materialDescription != null && !materialDescription.isEmpty()) { + return new DirectKmsMaterialProvider( + kmsClient, + keyDataMap.get(keys.decryptName).keyId, + materialDescription + ); + } return new DirectKmsMaterialProvider( kmsClient, keyDataMap.get(keys.decryptName).keyId From e75eba214edc2e38fa208a76ea0b6e0585d03924 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 11:20:03 -0700 Subject: [PATCH 20/60] Add KMS AES/128 interop test scenario to scenarios.json Add a new v1 scenario that uses the awskms provider with material_description {"amzn-ddb-env-alg": "AES/128"} to test encryption with a 128-bit content encryption key instead of the default 256-bit. Points to a new ciphertext vector file aws-kms-aes128-1.json (to be generated separately). --- .../vectors/encrypted_item/scenarios.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json index 611c81409f..de49dec570 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json @@ -260,6 +260,20 @@ "ciphertext": "file://ciphertext/java/aws-kms-direct-1.json", "network": true }, + { + "version": "v1", + "provider": "awskms", + "keys": { + "decrypt": "awsKmsUsWest2", + "verify": "awsKmsUsWest2" + }, + "material_description": { + "amzn-ddb-env-alg": "AES/128" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/aws-kms-aes128-1.json", + "network": true + }, { "version": "v1", "provider": "most_recent", From e017cdf74bd7e707d546ec5c9a246fd8ab54e09a Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 11:23:13 -0700 Subject: [PATCH 21/60] Add disabled generator test for KMS AES/128 ciphertext vector Add generateKmsAes128Vector() to sdkv2 HolisticIT as a disabled (@Test(enabled = false)) one-off test. When temporarily enabled, it: 1. Creates a DirectKmsMaterialsProvider with {amzn-ddb-env-alg: AES/128} 2. Encrypts standard test data (all 4 record types + HashKeyOnly + KeysOnly) 3. Prints the DynamoDB tables as JSON in the test vector format To generate the vector file: 1. Set enabled = true 2. Run the test and capture stdout 3. Save as ciphertext/java/aws-kms-aes128-1.json 4. Set enabled = false again --- .../datamodeling/sdkv2/HolisticIT.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 0fb4927684..3980d9d27b 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -679,6 +679,59 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { localDynamoDb.stop(); } + // One-off generator: run this test to produce the AES/128 ciphertext vector file. + // After generating, save stdout as ciphertext/java/aws-kms-aes128-1.json and disable this test. + @Test(enabled = false) + public void generateKmsAes128Vector() throws IOException { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + Map desc = Collections.singletonMap("amzn-ddb-env-alg", "AES/128"); + EncryptionMaterialsProvider provider = new DirectKmsMaterialsProvider( + kmsClient, keyDataMap.get("awsKmsUsWest2").keyId, desc); + + generateStandardData(provider); + + // Print tables in test vector format + ObjectMapper mapper = new ObjectMapper(); + com.fasterxml.jackson.databind.module.SimpleModule module = + new com.fasterxml.jackson.databind.module.SimpleModule(); + module.addSerializer( + AttributeValue.class, + new com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueSerializer() + ); + mapper.registerModule(module); + + Map>> testVector = new HashMap<>(); + for (String table : Arrays.asList("TableName", "HashKeyOnly")) { + List> items = new ArrayList<>(); + Map lastKey = null; + do { + ScanResponse scanResponse = client.scan( + ScanRequest.builder() + .tableName(table) + .exclusiveStartKey(lastKey) + .build() + ); + lastKey = scanResponse.lastEvaluatedKey(); + if (lastKey != null && lastKey.isEmpty()) lastKey = null; + items.addAll(scanResponse.items()); + } while (lastKey != null); + testVector.put(table, items); + } + System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(testVector)); + + client.close(); + localDynamoDb.stop(); + } + private EncryptionMaterialsProvider createProvider( String providerName, String materialName, From dc45bee7699ff9493a33fe0942408e77b5aba71e Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 11:37:16 -0700 Subject: [PATCH 22/60] Generate KMS AES/128 ciphertext test vector and disable generator Add aws-kms-aes128-1.json containing 13 TableName items (4 standard record types + 9 KeysOnly) and 3 HashKeyOnly items, all encrypted using DirectKmsMaterialsProvider with {amzn-ddb-env-alg: AES/128}. Update the generator test to also write HashKeyOnly and KeysOnly items (which generateStandardData does not produce), then disable the generator (@Test(enabled = false)) now that the vector is committed. --- .../ciphertext/java/aws-kms-aes128-1.json | 311 ++++++++++++++++++ .../datamodeling/sdkv2/HolisticIT.java | 104 ++++-- 2 files changed, 388 insertions(+), 27 deletions(-) create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json new file mode 100644 index 0000000000..8cd847ce6c --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json @@ -0,0 +1,311 @@ + { + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQd0lQa3k4QTFzT1RRUElRUUlCRUlBNzlYMG5tVUFacGcyb3A2K3A4Y2g3anV2REtDVTJRSnMzRENwK2FqUVNVVEpsa2FtOW5MSllTbkZiNzQwaHVsa04rUUVTZlBuNS9rWFZLcEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "IMNglnf3fGDf0pSg/OiCfrWLkyrX2LKheL5Ibt46284=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREakNIdHBRKzJ0WHhXblVJd0lCRUlBN2M4M1AvaHh2RFNlTldINEl5Rit5OGNYWUYrQzBXSGs4QUpmdHdHaWJKa1FhWG1rdWtxaFZma21nUzZWQ2Q1dE53cmw4VWh2NmkvemF6SEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "msVRBnZN4vAWlPbSQuxF9WqArj+mb6oGpsKMomgeJnY=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURPS3dibWdwSWpqSEdKeHpSd0lCRUlBNzVNVlN6RjcxU1NnOXZ0emVKZEdGeXduUG5XZnFONitXbU5WVFVhU0NKZjZmd0J2cXprbnBHMlB2T09MUWZmcUhVSTJmQVpEcWg4ZmlUL2s9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "6804339oz8XE8OVWpbW0mu0ml5ANJr7A0bxfG/YXwyE=" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURLWG53N3NLYkVkdnFUMDVSQUlCRUlBN0lQckRyOFdmc0ZHczh2ZXpaYUR2QXllV21yVGNhNzc1STRsV3ZrR1V4ZGd6YXc3MVI1N2UrM2hlU0N3TW1DY3VFU0NHWmxzYmtBMm44dHc9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "EVIRoOwZnLPXPI6yx8VSSu3ZPsiGAnchhp363oWGPM8=" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "TZJxvknkEB9eOxZ++wTeSD6a8NbEjDzI8oXT5cnb9i9hkKrpgJ0Jo1PJdE0+TneA" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURGU0FkMkJqR0Z3enI1eVRyQUlCRUlBN0EycWVLdVM1YWhhNU84ZEk4ckYxdGhTdmZuY1Z0bkNSS3pyRFRIZkdSNHBFVEt3QkNhRXd1dG54NGpxRkNCL1ZuRVlQRlpNZUFxdDlZS1E9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "B": "sQ+PO+Og3/FFcohT9zZ91D03NlwdpjwVbOukIKnB4MyieW+ah6vKBvR70C9ORnhx03RvOghCoXvbyOnex6xfDg==" + }, + "doubleSet": { + "B": "Qo4Ud9T+fTh599Os9FIRqysbUBM1KIKdcHvMchWDkFdGoOLic6EQ0zct3Nwv7vlKPUQ1OrUipDIT7GWAKvF/Yw==" + }, + "byteArrayValue": { + "B": "7YYqljXFHZg8bUxArPtmVlu04FLurthw5KM34E+8jMs=" + }, + "intValue": { + "B": "+BOtvGZbOjwyMphPSu7qtNwAl/Xq5xSoLluiNFcgq1w=" + }, + "stringSet": { + "B": "6X8AXwsF/cEW+LVSx5spYXX0QzIFVMN/UoV5LmZiIF4S1HohP4oQH2IUJQliKGDuDuHIctvdSfJrAG6bfs1r0Q==" + }, + "doubleValue": { + "B": "c4tyKimZVleeYz5vHpFcc41XE183dld/PC1WLHkAigc=" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "Oh5E8OM+EZrA6VxrIk7pDppQTdpYrGuTqsVZxOY64gg=" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFakZhYkJ1dHloaUdTS1JHZ0lCRUlBN1daVVFSYTl6alhHdnJQbkFScnNheFNvbVlJckNvSkhlaGptQWxuUmY3OGF5MEFBSUE4N0hBVEdmQ3NJV0VlRHRjS3Y3VTMrQ3Q1Q3kzdEU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "bVA/Vo22CZdAWmbsnx5gwP+gfzMCboO/etkN4yVUbaM=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREWXR3UmMvZ1BnQ1VXcUxmd0lCRUlBN3VHakVVUVlBOElyTmozR3FxQmplS09YRUxjQkpJME9LMFdrRkZDdFBSaUVHK3JMcEhXUk8xenZwbE1iNHo1RzVqOW0xOVlySzYyMHlDMDA9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "gxIp7YUUZXFcA7Bcm2AoJL4uSBgkLs5wt6QvEo0ll5g=" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQYnR1UGVIekZ5MDFLWGpKZ0lCRUlBN2xJSTJ4WXVHaHR5R2FEKzVnRGFCenNLbWg5dXFrdmR0NnpGY1lXZkVOOGJIWUhoUEgxaGZkMnNuUS9Yc0NVdWhyMy9xMzRYaDIzRWJBYkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "Uw5mbyl6yhvxXexo+ZUxPZ98Y7XFn5TQyz7iZ7OWN+U=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUROYVAwRWMwcGFwdmExOUkzd0lCRUlBN1NOc0FmanZBRjNJRkdzS25JT2pjWnBXWldlOXN1cVRtS1pmZmhGTE1TMm10eHM0bnZxWm1PYU9WekEvQ3lMR1hTN2xZdE01YzBJZllJQkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "tHgQnFUu003SgXHPq3b/Hja85lna6Mx5FlNvBxiCSa4=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURPeDMwVlg2cGFwQ0ZhV3JuUUlCRUlBN3lYV3dyM1oybEd4TmNBcWZKbVlxbFp4UU4yZk1uS3RLSTNWWXIrQWZhcTliWUZ5S2NUU2ZsaThnSmhCMnNySHAzWFZNb1Jrbzh6azNQekk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "EiHBnE3SJOQEsWFF3jUSkcxpzBwtv6V5xiM4DQaevWg=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIVHpBQmdSdHVnRENmNFd6QUlCRUlBN0xDNFJ0aC9kZFpubEhzMEsraVk3QUQySnBSMTBraWpkMUNONmpZbUNORXBiNGtaVmJJR3cxbFlXUlNBcHkrRlpuQ2FKdm1Yc09LNXdFY009AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "Pxc4MJdWwfOGHtAtojDUz6eJr4Yn29Tib9UURyEAwrM=" + } + }, + { + "rangeKey": { + "N": "8" + }, + "hashKey": { + "N": "6" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFbU9vMTdvU2VSZ00zWk9wUUlCRUlBN3ZiRisrZVlmc1cwVXg2Ty9lVjRyY0lBY0g4Z2haK1FHdHdWcURocEl0VkJ5MHFqSmIrTTMwL3QxVStHMDBvY0RPaUdVWU9IV0lDUFJWUms9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "B": "x+NimNfkOGm10eAgNLfZmNFmBVt+qShb4gUkH3/5NfDvZdOIKQh0LfhhqYL5WcPM+wIApr2jav9gO3EMAklyxQ==" + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "XOR3qte9brY7eUzv/phiso7V9glBTBGYS5CTu2/7IAU=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "MD4EsiWa7P688mazXynXT227EIhi7jCL4+pqP4UWsK38/ZKv0dz4psjoysBFGpz5CRWN2sWkZml4/wXNRggAlg==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "4EZ158l16NrTBjqehWMIn36kSj6mX1D7bdJq49Dz4j0=" + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURCWFU0ZTd5UnpzV01SQXFSQUlCRUlBN044Y3BJbWN6OTV0TXVQelovcGh5M2k1Sk5sekovdUwzR0pRc2puSzl2NkwrTmhWcUpaTzczcE9uQ3BBbGowdlA0Uy8rV3pUYmpUTVVVb1E9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "3uPOfF+AWaYw6Fl4TAV+tuCjE++4OTo1fHH4xBMCYb4=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURHbHVuVk5jTVpCT25EZldjd0lCRUlBNzFZK3JpZmNPUlhKa0NSOTZNVXNNWVY1ZUt1ZkdncmR1RUhxdE80bjhha2NxejVUVGtuL21IZE53VmpxNnNCUXZRQjBiajNPTW0wMEpJWGs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "GqGnAscxKsVXbGAwnKEAhWVFhernmoEq1dEH9wLJPrI=" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKVVRGSTVxQVUyWENmcTExZ0lCRUlBN1l2QWtsRXh1YmZpcVJZOWJEbXREQytSNExHeDhNelIyQ1JGOWhtYm0razNKbi9xK3N4dFZ4dEFtL1dWZWpKMWFmaWxUOTB2YzI4TW1wL2s9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "zGaG7SmZZpVgefQXsnYfx71qMIR/M1yMjjUa132A3SY=" + } + } + ] + } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 3980d9d27b..4613dad568 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -699,34 +699,84 @@ public void generateKmsAes128Vector() throws IOException { generateStandardData(provider); - // Print tables in test vector format - ObjectMapper mapper = new ObjectMapper(); - com.fasterxml.jackson.databind.module.SimpleModule module = - new com.fasterxml.jackson.databind.module.SimpleModule(); - module.addSerializer( - AttributeValue.class, - new com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueSerializer() - ); - mapper.registerModule(module); - - Map>> testVector = new HashMap<>(); - for (String table : Arrays.asList("TableName", "HashKeyOnly")) { - List> items = new ArrayList<>(); - Map lastKey = null; - do { - ScanResponse scanResponse = client.scan( - ScanRequest.builder() - .tableName(table) - .exclusiveStartKey(lastKey) - .build() - ); - lastKey = scanResponse.lastEvaluatedKey(); - if (lastKey != null && lastKey.isEmpty()) lastKey = null; - items.addAll(scanResponse.items()); - } while (lastKey != null); - testVector.put(table, items); + // generateStandardData only writes to TableName; also write HashKeyOnly and KeysOnly + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(provider); + EncryptionContext hashOnlyCtx = EncryptionContext.builder() + .tableName("HashKeyOnly").hashKeyName("hashKey").build(); + Map> hashOnlyActions = new HashMap<>(); + hashOnlyActions.put("hashKey", signOnly); + for (String name : new String[]{"Foo", "Bar", "Baz"}) { + Map item = new HashMap<>(); + item.put("hashKey", AttributeValue.builder().s(name).build()); + putItems(encryptor.encryptRecord(item, hashOnlyActions, hashOnlyCtx), "HashKeyOnly"); + } + EncryptionContext keysOnlyCtx = EncryptionContext.builder() + .tableName(tableName).hashKeyName("hashKey").rangeKeyName("rangeKey").build(); + Map> keysOnlyActions = new HashMap<>(); + keysOnlyActions.put("hashKey", signOnly); + keysOnlyActions.put("rangeKey", signOnly); + int[][] keysOnlyPairs = {{0,1},{0,2},{0,3},{1,1},{1,2},{1,3},{5,1},{6,2},{7,3}}; + for (int[] pair : keysOnlyPairs) { + Map item = new HashMap<>(); + item.put("hashKey", AttributeValue.builder().n(String.valueOf(pair[0])).build()); + item.put("rangeKey", AttributeValue.builder().n(String.valueOf(pair[1])).build()); + putItems(encryptor.encryptRecord(item, keysOnlyActions, keysOnlyCtx), tableName); + } + + // Scan and print tables in test vector JSON format + StringBuilder sb = new StringBuilder("{\n"); + String[] tables = {"TableName", "HashKeyOnly"}; + for (int t = 0; t < tables.length; t++) { + sb.append(" \"").append(tables[t]).append("\": [\n"); + ScanResponse scanResponse = client.scan( + ScanRequest.builder().tableName(tables[t]).build()); + List> items = scanResponse.items(); + for (int i = 0; i < items.size(); i++) { + sb.append(" {\n"); + Map item = items.get(i); + int attrIdx = 0; + for (Map.Entry e : item.entrySet()) { + AttributeValue v = e.getValue(); + sb.append(" \"").append(e.getKey()).append("\": {\n"); + if (v.n() != null) { + sb.append(" \"N\": \"").append(v.n()).append("\"\n"); + } else if (v.s() != null) { + sb.append(" \"S\": \"").append(v.s()).append("\"\n"); + } else if (v.b() != null) { + sb.append(" \"B\": \"") + .append(Base64.encodeAsString(v.b().asByteArray())) + .append("\"\n"); + } else if (v.hasSs()) { + sb.append(" \"SS\": ["); + List ss = v.ss(); + for (int s = 0; s < ss.size(); s++) { + sb.append("\"").append(ss.get(s)).append("\""); + if (s < ss.size() - 1) sb.append(", "); + } + sb.append("]\n"); + } else if (v.hasNs()) { + sb.append(" \"NS\": ["); + List ns = v.ns(); + for (int n = 0; n < ns.size(); n++) { + sb.append("\"").append(ns.get(n)).append("\""); + if (n < ns.size() - 1) sb.append(", "); + } + sb.append("]\n"); + } + sb.append(" }"); + if (++attrIdx < item.size()) sb.append(","); + sb.append("\n"); + } + sb.append(" }"); + if (i < items.size() - 1) sb.append(","); + sb.append("\n"); + } + sb.append(" ]"); + if (t < tables.length - 1) sb.append(","); + sb.append("\n"); } - System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(testVector)); + sb.append("}"); + System.out.println(sb); client.close(); localDynamoDb.stop(); From a37477476f4025847db40e2eeb6d71eb4c45eaee Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 12:13:42 -0700 Subject: [PATCH 23/60] See if it fails --- .../src/test/resources/vectors/encrypted_item/scenarios.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json index de49dec570..13e9e73e6f 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json @@ -267,9 +267,6 @@ "decrypt": "awsKmsUsWest2", "verify": "awsKmsUsWest2" }, - "material_description": { - "amzn-ddb-env-alg": "AES/128" - }, "plaintext": "file://plaintext.json", "ciphertext": "file://ciphertext/java/aws-kms-aes128-1.json", "network": true From 4eb0e82b76c49e2eb567b54890f3be91f6bf49d3 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 13:08:36 -0700 Subject: [PATCH 24/60] Revert "See if it fails" This reverts commit a37477476f4025847db40e2eeb6d71eb4c45eaee. --- .../src/test/resources/vectors/encrypted_item/scenarios.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json index 13e9e73e6f..de49dec570 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json @@ -267,6 +267,9 @@ "decrypt": "awsKmsUsWest2", "verify": "awsKmsUsWest2" }, + "material_description": { + "amzn-ddb-env-alg": "AES/128" + }, "plaintext": "file://plaintext.json", "ciphertext": "file://ciphertext/java/aws-kms-aes128-1.json", "network": true From c73101ebf3a5d7ef0a947f7d38758460f69fe890 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 13:09:47 -0700 Subject: [PATCH 25/60] to 256 --- .../src/test/resources/vectors/encrypted_item/scenarios.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json index de49dec570..302b4ecfd0 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json @@ -268,7 +268,7 @@ "verify": "awsKmsUsWest2" }, "material_description": { - "amzn-ddb-env-alg": "AES/128" + "amzn-ddb-env-alg": "AES/256" }, "plaintext": "file://plaintext.json", "ciphertext": "file://ciphertext/java/aws-kms-aes128-1.json", From c77a6052f7dd337aa6ce34441b1ee144e203d83d Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 13:33:01 -0700 Subject: [PATCH 26/60] Assert material_description values are present in ciphertext blobs When a scenario specifies material_description, verify that each value (e.g. AES/128) appears in the *amzn-ddb-map-desc* blob of every encrypted record in the ciphertext vector file. This proves the ciphertext was actually encrypted with the claimed algorithm, not just that the SDK can decrypt it. Also restores scenarios.json to AES/128 (was temporarily changed to AES/256 for manual verification). --- .../vectors/encrypted_item/scenarios.json | 2 +- .../datamodeling/sdkv2/HolisticIT.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json index 302b4ecfd0..de49dec570 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json @@ -268,7 +268,7 @@ "verify": "awsKmsUsWest2" }, "material_description": { - "amzn-ddb-env-alg": "AES/256" + "amzn-ddb-env-alg": "AES/128" }, "plaintext": "file://plaintext.json", "ciphertext": "file://ciphertext/java/aws-kms-aes128-1.json", diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 4613dad568..f4d4b63797 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -611,6 +611,26 @@ public void decryptTestVector(Scenario scenario) scenario.materialDescription ); + // If scenario specifies a material_description, verify it's baked into the ciphertext + if (scenario.materialDescription != null) { + Map>> cipherData = + getCiphertextManifestFromFile(scenario.ciphertextPath); + for (List> items : cipherData.values()) { + for (Map item : items) { + AttributeValue descAttr = item.get("*amzn-ddb-map-desc*"); + if (descAttr != null && descAttr.b() != null) { + String descBlob = new String(descAttr.b().asByteArray(), java.nio.charset.StandardCharsets.ISO_8859_1); + for (Map.Entry entry : scenario.materialDescription.entrySet()) { + assertTrue( + "Expected " + entry.getValue() + " in *amzn-ddb-map-desc* but not found", + descBlob.contains(entry.getValue()) + ); + } + } + } + } + } + // Verify successful decryption switch (scenario.version) { case "v0": From f6609504bbcacd9f928c7c21f843255d1f4e1d8a Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 14:23:39 -0700 Subject: [PATCH 27/60] m --- .../src/test/resources/vectors/encrypted_item/scenarios.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json index de49dec570..302b4ecfd0 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json @@ -268,7 +268,7 @@ "verify": "awsKmsUsWest2" }, "material_description": { - "amzn-ddb-env-alg": "AES/128" + "amzn-ddb-env-alg": "AES/256" }, "plaintext": "file://plaintext.json", "ciphertext": "file://ciphertext/java/aws-kms-aes128-1.json", From ea99854d3d4d5b7f70bdb6d667e196e009cd8567 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Fri, 13 Mar 2026 15:00:22 -0700 Subject: [PATCH 28/60] Revert "m" This reverts commit f6609504bbcacd9f928c7c21f843255d1f4e1d8a. --- .../src/test/resources/vectors/encrypted_item/scenarios.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json index 302b4ecfd0..de49dec570 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json @@ -268,7 +268,7 @@ "verify": "awsKmsUsWest2" }, "material_description": { - "amzn-ddb-env-alg": "AES/256" + "amzn-ddb-env-alg": "AES/128" }, "plaintext": "file://plaintext.json", "ciphertext": "file://ciphertext/java/aws-kms-aes128-1.json", From 8f460ab1f8ba537a8b51c580dfd3fbfc86cce3f5 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 09:42:10 -0700 Subject: [PATCH 29/60] m --- .../datamodeling/sdkv2/HolisticIT.java | 103 ------------------ 1 file changed, 103 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index f4d4b63797..bf69ba332e 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -699,109 +699,6 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { localDynamoDb.stop(); } - // One-off generator: run this test to produce the AES/128 ciphertext vector file. - // After generating, save stdout as ciphertext/java/aws-kms-aes128-1.json and disable this test. - @Test(enabled = false) - public void generateKmsAes128Vector() throws IOException { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - Map desc = Collections.singletonMap("amzn-ddb-env-alg", "AES/128"); - EncryptionMaterialsProvider provider = new DirectKmsMaterialsProvider( - kmsClient, keyDataMap.get("awsKmsUsWest2").keyId, desc); - - generateStandardData(provider); - - // generateStandardData only writes to TableName; also write HashKeyOnly and KeysOnly - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(provider); - EncryptionContext hashOnlyCtx = EncryptionContext.builder() - .tableName("HashKeyOnly").hashKeyName("hashKey").build(); - Map> hashOnlyActions = new HashMap<>(); - hashOnlyActions.put("hashKey", signOnly); - for (String name : new String[]{"Foo", "Bar", "Baz"}) { - Map item = new HashMap<>(); - item.put("hashKey", AttributeValue.builder().s(name).build()); - putItems(encryptor.encryptRecord(item, hashOnlyActions, hashOnlyCtx), "HashKeyOnly"); - } - EncryptionContext keysOnlyCtx = EncryptionContext.builder() - .tableName(tableName).hashKeyName("hashKey").rangeKeyName("rangeKey").build(); - Map> keysOnlyActions = new HashMap<>(); - keysOnlyActions.put("hashKey", signOnly); - keysOnlyActions.put("rangeKey", signOnly); - int[][] keysOnlyPairs = {{0,1},{0,2},{0,3},{1,1},{1,2},{1,3},{5,1},{6,2},{7,3}}; - for (int[] pair : keysOnlyPairs) { - Map item = new HashMap<>(); - item.put("hashKey", AttributeValue.builder().n(String.valueOf(pair[0])).build()); - item.put("rangeKey", AttributeValue.builder().n(String.valueOf(pair[1])).build()); - putItems(encryptor.encryptRecord(item, keysOnlyActions, keysOnlyCtx), tableName); - } - - // Scan and print tables in test vector JSON format - StringBuilder sb = new StringBuilder("{\n"); - String[] tables = {"TableName", "HashKeyOnly"}; - for (int t = 0; t < tables.length; t++) { - sb.append(" \"").append(tables[t]).append("\": [\n"); - ScanResponse scanResponse = client.scan( - ScanRequest.builder().tableName(tables[t]).build()); - List> items = scanResponse.items(); - for (int i = 0; i < items.size(); i++) { - sb.append(" {\n"); - Map item = items.get(i); - int attrIdx = 0; - for (Map.Entry e : item.entrySet()) { - AttributeValue v = e.getValue(); - sb.append(" \"").append(e.getKey()).append("\": {\n"); - if (v.n() != null) { - sb.append(" \"N\": \"").append(v.n()).append("\"\n"); - } else if (v.s() != null) { - sb.append(" \"S\": \"").append(v.s()).append("\"\n"); - } else if (v.b() != null) { - sb.append(" \"B\": \"") - .append(Base64.encodeAsString(v.b().asByteArray())) - .append("\"\n"); - } else if (v.hasSs()) { - sb.append(" \"SS\": ["); - List ss = v.ss(); - for (int s = 0; s < ss.size(); s++) { - sb.append("\"").append(ss.get(s)).append("\""); - if (s < ss.size() - 1) sb.append(", "); - } - sb.append("]\n"); - } else if (v.hasNs()) { - sb.append(" \"NS\": ["); - List ns = v.ns(); - for (int n = 0; n < ns.size(); n++) { - sb.append("\"").append(ns.get(n)).append("\""); - if (n < ns.size() - 1) sb.append(", "); - } - sb.append("]\n"); - } - sb.append(" }"); - if (++attrIdx < item.size()) sb.append(","); - sb.append("\n"); - } - sb.append(" }"); - if (i < items.size() - 1) sb.append(","); - sb.append("\n"); - } - sb.append(" ]"); - if (t < tables.length - 1) sb.append(","); - sb.append("\n"); - } - sb.append("}"); - System.out.println(sb); - - client.close(); - localDynamoDb.stop(); - } - private EncryptionMaterialsProvider createProvider( String providerName, String materialName, From 5d3a046a6b654a4fea30454815f6e32ffacc6527 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 09:52:23 -0700 Subject: [PATCH 30/60] empty commit From d9b5cff95068b0dbdb20b94742f0019e386ff9e9 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 10:05:42 -0700 Subject: [PATCH 31/60] Revert "m" This reverts commit 8f460ab1f8ba537a8b51c580dfd3fbfc86cce3f5. --- .../datamodeling/sdkv2/HolisticIT.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index bf69ba332e..f4d4b63797 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -699,6 +699,109 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { localDynamoDb.stop(); } + // One-off generator: run this test to produce the AES/128 ciphertext vector file. + // After generating, save stdout as ciphertext/java/aws-kms-aes128-1.json and disable this test. + @Test(enabled = false) + public void generateKmsAes128Vector() throws IOException { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + Map desc = Collections.singletonMap("amzn-ddb-env-alg", "AES/128"); + EncryptionMaterialsProvider provider = new DirectKmsMaterialsProvider( + kmsClient, keyDataMap.get("awsKmsUsWest2").keyId, desc); + + generateStandardData(provider); + + // generateStandardData only writes to TableName; also write HashKeyOnly and KeysOnly + DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(provider); + EncryptionContext hashOnlyCtx = EncryptionContext.builder() + .tableName("HashKeyOnly").hashKeyName("hashKey").build(); + Map> hashOnlyActions = new HashMap<>(); + hashOnlyActions.put("hashKey", signOnly); + for (String name : new String[]{"Foo", "Bar", "Baz"}) { + Map item = new HashMap<>(); + item.put("hashKey", AttributeValue.builder().s(name).build()); + putItems(encryptor.encryptRecord(item, hashOnlyActions, hashOnlyCtx), "HashKeyOnly"); + } + EncryptionContext keysOnlyCtx = EncryptionContext.builder() + .tableName(tableName).hashKeyName("hashKey").rangeKeyName("rangeKey").build(); + Map> keysOnlyActions = new HashMap<>(); + keysOnlyActions.put("hashKey", signOnly); + keysOnlyActions.put("rangeKey", signOnly); + int[][] keysOnlyPairs = {{0,1},{0,2},{0,3},{1,1},{1,2},{1,3},{5,1},{6,2},{7,3}}; + for (int[] pair : keysOnlyPairs) { + Map item = new HashMap<>(); + item.put("hashKey", AttributeValue.builder().n(String.valueOf(pair[0])).build()); + item.put("rangeKey", AttributeValue.builder().n(String.valueOf(pair[1])).build()); + putItems(encryptor.encryptRecord(item, keysOnlyActions, keysOnlyCtx), tableName); + } + + // Scan and print tables in test vector JSON format + StringBuilder sb = new StringBuilder("{\n"); + String[] tables = {"TableName", "HashKeyOnly"}; + for (int t = 0; t < tables.length; t++) { + sb.append(" \"").append(tables[t]).append("\": [\n"); + ScanResponse scanResponse = client.scan( + ScanRequest.builder().tableName(tables[t]).build()); + List> items = scanResponse.items(); + for (int i = 0; i < items.size(); i++) { + sb.append(" {\n"); + Map item = items.get(i); + int attrIdx = 0; + for (Map.Entry e : item.entrySet()) { + AttributeValue v = e.getValue(); + sb.append(" \"").append(e.getKey()).append("\": {\n"); + if (v.n() != null) { + sb.append(" \"N\": \"").append(v.n()).append("\"\n"); + } else if (v.s() != null) { + sb.append(" \"S\": \"").append(v.s()).append("\"\n"); + } else if (v.b() != null) { + sb.append(" \"B\": \"") + .append(Base64.encodeAsString(v.b().asByteArray())) + .append("\"\n"); + } else if (v.hasSs()) { + sb.append(" \"SS\": ["); + List ss = v.ss(); + for (int s = 0; s < ss.size(); s++) { + sb.append("\"").append(ss.get(s)).append("\""); + if (s < ss.size() - 1) sb.append(", "); + } + sb.append("]\n"); + } else if (v.hasNs()) { + sb.append(" \"NS\": ["); + List ns = v.ns(); + for (int n = 0; n < ns.size(); n++) { + sb.append("\"").append(ns.get(n)).append("\""); + if (n < ns.size() - 1) sb.append(", "); + } + sb.append("]\n"); + } + sb.append(" }"); + if (++attrIdx < item.size()) sb.append(","); + sb.append("\n"); + } + sb.append(" }"); + if (i < items.size() - 1) sb.append(","); + sb.append("\n"); + } + sb.append(" ]"); + if (t < tables.length - 1) sb.append(","); + sb.append("\n"); + } + sb.append("}"); + System.out.println(sb); + + client.close(); + localDynamoDb.stop(); + } + private EncryptionMaterialsProvider createProvider( String providerName, String materialName, From 254e018fc635c30801c54ef50635f5f61e224cb3 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 10:13:18 -0700 Subject: [PATCH 32/60] Write AES/128 vector file directly instead of printing to stdout The generator test now writes the JSON directly to src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json using the test resource path, removing the manual copy step. --- .../services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index f4d4b63797..8c76c50bd1 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -796,7 +796,11 @@ public void generateKmsAes128Vector() throws IOException { sb.append("\n"); } sb.append("}"); - System.out.println(sb); + java.nio.file.Path vectorPath = java.nio.file.Paths.get( + HolisticIT.class.getResource(TEST_VECTOR_MANIFEST_DIR).getPath(), + "ciphertext", "java", "aws-kms-aes128-1.json"); + java.nio.file.Files.write(vectorPath, sb.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8)); + System.out.println("Wrote vector to: " + vectorPath); client.close(); localDynamoDb.stop(); From a56ece78f08b18b5a2c98ea8ab988168295f7e06 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 10:16:11 -0700 Subject: [PATCH 33/60] Simplify generateKmsAes128Vector to just encrypt + dump Remove redundant manual encryption of HashKeyOnly/KeysOnly items. generateStandardData already handles all the encryption with the AES/128 provider. The generator now just calls generateStandardData and writes the resulting tables to the vector file. --- .../datamodeling/sdkv2/HolisticIT.java | 27 +------------------ 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 8c76c50bd1..6da6472124 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -700,7 +700,6 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { } // One-off generator: run this test to produce the AES/128 ciphertext vector file. - // After generating, save stdout as ciphertext/java/aws-kms-aes128-1.json and disable this test. @Test(enabled = false) public void generateKmsAes128Vector() throws IOException { localDynamoDb.start(); @@ -719,31 +718,7 @@ public void generateKmsAes128Vector() throws IOException { generateStandardData(provider); - // generateStandardData only writes to TableName; also write HashKeyOnly and KeysOnly - DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(provider); - EncryptionContext hashOnlyCtx = EncryptionContext.builder() - .tableName("HashKeyOnly").hashKeyName("hashKey").build(); - Map> hashOnlyActions = new HashMap<>(); - hashOnlyActions.put("hashKey", signOnly); - for (String name : new String[]{"Foo", "Bar", "Baz"}) { - Map item = new HashMap<>(); - item.put("hashKey", AttributeValue.builder().s(name).build()); - putItems(encryptor.encryptRecord(item, hashOnlyActions, hashOnlyCtx), "HashKeyOnly"); - } - EncryptionContext keysOnlyCtx = EncryptionContext.builder() - .tableName(tableName).hashKeyName("hashKey").rangeKeyName("rangeKey").build(); - Map> keysOnlyActions = new HashMap<>(); - keysOnlyActions.put("hashKey", signOnly); - keysOnlyActions.put("rangeKey", signOnly); - int[][] keysOnlyPairs = {{0,1},{0,2},{0,3},{1,1},{1,2},{1,3},{5,1},{6,2},{7,3}}; - for (int[] pair : keysOnlyPairs) { - Map item = new HashMap<>(); - item.put("hashKey", AttributeValue.builder().n(String.valueOf(pair[0])).build()); - item.put("rangeKey", AttributeValue.builder().n(String.valueOf(pair[1])).build()); - putItems(encryptor.encryptRecord(item, keysOnlyActions, keysOnlyCtx), tableName); - } - - // Scan and print tables in test vector JSON format + // Scan and write tables to vector file StringBuilder sb = new StringBuilder("{\n"); String[] tables = {"TableName", "HashKeyOnly"}; for (int t = 0; t < tables.length; t++) { From 3ab198875437a7396e297c5d0b86cd245e83156a Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 10:43:32 -0700 Subject: [PATCH 34/60] Extract writeTablesAsTestVector helper from generator test Move scan+serialize+write logic into a reusable function that takes an output filename and table names. Simplifies the generator and can be reused for future vector file generation. --- .../ciphertext/java/aws-kms-aes128-1.json | 311 ------------------ .../datamodeling/sdkv2/HolisticIT.java | 84 ++--- 2 files changed, 25 insertions(+), 370 deletions(-) delete mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json deleted file mode 100644 index 8cd847ce6c..0000000000 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json +++ /dev/null @@ -1,311 +0,0 @@ - { - "TableName": [ - { - "rangeKey": { - "N": "1" - }, - "hashKey": { - "N": "1" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQd0lQa3k4QTFzT1RRUElRUUlCRUlBNzlYMG5tVUFacGcyb3A2K3A4Y2g3anV2REtDVTJRSnMzRENwK2FqUVNVVEpsa2FtOW5MSllTbkZiNzQwaHVsa04rUUVTZlBuNS9rWFZLcEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "IMNglnf3fGDf0pSg/OiCfrWLkyrX2LKheL5Ibt46284=" - } - }, - { - "rangeKey": { - "N": "2" - }, - "hashKey": { - "N": "1" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREakNIdHBRKzJ0WHhXblVJd0lCRUlBN2M4M1AvaHh2RFNlTldINEl5Rit5OGNYWUYrQzBXSGs4QUpmdHdHaWJKa1FhWG1rdWtxaFZma21nUzZWQ2Q1dE53cmw4VWh2NmkvemF6SEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "msVRBnZN4vAWlPbSQuxF9WqArj+mb6oGpsKMomgeJnY=" - } - }, - { - "rangeKey": { - "N": "3" - }, - "hashKey": { - "N": "1" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURPS3dibWdwSWpqSEdKeHpSd0lCRUlBNzVNVlN6RjcxU1NnOXZ0emVKZEdGeXduUG5XZnFONitXbU5WVFVhU0NKZjZmd0J2cXprbnBHMlB2T09MUWZmcUhVSTJmQVpEcWg4ZmlUL2s9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "6804339oz8XE8OVWpbW0mu0ml5ANJr7A0bxfG/YXwyE=" - } - }, - { - "rangeKey": { - "N": "1" - }, - "hashKey": { - "N": "5" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURLWG53N3NLYkVkdnFUMDVSQUlCRUlBN0lQckRyOFdmc0ZHczh2ZXpaYUR2QXllV21yVGNhNzc1STRsV3ZrR1V4ZGd6YXc3MVI1N2UrM2hlU0N3TW1DY3VFU0NHWmxzYmtBMm44dHc9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "EVIRoOwZnLPXPI6yx8VSSu3ZPsiGAnchhp363oWGPM8=" - } - }, - { - "rangeKey": { - "N": "7" - }, - "hashKey": { - "N": "5" - }, - "stringValue": { - "B": "TZJxvknkEB9eOxZ++wTeSD6a8NbEjDzI8oXT5cnb9i9hkKrpgJ0Jo1PJdE0+TneA" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURGU0FkMkJqR0Z3enI1eVRyQUlCRUlBN0EycWVLdVM1YWhhNU84ZEk4ckYxdGhTdmZuY1Z0bkNSS3pyRFRIZkdSNHBFVEt3QkNhRXd1dG54NGpxRkNCL1ZuRVlQRlpNZUFxdDlZS1E9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet": { - "B": "sQ+PO+Og3/FFcohT9zZ91D03NlwdpjwVbOukIKnB4MyieW+ah6vKBvR70C9ORnhx03RvOghCoXvbyOnex6xfDg==" - }, - "doubleSet": { - "B": "Qo4Ud9T+fTh599Os9FIRqysbUBM1KIKdcHvMchWDkFdGoOLic6EQ0zct3Nwv7vlKPUQ1OrUipDIT7GWAKvF/Yw==" - }, - "byteArrayValue": { - "B": "7YYqljXFHZg8bUxArPtmVlu04FLurthw5KM34E+8jMs=" - }, - "intValue": { - "B": "+BOtvGZbOjwyMphPSu7qtNwAl/Xq5xSoLluiNFcgq1w=" - }, - "stringSet": { - "B": "6X8AXwsF/cEW+LVSx5spYXX0QzIFVMN/UoV5LmZiIF4S1HohP4oQH2IUJQliKGDuDuHIctvdSfJrAG6bfs1r0Q==" - }, - "doubleValue": { - "B": "c4tyKimZVleeYz5vHpFcc41XE183dld/PC1WLHkAigc=" - }, - "version": { - "N": "0" - }, - "*amzn-ddb-map-sig*": { - "B": "Oh5E8OM+EZrA6VxrIk7pDppQTdpYrGuTqsVZxOY64gg=" - } - }, - { - "rangeKey": { - "N": "10" - }, - "hashKey": { - "N": "8" - }, - "stringValue": { - "S": "Hello world!" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFakZhYkJ1dHloaUdTS1JHZ0lCRUlBN1daVVFSYTl6alhHdnJQbkFScnNheFNvbVlJckNvSkhlaGptQWxuUmY3OGF5MEFBSUE4N0hBVEdmQ3NJV0VlRHRjS3Y3VTMrQ3Q1Q3kzdEU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet": { - "NS": ["0", "1", "10", "15", "200"] - }, - "doubleSet": { - "NS": ["-34.2", "-3", "0", "7.6", "15"] - }, - "byteArrayValue": { - "B": "AAECAwQF" - }, - "intValue": { - "N": "123" - }, - "stringSet": { - "SS": ["?", "Cruel", "Goodbye", "World"] - }, - "doubleValue": { - "N": "15" - }, - "version": { - "N": "0" - }, - "*amzn-ddb-map-sig*": { - "B": "bVA/Vo22CZdAWmbsnx5gwP+gfzMCboO/etkN4yVUbaM=" - } - }, - { - "rangeKey": { - "N": "3" - }, - "hashKey": { - "N": "7" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREWXR3UmMvZ1BnQ1VXcUxmd0lCRUlBN3VHakVVUVlBOElyTmozR3FxQmplS09YRUxjQkpJME9LMFdrRkZDdFBSaUVHK3JMcEhXUk8xenZwbE1iNHo1RzVqOW0xOVlySzYyMHlDMDA9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "gxIp7YUUZXFcA7Bcm2AoJL4uSBgkLs5wt6QvEo0ll5g=" - } - }, - { - "rangeKey": { - "N": "9" - }, - "hashKey": { - "N": "7" - }, - "stringValue": { - "S": "Hello world!" - }, - "intSet": { - "NS": ["0", "1", "10", "15", "200"] - }, - "doubleSet": { - "NS": ["-34.2", "-3", "0", "7.6", "15"] - }, - "byteArrayValue": { - "B": "AAECAwQF" - }, - "intValue": { - "N": "123" - }, - "stringSet": { - "SS": ["?", "Cruel", "Goodbye", "World"] - }, - "doubleValue": { - "N": "15" - }, - "version": { - "N": "0" - } - }, - { - "rangeKey": { - "N": "1" - }, - "hashKey": { - "N": "0" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQYnR1UGVIekZ5MDFLWGpKZ0lCRUlBN2xJSTJ4WXVHaHR5R2FEKzVnRGFCenNLbWg5dXFrdmR0NnpGY1lXZkVOOGJIWUhoUEgxaGZkMnNuUS9Yc0NVdWhyMy9xMzRYaDIzRWJBYkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "Uw5mbyl6yhvxXexo+ZUxPZ98Y7XFn5TQyz7iZ7OWN+U=" - } - }, - { - "rangeKey": { - "N": "2" - }, - "hashKey": { - "N": "0" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUROYVAwRWMwcGFwdmExOUkzd0lCRUlBN1NOc0FmanZBRjNJRkdzS25JT2pjWnBXWldlOXN1cVRtS1pmZmhGTE1TMm10eHM0bnZxWm1PYU9WekEvQ3lMR1hTN2xZdE01YzBJZllJQkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "tHgQnFUu003SgXHPq3b/Hja85lna6Mx5FlNvBxiCSa4=" - } - }, - { - "rangeKey": { - "N": "3" - }, - "hashKey": { - "N": "0" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURPeDMwVlg2cGFwQ0ZhV3JuUUlCRUlBN3lYV3dyM1oybEd4TmNBcWZKbVlxbFp4UU4yZk1uS3RLSTNWWXIrQWZhcTliWUZ5S2NUU2ZsaThnSmhCMnNySHAzWFZNb1Jrbzh6azNQekk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "EiHBnE3SJOQEsWFF3jUSkcxpzBwtv6V5xiM4DQaevWg=" - } - }, - { - "rangeKey": { - "N": "2" - }, - "hashKey": { - "N": "6" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIVHpBQmdSdHVnRENmNFd6QUlCRUlBN0xDNFJ0aC9kZFpubEhzMEsraVk3QUQySnBSMTBraWpkMUNONmpZbUNORXBiNGtaVmJJR3cxbFlXUlNBcHkrRlpuQ2FKdm1Yc09LNXdFY009AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "Pxc4MJdWwfOGHtAtojDUz6eJr4Yn29Tib9UURyEAwrM=" - } - }, - { - "rangeKey": { - "N": "8" - }, - "hashKey": { - "N": "6" - }, - "stringValue": { - "S": "Hello world!" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFbU9vMTdvU2VSZ00zWk9wUUlCRUlBN3ZiRisrZVlmc1cwVXg2Ty9lVjRyY0lBY0g4Z2haK1FHdHdWcURocEl0VkJ5MHFqSmIrTTMwL3QxVStHMDBvY0RPaUdVWU9IV0lDUFJWUms9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet": { - "B": "x+NimNfkOGm10eAgNLfZmNFmBVt+qShb4gUkH3/5NfDvZdOIKQh0LfhhqYL5WcPM+wIApr2jav9gO3EMAklyxQ==" - }, - "doubleSet": { - "NS": ["-34.2", "-3", "0", "7.6", "15"] - }, - "byteArrayValue": { - "B": "XOR3qte9brY7eUzv/phiso7V9glBTBGYS5CTu2/7IAU=" - }, - "intValue": { - "N": "123" - }, - "stringSet": { - "B": "MD4EsiWa7P688mazXynXT227EIhi7jCL4+pqP4UWsK38/ZKv0dz4psjoysBFGpz5CRWN2sWkZml4/wXNRggAlg==" - }, - "doubleValue": { - "N": "15" - }, - "version": { - "N": "0" - }, - "*amzn-ddb-map-sig*": { - "B": "4EZ158l16NrTBjqehWMIn36kSj6mX1D7bdJq49Dz4j0=" - } - } - ], - "HashKeyOnly": [ - { - "hashKey": { - "S": "Bar" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURCWFU0ZTd5UnpzV01SQXFSQUlCRUlBN044Y3BJbWN6OTV0TXVQelovcGh5M2k1Sk5sekovdUwzR0pRc2puSzl2NkwrTmhWcUpaTzczcE9uQ3BBbGowdlA0Uy8rV3pUYmpUTVVVb1E9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "3uPOfF+AWaYw6Fl4TAV+tuCjE++4OTo1fHH4xBMCYb4=" - } - }, - { - "hashKey": { - "S": "Baz" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURHbHVuVk5jTVpCT25EZldjd0lCRUlBNzFZK3JpZmNPUlhKa0NSOTZNVXNNWVY1ZUt1ZkdncmR1RUhxdE80bjhha2NxejVUVGtuL21IZE53VmpxNnNCUXZRQjBiajNPTW0wMEpJWGs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "GqGnAscxKsVXbGAwnKEAhWVFhernmoEq1dEH9wLJPrI=" - } - }, - { - "hashKey": { - "S": "Foo" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKVVRGSTVxQVUyWENmcTExZ0lCRUlBN1l2QWtsRXh1YmZpcVJZOWJEbXREQytSNExHeDhNelIyQ1JGOWhtYm0razNKbi9xK3N4dFZ4dEFtL1dWZWpKMWFmaWxUOTB2YzI4TW1wL2s9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "zGaG7SmZZpVgefQXsnYfx71qMIR/M1yMjjUa132A3SY=" - } - } - ] - } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 6da6472124..9217bc8f78 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -717,70 +717,36 @@ public void generateKmsAes128Vector() throws IOException { kmsClient, keyDataMap.get("awsKmsUsWest2").keyId, desc); generateStandardData(provider); - - // Scan and write tables to vector file - StringBuilder sb = new StringBuilder("{\n"); - String[] tables = {"TableName", "HashKeyOnly"}; - for (int t = 0; t < tables.length; t++) { - sb.append(" \"").append(tables[t]).append("\": [\n"); - ScanResponse scanResponse = client.scan( - ScanRequest.builder().tableName(tables[t]).build()); - List> items = scanResponse.items(); - for (int i = 0; i < items.size(); i++) { - sb.append(" {\n"); - Map item = items.get(i); - int attrIdx = 0; - for (Map.Entry e : item.entrySet()) { - AttributeValue v = e.getValue(); - sb.append(" \"").append(e.getKey()).append("\": {\n"); - if (v.n() != null) { - sb.append(" \"N\": \"").append(v.n()).append("\"\n"); - } else if (v.s() != null) { - sb.append(" \"S\": \"").append(v.s()).append("\"\n"); - } else if (v.b() != null) { - sb.append(" \"B\": \"") - .append(Base64.encodeAsString(v.b().asByteArray())) - .append("\"\n"); - } else if (v.hasSs()) { - sb.append(" \"SS\": ["); - List ss = v.ss(); - for (int s = 0; s < ss.size(); s++) { - sb.append("\"").append(ss.get(s)).append("\""); - if (s < ss.size() - 1) sb.append(", "); - } - sb.append("]\n"); - } else if (v.hasNs()) { - sb.append(" \"NS\": ["); - List ns = v.ns(); - for (int n = 0; n < ns.size(); n++) { - sb.append("\"").append(ns.get(n)).append("\""); - if (n < ns.size() - 1) sb.append(", "); - } - sb.append("]\n"); - } - sb.append(" }"); - if (++attrIdx < item.size()) sb.append(","); - sb.append("\n"); - } - sb.append(" }"); - if (i < items.size() - 1) sb.append(","); - sb.append("\n"); - } - sb.append(" ]"); - if (t < tables.length - 1) sb.append(","); - sb.append("\n"); - } - sb.append("}"); - java.nio.file.Path vectorPath = java.nio.file.Paths.get( - HolisticIT.class.getResource(TEST_VECTOR_MANIFEST_DIR).getPath(), - "ciphertext", "java", "aws-kms-aes128-1.json"); - java.nio.file.Files.write(vectorPath, sb.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8)); - System.out.println("Wrote vector to: " + vectorPath); + writeTablesAsTestVector("aws-kms-aes128-1.json", "TableName", "HashKeyOnly"); client.close(); localDynamoDb.stop(); } + private void writeTablesAsTestVector(String outputFile, String... tableNames) + throws IOException { + com.fasterxml.jackson.databind.module.SimpleModule module = + new com.fasterxml.jackson.databind.module.SimpleModule(); + module.addSerializer(AttributeValue.class, + new com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueSerializer()); + ObjectMapper jsonMapper = new ObjectMapper(); + jsonMapper.registerModule(module); + + Map>> testVector = new HashMap<>(); + for (String table : tableNames) { + testVector.put(table, client.scan( + ScanRequest.builder().tableName(table).build()).items()); + } + + java.nio.file.Path vectorPath = java.nio.file.Paths.get( + "src", "test", "resources", "vectors", "encrypted_item", + "ciphertext", "java", outputFile); + java.nio.file.Files.createDirectories(vectorPath.getParent()); + java.nio.file.Files.write(vectorPath, + jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsBytes(testVector)); + System.out.println("Wrote vector to: " + vectorPath.toAbsolutePath()); + } + private EncryptionMaterialsProvider createProvider( String providerName, String materialName, From fb38c1615db6f63b877a23546ea5b2d12cdd4408 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 10:46:31 -0700 Subject: [PATCH 35/60] Re-add aws-kms-aes128-1.json ciphertext vector file --- .../ciphertext/java/aws-kms-aes128-1.json | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json new file mode 100644 index 0000000000..76825f797f --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json @@ -0,0 +1,146 @@ +{ + "TableName" : [ { + "rangeKey" : { + "N" : "7" + }, + "hashKey" : { + "N" : "5" + }, + "stringValue" : { + "B" : "TPEZK1ak/sj0XmIwkrVMR/5NgChu5sp8stSSJo06dFtqlAeyEJzbOtr+ziDFBMcB" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURNRG05QTYwVDJmN3Bmb2xkUUlCRUlBN0NXQkRnRHU3ZUR4RGxDYi80SzhwNzZXa05LSDM3UVkxcVBaRkxIN2N4MlY2V3BTUjE5aTVUUHR1dEVPZStxU0ZiRXJvVjdyWlpPbnd5UEU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet" : { + "B" : "ND+QbVsOQ6oZmTdgKdSMLANILcjdItwXEy0ePH08Is119t8rRXBRFp+/TDmgLPJEUm7Dtm7w4eVnD+22TS+zbA==" + }, + "doubleSet" : { + "B" : "Z5p7Fqs5Tgn5FWZNiJJW4+GxtOb2c0IwqpW4A4yGHd4B/i7AVm7GbfigjjWLi6AEvDmIjC/KmbcF11XLLyMRvQ==" + }, + "byteArrayValue" : { + "B" : "8FMXwnxMxFNGLgJdS07l54Hu2Wl8DwUWTYoLUteCj6k=" + }, + "intValue" : { + "B" : "NRLhUzOc3CHlNOqk3OYOwHSkGnNOIF79vpdMpgDzXHo=" + }, + "stringSet" : { + "B" : "6OTFuDXhyNQc5qVk0ykvzMyLN1fdjwLeUELYhaAQQM2w7gmaCNT+xCiuJFMW/o8QWW9Xk+C6MQwphc74saqYog==" + }, + "doubleValue" : { + "B" : "vVXtClcm1QLVhqe7MvcJgBMYhQO3WG9H0KdsvwhkRN8=" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "8gcq56zSmb+i6r+WLeyQYVzMPEciKVRjc+8LZGve+ps=" + } + }, { + "rangeKey" : { + "N" : "10" + }, + "hashKey" : { + "N" : "8" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFWHhVZnJoSHpQMXFlanVHZ0lCRUlBNzlCNDZJRXByVDVNNFp4Mkl0TkZNUmpNaEE2di9OK0QwV1lmT2Zmc0ZTMWlGemp4L3B6MVFUS2kxaGpnVjkxTFF1dmp5bmlYTHE5b1VMNTA9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "qvz65hMuXuz84xEq/aLHOuKh25gObR+AlTxBx0ePFp8=" + } + }, { + "rangeKey" : { + "N" : "9" + }, + "hashKey" : { + "N" : "7" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + } + }, { + "rangeKey" : { + "N" : "8" + }, + "hashKey" : { + "N" : "6" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURMSWlBcmZVUFFMS0dxMDlpQUlCRUlBN1ZaaDhGMnMvVGYwZTJXKzdmb1hsdkxQcW40R3l1S2s1VEhHWUZLZ3Y1Y3czd2NlNzU2ZjFEbE5rVDFDMnZQM0xWRG1GUi9NOXNxZFlDUVk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet" : { + "B" : "xevDR/najrtGCqXIvQNPlRwDXoHDaBXQY79EdHOlPgGiRRZPsASu+hXsNeBlwJcgmODYbyfepuSBI0Te5OxEzg==" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "JieN7ppyFrtLlKpiNtqJVVQJJqq3tD15rLDUymCCiRk=" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "B" : "O+gA60G0IkqBqp6o581hXffJsj6UdNCCE69tu6CuDlcxzLuWygug4oiQaJn0G826IMYDXXMj5YcXA4EeZonBjg==" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "MEHxJuQKOv7ILdhf99LDxwKkbgngrGEu1NE14s2xjPU=" + } + } ], + "HashKeyOnly" : [ ] +} \ No newline at end of file From c10c054cbd64de2212686e65ce7cf48c6d3d8e31 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 10:52:35 -0700 Subject: [PATCH 36/60] Add HashKeyOnly and KeysOnly writes to sdkv2 generateStandardData MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit generateStandardData now writes all the same items as the sdkv1 version: 4 standard records, 3 HashKeyOnly (Foo, Bar, Baz), and 9 KeysOnly pairs. This makes the generator self-contained — it just calls generateStandardData + writeTablesAsTestVector. Also restores the original aws-kms-aes128-1.json vector file with all 16 items (13 TableName + 3 HashKeyOnly). --- .../ciphertext/java/aws-kms-aes128-1.json | 455 ++++++++++++------ .../datamodeling/sdkv2/HolisticIT.java | 21 + 2 files changed, 331 insertions(+), 145 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json index 76825f797f..8cd847ce6c 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json @@ -1,146 +1,311 @@ -{ - "TableName" : [ { - "rangeKey" : { - "N" : "7" - }, - "hashKey" : { - "N" : "5" - }, - "stringValue" : { - "B" : "TPEZK1ak/sj0XmIwkrVMR/5NgChu5sp8stSSJo06dFtqlAeyEJzbOtr+ziDFBMcB" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURNRG05QTYwVDJmN3Bmb2xkUUlCRUlBN0NXQkRnRHU3ZUR4RGxDYi80SzhwNzZXa05LSDM3UVkxcVBaRkxIN2N4MlY2V3BTUjE5aTVUUHR1dEVPZStxU0ZiRXJvVjdyWlpPbnd5UEU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet" : { - "B" : "ND+QbVsOQ6oZmTdgKdSMLANILcjdItwXEy0ePH08Is119t8rRXBRFp+/TDmgLPJEUm7Dtm7w4eVnD+22TS+zbA==" - }, - "doubleSet" : { - "B" : "Z5p7Fqs5Tgn5FWZNiJJW4+GxtOb2c0IwqpW4A4yGHd4B/i7AVm7GbfigjjWLi6AEvDmIjC/KmbcF11XLLyMRvQ==" - }, - "byteArrayValue" : { - "B" : "8FMXwnxMxFNGLgJdS07l54Hu2Wl8DwUWTYoLUteCj6k=" - }, - "intValue" : { - "B" : "NRLhUzOc3CHlNOqk3OYOwHSkGnNOIF79vpdMpgDzXHo=" - }, - "stringSet" : { - "B" : "6OTFuDXhyNQc5qVk0ykvzMyLN1fdjwLeUELYhaAQQM2w7gmaCNT+xCiuJFMW/o8QWW9Xk+C6MQwphc74saqYog==" - }, - "doubleValue" : { - "B" : "vVXtClcm1QLVhqe7MvcJgBMYhQO3WG9H0KdsvwhkRN8=" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "8gcq56zSmb+i6r+WLeyQYVzMPEciKVRjc+8LZGve+ps=" + { + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQd0lQa3k4QTFzT1RRUElRUUlCRUlBNzlYMG5tVUFacGcyb3A2K3A4Y2g3anV2REtDVTJRSnMzRENwK2FqUVNVVEpsa2FtOW5MSllTbkZiNzQwaHVsa04rUUVTZlBuNS9rWFZLcEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "IMNglnf3fGDf0pSg/OiCfrWLkyrX2LKheL5Ibt46284=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREakNIdHBRKzJ0WHhXblVJd0lCRUlBN2M4M1AvaHh2RFNlTldINEl5Rit5OGNYWUYrQzBXSGs4QUpmdHdHaWJKa1FhWG1rdWtxaFZma21nUzZWQ2Q1dE53cmw4VWh2NmkvemF6SEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "msVRBnZN4vAWlPbSQuxF9WqArj+mb6oGpsKMomgeJnY=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURPS3dibWdwSWpqSEdKeHpSd0lCRUlBNzVNVlN6RjcxU1NnOXZ0emVKZEdGeXduUG5XZnFONitXbU5WVFVhU0NKZjZmd0J2cXprbnBHMlB2T09MUWZmcUhVSTJmQVpEcWg4ZmlUL2s9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "6804339oz8XE8OVWpbW0mu0ml5ANJr7A0bxfG/YXwyE=" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURLWG53N3NLYkVkdnFUMDVSQUlCRUlBN0lQckRyOFdmc0ZHczh2ZXpaYUR2QXllV21yVGNhNzc1STRsV3ZrR1V4ZGd6YXc3MVI1N2UrM2hlU0N3TW1DY3VFU0NHWmxzYmtBMm44dHc9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "EVIRoOwZnLPXPI6yx8VSSu3ZPsiGAnchhp363oWGPM8=" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "TZJxvknkEB9eOxZ++wTeSD6a8NbEjDzI8oXT5cnb9i9hkKrpgJ0Jo1PJdE0+TneA" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURGU0FkMkJqR0Z3enI1eVRyQUlCRUlBN0EycWVLdVM1YWhhNU84ZEk4ckYxdGhTdmZuY1Z0bkNSS3pyRFRIZkdSNHBFVEt3QkNhRXd1dG54NGpxRkNCL1ZuRVlQRlpNZUFxdDlZS1E9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "B": "sQ+PO+Og3/FFcohT9zZ91D03NlwdpjwVbOukIKnB4MyieW+ah6vKBvR70C9ORnhx03RvOghCoXvbyOnex6xfDg==" + }, + "doubleSet": { + "B": "Qo4Ud9T+fTh599Os9FIRqysbUBM1KIKdcHvMchWDkFdGoOLic6EQ0zct3Nwv7vlKPUQ1OrUipDIT7GWAKvF/Yw==" + }, + "byteArrayValue": { + "B": "7YYqljXFHZg8bUxArPtmVlu04FLurthw5KM34E+8jMs=" + }, + "intValue": { + "B": "+BOtvGZbOjwyMphPSu7qtNwAl/Xq5xSoLluiNFcgq1w=" + }, + "stringSet": { + "B": "6X8AXwsF/cEW+LVSx5spYXX0QzIFVMN/UoV5LmZiIF4S1HohP4oQH2IUJQliKGDuDuHIctvdSfJrAG6bfs1r0Q==" + }, + "doubleValue": { + "B": "c4tyKimZVleeYz5vHpFcc41XE183dld/PC1WLHkAigc=" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "Oh5E8OM+EZrA6VxrIk7pDppQTdpYrGuTqsVZxOY64gg=" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFakZhYkJ1dHloaUdTS1JHZ0lCRUlBN1daVVFSYTl6alhHdnJQbkFScnNheFNvbVlJckNvSkhlaGptQWxuUmY3OGF5MEFBSUE4N0hBVEdmQ3NJV0VlRHRjS3Y3VTMrQ3Q1Q3kzdEU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "bVA/Vo22CZdAWmbsnx5gwP+gfzMCboO/etkN4yVUbaM=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREWXR3UmMvZ1BnQ1VXcUxmd0lCRUlBN3VHakVVUVlBOElyTmozR3FxQmplS09YRUxjQkpJME9LMFdrRkZDdFBSaUVHK3JMcEhXUk8xenZwbE1iNHo1RzVqOW0xOVlySzYyMHlDMDA9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "gxIp7YUUZXFcA7Bcm2AoJL4uSBgkLs5wt6QvEo0ll5g=" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQYnR1UGVIekZ5MDFLWGpKZ0lCRUlBN2xJSTJ4WXVHaHR5R2FEKzVnRGFCenNLbWg5dXFrdmR0NnpGY1lXZkVOOGJIWUhoUEgxaGZkMnNuUS9Yc0NVdWhyMy9xMzRYaDIzRWJBYkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "Uw5mbyl6yhvxXexo+ZUxPZ98Y7XFn5TQyz7iZ7OWN+U=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUROYVAwRWMwcGFwdmExOUkzd0lCRUlBN1NOc0FmanZBRjNJRkdzS25JT2pjWnBXWldlOXN1cVRtS1pmZmhGTE1TMm10eHM0bnZxWm1PYU9WekEvQ3lMR1hTN2xZdE01YzBJZllJQkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "tHgQnFUu003SgXHPq3b/Hja85lna6Mx5FlNvBxiCSa4=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURPeDMwVlg2cGFwQ0ZhV3JuUUlCRUlBN3lYV3dyM1oybEd4TmNBcWZKbVlxbFp4UU4yZk1uS3RLSTNWWXIrQWZhcTliWUZ5S2NUU2ZsaThnSmhCMnNySHAzWFZNb1Jrbzh6azNQekk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "EiHBnE3SJOQEsWFF3jUSkcxpzBwtv6V5xiM4DQaevWg=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIVHpBQmdSdHVnRENmNFd6QUlCRUlBN0xDNFJ0aC9kZFpubEhzMEsraVk3QUQySnBSMTBraWpkMUNONmpZbUNORXBiNGtaVmJJR3cxbFlXUlNBcHkrRlpuQ2FKdm1Yc09LNXdFY009AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "Pxc4MJdWwfOGHtAtojDUz6eJr4Yn29Tib9UURyEAwrM=" + } + }, + { + "rangeKey": { + "N": "8" + }, + "hashKey": { + "N": "6" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFbU9vMTdvU2VSZ00zWk9wUUlCRUlBN3ZiRisrZVlmc1cwVXg2Ty9lVjRyY0lBY0g4Z2haK1FHdHdWcURocEl0VkJ5MHFqSmIrTTMwL3QxVStHMDBvY0RPaUdVWU9IV0lDUFJWUms9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "B": "x+NimNfkOGm10eAgNLfZmNFmBVt+qShb4gUkH3/5NfDvZdOIKQh0LfhhqYL5WcPM+wIApr2jav9gO3EMAklyxQ==" + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "XOR3qte9brY7eUzv/phiso7V9glBTBGYS5CTu2/7IAU=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "MD4EsiWa7P688mazXynXT227EIhi7jCL4+pqP4UWsK38/ZKv0dz4psjoysBFGpz5CRWN2sWkZml4/wXNRggAlg==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "4EZ158l16NrTBjqehWMIn36kSj6mX1D7bdJq49Dz4j0=" + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURCWFU0ZTd5UnpzV01SQXFSQUlCRUlBN044Y3BJbWN6OTV0TXVQelovcGh5M2k1Sk5sekovdUwzR0pRc2puSzl2NkwrTmhWcUpaTzczcE9uQ3BBbGowdlA0Uy8rV3pUYmpUTVVVb1E9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "3uPOfF+AWaYw6Fl4TAV+tuCjE++4OTo1fHH4xBMCYb4=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURHbHVuVk5jTVpCT25EZldjd0lCRUlBNzFZK3JpZmNPUlhKa0NSOTZNVXNNWVY1ZUt1ZkdncmR1RUhxdE80bjhha2NxejVUVGtuL21IZE53VmpxNnNCUXZRQjBiajNPTW0wMEpJWGs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "GqGnAscxKsVXbGAwnKEAhWVFhernmoEq1dEH9wLJPrI=" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKVVRGSTVxQVUyWENmcTExZ0lCRUlBN1l2QWtsRXh1YmZpcVJZOWJEbXREQytSNExHeDhNelIyQ1JGOWhtYm0razNKbi9xK3N4dFZ4dEFtL1dWZWpKMWFmaWxUOTB2YzI4TW1wL2s9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "zGaG7SmZZpVgefQXsnYfx71qMIR/M1yMjjUa132A3SY=" + } + } + ] } - }, { - "rangeKey" : { - "N" : "10" - }, - "hashKey" : { - "N" : "8" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFWHhVZnJoSHpQMXFlanVHZ0lCRUlBNzlCNDZJRXByVDVNNFp4Mkl0TkZNUmpNaEE2di9OK0QwV1lmT2Zmc0ZTMWlGemp4L3B6MVFUS2kxaGpnVjkxTFF1dmp5bmlYTHE5b1VMNTA9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "qvz65hMuXuz84xEq/aLHOuKh25gObR+AlTxBx0ePFp8=" - } - }, { - "rangeKey" : { - "N" : "9" - }, - "hashKey" : { - "N" : "7" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - } - }, { - "rangeKey" : { - "N" : "8" - }, - "hashKey" : { - "N" : "6" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURMSWlBcmZVUFFMS0dxMDlpQUlCRUlBN1ZaaDhGMnMvVGYwZTJXKzdmb1hsdkxQcW40R3l1S2s1VEhHWUZLZ3Y1Y3czd2NlNzU2ZjFEbE5rVDFDMnZQM0xWRG1GUi9NOXNxZFlDUVk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet" : { - "B" : "xevDR/najrtGCqXIvQNPlRwDXoHDaBXQY79EdHOlPgGiRRZPsASu+hXsNeBlwJcgmODYbyfepuSBI0Te5OxEzg==" - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "JieN7ppyFrtLlKpiNtqJVVQJJqq3tD15rLDUymCCiRk=" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "B" : "O+gA60G0IkqBqp6o581hXffJsj6UdNCCE69tu6CuDlcxzLuWygug4oiQaJn0G826IMYDXXMj5YcXA4EeZonBjg==" - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "MEHxJuQKOv7ILdhf99LDxwKkbgngrGEu1NE14s2xjPU=" - } - } ], - "HashKeyOnly" : [ ] -} \ No newline at end of file diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 9217bc8f78..779a3df076 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -1106,6 +1106,27 @@ public void generateStandardData(EncryptionMaterialsProvider prov) { // untouched record putItems(UNTOUCHED_TEST_VALUE_2, tableName); + + // HashKeyOnly items + EncryptionContext hashOnlyCtx = EncryptionContext.builder() + .tableName("HashKeyOnly").hashKeyName("hashKey").build(); + Map> hashOnlyActions = new HashMap<>(); + hashOnlyActions.put("hashKey", signOnly); + for (Map hk : new Map[]{hashKey1, hashKey2, hashKey3}) { + putItems(encryptor.encryptRecord(hk, hashOnlyActions, hashOnlyCtx), "HashKeyOnly"); + } + + // KeysOnly items + Map> keysOnlyActions = new HashMap<>(); + keysOnlyActions.put("hashKey", signOnly); + keysOnlyActions.put("rangeKey", signOnly); + int[][] keysOnlyPairs = {{0,1},{0,2},{0,3},{1,1},{1,2},{1,3},{5,1},{6,2},{7,3}}; + for (int[] pair : keysOnlyPairs) { + Map item = new HashMap<>(); + item.put("hashKey", AttributeValue.builder().n(String.valueOf(pair[0])).build()); + item.put("rangeKey", AttributeValue.builder().n(String.valueOf(pair[1])).build()); + putItems(encryptor.encryptRecord(item, keysOnlyActions, encryptionContext), tableName); + } } private void putItems(Map map, String tableName) { From e582d8a2e48c463d1cf1a7d13549ed8f2d674849 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 11:04:49 -0700 Subject: [PATCH 37/60] Move vector generator to CipherTestGenerator extending HolisticIT Create CipherTestGenerator as a subclass of HolisticIT to hold one-off ciphertext vector generation tests. Change localDynamoDb, client, createCiphertextTables, putItems, and writeTablesAsTestVector from private to protected to allow subclass access. Run generators with: gradle test --tests '*.CipherTestGenerator.*' --- .../sdkv2/CipherTestGenerator.java | 38 +++++++++++++++++++ .../datamodeling/sdkv2/HolisticIT.java | 34 +++-------------- 2 files changed, 43 insertions(+), 29 deletions(-) create mode 100644 DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTestGenerator.java diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTestGenerator.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTestGenerator.java new file mode 100644 index 0000000000..6bbdca672b --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTestGenerator.java @@ -0,0 +1,38 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package com.amazonaws.services.dynamodbv2.datamodeling.sdkv2; + +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.DirectKmsMaterialsProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.EncryptionMaterialsProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest; +import com.fasterxml.jackson.core.type.TypeReference; +import java.io.IOException; +import java.util.Collections; +import java.util.Map; +import org.testng.annotations.Test; + +public class CipherTestGenerator extends HolisticIT { + + @Test(enabled = false) + public void generateKmsAes128Vector() throws IOException { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + Map desc = Collections.singletonMap("amzn-ddb-env-alg", "AES/128"); + EncryptionMaterialsProvider provider = new DirectKmsMaterialsProvider( + kmsClient, keyDataMap.get("awsKmsUsWest2").keyId, desc); + + generateStandardData(provider); + writeTablesAsTestVector("aws-kms-aes128-1.json", "TableName", "HashKeyOnly"); + + client.close(); + localDynamoDb.stop(); + } +} diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 779a3df076..63a59b0e28 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -110,8 +110,8 @@ public class HolisticIT { EncryptionFlags.SIGN ); - private final LocalDynamoDb localDynamoDb = new LocalDynamoDb(); - private DynamoDbClient client; + protected final LocalDynamoDb localDynamoDb = new LocalDynamoDb(); + protected DynamoDbClient client; public static KmsClient kmsClient = KmsClient.builder().build(); public static Map keyDataMap = new HashMap<>(); @@ -699,31 +699,7 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { localDynamoDb.stop(); } - // One-off generator: run this test to produce the AES/128 ciphertext vector file. - @Test(enabled = false) - public void generateKmsAes128Vector() throws IOException { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - Map desc = Collections.singletonMap("amzn-ddb-env-alg", "AES/128"); - EncryptionMaterialsProvider provider = new DirectKmsMaterialsProvider( - kmsClient, keyDataMap.get("awsKmsUsWest2").keyId, desc); - - generateStandardData(provider); - writeTablesAsTestVector("aws-kms-aes128-1.json", "TableName", "HashKeyOnly"); - - client.close(); - localDynamoDb.stop(); - } - - private void writeTablesAsTestVector(String outputFile, String... tableNames) + protected void writeTablesAsTestVector(String outputFile, String... tableNames) throws IOException { com.fasterxml.jackson.databind.module.SimpleModule module = new com.fasterxml.jackson.databind.module.SimpleModule(); @@ -847,7 +823,7 @@ private EncryptionMaterialsProvider createProvider( // Create empty tables for the ciphertext. // The underlying structure to these tables is hardcoded, // and we run all test vectors assuming the ciphertext matches the key schema for these tables. - private void createCiphertextTables(DynamoDbClient localDynamoDb) { + protected void createCiphertextTables(DynamoDbClient localDynamoDb) { // TableName Setup ArrayList attrDef = new ArrayList<>(); attrDef.add( @@ -1129,7 +1105,7 @@ public void generateStandardData(EncryptionMaterialsProvider prov) { } } - private void putItems(Map map, String tableName) { + protected void putItems(Map map, String tableName) { PutItemRequest request = PutItemRequest .builder() .item(map) From 7a434fc9c6e7fa4263072566300abc42557bb143 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 11:06:33 -0700 Subject: [PATCH 38/60] Rename CipherTestGenerator to CipherTextGenerator --- .../{CipherTestGenerator.java => CipherTextGenerator.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/{CipherTestGenerator.java => CipherTextGenerator.java} (96%) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTestGenerator.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java similarity index 96% rename from DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTestGenerator.java rename to DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java index 6bbdca672b..192113b7f7 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTestGenerator.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java @@ -11,7 +11,7 @@ import java.util.Map; import org.testng.annotations.Test; -public class CipherTestGenerator extends HolisticIT { +public class CipherTextGenerator extends HolisticIT { @Test(enabled = false) public void generateKmsAes128Vector() throws IOException { From 94c0df5d718da56e8e531a827f9355805e4af7cd Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 11:08:56 -0700 Subject: [PATCH 39/60] Change AttributeValueSerializer to serialize AttributeValue instead of Builder The serializer was typed as JsonSerializer, but DynamoDB scan results return AttributeValue objects, not builders. This caused a compile error when registering it with Jackson's SimpleModule.addSerializer(AttributeValue.class, ...) because the generic types didn't match. Retyped to JsonSerializer so it can be used by CipherTextGenerator.writeTablesAsTestVector to serialize scan results directly. No existing code depended on the Builder-typed version. --- .../testing/AttributeValueSerializer.java | 62 +++++++++---------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/AttributeValueSerializer.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/AttributeValueSerializer.java index 888c1a647e..568b36a23a 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/AttributeValueSerializer.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/AttributeValueSerializer.java @@ -5,49 +5,43 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; -import java.nio.ByteBuffer; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; -public class AttributeValueSerializer - extends JsonSerializer { +public class AttributeValueSerializer extends JsonSerializer { @Override public void serialize( - AttributeValue.Builder value, + AttributeValue value, JsonGenerator jgen, SerializerProvider provider ) throws IOException { - if (value != null) { - jgen.writeStartObject(); - if (value.build().s() != null) { - jgen.writeStringField("S", value.build().s()); - } else if (value.build().b() != null) { - ByteBuffer valueBytes = value.build().b().asByteBuffer(); - byte[] arr = new byte[valueBytes.remaining()]; - valueBytes.get(arr); - jgen.writeStringField("B", Base64.encodeAsString(arr)); - } else if (value.build().n() != null) { - jgen.writeStringField("N", value.build().n()); - } else if (value.build().ss() != null) { - jgen.writeFieldName("SS"); - jgen.writeStartArray(); - for (String s : value.build().ss()) { - jgen.writeString(s); - } - jgen.writeEndArray(); - } else if (value.build().ns() != null) { - jgen.writeFieldName("NS"); - jgen.writeStartArray(); - for (String num : value.build().ns()) { - jgen.writeString(num); - } - jgen.writeEndArray(); - } else { - throw new IllegalStateException( - "AttributeValue has no value or type not implemented for serialization." - ); + if (value == null) return; + jgen.writeStartObject(); + if (value.s() != null) { + jgen.writeStringField("S", value.s()); + } else if (value.b() != null) { + jgen.writeStringField("B", Base64.encodeAsString(value.b().asByteArray())); + } else if (value.n() != null) { + jgen.writeStringField("N", value.n()); + } else if (value.hasSs()) { + jgen.writeFieldName("SS"); + jgen.writeStartArray(); + for (String s : value.ss()) { + jgen.writeString(s); } - jgen.writeEndObject(); + jgen.writeEndArray(); + } else if (value.hasNs()) { + jgen.writeFieldName("NS"); + jgen.writeStartArray(); + for (String num : value.ns()) { + jgen.writeString(num); + } + jgen.writeEndArray(); + } else { + throw new IllegalStateException( + "AttributeValue has no value or type not implemented for serialization." + ); } + jgen.writeEndObject(); } } From 4a8bc5fb5f7ebb6a62b21d075716584ea1b80acd Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 11:30:15 -0700 Subject: [PATCH 40/60] m --- .../runtimes/java/build.gradle.kts | 3 + .../ciphertext/java/aws-kms-aes128-1.json | 602 +++++++++--------- .../sdkv2/CipherTextGenerator.java | 2 +- 3 files changed, 296 insertions(+), 311 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/build.gradle.kts b/DynamoDbEncryption/runtimes/java/build.gradle.kts index 0557befdbb..2135acf23a 100644 --- a/DynamoDbEncryption/runtimes/java/build.gradle.kts +++ b/DynamoDbEncryption/runtimes/java/build.gradle.kts @@ -37,6 +37,9 @@ java { } sourceSets["test"].java { srcDir("src/test") + // adding sdkv1 and sdkv2 helps IDE to resolve package names inside SDK v1 and v2 test + srcDir("src/test/sdkv1") + srcDir("src/test/sdkv2") } withJavadocJar() withSourcesJar() diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json index 8cd847ce6c..c52c6181cc 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json @@ -1,311 +1,293 @@ - { - "TableName": [ - { - "rangeKey": { - "N": "1" - }, - "hashKey": { - "N": "1" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQd0lQa3k4QTFzT1RRUElRUUlCRUlBNzlYMG5tVUFacGcyb3A2K3A4Y2g3anV2REtDVTJRSnMzRENwK2FqUVNVVEpsa2FtOW5MSllTbkZiNzQwaHVsa04rUUVTZlBuNS9rWFZLcEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "IMNglnf3fGDf0pSg/OiCfrWLkyrX2LKheL5Ibt46284=" - } - }, - { - "rangeKey": { - "N": "2" - }, - "hashKey": { - "N": "1" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREakNIdHBRKzJ0WHhXblVJd0lCRUlBN2M4M1AvaHh2RFNlTldINEl5Rit5OGNYWUYrQzBXSGs4QUpmdHdHaWJKa1FhWG1rdWtxaFZma21nUzZWQ2Q1dE53cmw4VWh2NmkvemF6SEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "msVRBnZN4vAWlPbSQuxF9WqArj+mb6oGpsKMomgeJnY=" - } - }, - { - "rangeKey": { - "N": "3" - }, - "hashKey": { - "N": "1" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURPS3dibWdwSWpqSEdKeHpSd0lCRUlBNzVNVlN6RjcxU1NnOXZ0emVKZEdGeXduUG5XZnFONitXbU5WVFVhU0NKZjZmd0J2cXprbnBHMlB2T09MUWZmcUhVSTJmQVpEcWg4ZmlUL2s9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "6804339oz8XE8OVWpbW0mu0ml5ANJr7A0bxfG/YXwyE=" - } - }, - { - "rangeKey": { - "N": "1" - }, - "hashKey": { - "N": "5" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURLWG53N3NLYkVkdnFUMDVSQUlCRUlBN0lQckRyOFdmc0ZHczh2ZXpaYUR2QXllV21yVGNhNzc1STRsV3ZrR1V4ZGd6YXc3MVI1N2UrM2hlU0N3TW1DY3VFU0NHWmxzYmtBMm44dHc9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "EVIRoOwZnLPXPI6yx8VSSu3ZPsiGAnchhp363oWGPM8=" - } - }, - { - "rangeKey": { - "N": "7" - }, - "hashKey": { - "N": "5" - }, - "stringValue": { - "B": "TZJxvknkEB9eOxZ++wTeSD6a8NbEjDzI8oXT5cnb9i9hkKrpgJ0Jo1PJdE0+TneA" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURGU0FkMkJqR0Z3enI1eVRyQUlCRUlBN0EycWVLdVM1YWhhNU84ZEk4ckYxdGhTdmZuY1Z0bkNSS3pyRFRIZkdSNHBFVEt3QkNhRXd1dG54NGpxRkNCL1ZuRVlQRlpNZUFxdDlZS1E9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet": { - "B": "sQ+PO+Og3/FFcohT9zZ91D03NlwdpjwVbOukIKnB4MyieW+ah6vKBvR70C9ORnhx03RvOghCoXvbyOnex6xfDg==" - }, - "doubleSet": { - "B": "Qo4Ud9T+fTh599Os9FIRqysbUBM1KIKdcHvMchWDkFdGoOLic6EQ0zct3Nwv7vlKPUQ1OrUipDIT7GWAKvF/Yw==" - }, - "byteArrayValue": { - "B": "7YYqljXFHZg8bUxArPtmVlu04FLurthw5KM34E+8jMs=" - }, - "intValue": { - "B": "+BOtvGZbOjwyMphPSu7qtNwAl/Xq5xSoLluiNFcgq1w=" - }, - "stringSet": { - "B": "6X8AXwsF/cEW+LVSx5spYXX0QzIFVMN/UoV5LmZiIF4S1HohP4oQH2IUJQliKGDuDuHIctvdSfJrAG6bfs1r0Q==" - }, - "doubleValue": { - "B": "c4tyKimZVleeYz5vHpFcc41XE183dld/PC1WLHkAigc=" - }, - "version": { - "N": "0" - }, - "*amzn-ddb-map-sig*": { - "B": "Oh5E8OM+EZrA6VxrIk7pDppQTdpYrGuTqsVZxOY64gg=" - } - }, - { - "rangeKey": { - "N": "10" - }, - "hashKey": { - "N": "8" - }, - "stringValue": { - "S": "Hello world!" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFakZhYkJ1dHloaUdTS1JHZ0lCRUlBN1daVVFSYTl6alhHdnJQbkFScnNheFNvbVlJckNvSkhlaGptQWxuUmY3OGF5MEFBSUE4N0hBVEdmQ3NJV0VlRHRjS3Y3VTMrQ3Q1Q3kzdEU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet": { - "NS": ["0", "1", "10", "15", "200"] - }, - "doubleSet": { - "NS": ["-34.2", "-3", "0", "7.6", "15"] - }, - "byteArrayValue": { - "B": "AAECAwQF" - }, - "intValue": { - "N": "123" - }, - "stringSet": { - "SS": ["?", "Cruel", "Goodbye", "World"] - }, - "doubleValue": { - "N": "15" - }, - "version": { - "N": "0" - }, - "*amzn-ddb-map-sig*": { - "B": "bVA/Vo22CZdAWmbsnx5gwP+gfzMCboO/etkN4yVUbaM=" - } - }, - { - "rangeKey": { - "N": "3" - }, - "hashKey": { - "N": "7" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREWXR3UmMvZ1BnQ1VXcUxmd0lCRUlBN3VHakVVUVlBOElyTmozR3FxQmplS09YRUxjQkpJME9LMFdrRkZDdFBSaUVHK3JMcEhXUk8xenZwbE1iNHo1RzVqOW0xOVlySzYyMHlDMDA9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "gxIp7YUUZXFcA7Bcm2AoJL4uSBgkLs5wt6QvEo0ll5g=" - } - }, - { - "rangeKey": { - "N": "9" - }, - "hashKey": { - "N": "7" - }, - "stringValue": { - "S": "Hello world!" - }, - "intSet": { - "NS": ["0", "1", "10", "15", "200"] - }, - "doubleSet": { - "NS": ["-34.2", "-3", "0", "7.6", "15"] - }, - "byteArrayValue": { - "B": "AAECAwQF" - }, - "intValue": { - "N": "123" - }, - "stringSet": { - "SS": ["?", "Cruel", "Goodbye", "World"] - }, - "doubleValue": { - "N": "15" - }, - "version": { - "N": "0" - } - }, - { - "rangeKey": { - "N": "1" - }, - "hashKey": { - "N": "0" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQYnR1UGVIekZ5MDFLWGpKZ0lCRUlBN2xJSTJ4WXVHaHR5R2FEKzVnRGFCenNLbWg5dXFrdmR0NnpGY1lXZkVOOGJIWUhoUEgxaGZkMnNuUS9Yc0NVdWhyMy9xMzRYaDIzRWJBYkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "Uw5mbyl6yhvxXexo+ZUxPZ98Y7XFn5TQyz7iZ7OWN+U=" - } - }, - { - "rangeKey": { - "N": "2" - }, - "hashKey": { - "N": "0" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUROYVAwRWMwcGFwdmExOUkzd0lCRUlBN1NOc0FmanZBRjNJRkdzS25JT2pjWnBXWldlOXN1cVRtS1pmZmhGTE1TMm10eHM0bnZxWm1PYU9WekEvQ3lMR1hTN2xZdE01YzBJZllJQkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "tHgQnFUu003SgXHPq3b/Hja85lna6Mx5FlNvBxiCSa4=" - } - }, - { - "rangeKey": { - "N": "3" - }, - "hashKey": { - "N": "0" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURPeDMwVlg2cGFwQ0ZhV3JuUUlCRUlBN3lYV3dyM1oybEd4TmNBcWZKbVlxbFp4UU4yZk1uS3RLSTNWWXIrQWZhcTliWUZ5S2NUU2ZsaThnSmhCMnNySHAzWFZNb1Jrbzh6azNQekk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "EiHBnE3SJOQEsWFF3jUSkcxpzBwtv6V5xiM4DQaevWg=" - } - }, - { - "rangeKey": { - "N": "2" - }, - "hashKey": { - "N": "6" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIVHpBQmdSdHVnRENmNFd6QUlCRUlBN0xDNFJ0aC9kZFpubEhzMEsraVk3QUQySnBSMTBraWpkMUNONmpZbUNORXBiNGtaVmJJR3cxbFlXUlNBcHkrRlpuQ2FKdm1Yc09LNXdFY009AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "Pxc4MJdWwfOGHtAtojDUz6eJr4Yn29Tib9UURyEAwrM=" - } - }, - { - "rangeKey": { - "N": "8" - }, - "hashKey": { - "N": "6" - }, - "stringValue": { - "S": "Hello world!" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFbU9vMTdvU2VSZ00zWk9wUUlCRUlBN3ZiRisrZVlmc1cwVXg2Ty9lVjRyY0lBY0g4Z2haK1FHdHdWcURocEl0VkJ5MHFqSmIrTTMwL3QxVStHMDBvY0RPaUdVWU9IV0lDUFJWUms9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet": { - "B": "x+NimNfkOGm10eAgNLfZmNFmBVt+qShb4gUkH3/5NfDvZdOIKQh0LfhhqYL5WcPM+wIApr2jav9gO3EMAklyxQ==" - }, - "doubleSet": { - "NS": ["-34.2", "-3", "0", "7.6", "15"] - }, - "byteArrayValue": { - "B": "XOR3qte9brY7eUzv/phiso7V9glBTBGYS5CTu2/7IAU=" - }, - "intValue": { - "N": "123" - }, - "stringSet": { - "B": "MD4EsiWa7P688mazXynXT227EIhi7jCL4+pqP4UWsK38/ZKv0dz4psjoysBFGpz5CRWN2sWkZml4/wXNRggAlg==" - }, - "doubleValue": { - "N": "15" - }, - "version": { - "N": "0" - }, - "*amzn-ddb-map-sig*": { - "B": "4EZ158l16NrTBjqehWMIn36kSj6mX1D7bdJq49Dz4j0=" - } - } - ], - "HashKeyOnly": [ - { - "hashKey": { - "S": "Bar" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURCWFU0ZTd5UnpzV01SQXFSQUlCRUlBN044Y3BJbWN6OTV0TXVQelovcGh5M2k1Sk5sekovdUwzR0pRc2puSzl2NkwrTmhWcUpaTzczcE9uQ3BBbGowdlA0Uy8rV3pUYmpUTVVVb1E9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "3uPOfF+AWaYw6Fl4TAV+tuCjE++4OTo1fHH4xBMCYb4=" - } - }, - { - "hashKey": { - "S": "Baz" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURHbHVuVk5jTVpCT25EZldjd0lCRUlBNzFZK3JpZmNPUlhKa0NSOTZNVXNNWVY1ZUt1ZkdncmR1RUhxdE80bjhha2NxejVUVGtuL21IZE53VmpxNnNCUXZRQjBiajNPTW0wMEpJWGs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "GqGnAscxKsVXbGAwnKEAhWVFhernmoEq1dEH9wLJPrI=" - } - }, - { - "hashKey": { - "S": "Foo" - }, - "*amzn-ddb-map-desc*": { - "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKVVRGSTVxQVUyWENmcTExZ0lCRUlBN1l2QWtsRXh1YmZpcVJZOWJEbXREQytSNExHeDhNelIyQ1JGOWhtYm0razNKbi9xK3N4dFZ4dEFtL1dWZWpKMWFmaWxUOTB2YzI4TW1wL2s9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*": { - "B": "zGaG7SmZZpVgefQXsnYfx71qMIR/M1yMjjUa132A3SY=" - } - } - ] +{ + "TableName" : [ { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURJSi9mY0M1SWJuanpOWWIwQUlCRUlBN0plYjdkL2VzcDlUeXpNTm02c290K3hvZlVwOS9KdjZTeGhmME0vcnFDSnhIdFVrOEVKeEVhanVFZEdqZzdqWlB2VHF4aGlIV0FQS0syU0U9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "qGocewScUQ1c8aq3C/vzn5ny8ticJsDzS032sYqWMFg=" } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURITy9OQlBzcVg4c1ExdWFCd0lCRUlBN3hEeVRQZHRBQkV0cTRsNlRCWURtaWIrVlZpNWFhSEJUTjFwZkpjSkhiRUFUbkRIRVFleHVCbFdFWGF2Z21YeTB5N0VKb09JRjFkUmw1dmM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "NHoCI+Fptt1+EbeLvlFfwgeJ//6cwEThIwd5lnfSUHQ=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKZ2tlcExOL1NEUjk1VTU4QUlCRUlBN01MV1NFRHJWc1NodXJVeGdiSXh2a0JnbEYwQzFaQUJMNWJJM3VQTjhaT0NrODFFRDdMQ2lmSysxRktPaFhCMjdWa0xXUmtmQ3hwNFI5SHM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "n3p9vPZFUXYtrROqMcSN7DbA43o4/d/i+GvjC3QRijk=" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURBRTVXanBkNUxSNlVtQldCUUlCRUlBNzI1NnB5ZHhyeFRoVFZhTFlvaVpJd000eVZjdTF2M0g1MTV0cHdYVjc1RkhXMEdJRFBCaDFFV0pVbktzSno3ZWhOK29paDQrR0hUTTd0aEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "b33u94fPe98fWv/8yxljlAX50oZHzYAdSkgR47fyuEk=" + } + }, { + "rangeKey" : { + "N" : "7" + }, + "hashKey" : { + "N" : "5" + }, + "stringValue" : { + "B" : "ulvmiUjfdoADRULkSCt0TMJR41SeJ3tGhB0eo9klbkimDpH+kLvSFssShNNiw58D" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURHYzM3OXduNThwSFJNdngzUUlCRUlBN1hsOGxsY2JtcCsveDQ1UTJxbXJIWUVOa09hSnhiNTdMV3p5eUJQd3F5dFVPUkxEdEFoMTlwVTRZSXAwekkxcjFZak9WY2FrMFpCejhnTzA9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet" : { + "B" : "mWj/x2i5ZVnF85M+0DlMuA8auGMTpxRneHTT4nC4INLQKb9g4wjrh/fBxP3+ThRMd+cVPZkzIfzX5StxSQ5SDQ==" + }, + "doubleSet" : { + "B" : "e7pTh2Vvf64nSyfaM1Tl42gqZ1ikadrZWSQx4h5Zukk1EketDPQ7nKwDdttO6H/67NLodz3KwyUC4knfsdxJhg==" + }, + "byteArrayValue" : { + "B" : "8wRbF6KLOdOaBfOLlzEaX78McJs0XCUcmE1T9gyDmik=" + }, + "intValue" : { + "B" : "Zjtk/o2pOnTFE8pWQx2oi6q3ZS/+kuq4cQUV+uSJbng=" + }, + "stringSet" : { + "B" : "tRT+oPWeTbD21GsKGKbMLi2NQA3HFPuTHCwbk+640+uPx4jolsrPAe9XxIClIvL9QUzJElVfcOHMrYmHMixAnw==" + }, + "doubleValue" : { + "B" : "3t0FHOiVXalm/MeTcqgtQVFbbtcHOd5zT4e+kid1GHE=" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "AOq0OZXtbC2AR0EKzuPuD85LV79rN82ilhNn9JZreVY=" + } + }, { + "rangeKey" : { + "N" : "10" + }, + "hashKey" : { + "N" : "8" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQOGkrVGtJS2luaU1mVGN0UUlCRUlBNzNsUWVHVTM0ZERxSXBTbW45ZWliR0t6M3oxMVZPTWkvTFRMWXR4YlZGRlllS0Y4Mk5ZSUN3NGZKN0tlaG1tTWFnYWtHQW9xalJrYjhUZnc9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "GqTn5MsMdwzJhu5fvFXFTU+r254fIwM6ExTZ+ztCWIk=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "7" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURDNWtLak9BcTVNVit5NU9QQUlCRUlBN0ovdUduR2puNjZ2bWNZQWkzM3JXRVgvL3pGVnI4MVlJYTVRMTJrNEN6MldOMTUraERETHlheDRaUGo5R2ZNSWN2VDIrQXZzQWlWcEh5WnM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "vUHDVrOUX1uUzpGQh9Hh/RKdo4f/9mlJque0ASKUmWU=" + } + }, { + "rangeKey" : { + "N" : "9" + }, + "hashKey" : { + "N" : "7" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFSmxkYm5KZDdqVHlnd3ZYd0lCRUlBNzl2cEpiVFh6YThWbVpMdnRpZHQxbjVQYmV3MFdZa2NaSHpObkdzbm9uMDg5bWlydEpJSkVFWjRkVzg0UFR4ZHg2d0pTRlB0Ui9iQmMxSkE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "yUILbNFQqe62ny1BxHji2E4EVr72JxIQl8vqA5xTudI=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKNWx1c2ZhckhqK3dFR1E3QUlCRUlBNzhqNUpad01FQndtUWlrbjBGQWdFZEhLRTUrVm5EY2U4cmk5VjRQSmgwUU5OT3pOT2FRUE8wWm11Y0t2TWhJd2V5QWp1d3N4TnI3YUdKcWs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "vE2UBbTXt8CEA9ldbV+SxkaJInmuM4F+0iagwL3jlfQ=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURETkxaUy8vVXJUVDFjQVZUUUlCRUlBN2liWXZFTDJ4b3dvNlppQy9KRDVJeUkzUzNDQ1pkSkVXejREUW8ySVpYZEdMVG5iQTlLNlIvM21pUFBXVGJpeHRaL2tRMzErSHpmQ3JzQkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "8jebfjADsrOFu2bWru8RPkxuagYBe6pNhCffKmGBBa4=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIK1BjOSsvT254N28wQjFSUUlCRUlBN2lxMmpEMjhsOXYvTHROTXNtMmpKMFU4T0JHRWd0MHo3UGJSZm9SNTFDY2ZlN2RSYmhVUVJHQmd2SjZPejJ1Zk82YUlTeEZDeStXSEFsYWs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "EdDDCOj5LtUz41YfujnxAFBAEVrDMxNOOgC//5g+Ga0=" + } + }, { + "rangeKey" : { + "N" : "8" + }, + "hashKey" : { + "N" : "6" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUROTkNxR2JhNDNGL09ZcUJ4QUlCRUlBN1V3Mkxyd0VSdVVCZ0txUkJDSG9GbTFKNythS2twNnNZdysya1F2YktjcHhCSkhTaUQ5c2UrTkFORDJ4NmUxL3FZZHdoMmluTUp4N1dHVlE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet" : { + "B" : "G9pyhYAvW+lcI045VGJzLjNok83QYmo25EhzxLu+pmPFu1TOzYYGq0L9UbZhptH0lkIUA3JDEos7hojNhrXH7Q==" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "pfV5LK+VlC8exIfWuz6gYpHzOOco5DkHlEubLTG6ryU=" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "B" : "6c6Vs3V4v1d0VcKwH4mZ1X23X4yBmzRkDSa9njnpGsiUCikKOf9roouTmOSFTDTBnJg5+ONeQ+eUP0he71s4VA==" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "snEytpzx8XslpZ2twaYuJ90aO10GGm/QHpT31XISj68=" + } + } ], + "HashKeyOnly" : [ { + "hashKey" : { + "S" : "Bar" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURBY3FjeXN3bzVpRXJ0bDZLQUlCRUlBN095WTFMUEcwWlord0hKeEJBREI5R3k0R015bDBXSHVSVjlGQ2I1aXd3M2psVXZnMG8ydDJ0ZTNwWUw4d0xpRm5icFBQMDc0MmE4ejNzc3c9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "UtWxrrB03cfrQVcEX5vCaKPzYq8U+KGLaFyXJO358EM=" + } + }, { + "hashKey" : { + "S" : "Baz" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFcXpkVWhRUmxNMmRPVkxUUUlCRUlBN0VwdXRQZ0h3T0xHMW1qSmEyRjl1M095QVdBd2JidnhGTzJ1THdETVJGR2NSbUd1MThlcUg3RUxycWFCSm5jODdtS2RDU05PNkVLSTJUSzQ9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "oMgtd70jhH3e42b43WZsHcQ8dh2WFLHTa7LSbPfRkx8=" + } + }, { + "hashKey" : { + "S" : "Foo" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREM3NJVDhuVVJtUnVaQWJkZ0lCRUlBN1VGN3RkVW9tRHBUUlJjcXBobEVMNFJZV2F6MHMyMVRDNnlHZmQ0Zy85STdZcVpHVkZLL3owbGJTT1djTHFlaTNySFUxR2gwYkxFMHJDRTg9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "vv4kUq+PG3AdqUeLeiFuoywRAyOdlcufZavixrqkePI=" + } + } ] +} \ No newline at end of file diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java index 192113b7f7..3c718c8a72 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java @@ -13,7 +13,7 @@ public class CipherTextGenerator extends HolisticIT { - @Test(enabled = false) + @Test(enabled = true) public void generateKmsAes128Vector() throws IOException { localDynamoDb.start(); client = localDynamoDb.createLimitedWrappedClient(); From 7144f3183f9f16844465f31c6613ce853cf6c0b0 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 11:30:37 -0700 Subject: [PATCH 41/60] m --- .../dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java index 3c718c8a72..192113b7f7 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java @@ -13,7 +13,7 @@ public class CipherTextGenerator extends HolisticIT { - @Test(enabled = true) + @Test(enabled = false) public void generateKmsAes128Vector() throws IOException { localDynamoDb.start(); client = localDynamoDb.createLimitedWrappedClient(); From 9bbca95598854942e982bcf957086c34ab25a2f0 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 11:31:24 -0700 Subject: [PATCH 42/60] m --- .../sdkv2/CipherTextGenerator.java | 29 +++++++++++++++++++ .../datamodeling/sdkv2/HolisticIT.java | 24 --------------- 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java index 192113b7f7..21f36471e7 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java @@ -8,8 +8,14 @@ import com.fasterxml.jackson.core.type.TypeReference; import java.io.IOException; import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.Map; + +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; +import software.amazon.awssdk.services.dynamodb.model.ScanRequest; public class CipherTextGenerator extends HolisticIT { @@ -35,4 +41,27 @@ public void generateKmsAes128Vector() throws IOException { client.close(); localDynamoDb.stop(); } + + private void writeTablesAsTestVector(String outputFile, String... tableNames) + throws IOException { + com.fasterxml.jackson.databind.module.SimpleModule module = + new com.fasterxml.jackson.databind.module.SimpleModule(); + module.addSerializer(AttributeValue.class, + new com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueSerializer()); + ObjectMapper jsonMapper = new ObjectMapper(); + jsonMapper.registerModule(module); + + Map>> testVector = new HashMap<>(); + for (String table : tableNames) { + testVector.put(table, client.scan( + ScanRequest.builder().tableName(table).build()).items()); + } + + java.nio.file.Path vectorPath = java.nio.file.Paths.get( + "src", "test", "resources", "vectors", "encrypted_item", + "ciphertext", "java", outputFile); + java.nio.file.Files.createDirectories(vectorPath.getParent()); + java.nio.file.Files.write(vectorPath, + jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsBytes(testVector)); + } } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 63a59b0e28..7043d6c317 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -699,30 +699,6 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { localDynamoDb.stop(); } - protected void writeTablesAsTestVector(String outputFile, String... tableNames) - throws IOException { - com.fasterxml.jackson.databind.module.SimpleModule module = - new com.fasterxml.jackson.databind.module.SimpleModule(); - module.addSerializer(AttributeValue.class, - new com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueSerializer()); - ObjectMapper jsonMapper = new ObjectMapper(); - jsonMapper.registerModule(module); - - Map>> testVector = new HashMap<>(); - for (String table : tableNames) { - testVector.put(table, client.scan( - ScanRequest.builder().tableName(table).build()).items()); - } - - java.nio.file.Path vectorPath = java.nio.file.Paths.get( - "src", "test", "resources", "vectors", "encrypted_item", - "ciphertext", "java", outputFile); - java.nio.file.Files.createDirectories(vectorPath.getParent()); - java.nio.file.Files.write(vectorPath, - jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsBytes(testVector)); - System.out.println("Wrote vector to: " + vectorPath.toAbsolutePath()); - } - private EncryptionMaterialsProvider createProvider( String providerName, String materialName, From 750d703dc60ab66efaa765d24b2c34a01c66c111 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 11:32:56 -0700 Subject: [PATCH 43/60] Rename CipherTextGenerator to CipherTextGeneratorIT Match the test naming convention regex required by the test runner: '[A-Z][A-Za-z\d]*Test(s|Case)?|Test[A-Z][A-Za-z\d]*|IT(.*)|(.*)IT(Case)?' --- .../{CipherTextGenerator.java => CipherTextGeneratorIT.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/{CipherTextGenerator.java => CipherTextGeneratorIT.java} (98%) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java similarity index 98% rename from DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java rename to DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java index 21f36471e7..a6118cb7d8 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGenerator.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java @@ -17,7 +17,7 @@ import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.ScanRequest; -public class CipherTextGenerator extends HolisticIT { +public class CipherTextGeneratorIT extends HolisticIT { @Test(enabled = false) public void generateKmsAes128Vector() throws IOException { From d7be49b6fb68a771b5aacbbfb41a108fe53321d1 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 11:48:32 -0700 Subject: [PATCH 44/60] Add non-ASCII material name interop test scenario MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a most_recent provider scenario with material_name containing Japanese, Greek (Ψ), and emoji characters. The materialName is stored as the hash key in the MetaStore table and flows into the KMS encryption context — encoding mismatches between sdkv1 and sdkv2 would cause encrypt/decrypt failures. Add generateNonAsciiMaterialNameVector to CipherTextGeneratorIT to produce both the data table and metastore vector files. --- .../vectors/encrypted_item/scenarios.json | 17 +++++++ .../sdkv2/CipherTextGeneratorIT.java | 49 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json index de49dec570..bd1f381e92 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json @@ -309,6 +309,23 @@ "plaintext": "file://plaintext.json", "ciphertext": "file://ciphertext/java/metastore-data-tables-3.json", "network": true + }, + { + "version": "v1", + "provider": "most_recent", + "material_name": "テスト\u03A8素材\uD83D\uDE00", + "metastore": { + "table_name": "nonascii-metatable", + "provider": "awskms", + "keys": { + "decrypt": "awsKmsUsWest2", + "verify": "awsKmsUsWest2" + }, + "ciphertext": "file://ciphertext/java/metastore-nonascii-name-1.json" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/nonascii-material-name-1.json", + "network": true } ] } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java index a6118cb7d8..cb13d470b9 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java @@ -2,8 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 package com.amazonaws.services.dynamodbv2.datamodeling.sdkv2; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.DynamoDBEncryptor; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.CachingMostRecentProvider; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.DirectKmsMaterialsProvider; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.EncryptionMaterialsProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.MetaStore; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.ProviderStore; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest; import com.fasterxml.jackson.core.type.TypeReference; import java.io.IOException; @@ -15,6 +19,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; +import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput; import software.amazon.awssdk.services.dynamodb.model.ScanRequest; public class CipherTextGeneratorIT extends HolisticIT { @@ -42,6 +47,50 @@ public void generateKmsAes128Vector() throws IOException { localDynamoDb.stop(); } + @Test(enabled = false) + public void generateNonAsciiMaterialNameVector() throws IOException { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + String materialName = "\u30C6\u30B9\u30C8\u03A8\u7D20\u6750\uD83D\uDE00"; + String metastoreTableName = "nonascii-metatable"; + + // Create metastore table + MetaStore.createTable( + client, + metastoreTableName, + ProvisionedThroughput.builder() + .readCapacityUnits(100L) + .writeCapacityUnits(100L) + .build() + ); + + // Create KMS-backed metastore + EncryptionMaterialsProvider metaProvider = new DirectKmsMaterialsProvider( + kmsClient, keyDataMap.get("awsKmsUsWest2").keyId); + ProviderStore metastore = new MetaStore( + client, metastoreTableName, + DynamoDBEncryptor.getInstance(metaProvider)); + + // Create most_recent provider with non-ASCII material name + EncryptionMaterialsProvider provider = + new CachingMostRecentProvider(metastore, materialName, 1000); + + generateStandardData(provider); + writeTablesAsTestVector("nonascii-material-name-1.json", "TableName", "HashKeyOnly"); + writeTablesAsTestVector("metastore-nonascii-name-1.json", metastoreTableName); + + client.close(); + localDynamoDb.stop(); + } + private void writeTablesAsTestVector(String outputFile, String... tableNames) throws IOException { com.fasterxml.jackson.databind.module.SimpleModule module = From 695e1f12af2af74891380e28f374770c094ac22b Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 12:05:30 -0700 Subject: [PATCH 45/60] Return table names from generateStandardData instead of hardcoding generateStandardData now returns a Set of table names it wrote to, collected dynamically as putItems is called. Generators use this to pass table names to writeTablesAsTestVector instead of hardcoding 'TableName' and 'HashKeyOnly'. --- .../datamodeling/sdkv2/CipherTextGeneratorIT.java | 11 ++++++----- .../dynamodbv2/datamodeling/sdkv2/HolisticIT.java | 6 +++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java index cb13d470b9..0e9d611a20 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -40,14 +41,14 @@ public void generateKmsAes128Vector() throws IOException { EncryptionMaterialsProvider provider = new DirectKmsMaterialsProvider( kmsClient, keyDataMap.get("awsKmsUsWest2").keyId, desc); - generateStandardData(provider); - writeTablesAsTestVector("aws-kms-aes128-1.json", "TableName", "HashKeyOnly"); + Set tables = generateStandardData(provider); + writeTablesAsTestVector("aws-kms-aes128-1.json", tables.toArray(new String[0])); client.close(); localDynamoDb.stop(); } - @Test(enabled = false) + @Test(enabled = true) public void generateNonAsciiMaterialNameVector() throws IOException { localDynamoDb.start(); client = localDynamoDb.createLimitedWrappedClient(); @@ -83,8 +84,8 @@ public void generateNonAsciiMaterialNameVector() throws IOException { EncryptionMaterialsProvider provider = new CachingMostRecentProvider(metastore, materialName, 1000); - generateStandardData(provider); - writeTablesAsTestVector("nonascii-material-name-1.json", "TableName", "HashKeyOnly"); + Set tables = generateStandardData(provider); + writeTablesAsTestVector("nonascii-material-name-1.json", tables.toArray(new String[0])); writeTablesAsTestVector("metastore-nonascii-name-1.json", metastoreTableName); client.close(); diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 7043d6c317..d3eae5eed2 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -984,7 +984,8 @@ public static void loadKeyData(String filename) throws IOException { ); } - public void generateStandardData(EncryptionMaterialsProvider prov) { + public Set generateStandardData(EncryptionMaterialsProvider prov) { + Set tables = new LinkedHashSet<>(); DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(prov); Map encryptedRecord; Map> actions; @@ -1022,6 +1023,7 @@ public void generateStandardData(EncryptionMaterialsProvider prov) { actions, encryptionContext ); + tables.add(tableName); putItems(encryptedRecord, tableName); // mixed test record @@ -1065,6 +1067,7 @@ public void generateStandardData(EncryptionMaterialsProvider prov) { Map> hashOnlyActions = new HashMap<>(); hashOnlyActions.put("hashKey", signOnly); for (Map hk : new Map[]{hashKey1, hashKey2, hashKey3}) { + tables.add("HashKeyOnly"); putItems(encryptor.encryptRecord(hk, hashOnlyActions, hashOnlyCtx), "HashKeyOnly"); } @@ -1079,6 +1082,7 @@ public void generateStandardData(EncryptionMaterialsProvider prov) { item.put("rangeKey", AttributeValue.builder().n(String.valueOf(pair[1])).build()); putItems(encryptor.encryptRecord(item, keysOnlyActions, encryptionContext), tableName); } + return tables; } protected void putItems(Map map, String tableName) { From c6c0f00ba020802f5d6d46067f95290d1e5eafbc Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 12:12:32 -0700 Subject: [PATCH 46/60] m --- .../dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java index 0e9d611a20..5131a24429 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java @@ -48,7 +48,7 @@ public void generateKmsAes128Vector() throws IOException { localDynamoDb.stop(); } - @Test(enabled = true) + @Test(enabled = false) public void generateNonAsciiMaterialNameVector() throws IOException { localDynamoDb.start(); client = localDynamoDb.createLimitedWrappedClient(); @@ -60,7 +60,7 @@ public void generateNonAsciiMaterialNameVector() throws IOException { ); loadKeyData(scenarioManifest.keyDataPath); - String materialName = "\u30C6\u30B9\u30C8\u03A8\u7D20\u6750\uD83D\uDE00"; + String materialName = "テストΨ素材\uD83D\uDE00"; String metastoreTableName = "nonascii-metatable"; // Create metastore table From a0b2f3ef365333042deedbd7a33adda75a332795 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 12:12:46 -0700 Subject: [PATCH 47/60] m --- .../java/metastore-nonascii-name-1.json | 31 ++ .../java/nonascii-material-name-1.json | 293 ++++++++++++++++++ 2 files changed, 324 insertions(+) create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-nonascii-name-1.json create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/nonascii-material-name-1.json diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-nonascii-name-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-nonascii-name-1.json new file mode 100644 index 0000000000..c53e8f73da --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-nonascii-name-1.json @@ -0,0 +1,31 @@ +{ + "nonascii-metatable" : [ { + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURGMVo0eVNOSFpjbXo0Ky9vZ0lCRUlBN3hwL1J4K2Z4OE4yRzBiZFppM3dvWHpiejJ5ZXJIWk80TmlqWVBhWHZENzcxbmY3Q1cxRm1YUzY5Um1GRjBjRXlVTkNmVHk4anZJa0JlWVE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "t" : { + "B" : "Aytthuzqg8+ovuhyjSrnJPdCrSCzr0hGq+P25QjM5Lk=" + }, + "V" : { + "N" : "0" + }, + "encAlg" : { + "B" : "EU2NEt5cohFAUdVGVUzAKB7ywZJ7fukGfX5LwvZ5d38=" + }, + "enc" : { + "B" : "Ctyt15L9T3dtnDZgwxMwaLVsPUqLajsm2on+NFyPE+K20EbThFVZlfL8tBeKg95zhfpV3SMk6Tr3H3V72ttCLg==" + }, + "intAlg" : { + "B" : "slaBhG/rQuJGdfN1xk1l010iAu8o0FNRYSeZonAzMRSkxDGR2ZPoxwx4KhTtfLaV" + }, + "N" : { + "S" : "テストΨ素材\uD83D\uDE00" + }, + "int" : { + "B" : "1SFTmZuykcMQo0iPoJy14xNhRqPlSSmPFx9YAuDCv+JrW+/FfUAZiZxei1Du5MOLTPBXv6a1bAK9v4LWc3N2EQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "LHsI6noUN3eS6FK03l8Cd/IfXZgCa2xIKmmXHaZijZ4=" + } + } ] +} \ No newline at end of file diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/nonascii-material-name-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/nonascii-material-name-1.json new file mode 100644 index 0000000000..3f75b06b29 --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/nonascii-material-name-1.json @@ -0,0 +1,293 @@ +{ + "TableName" : [ { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOENGam1pdlJnTjBza1lHbTlVWmZuekM5WnlIMjZsR2Q4d0laRTZWVG9PNDBhWitVVURBMVdTZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "PFr8lpiLEHLuX/cKx9uP3+uSPkjdCXDtlcQ5gPoUBxQ=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOERHK0Z1WHZXUWxnd1Q3cGNXRlNoMEk2WG81YnpLTENtRml6N3J3dkdlYW5wd0hHTW15RXltUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "eNQ30yLupNzPT2YOE4LTujQrW0GzVZKkM4C38hkHZKI=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEtlcGpQZTdiTDE5Q2dtTnA4ak5iekE0SXJYa00yckpVV3Jxc3FmREgydDE5S1kvalk2Q005Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "kd5jrrYMhisPrN8LBinaGped9Bpd++DSyhtcChNXxHI=" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGFGN3ZxYUlaUmxkNFdCNk5hbDRLaFpqUTFNcXdLSlhaczZIUTZ6Sm4yeWxxdWVEcmhVUWtnQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "W8hStNhjqAymY5ZBjGRqw08/63SU3N87Q6WCS94tYoA=" + } + }, { + "rangeKey" : { + "N" : "7" + }, + "hashKey" : { + "N" : "5" + }, + "stringValue" : { + "B" : "FHDgEDmLyUUv5wYGfq6lqBSAi9PUuEZiHEdaKEaEougJZhz11cGoFQuTF4ydu+ez" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODVTb3laeExVcDFJUEZyekV4UThBa1BBcWlmczd5aVV6bXBYZjRuSHpoWWtRdzdmTkhKQ2ZqZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet" : { + "B" : "wsQgIwKrPEk3VoYLDCP5wOTGBKMmBFok0XjFIA08fEl/KmpS71VrQiKvg2MpIuaTyoqXGq5hUSXbUZkR6VujqQ==" + }, + "doubleSet" : { + "B" : "flgSLsQ5VMukZDfrwwwO8+rVuMAcexvrn+vqhJLst8tuE0gU2wXKM5ZYXifw1V9mTcDgTXQdXBNTvHLdzQ45QQ==" + }, + "byteArrayValue" : { + "B" : "AvkM2y8LkS3zcDw4sUH0Hu2FNGy+La3jCRrEkJGY88w=" + }, + "intValue" : { + "B" : "PZwP0jZggL0gNzKBf/XcvvqEnGhOpzLhkEnNIQOAv90=" + }, + "stringSet" : { + "B" : "sVPWa+AkzXaeG0vnerk3AoemAltp+mLsrfnRtRq3YIBrH7ePlb3JIGxP+Kz1ZJwMh54HOmIyr3+BcSPDKAsZJw==" + }, + "doubleValue" : { + "B" : "QCI7NPbUidAc6Kl4S4GKm+S8ycD0slUtyqzQZd9nmAI=" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "7L1OrgAj3+5G6PIFRiNF20VfnkkrOO4nRqotd8IvbWI=" + } + }, { + "rangeKey" : { + "N" : "10" + }, + "hashKey" : { + "N" : "8" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGpvQjhYL3puRWdJNVN5S3l0ZXRZZFpDWS8zR3k5Nkd2UVF2eVZpZVNFcDZjcnJ1aWZqNmJsZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "LGJAXl7XkqCIDyvvbLTE2cXHLcP0Q51oFLy6z14bP7E=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "7" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODJRZmtnZWxXeXZITmNubzhFWU5GUFFhWHoweVI4S01uL1BSUWlYUWU0TEJzY1FFVmE2eFVCdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "M/ygfKm1pSiDLfM8ndOPaFcreHykwjTWJ99bZ8RifBM=" + } + }, { + "rangeKey" : { + "N" : "9" + }, + "hashKey" : { + "N" : "7" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHhxMjA4YUpPRHAxd1lBQ1hGSERDRXRnQzNlVlNTK2wwcWRFQ2h5T2VyTXFuM0RxUW82QXBTZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "kVnmGSSwcE61fbTJiy2uPUWiSe4cXPIA3N0lMb78wJY=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOElMdjhEWE0zS1VoN0puT0hKTVpTeDJnVVRrc3owendQSmF1L3haZGYvRENvNTJNRHBiaUFrdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "fliK8KzRmgEb1P6NWb8JV79Z1QZW8sKXPTfnStQo5qk=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG1iOWRrQ1dKNUk0UWhXM2lhTDJFVEhzZ0MwbXVLTGcrN3VRbGhnc2lQLzJRT3VObUJPUzF2dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "tFuoBD99KJd7ArlC4s8wVun2Q5Hn59uzCpYzJ0JDO+U=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODE2SGhydVFmWkE4ZFlYRW9lRVhRVmlRUWFBaXNBT3k0UnhIVlUrV0VpRlFwWG1LbG80NkF5Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "rHXyZmeg7oDf//vlyfgP7eckc+FbzhCiCetadTYysL8=" + } + }, { + "rangeKey" : { + "N" : "8" + }, + "hashKey" : { + "N" : "6" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODZpTk1NZ2FqQTRnQkREMVRDdWVTaTdlQkY3WC9GMUo4K0FRbnJka1M4M1EvbU1tSE5INkhsZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet" : { + "B" : "sRSQoizMT+OvqksMiyIseEwj+92uOL9v090qLGfPHXPpurfBIbJlK5jakvnW6fg+OO/b8P/zfwTnJ93RoVbmJA==" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "nnoV9ZoF6GM6uFQwxEh3nOsKut/2HrfUBFA4eC347F8=" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "B" : "EdkGy4yaFhE2P92uhurBMlbMnJLuvrPGpn3AmAcClUwGXzazfdbbPdP5akxJaqutNsEZsFVOmCSNG37+cyIy1g==" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "Y2DTFZHVoz7FZFnF3HTE+azRW8KFf+MWIBM+boAYkwQ=" + } + } ], + "HashKeyOnly" : [ { + "hashKey" : { + "S" : "Bar" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHVManh0OWpLOXAwTGl5S3AxWHRsN0tXM0RzWW5jS3ZyRGJQWS9pUTZ5OTNJVWF3MVBzTTJTUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "yZxl3mhu2fAJGfhlJLDaUWOBdT0Q5FojTqGHKthDOhg=" + } + }, { + "hashKey" : { + "S" : "Baz" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFg1d3BIUlE0QkxId3pUUjlrM0lCcEsybEY0VFQzS0NVUkRSZWtYS05VZHpkUVVwZGRjajN4UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "WPZZ4TzN724wJ0hWo+Hvmr7dPjdZVUNpilBsr9w4WCw=" + } + }, { + "hashKey" : { + "S" : "Foo" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHRObzhBbnIyRWEreHpIN3pOb2pXMm9kMnYrcU5EYU5SQmNZSjJ4ZkpETEJyUldUdHlYTkU0UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "kUZ2o3A6kxRf5ImPL14KwinOcvv7gVes8GQ5jBTzrc4=" + } + } ] +} \ No newline at end of file From 45ab6fe836b97c41cfa1ca3ae026b473cb7bb3e5 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 12:57:48 -0700 Subject: [PATCH 48/60] Support RSA signing pairs and materialDescription in static provider case Update the static case in createProvider() for both sdkv1 and sdkv2 to handle two key types: - symmetric (existing): AES + HMAC via SymmetricStaticProvider(key, macKey, desc) - asymmetric (new): AES + RSA KeyPair via SymmetricStaticProvider(key, sigPair, desc) Also pass materialDescription (defaulting to empty map) to support non-BMP/non-ASCII description testing. Add two new scenarios to scenarios.json: 1. static provider with AES encrypt + RSA signing pair 2. static provider with AES + HMAC and non-BMP material description --- .../datamodeling/TransformerHolisticIT.java | 32 ++++++++++++----- .../datamodeling/sdkv2/HolisticIT.java | 34 ++++++++++++++----- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index 1409159125..f8be7dc76a 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -1204,14 +1204,28 @@ private EncryptionMaterialsProvider createProvider( KeyData decryptKeyData = keyDataMap.get(keys.decryptName); KeyData verifyKeyData = keyDataMap.get(keys.verifyName); SecretKey decryptKey = new SecretKeySpec( - Base64.decode(decryptKeyData.material), - decryptKeyData.algorithm - ); - SecretKey verifyKey = new SecretKeySpec( - Base64.decode(verifyKeyData.material), - verifyKeyData.algorithm - ); - return new SymmetricStaticProvider(decryptKey, verifyKey); + Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + Map desc = (materialDescription != null) + ? materialDescription : Collections.emptyMap(); + + if (verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE)) { + SecretKey verifyKey = new SecretKeySpec( + Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); + return new SymmetricStaticProvider(decryptKey, verifyKey, desc); + } else { + try { + KeyData signKeyData = keyDataMap.get(keys.signName); + KeyFactory rsaFact = KeyFactory.getInstance(RSA); + PublicKey verifyMaterial = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); + PrivateKey signingMaterial = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); + KeyPair sigPair = new KeyPair(verifyMaterial, signingMaterial); + return new SymmetricStaticProvider(decryptKey, sigPair, desc); + } catch (GeneralSecurityException ex) { + throw new RuntimeException(ex); + } + } case ScenarioManifest.WRAPPED_PROVIDER_NAME: decryptKeyData = keyDataMap.get(keys.decryptName); verifyKeyData = keyDataMap.get(keys.verifyName); @@ -1227,7 +1241,7 @@ private EncryptionMaterialsProvider createProvider( Base64.decode(decryptKeyData.material), decryptKeyData.algorithm ); - verifyKey = + SecretKey verifyKey = new SecretKeySpec( Base64.decode(verifyKeyData.material), verifyKeyData.algorithm diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index d3eae5eed2..3017af3306 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -713,14 +713,30 @@ private EncryptionMaterialsProvider createProvider( KeyData decryptKeyData = keyDataMap.get(keys.decryptName); KeyData verifyKeyData = keyDataMap.get(keys.verifyName); SecretKey decryptKey = new SecretKeySpec( - Base64.decode(decryptKeyData.material), - decryptKeyData.algorithm - ); - SecretKey verifyKey = new SecretKeySpec( - Base64.decode(verifyKeyData.material), - verifyKeyData.algorithm - ); - return new SymmetricStaticProvider(decryptKey, verifyKey); + Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + Map desc = (materialDescription != null) + ? materialDescription : Collections.emptyMap(); + + if (verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE)) { + // Existing path: AES + HMAC (e.g. aesKey + hmacKey) + SecretKey verifyKey = new SecretKeySpec( + Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); + return new SymmetricStaticProvider(decryptKey, verifyKey, desc); + } else { + // New path: AES + RSA signing pair (e.g. aesKey + rsaSignPub/rsaSignPriv) + try { + KeyData signKeyData = keyDataMap.get(keys.signName); + KeyFactory rsaFact = KeyFactory.getInstance(RSA); + PublicKey verifyMaterial = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); + PrivateKey signingMaterial = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); + KeyPair sigPair = new KeyPair(verifyMaterial, signingMaterial); + return new SymmetricStaticProvider(decryptKey, sigPair, desc); + } catch (GeneralSecurityException ex) { + throw new RuntimeException(ex); + } + } case ScenarioManifest.WRAPPED_PROVIDER_NAME: decryptKeyData = keyDataMap.get(keys.decryptName); verifyKeyData = keyDataMap.get(keys.verifyName); @@ -736,7 +752,7 @@ private EncryptionMaterialsProvider createProvider( Base64.decode(decryptKeyData.material), decryptKeyData.algorithm ); - verifyKey = + SecretKey verifyKey = new SecretKeySpec( Base64.decode(verifyKeyData.material), verifyKeyData.algorithm From 28a108a741a9def9179f6512092be40f54601c82 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 13:07:46 -0700 Subject: [PATCH 49/60] Add AES+RSA signing pair and non-BMP description scenarios MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. static-aes-rsa-1: SymmetricStaticProvider with AES encryption key and RSA signing KeyPair (rsaSignPub/rsaSignPriv) 2. static-aes-hmac-nonbmp-desc-1: SymmetricStaticProvider with AES + HMAC and a material description containing non-BMP characters (musical symbols, emoji, Greek Ψ) --- .../vectors/encrypted_item/scenarios.json | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json index bd1f381e92..de5355fc92 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json @@ -326,6 +326,34 @@ "plaintext": "file://plaintext.json", "ciphertext": "file://ciphertext/java/nonascii-material-name-1.json", "network": true + }, + { + "version": "v1", + "provider": "static", + "keys": { + "decrypt": "aesKey", + "verify": "rsaSignPub", + "sign": "rsaSignPriv" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/static-aes-rsa-1.json", + "network": false + }, + { + "version": "v1", + "provider": "static", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "material_description": { + "\uD834\uDD1Emusic": "\uD834\uDD22clef", + "emoji\uD83D\uDD11key": "value\uD83D\uDD12lock", + "\u03A8greek": "\u03A8value" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/static-aes-hmac-nonbmp-desc-1.json", + "network": false } ] } From 8c8980a90f5173fcd2ceb6e36bebf10ed243a184 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 13:53:35 -0700 Subject: [PATCH 50/60] m --- .../services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 3017af3306..4d8c8195cb 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -718,12 +718,10 @@ private EncryptionMaterialsProvider createProvider( ? materialDescription : Collections.emptyMap(); if (verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE)) { - // Existing path: AES + HMAC (e.g. aesKey + hmacKey) SecretKey verifyKey = new SecretKeySpec( Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); return new SymmetricStaticProvider(decryptKey, verifyKey, desc); } else { - // New path: AES + RSA signing pair (e.g. aesKey + rsaSignPub/rsaSignPriv) try { KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); From 89a2554779470cc9624f8a16d152c8dab0232ee6 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 13:54:18 -0700 Subject: [PATCH 51/60] Add generators for AES+RSA and AES+HMAC non-BMP description vectors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit generateStaticAesRsaVector: SymmetricStaticProvider with AES encryption key and RSA signing KeyPair, no custom description. generateStaticAesHmacNonBmpDescVector: SymmetricStaticProvider with AES + HMAC and a material description containing non-BMP characters (musical symbols U+1D11E/U+1D122, emoji U+1F511/U+1F512, Greek Ψ). Both are network: false — no AWS credentials needed to generate. --- .../sdkv2/CipherTextGeneratorIT.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java index 5131a24429..a149885021 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java @@ -6,16 +6,26 @@ import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.CachingMostRecentProvider; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.DirectKmsMaterialsProvider; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.EncryptionMaterialsProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.SymmetricStaticProvider; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.MetaStore; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.ProviderStore; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest; +import com.amazonaws.util.Base64; import com.fasterxml.jackson.core.type.TypeReference; import java.io.IOException; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -92,6 +102,73 @@ public void generateNonAsciiMaterialNameVector() throws IOException { localDynamoDb.stop(); } + @Test(enabled = false) + public void generateStaticAesRsaVector() throws IOException { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + ScenarioManifest.KeyData aesData = keyDataMap.get("aesKey"); + ScenarioManifest.KeyData rsaPubData = keyDataMap.get("rsaSignPub"); + ScenarioManifest.KeyData rsaPrivData = keyDataMap.get("rsaSignPriv"); + SecretKey aes = new SecretKeySpec(Base64.decode(aesData.material), aesData.algorithm); + try { + KeyFactory rsaFact = KeyFactory.getInstance("RSA"); + PublicKey pub = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(rsaPubData.material))); + PrivateKey priv = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(rsaPrivData.material))); + EncryptionMaterialsProvider provider = + new SymmetricStaticProvider(aes, new KeyPair(pub, priv)); + + Set tables = generateStandardData(provider); + writeTablesAsTestVector("static-aes-rsa-1.json", tables.toArray(new String[0])); + } catch (java.security.GeneralSecurityException ex) { + throw new RuntimeException(ex); + } + + client.close(); + localDynamoDb.stop(); + } + + @Test(enabled = false) + public void generateStaticAesHmacNonBmpDescVector() throws IOException { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + ScenarioManifest.KeyData aesData = keyDataMap.get("aesKey"); + ScenarioManifest.KeyData hmacData = keyDataMap.get("hmacKey"); + SecretKey aes = new SecretKeySpec(Base64.decode(aesData.material), aesData.algorithm); + SecretKey hmac = new SecretKeySpec(Base64.decode(hmacData.material), hmacData.algorithm); + + Map description = new HashMap<>(); + description.put("\uD834\uDD1Emusic", "\uD834\uDD22clef"); + description.put("emoji\uD83D\uDD11key", "value\uD83D\uDD12lock"); + description.put("\u03A8greek", "\u03A8value"); + + EncryptionMaterialsProvider provider = + new SymmetricStaticProvider(aes, hmac, description); + + Set tables = generateStandardData(provider); + writeTablesAsTestVector("static-aes-hmac-nonbmp-desc-1.json", tables.toArray(new String[0])); + + client.close(); + localDynamoDb.stop(); + } + private void writeTablesAsTestVector(String outputFile, String... tableNames) throws IOException { com.fasterxml.jackson.databind.module.SimpleModule module = From d269a5fad63551227e64009e34f39bbca861f7de Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 14:55:36 -0700 Subject: [PATCH 52/60] m --- .../java/static-aes-hmac-nonbmp-desc-1.json | 293 ++++++++++++++++++ .../ciphertext/java/static-aes-rsa-1.json | 293 ++++++++++++++++++ 2 files changed, 586 insertions(+) create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonbmp-desc-1.json create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-rsa-1.json diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonbmp-desc-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonbmp-desc-1.json new file mode 100644 index 0000000000..575ce02ad5 --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonbmp-desc-1.json @@ -0,0 +1,293 @@ +{ + "TableName" : [ { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + } + }, { + "rangeKey" : { + "N" : "7" + }, + "hashKey" : { + "N" : "5" + }, + "stringValue" : { + "B" : "8HoNPftDkC6gi4Ti9RDl0R3uvAQh84zFZ4xOB8u8ZLQAkcqfPxyPVOivOzBd2in2" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet" : { + "B" : "881Z7FYW3IYDucseX7rF3gP1ybF82XgGZYfpUa1usH48WWj8kFFD9SPEEk/8sc7cDlydkSlFL8CNiubUufJ0LQ==" + }, + "doubleSet" : { + "B" : "b60lXmzsbZ39apoaYKkgY+aWo8LWfzAkIGQlNvWkur2IiWcG6owxFzrdr4L+c8P5Kk2X4kWNuDSfWY+w7S8BJw==" + }, + "byteArrayValue" : { + "B" : "3jR3t/sJDnCIAzKyYaEOeyuRdbOvxshJ5tYUFnUdh5A=" + }, + "intValue" : { + "B" : "IjdNh5/lKDA6enzBZK+X6H4m4Xm9yEX2H40Juth0Q24=" + }, + "stringSet" : { + "B" : "y73CITSPLvZnxOZc69JWzhqhrZVLx3erb9bO2pzw59pQsh5eKYU7tulHZ42wi4bwGetDd6m5WZI44e0WpuUITQ==" + }, + "doubleValue" : { + "B" : "1zJZjhbVoI/n4gm9v9AMEed4ERqQC31WgBtZAeT+CW4=" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "jdpG76kptkAXRvykyzuhVSE+T16+jax0SVjbOlmJvkc=" + } + }, { + "rangeKey" : { + "N" : "10" + }, + "hashKey" : { + "N" : "8" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "RBAsheB0kh7XA4EPlHGJFTaq5p08xJg+8YX/O6iC+7Y=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "7" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + } + }, { + "rangeKey" : { + "N" : "9" + }, + "hashKey" : { + "N" : "7" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + } + }, { + "rangeKey" : { + "N" : "8" + }, + "hashKey" : { + "N" : "6" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet" : { + "B" : "bCRH9NVdBsNPims1VSQ6yIzaBTyd9GzG0jlXZTd3pJVtYEtoKS+3KZTWEaL7mjw4YuN1fcGxOXwry1ZyPGQwKw==" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "czUZ62g+6Uo9aA2rVM5hWpgFwGo3ciRuL+feWYAATlg=" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "B" : "ahQmHHwye0i8CxrjiiFYAaBcekI4h02CfNDIAssp2s/bykeiCjsAADrL1Zse08DhZvesPK6SMr8fCwrLssNVGg==" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "co23v5PFdj3JBxYAwyC8F5J08Q4GOjXKoPUAR+EjwvY=" + } + } ], + "HashKeyOnly" : [ { + "hashKey" : { + "S" : "Bar" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + } + }, { + "hashKey" : { + "S" : "Baz" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + } + }, { + "hashKey" : { + "S" : "Foo" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + } + } ] +} \ No newline at end of file diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-rsa-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-rsa-1.json new file mode 100644 index 0000000000..d36734b938 --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-rsa-1.json @@ -0,0 +1,293 @@ +{ + "TableName" : [ { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" + } + }, { + "rangeKey" : { + "N" : "7" + }, + "hashKey" : { + "N" : "5" + }, + "stringValue" : { + "B" : "WzJrn54GcMHwEsjlY7Q8sbj6vyNvLlinLXkKS4iok6aPi7SK3KvBaiuvTeSg50lo" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "intSet" : { + "B" : "1quqfVABNbNgKQ7sUfeVTiTa4UkGlf/ovHewrp5GNT+0hYoccAuiyVG3lKTgVaL3Gk1DVVo8xY7SG7nG52+7pA==" + }, + "doubleSet" : { + "B" : "q40QummaNeoy+KcszMyFXyTgUIZrGv9+b1XbEr3BIsApCjDjrRIu6xg1AOrvfq4K0DAy0oJESFBN4fPtElZR8w==" + }, + "byteArrayValue" : { + "B" : "jcDbafnUHhIwPh4a3/vkAbJukMQY4nAhJsLsI1Y/MJk=" + }, + "intValue" : { + "B" : "BqwAmcd2nuJzj3/O4K7jDKFv3uz9ueUWDVrm83AVbG8=" + }, + "stringSet" : { + "B" : "y61JZU9ggiEtxAySIhgUUoy9igR7+vegC0mBFboh49Da9WWtMEjw4Zf166mWuy3gFlngMeMMuSt8JxoK063S2g==" + }, + "doubleValue" : { + "B" : "ygH0LAHYM10H11rOMS7L+hCU9J6Jnc5WCebgKlo55h8=" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "nrrYM34GT6U84RVwsaizBfdrp7jVwJaVYHtjyH205tRLG4mNUMJjKhfDn5dWQyP7aoY8fqyYIUwTiSPJx4cvtcAuZ6/GndRYG3X9QfTQEPprKn8wGzh35zBEx/fJqhWiVoohrHqhg8P5GWSGmQiLttdId0K3jSHIyN/xXix0FXEaF8g5+rCXWPW+gqhFh/9ghBPgLTKLiB6ubeRRcuFLUQSe4c2gctDt61EVXO1HYGgY+Q0CHYhQ1q2uDVchUJ0041YlpkjNPXIDow9Tnn/WXA6AlHkSJh6OL0+Es2zgBerzxgDGO56nm+alz0f1sgiqJcb95GyqnlC0a1yL5yYI+Q==" + } + }, { + "rangeKey" : { + "N" : "10" + }, + "hashKey" : { + "N" : "8" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "ZGgH3th12g5smQYjM4V1ZJ6lQ90A32YHIQ+e1dkTix7jbg0F+EldPBQQ2VXZKO9LbQcSziWQuGL7HYuZ0Rm3QQgpuCF5fM5DtMBGwHxuF8SdW4iWaeoY9TKkmvaLSMdHLyRUuJi3mvh388saVwai1WKqiq1uebpNv6eJdrxE0UnmLEgtSfUmeh/KMUu97Llhhpi8I3HSjDhRaFNLpck39wuFUjmaMzwhSQ7Ml9gmSSj8fyVSurdM7aNW3whLRUKCaxHjB3S5obbu68fN1uoXKDl1qSE9/VPr654pPpSu/aC8ffCKLpdDMi6OWx5+mZaKihIgkOEVoehrbCSk5XjbjA==" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "7" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" + } + }, { + "rangeKey" : { + "N" : "9" + }, + "hashKey" : { + "N" : "7" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" + } + }, { + "rangeKey" : { + "N" : "8" + }, + "hashKey" : { + "N" : "6" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "intSet" : { + "B" : "+GW1lOUJedn3jzV8JJKiw5Dq4ximdSmsmKaOoLIM/qPSXAl/l7haOe3IsQQICSbZWJfbs8/B+FCUCum2n0pP9A==" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "wHspV5Q2cj2Tt1S8YkY6Eka2L6Grx8ctnu+s3dqCCiE=" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "B" : "nQwzoDVQ+F5waf8Q+WwYqDfeHz4pm8s9IhH82UIc4dOkHMkMh/6bqnqZc53quOik5ZYrXtIsHatkIDll/m8ghQ==" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "kEPqYLQp0YCO1Dg1dSg7ZcemSc4HR4FbhDaDFc26vgnWpSc05ZU4Owx13hjNWmAAI3JrKI5fJMoHhBMmhaAoJVRa3fOPr6nL+GXVlOXEYQsNio9+d3rhtwyWwNyT611ONvWLObtQihzOmozuI/qXdsHxW0tTcGoIvBqnyrHQ86tu03WS63DARIIs8pvBgsu5rG6/6XenY/VPXm4QF+U03mic1ACpeVEsNDGlrVXWNiIIsPabf8crZEdW9GXUidp9tq232PNjSi/QpwZ+2761iiLqQr9qIbyx7QbWWABumtm+yGWw7mHFLgolekToOyUTvqNurugSigO3k6a/jJgpEw==" + } + } ], + "HashKeyOnly" : [ { + "hashKey" : { + "S" : "Bar" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" + } + }, { + "hashKey" : { + "S" : "Baz" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" + } + }, { + "hashKey" : { + "S" : "Foo" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + } + } ] +} \ No newline at end of file From 99a2d46ea75f66a8f9875844d263f8c9acd686f1 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 15:16:45 -0700 Subject: [PATCH 53/60] Add AES+RSA and RSA+HMAC wrapped provider interop tests Rewrite the wrapped case in createProvider() for both sdkv1 and sdkv2 to handle all 4 wrapping/signing combinations: - AES wrapping + HMAC signing (existing) - AES wrapping + RSA signing (new) - RSA wrapping + HMAC signing (new) - RSA wrapping + RSA signing (existing) Uses a 2x2 check on decrypt key type x verify key type to select the correct WrappedMaterialsProvider or AsymmetricStaticProvider constructor. Add two new scenarios to scenarios.json and corresponding generators in CipherTextGeneratorIT. Both are network: false (no AWS credentials needed). --- .../vectors/encrypted_item/scenarios.json | 24 ++++++ .../datamodeling/TransformerHolisticIT.java | 85 ++++++++++--------- .../sdkv2/CipherTextGeneratorIT.java | 71 ++++++++++++++++ .../datamodeling/sdkv2/HolisticIT.java | 85 ++++++++++--------- 4 files changed, 183 insertions(+), 82 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json index de5355fc92..39cd348968 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/scenarios.json @@ -354,6 +354,30 @@ "plaintext": "file://plaintext.json", "ciphertext": "file://ciphertext/java/static-aes-hmac-nonbmp-desc-1.json", "network": false + }, + { + "version": "v1", + "provider": "wrapped", + "keys": { + "decrypt": "aesKey", + "verify": "rsaSignPub", + "sign": "rsaSignPriv" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/wrapped-aes-rsa-1.json", + "network": false + }, + { + "version": "v1", + "provider": "wrapped", + "keys": { + "encrypt": "rsaEncPub", + "decrypt": "rsaEncPriv", + "verify": "hmacKey" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/wrapped-rsa-hmac-1.json", + "network": false } ] } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index f8be7dc76a..dd2e76be8e 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -1229,56 +1229,59 @@ private EncryptionMaterialsProvider createProvider( case ScenarioManifest.WRAPPED_PROVIDER_NAME: decryptKeyData = keyDataMap.get(keys.decryptName); verifyKeyData = keyDataMap.get(keys.verifyName); - - // This can be either the asymmetric provider, where we should test using it's explicit - // constructor, - // or a wrapped symmetric where we use the wrapped materials constructor. - if ( - decryptKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE) - ) { - decryptKey = - new SecretKeySpec( - Base64.decode(decryptKeyData.material), - decryptKeyData.algorithm - ); - SecretKey verifyKey = - new SecretKeySpec( - Base64.decode(verifyKeyData.material), - verifyKeyData.algorithm - ); - return new WrappedMaterialsProvider( - decryptKey, - decryptKey, - verifyKey - ); - } else { - KeyData encryptKeyData = keyDataMap.get(keys.encryptName); - KeyData signKeyData = keyDataMap.get(keys.signName); - try { - // Hardcoded to use RSA for asymmetric keys. If we include vectors with a different - // asymmetric scheme this will need to be updated. + boolean symDecrypt = decryptKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE); + boolean symVerify = verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE); + + try { + if (symDecrypt && symVerify) { + // AES wrapping + HMAC signing + decryptKey = new SecretKeySpec( + Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + SecretKey verifyKey = new SecretKeySpec( + Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); + return new WrappedMaterialsProvider(decryptKey, decryptKey, verifyKey); + } else if (symDecrypt) { + // AES wrapping + RSA signing + decryptKey = new SecretKeySpec( + Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + KeyData signKeyData = keyDataMap.get(keys.signName); + KeyFactory rsaFact = KeyFactory.getInstance(RSA); + PublicKey verifyMaterial = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); + PrivateKey signingMaterial = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); + return new WrappedMaterialsProvider( + decryptKey, decryptKey, new KeyPair(verifyMaterial, signingMaterial)); + } else if (symVerify) { + // RSA wrapping + HMAC signing + KeyData encryptKeyData = keyDataMap.get(keys.encryptName); + KeyFactory rsaFact = KeyFactory.getInstance(RSA); + PublicKey wrappingKey = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(encryptKeyData.material))); + PrivateKey unwrappingKey = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material))); + SecretKey verifyKey = new SecretKeySpec( + Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); + return new WrappedMaterialsProvider(wrappingKey, unwrappingKey, verifyKey); + } else { + // RSA wrapping + RSA signing + KeyData encryptKeyData = keyDataMap.get(keys.encryptName); + KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); - PublicKey encryptMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(encryptKeyData.material)) - ); + new X509EncodedKeySpec(Base64.decode(encryptKeyData.material))); PrivateKey decryptMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material)) - ); + new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material))); KeyPair decryptPair = new KeyPair(encryptMaterial, decryptMaterial); - PublicKey verifyMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(verifyKeyData.material)) - ); + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); PrivateKey signingMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material)) - ); + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); KeyPair sigPair = new KeyPair(verifyMaterial, signingMaterial); - return new AsymmetricStaticProvider(decryptPair, sigPair); - } catch (GeneralSecurityException ex) { - throw new RuntimeException(ex); } + } catch (GeneralSecurityException ex) { + throw new RuntimeException(ex); } case ScenarioManifest.AWS_KMS_PROVIDER_NAME: if (materialDescription != null && !materialDescription.isEmpty()) { diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java index a149885021..ad8e7c04e4 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java @@ -7,6 +7,7 @@ import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.DirectKmsMaterialsProvider; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.EncryptionMaterialsProvider; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.SymmetricStaticProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.WrappedMaterialsProvider; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.MetaStore; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.ProviderStore; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest; @@ -169,6 +170,76 @@ public void generateStaticAesHmacNonBmpDescVector() throws IOException { localDynamoDb.stop(); } + @Test(enabled = false) + public void generateWrappedAesRsaVector() throws IOException { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + ScenarioManifest.KeyData aesData = keyDataMap.get("aesKey"); + ScenarioManifest.KeyData rsaPubData = keyDataMap.get("rsaSignPub"); + ScenarioManifest.KeyData rsaPrivData = keyDataMap.get("rsaSignPriv"); + SecretKey aes = new SecretKeySpec(Base64.decode(aesData.material), aesData.algorithm); + try { + KeyFactory rsaFact = KeyFactory.getInstance("RSA"); + PublicKey pub = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(rsaPubData.material))); + PrivateKey priv = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(rsaPrivData.material))); + EncryptionMaterialsProvider provider = + new WrappedMaterialsProvider(aes, aes, new KeyPair(pub, priv)); + + Set tables = generateStandardData(provider); + writeTablesAsTestVector("wrapped-aes-rsa-1.json", tables.toArray(new String[0])); + } catch (java.security.GeneralSecurityException ex) { + throw new RuntimeException(ex); + } + + client.close(); + localDynamoDb.stop(); + } + + @Test(enabled = false) + public void generateWrappedRsaHmacVector() throws IOException { + localDynamoDb.start(); + client = localDynamoDb.createLimitedWrappedClient(); + createCiphertextTables(client); + + ScenarioManifest scenarioManifest = getManifestFromFile( + SCENARIO_MANIFEST_PATH, + new TypeReference() {} + ); + loadKeyData(scenarioManifest.keyDataPath); + + ScenarioManifest.KeyData rsaEncPubData = keyDataMap.get("rsaEncPub"); + ScenarioManifest.KeyData rsaEncPrivData = keyDataMap.get("rsaEncPriv"); + ScenarioManifest.KeyData hmacData = keyDataMap.get("hmacKey"); + SecretKey hmac = new SecretKeySpec(Base64.decode(hmacData.material), hmacData.algorithm); + try { + KeyFactory rsaFact = KeyFactory.getInstance("RSA"); + PublicKey wrappingKey = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(rsaEncPubData.material))); + PrivateKey unwrappingKey = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(rsaEncPrivData.material))); + EncryptionMaterialsProvider provider = + new WrappedMaterialsProvider(wrappingKey, unwrappingKey, hmac); + + Set tables = generateStandardData(provider); + writeTablesAsTestVector("wrapped-rsa-hmac-1.json", tables.toArray(new String[0])); + } catch (java.security.GeneralSecurityException ex) { + throw new RuntimeException(ex); + } + + client.close(); + localDynamoDb.stop(); + } + private void writeTablesAsTestVector(String outputFile, String... tableNames) throws IOException { com.fasterxml.jackson.databind.module.SimpleModule module = diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 4d8c8195cb..9046006a47 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -738,56 +738,59 @@ private EncryptionMaterialsProvider createProvider( case ScenarioManifest.WRAPPED_PROVIDER_NAME: decryptKeyData = keyDataMap.get(keys.decryptName); verifyKeyData = keyDataMap.get(keys.verifyName); - - // This can be either the asymmetric provider, where we should test using it's explicit - // constructor, - // or a wrapped symmetric where we use the wrapped materials constructor. - if ( - decryptKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE) - ) { - decryptKey = - new SecretKeySpec( - Base64.decode(decryptKeyData.material), - decryptKeyData.algorithm - ); - SecretKey verifyKey = - new SecretKeySpec( - Base64.decode(verifyKeyData.material), - verifyKeyData.algorithm - ); - return new WrappedMaterialsProvider( - decryptKey, - decryptKey, - verifyKey - ); - } else { - KeyData encryptKeyData = keyDataMap.get(keys.encryptName); - KeyData signKeyData = keyDataMap.get(keys.signName); - try { - // Hardcoded to use RSA for asymmetric keys. If we include vectors with a different - // asymmetric scheme this will need to be updated. + boolean symDecrypt = decryptKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE); + boolean symVerify = verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE); + + try { + if (symDecrypt && symVerify) { + // AES wrapping + HMAC signing + decryptKey = new SecretKeySpec( + Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + SecretKey verifyKey = new SecretKeySpec( + Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); + return new WrappedMaterialsProvider(decryptKey, decryptKey, verifyKey); + } else if (symDecrypt) { + // AES wrapping + RSA signing + decryptKey = new SecretKeySpec( + Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + KeyData signKeyData = keyDataMap.get(keys.signName); + KeyFactory rsaFact = KeyFactory.getInstance(RSA); + PublicKey verifyMaterial = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); + PrivateKey signingMaterial = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); + return new WrappedMaterialsProvider( + decryptKey, decryptKey, new KeyPair(verifyMaterial, signingMaterial)); + } else if (symVerify) { + // RSA wrapping + HMAC signing + KeyData encryptKeyData = keyDataMap.get(keys.encryptName); + KeyFactory rsaFact = KeyFactory.getInstance(RSA); + PublicKey wrappingKey = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(encryptKeyData.material))); + PrivateKey unwrappingKey = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material))); + SecretKey verifyKey = new SecretKeySpec( + Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); + return new WrappedMaterialsProvider(wrappingKey, unwrappingKey, verifyKey); + } else { + // RSA wrapping + RSA signing + KeyData encryptKeyData = keyDataMap.get(keys.encryptName); + KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); - PublicKey encryptMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(encryptKeyData.material)) - ); + new X509EncodedKeySpec(Base64.decode(encryptKeyData.material))); PrivateKey decryptMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material)) - ); + new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material))); KeyPair decryptPair = new KeyPair(encryptMaterial, decryptMaterial); - PublicKey verifyMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(verifyKeyData.material)) - ); + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); PrivateKey signingMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material)) - ); + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); KeyPair sigPair = new KeyPair(verifyMaterial, signingMaterial); - return new AsymmetricStaticProvider(decryptPair, sigPair); - } catch (GeneralSecurityException ex) { - throw new RuntimeException(ex); } + } catch (GeneralSecurityException ex) { + throw new RuntimeException(ex); } case ScenarioManifest.AWS_KMS_PROVIDER_NAME: if (materialDescription != null && !materialDescription.isEmpty()) { From 5404a6e7aaf09a2428b5ade9854e644c14126b22 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 16:01:55 -0700 Subject: [PATCH 54/60] m --- .../dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java index ad8e7c04e4..39ec58dfe2 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java @@ -172,6 +172,7 @@ public void generateStaticAesHmacNonBmpDescVector() throws IOException { @Test(enabled = false) public void generateWrappedAesRsaVector() throws IOException { + // wrapping/unwrapping key = aes, signing = RSA localDynamoDb.start(); client = localDynamoDb.createLimitedWrappedClient(); createCiphertextTables(client); @@ -207,6 +208,7 @@ public void generateWrappedAesRsaVector() throws IOException { @Test(enabled = false) public void generateWrappedRsaHmacVector() throws IOException { + // wrapping/unwrapping key = rsa, signing = hmac localDynamoDb.start(); client = localDynamoDb.createLimitedWrappedClient(); createCiphertextTables(client); From 676c8e785ace84350e126cb0e1e9b5f3b4489531 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 16:03:11 -0700 Subject: [PATCH 55/60] m --- .../ciphertext/java/wrapped-aes-rsa-1.json | 293 ++++++++++++++++++ .../ciphertext/java/wrapped-rsa-hmac-1.json | 293 ++++++++++++++++++ 2 files changed, 586 insertions(+) create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-rsa-1.json create mode 100644 DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-hmac-1.json diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-rsa-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-rsa-1.json new file mode 100644 index 0000000000..538d2c8a3a --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-rsa-1.json @@ -0,0 +1,293 @@ +{ + "TableName" : [ { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGZyOWZESWt5bEpVVUU2VktEc0lHcThjcVQzb0lldkhhWFovMHErTjFNeFlmdUZUSVF6VzlWQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOElGbnRVb0xsUElaOERnWm92R0E3ZnIva3F1ay85SkU2cllyRDdFdUFCd1g4eWcyOWY2UG5NUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGtoZm1JNEt6OXRMR2l6ZUhXUnYwMlRmdDBldmRMV1BHMkRLVXlBWkpGbm1ISGxyRk9KVE9Edz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHBJZitQdkNqK0VreFp2aG9oSGVzaEQ1UWgxaGg5eEp3K2RLckdQUFhSbTBaQlF2M0ZsbWRaUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" + } + }, { + "rangeKey" : { + "N" : "7" + }, + "hashKey" : { + "N" : "5" + }, + "stringValue" : { + "B" : "umLEEBYb1tu3d4bHFiU/qDy2aBANsYijmbmd2MY/6KTPyJX4jToisbf1IFEv98Vt" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODBuZk5aUjVXSlVGQ1dpY3NOeklYbGJVWkNKVHhDcHk0K295b2ZFSkt1c2hqaFA4QjlETjhuUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet" : { + "B" : "0k+MS5+E2z3qUqbtymenHWYX8vFTAZ/3Y7TabRFv270zIY7KJXQ1afR8Gu7wCyzokY4fJ9uazBRnakbe/btU+A==" + }, + "doubleSet" : { + "B" : "FPNZipxAOKhIC9jkzAICEtVQfE2/0gsOYDKjxmu+6w6jHP8/jRhbfmURReiBSHCWLdXnLgxJIdbbmERk/vgqAw==" + }, + "byteArrayValue" : { + "B" : "s5+7Nw3zgxukEvb4zhGyFCpI9hcibwAnVC72mK45dEA=" + }, + "intValue" : { + "B" : "FmIcibB9h7/4Ym2NE7FUFbAnLd83zwjddgtDMV85uco=" + }, + "stringSet" : { + "B" : "JD88XixzdYD+4q658J4h0F1ND6pxuv26nvaptK7vC/H0J0cxhDKsEO4N3ykKRdoRBLCmHurSS54B1RkkARqkAg==" + }, + "doubleValue" : { + "B" : "1amQVT8K7MFfjriJYYD/UqQHG0eqWkbOEL2LDF0MpUQ=" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "lq0Mj71SzeAa9lsSba7Qu7PwphnuxLruDIeYeoVo7GS8y0hYZZdCT3xcbOFEfnfYCteWMEXTkMVvHd59mF6HxFtlShywxx9+QMadTDz18YC+wYZUMB3/U8oqViWjivemLtg0+9ZfLOxCpUP9d4OC+uUUIIXgTwVEYKJ4v4oStSKRtLrZ4aaK19d1dHZjajkVXcoCAYgwQyrcLsUkl0+GmiBtfF9LYyfWJqow/3TXh1t5v/H8U9H+RfMZgFSQE/CL+eI2BTUvSt4xj4u2G2EFBqWTfKDh59+gYMZMLNkuY5mk9h9Tpy8o7PuV3OUzn9xBHAE2AMi6z2X3ofuF8Hy+fg==" + } + }, { + "rangeKey" : { + "N" : "10" + }, + "hashKey" : { + "N" : "8" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOExtamVEMzAwQzJhVU1zemlGNVdjc21CMldmWkl4Um1XMUlZRGJoTHNZdVVLZUN1ejlOK2h6Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "ZGgH3th12g5smQYjM4V1ZJ6lQ90A32YHIQ+e1dkTix7jbg0F+EldPBQQ2VXZKO9LbQcSziWQuGL7HYuZ0Rm3QQgpuCF5fM5DtMBGwHxuF8SdW4iWaeoY9TKkmvaLSMdHLyRUuJi3mvh388saVwai1WKqiq1uebpNv6eJdrxE0UnmLEgtSfUmeh/KMUu97Llhhpi8I3HSjDhRaFNLpck39wuFUjmaMzwhSQ7Ml9gmSSj8fyVSurdM7aNW3whLRUKCaxHjB3S5obbu68fN1uoXKDl1qSE9/VPr654pPpSu/aC8ffCKLpdDMi6OWx5+mZaKihIgkOEVoehrbCSk5XjbjA==" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "7" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFNNZms1dmdrREVQejRZLzhDc1FkbWdMYlZyZ1NBb3gwZVRBSkMrODRsNWhWV1o2SkRXZTRVQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" + } + }, { + "rangeKey" : { + "N" : "9" + }, + "hashKey" : { + "N" : "7" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODJTOWVJeWp4ZW9YTnNxNldVL09IaXVLMERrdWdtWjlHemdqRGNSV2VTOTVqMWtabTVaQ0JaUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG42WDNYakJEZGVVcFNtdHNwMCtZQXJoM2tuTFpOK0FWc2Vnc0dqcFozZUN4TUkyTy9LSkRPdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGlDUGVaYmxMMjErQnV6YUwxUW02WDEyaUw4dWYwZTU5N1lLTDdaSFZ0dThIYUdNaXhxcjVIUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEFadHNuRmJKYjRGdEZqMmt4anZETXU1ck1EK3ZNckZlaU91QXRiSDNPWC9iUmpUZTlKY1hGdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" + } + }, { + "rangeKey" : { + "N" : "8" + }, + "hashKey" : { + "N" : "6" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFd5eWVLWlhTQlI1enlwcWpETElLNS81M1pjNnhJZDZhelVhNFhTaHI1aUNBVlZjcjBxUnhpdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet" : { + "B" : "BCxzLimnWGgSLipbleaJrxhyhM0DVbLXmhic97+WFS4v2f+wUw3GqWDiidnUbbzDlgJKxNL88hLkXwHKRIuc7g==" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "bSLPxcoBUNFp5ngpN+vW00uak2gIZBTlZ4/Dpu45IRs=" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "B" : "gqoZ6E0+b8Su4/VnUEwmET3Ig5NcDtfO/iJ2c7wJ9rSijkBZFX2wiRK70jdieyvnPKhQlmenvUit8VAgeDeB5w==" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "cEAa61z6f+qk7E4dgsvqz7io2+UsL40UVBng1H/relvx52iWqmDs0uH8uaa1RAPbDBBtn9S4SlyUDl63Oc6VRkZxKtpMUTigDPccJ09zmj8UPXe5vcmahseSWlUh7xXJRxp9EKYVYorKjDUdDMWqiv/xInrkJ+rbMCjFfaE9LuI0VheB2VlAZMzLoSwpo+CENqLKvSDoI1LZeIoMLns3mVrsAbND7HYVI6DCugBh5BSWlSfgKTho5R1mCMIdPhr/u7H5I8YLZkEhdhv8QhDnhgRTXtkeABbZVSBwIqzB2oGnQYd2FY71p0j83ZqjwQffluAAO2fa1GgtBHbQe9x3WQ==" + } + } ], + "HashKeyOnly" : [ { + "hashKey" : { + "S" : "Bar" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOC9zWTJEeXQzR3Q4dW9ucW0vVzNDZ09LMjEvdGFTYWc0aFZmdEVpTWg5Rit0ZHIyOHlFRElUdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" + } + }, { + "hashKey" : { + "S" : "Baz" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFVGamN0RWQ5ZjBHQnRFL0V0V1BKMXhOcitqYVIrKzBqalJiem9YbkdXQWlaYVUrTHVSSk5sUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" + } + }, { + "hashKey" : { + "S" : "Foo" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOE5FN0lWek1mV0VkdW5RbEphUmxPa002UTJYRzQ0UTE2ZS9LSlNQMWc0Rk1pa3J0bFU3Y0VmZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*" : { + "B" : "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + } + } ] +} \ No newline at end of file diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-hmac-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-hmac-1.json new file mode 100644 index 0000000000..d39752c078 --- /dev/null +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-hmac-1.json @@ -0,0 +1,293 @@ +{ + "TableName" : [ { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHRacDhMbmdHUDB1M0p3amJjTERJaG5OYk8xR1VMditEa0lQVkpTc2E0OVdKM3Z4eFovbFVSUE1KTmU3SjBRQTZCK0NNNXNPTCtnZzg5cXQrYXpvZ2tmYW5IU28zZ3hwWWdyRURBRlNOWlJMRXZidHVlRHlrOUFzdzVsV3hZVE1vc1FGQlFNYnBiSmprVHNlOUVnR3RSN2s5djNFckluVEFsK0N5dXY1RTlmZzYxcUdqQ3BGMHIyR1NDakpsd2FuUkNpYjRXWGxoNldYTnkyY3g1VTF2ZmJ2M3F1S0hGeStLSUxtSnc2bHJ2elpTN09IQW9GUXlhS09IRUJZeGRXd3F5ditwS3FJUFRVWVd0K0RvdktibTVYVkk0eWovaGJuK2dUbTdXbTNqYVNTZ2pVdDhENi93RGZ5MUp2ZVdidHZlVk1pbS96K1ptbVBOeTR3UG1FTndHUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEYxcmZBN2QrNkhhajJJMjdDV1NvRmhFaW4vK0hwUjhpUVJ2c0tIRWlORGoxN2FEeWJvMHY4ZjM2TmFuZlREdzM2RzJodTgweFUrQ3JiUFdrRzhvbGx4MUhXcTkzT05ONkp0SG9LUEgxVWxTMU4xb0UrNmM4SzB4SDlBVmlTNU0vT01jZnVtWGEySm9VcjBSSlovb0lOYjhCT3NJbmZnSWRSMFRvMUJGS09razU5ZGphcEJka2lKSUxFdFdlaWNBN25Vdm9PNm91QzlKMUNOVEhncWZUUFJiRHE4WHpMNUJjc2R3bjl3Sy9KTURXVHQ5bUVhV0pzc2hCKzVZR3pualBObjNPMzdnd2gxeWRGRzdvcU42VkpkU1k0TDNaOU1qN3JqUWhubUR2UmZaT1Z1dmhuVnN2bnEzY1RiTStCQzRSM1ZQVmh3WEVVV01lNDduL2wrMXFIZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWE5hK1ZWVTZDVm9iUTMwY1BOdmd5SFlxK3d0TWc2a0pPd054ZGtaTm9UMmR0UVhLRnE4Y2ZISTJSYzF0QklsYzdPS2hJVUwvUXNuTlNobitJTDIxZ3pLTUtRbEJIYlVMeGgyTnBXeHhackxkRmkzdjFKZXBFSU8vTEppM0c4TXYvektFQ2t1Mk1Qd1AwMVRzcUhFOUphUWx0R01hbkpYdkF4RTVYV2c0aGZrRFRtdGMvc0NWVHRaM1hZUTNJQU4vU2VMdWdudkJqWDhjdWw3UUVhc2lLbmNWNklhTitEaW5Bd3JyRFhvSVI5TjhoSStoRXYvb29hUk85ZjRoNkZjcWxxYVBFdTRXemY0bVlPeXRlcmVzbmRKYnd4elN0T2ZhYno0NE02emloUkUyRThBSkNJcGV4NEIrSDUvdW1jOTd3ZklOMUlYZzNDcnBkY3lBcDFaM1VhQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEhhNU85OFFwQzJ5YmcrZkFESHh2TjhTaGZUdVBSQk41TStzcVJXbG5lZEJsSktHaWxkN24xTjNXSVlNMkxQRmhLTUJvNytJUC9OMjREdEdoYXkzVnJiWHZZVEpLb0RJeEN2RDYxSXNGaDNWTUQyN29KdnpQemx1ZkQ0UndWV2Z5UzNvbzNiaVlROUFCTE94cG5HM1NiYzhLMUtHZEptNnhFR1dBd1FwUVdOK0RzeEtkTk50Mkp6VGxvb3ZWUWhTQXQyVksxMWsvM2RsVTEweEw0c2cyUDJ6M2wzYk1SWS9uU1Jka1N6VXZBRUwyZG5LS2tMbSswWjNMTkdWcHNXZmxaS2xweGwvWFVPV3ZWOERUSWs5NTBvL1BBSkZSUlQzZUp2SUNuMkNUY0xydm1VVHFySUltSmJVVjJSNVB2bXVONG5OU2JpeERsc2RqQzFxL3BESjh0Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + } + }, { + "rangeKey" : { + "N" : "7" + }, + "hashKey" : { + "N" : "5" + }, + "stringValue" : { + "B" : "KiO3tgTZErY3zPEn+A9bSBUBzqsSIJcP2DSCmCeDl6pObxeNkaloc3Hc25TYFEb0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWE5zRHJHRUZIb2NaTzIzRzcrVlllOENMZitabjNaT3Q0N2tmRVBnaVZ6Q1Q2QVVSaGVoOGVNcDJXVUd1Y2FSdzI4amJmR1pQanVKNndJTWg1bUE0cmhubUxaUzdZM0QzUWdibytVTURLWUVic3VIcE9tZFRPUVpSTjFFWW10WGFsRTFrcjhxeXptNHV1SXA0VHJwQmlhNFd0dklNRytZY1A1NjVTaThEcHBwMlVUOEt0elhFN2JseW9Ob0dvRE1TZlZ0K05BN1ZmdmJnTHhhcDB5ZTBJc1Q2UjcrTVd0UVRnMkx3cjJPMkZsR0RLQWVqdVk2TytHbkF2SGQ5V3Frc29PWG1qMDIxVGlDNHU4TWhVcDNnTVVLU2RRUUs3Z25qQXZ5eVJscFR1Qi9FdG1vcDh6TEZoVFdNdi9FOHArUU1PWDlIQnVmRWJVelFIVzcvNytqb0p1QT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "intSet" : { + "B" : "64kXa8pRAflpD63+KAlDVYxKQCyd3umG5JtpD8TkbLroWxknf8wr4Bbq60GEMDZeeYmmvL4nbEBnhHkU/96TCQ==" + }, + "doubleSet" : { + "B" : "zTrh4n1QV7GprvBl+0SGZHrpwLCzlU4PMjXmuYwZ1VGZ3U8ZnmRmTp4MnWmhx1lOs+QJj3SjuEhlw7d5uZ7uCg==" + }, + "byteArrayValue" : { + "B" : "ozqegfAhdkXdVkebF1KC4G48XdtpQTsgt+2zIdCutqI=" + }, + "intValue" : { + "B" : "2/ytG7LALLoO/wSVDSmvOR1amO0C06NkizQX9vztXBI=" + }, + "stringSet" : { + "B" : "HovxICA0tySSb/nORaKsZInFgQAvm5vvS9A8rilirumqF9iVFYaT487HCa46ty6d5PaLYQ8BeKG0S7YmyqKLqQ==" + }, + "doubleValue" : { + "B" : "b62bBPKQbkSyigK6dM1EL6OPMOW8j88qh8r9WcwvG8E=" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "jGJOy9PoGejN4ZdzNR6kVFBXv3G46dFVj66z/Ae8e4I=" + } + }, { + "rangeKey" : { + "N" : "10" + }, + "hashKey" : { + "N" : "8" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWFVvRDNneG5jd1VDa01tQ2xUUHJWaWpXejlzc0NZdFVHNVQwQkJBZDl6czgvNURGZndCdVY1dFhEVGpxVkpTSVJRYmFUK0ROUy9nUFNzb3ZtWVpGTGF4dWJqRE4vd2ZRTXB1OGZEOEhVQmV5S1pKTEYwNTg5OG5SNmZSSGZaVEljUmNXRE5VV2tVVlRMbUVTcFc1MXFlSFJqaDNldGlEOVFWN1JoY20ySGZOSHlZZlQ5dlNZeXBpK3pETDE5bDA1MzBMZmUxWitDQXlIczQ0cGVmemIwQnNxbGg0KzY2Z2IyY1hnOXA5bHNKdVVLdDF3dS9BNklDL1FYMTJKRmFiWlRPMCswL2FXdzZTc2RjcjczL0FvYzdRekJpK1lGVFRvZ3liNFlQZUtYV2RKazdSblNicldXVlFlWktLV3pSMTNzcEN2WS95OWtYcW9JYnA1anorYmZIUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "RBAsheB0kh7XA4EPlHGJFTaq5p08xJg+8YX/O6iC+7Y=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "7" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWE1hS3lIbnJjOXZqeEplVC9CbEZnZW15bzBNV29yNDR6ZnVyKzBUK3FZbGZYcDJOKzRReGQ1Mk1jNDNJVmNwRzUwWTNoS2FxdDhBcHFSL1VQVjVxTDVVVUJQY1p6Zms3RnlLYjcwM01UeEpObmt3SGk5ZDQxOGc2S05wYW9LbHJUSlRVOU5HUVZFYkIwSGUvRU9zeS94azl4NVZiTVhkeUt1ZWtpMElobmtBL1BPOTNIQzNKU2t2NjFoL3dpLzkrdmZtNWJYS2ZWSzdGY3JYNDRLaFhmSDgyd0xvOERtU2I3cEw2a1hRYURaUUw3WXJhTUVrL3lDWnlwMXdtdHFaTm05OExRY3NCK3FZVmhYdGxCVlJlTXhEZU8wTzNCcWd5VFJrdy9sVzVQa1NtRzZwOVBqMnJhVmJJYXViME9iUjMrOXdldFZ5RzZsL2pOSHliN1E4MFZIQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + } + }, { + "rangeKey" : { + "N" : "9" + }, + "hashKey" : { + "N" : "7" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHJWS3lIa1ZjeGhqa3hrSUU5ai9RSTlmcWNtc2Y5SmpUV2dRQlpuRkhVTVFHczQyK0dmeE1idUJkUkE4MjEwb0pGaDlXbGVhMCs5Zlp3azAvd1J2SlF0UTRBbmdoaVoxS0FueXc1NmV3TnBrOE03S1BGN2ZKRmd2Vlc3WnRXVDdqakRHWjFmZ1MzOHF4RG11RDNWVFpBVzJpNFBHV3F2bEFZQTYvc3hSRzUwM28rN0pVOVFsaEM5V0lzVVI5MndxbXhnQlNFcEdWendjcTNsYkJwM1Ztc0oyYmw2TU1nYWZIZkNsc0l3dVJXcU44UUsvMFRNeU4yWERFcGFpZFcxUDIrWjNQVGx5a214RDg0WVd1cWtGaHB0aVR6NzBUMHNJSnNZTGRyVFl4M3F6dzlJYVNwZjlRZXIwNVRWMWxVOVkyRTJQYW5NUWZXZnBUeDdSK0F1TWZEUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEg1WWJvRGlFdmkrVkpiZm9HdHBPcFhsTzJiRDJ2S3RMSU1UdUtqN1dTN2QyWCtJdmhSeHNvS0hMd20xdVM5YnNMbEpOUkcySnpBZzlVaU5rUHlnOEFLT3JMR21RYUFOMUp1VmVqaFpKcENURW5pRFlsRExHZ3B3UzY4TCsyUFl4eUZqMWZXN0FvSHVjZDljWWJjV1JZOUpHeGxZWnNKREJkLzVFZUhRVktaalRCNmdVd21HbmlEOVgrazI1SzhQazE5K1k3QVZkblhKZDRyOTVNOEY4ZmJUdmtKV3pZaTRoaEM5dGpPWk5qVjd6L2FMN1gyeE1yMXpVQ21XU3RqKy85QnorbkRBMXovYXZ3bG1hTTN2dmRwRHo2RGhiRmZiTFlMancvYU5JT0czOHkxOUo2ekljZkl6WDI0cFBaZGNYRHdTVUJOMHpiQlZYUEtsVHdRVXpKQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEd5d1E4dGM2Qk8wNERWL3JOc1UrVGhrcTZWL3RqN2E4ekFHTEhQeVM4TTV4SzJqK1MzbFVjbFhBR2U1OEhIN2hHMlVJc1hTLzRqbERCY0dwWmFTeExaaytNRjV3TUhxTkhOM0tzdGo1aTQxZ1ZjSkljdGJPTjhsZEhJeWFNSHgzUi9Dd1BVYmUyc0wvYk1pd2xuUUxBUVZZU25jY2VEaS9qRExESUt6ZWdhZjFVdjBBS2h1cjdtczhOeGJEY2l4Zko1NkNVNVdQZVl5ZE56Y3NFSnZGVTVqT1lkNkdQTFEram1iVVNYQytOT0M5RXluSEpDTC9pR1paSWw3eVBvYUZEY25qQ2pVbzhSQlAxaVBtMVBCWmU1N3lTblg2c0Mzb05ocWg2a2lnR0k3UEVPWkhSM0xLT2gralQreHFjWVB0ejFteGxndTBlQnFBOGE1MGJSNkJSUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHNqb1Jyb3ZYSVlaOW55UFFWajNHSytoOGx4SndpMGVYMHVGRU5HNzVQVWY5REVqUytYR0lnZHpPaDYxSlZBUllCWW9BM2ltckpGWjVzNUlnUGhFazQ0bjhkYWJJWG96WVdJU2VHYm5RbTgzUlZvV3NUS0x1R0pOTkV5T2hNVVRJK3NwVERMMzVxbndmZmJ3U3F6VmYxNmpwVUFMMEVpUVNFbTF5WkJXREk5OURIWkE0VnJaUGhCbUx5R1UxQkQxZi9FSERFK1Z5OVYwL3N1dGtsQldCMkI0bE9yUkxYUmEwelhVcDMyZWhKVk94a1o5eXVMeFU4OEdsbm5UZ1dpUGRaK1NTbzZsek1iUkdoN1VyNmtlMm02c1c0WXJaTmJGdVhUUEVWd1BuSXdycWtDVDc0WUl4ODA3VWdtRk5qckpDbTZxVWppWDdKVWFaaDJFUUlWZDJuQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + } + }, { + "rangeKey" : { + "N" : "8" + }, + "hashKey" : { + "N" : "6" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHFoZnBVOCtSZndndTd6U2ZKMkVnb3E2anJZQjZGMUlGWWdIaFhhSzZiMk9YMkgzZUIrWkdlVEZWYkdUQWlJVm1NSjhRK2hEbWwxeTBaUThudTNjdFpVWHVhYXRUQzZOWW9rR20xVTFYbVg1cXpTcGQ2R2R3RndCamVYQXQrcStUMmR6UDVQOVRZTjZhMlZBSmd6eVEra21FSkpIWmdUb1FBWVlrRENST3ZtSnVETGpkWE1pM1BoWm91dTZTMVNJSDVINUNyWnVPdVBmc1ZiWC9LUGNnckhhVmtnL2tSQ3ozTXdmRDA4MVRUc3F4bTZQRWE5TzFCaFkwSlladXFYZlZodlhZNCtqVmd1OEhBWTlteGxaQzdkdWVXa0lXK3k1TVJIeWdDVTBVNitlRVdlSlVWK1RzbThFYkxRMmtFd25vS3RsOXVKOUw2UGJRU28xR0FHYjZLQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "intSet" : { + "B" : "mwGiX9m/HbHVkhpyZaSJQwRW/EfiGwa/BppMim0JM4zAUF3JufkOXBpDQZpItSbOcwAQwEI1iEUpz1cFfZsxvA==" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "byteArrayValue" : { + "B" : "QJBfCt0G7U8ndcYZt1uyMVFGSFT/ZGfdJNgQxX7B9h8=" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "B" : "C284N/u/d04heIWNVGfX6HaZW1BbcKKHNRPUP8+c0zLqPgSxn0raBppjlvEPGyciFe12kcn+fNbuQMQbDYsqKw==" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "0" + }, + "*amzn-ddb-map-sig*" : { + "B" : "W2iOpDKlcvuPnNm3SPrPn8YhhjnG1jsJVdXwtK8vq20=" + } + } ], + "HashKeyOnly" : [ { + "hashKey" : { + "S" : "Bar" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWFJsSENoT0V2WGpJdU1ma3BDTGtITUppQ0c5VkIzY1VPRU9lOXh1Z1dQVFQ5dzdLZjhzSkxjbDNOSHFGZ1pWUzdHU2trVDFjaG0yRlUrR3AyNHdDbEZ5M1AxZmovTGV0QjdBN3Y3MmhhTmxsZGE5RFJYT1l2OStpd2VQMFBMM2pwL2FoYmRCSTIvREl5ZGpJWDB0Wm5FK0xRcGlWT0huOEJ6NjhKM2xpOHM5TS9TQ0U2WWRuUHYwdEhKaEVER0pSWUFhdlFSUytaTTh5Mk1uZy9NUE9obnYwWkVGdmlpU2QxNzlyOTZFSGFUV1ErcXh2T0R5NkFnUVZYMkRRUExKRDJpemZFRDhYSVpuLzBOcHhBc3RSVzBPbXlRTEd0K1gyM0dwbjgzWkdZNjFUNGNqRTR6MUtGVUU0N0J2QjJVeDd1NlIzUzVsMmxNSm8xN1g1TDFmblM3QT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + } + }, { + "hashKey" : { + "S" : "Baz" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWGdWbUNTMGZWanFieTkwRmVZL2VvTlQzallUblpwRXJjSm5DbGFFbHhVZUhRcTlWanRDbGltVWtPTmFLcnR3K2dvM3JPcXo2cDlWWDJtdkxyZDBUVWR3amRvdVpiUnc0UE5mcFRPeEZQUzdYN0FzU2tmZ2lNdzcvY3h6V1NESVI1OXhDejB4alM1MksxemRpeW0vTHFVWktiY2c2dTJ4QUtRbFM2cFpzTGVnOWk0bXd0YTNMK2hXQ084L0lveEhyUkc0N1UwYmhGVEVCRVdHc2gvTHZUdFdIT2J0YVNBek5vcS9XTHcwY2hRMlZzYWYybTUzeWxhNURjbEkvUFF5aVNIU3V6Rk11bmpSaGtUSzJzNE9IbEdaalVKcmUzUTdhQWY4SkZQNE1kQWVQWVVrdjl0TWdmc1dvVkVFOXVEb2tQT2I5S0l1dHA5amY0bjlOSEhZbEE2dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + } + }, { + "hashKey" : { + "S" : "Foo" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWFh3eGFWY3JrdDZLZ1JNUG81UjdwZVFsa3pvZW5ScElkZ3BkRlNyakdBYnNzWUVGQTNnaGlEeDJzK2p5c1lxbE1WVERSZFlwTDE0a1VqeDdBQUNHUXh2Z0Fvb1BIMEtnemFDV1orRE9OOEMzVGVYb0ZkbkFEL05ISHpLM1Fjd0lrK0U3WTVrTWVsdDZqcjd2NS9ZVkRGTUliYUxnWlpZMVJCOUluc0RoWUtDZ3JSYXZJVDJVb1VvdHNwNnZJWElYVS9PZ0FRN21vdFNQdHlkbTArVnNVaEFxVENvdWI5NE1lRVFkNXZDSDRrQU02dCtFd2JqZGlkUDY2d3B2NDd3NWdLck00dVhHRkU5a2FJWDdVbGFMMWZXZFJQQVBwcGJqeFFrWTB5UHQrM0Zzd2tiY2lhME5DbjI0azFiSUFQREgzTTZwTWFPdXpmSlgvcmwvcXJ0NTNCUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + } + } ] +} \ No newline at end of file From 02dbbf2b09a42bca0cc50ddb6de0f40ef97a91e4 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 21:44:04 -0700 Subject: [PATCH 56/60] m --- .../sdkv2/CipherTextGeneratorIT.java | 267 ------------------ .../datamodeling/sdkv2/HolisticIT.java | 23 +- .../datamodeling/sdkv2/HolisticITHelper.java | 40 +++ .../testing/AttributeValueSerializer.java | 5 +- 4 files changed, 64 insertions(+), 271 deletions(-) delete mode 100644 DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java deleted file mode 100644 index 39ec58dfe2..0000000000 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/CipherTextGeneratorIT.java +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package com.amazonaws.services.dynamodbv2.datamodeling.sdkv2; - -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.DynamoDBEncryptor; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.CachingMostRecentProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.DirectKmsMaterialsProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.EncryptionMaterialsProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.SymmetricStaticProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.WrappedMaterialsProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.MetaStore; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.providers.store.ProviderStore; -import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest; -import com.amazonaws.util.Base64; -import com.fasterxml.jackson.core.type.TypeReference; -import java.io.IOException; -import java.security.KeyFactory; -import java.security.KeyPair; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import javax.crypto.SecretKey; -import javax.crypto.spec.SecretKeySpec; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; -import software.amazon.awssdk.services.dynamodb.model.AttributeValue; -import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput; -import software.amazon.awssdk.services.dynamodb.model.ScanRequest; - -public class CipherTextGeneratorIT extends HolisticIT { - - @Test(enabled = false) - public void generateKmsAes128Vector() throws IOException { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - Map desc = Collections.singletonMap("amzn-ddb-env-alg", "AES/128"); - EncryptionMaterialsProvider provider = new DirectKmsMaterialsProvider( - kmsClient, keyDataMap.get("awsKmsUsWest2").keyId, desc); - - Set tables = generateStandardData(provider); - writeTablesAsTestVector("aws-kms-aes128-1.json", tables.toArray(new String[0])); - - client.close(); - localDynamoDb.stop(); - } - - @Test(enabled = false) - public void generateNonAsciiMaterialNameVector() throws IOException { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - String materialName = "テストΨ素材\uD83D\uDE00"; - String metastoreTableName = "nonascii-metatable"; - - // Create metastore table - MetaStore.createTable( - client, - metastoreTableName, - ProvisionedThroughput.builder() - .readCapacityUnits(100L) - .writeCapacityUnits(100L) - .build() - ); - - // Create KMS-backed metastore - EncryptionMaterialsProvider metaProvider = new DirectKmsMaterialsProvider( - kmsClient, keyDataMap.get("awsKmsUsWest2").keyId); - ProviderStore metastore = new MetaStore( - client, metastoreTableName, - DynamoDBEncryptor.getInstance(metaProvider)); - - // Create most_recent provider with non-ASCII material name - EncryptionMaterialsProvider provider = - new CachingMostRecentProvider(metastore, materialName, 1000); - - Set tables = generateStandardData(provider); - writeTablesAsTestVector("nonascii-material-name-1.json", tables.toArray(new String[0])); - writeTablesAsTestVector("metastore-nonascii-name-1.json", metastoreTableName); - - client.close(); - localDynamoDb.stop(); - } - - @Test(enabled = false) - public void generateStaticAesRsaVector() throws IOException { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - ScenarioManifest.KeyData aesData = keyDataMap.get("aesKey"); - ScenarioManifest.KeyData rsaPubData = keyDataMap.get("rsaSignPub"); - ScenarioManifest.KeyData rsaPrivData = keyDataMap.get("rsaSignPriv"); - SecretKey aes = new SecretKeySpec(Base64.decode(aesData.material), aesData.algorithm); - try { - KeyFactory rsaFact = KeyFactory.getInstance("RSA"); - PublicKey pub = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(rsaPubData.material))); - PrivateKey priv = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(rsaPrivData.material))); - EncryptionMaterialsProvider provider = - new SymmetricStaticProvider(aes, new KeyPair(pub, priv)); - - Set tables = generateStandardData(provider); - writeTablesAsTestVector("static-aes-rsa-1.json", tables.toArray(new String[0])); - } catch (java.security.GeneralSecurityException ex) { - throw new RuntimeException(ex); - } - - client.close(); - localDynamoDb.stop(); - } - - @Test(enabled = false) - public void generateStaticAesHmacNonBmpDescVector() throws IOException { - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - ScenarioManifest.KeyData aesData = keyDataMap.get("aesKey"); - ScenarioManifest.KeyData hmacData = keyDataMap.get("hmacKey"); - SecretKey aes = new SecretKeySpec(Base64.decode(aesData.material), aesData.algorithm); - SecretKey hmac = new SecretKeySpec(Base64.decode(hmacData.material), hmacData.algorithm); - - Map description = new HashMap<>(); - description.put("\uD834\uDD1Emusic", "\uD834\uDD22clef"); - description.put("emoji\uD83D\uDD11key", "value\uD83D\uDD12lock"); - description.put("\u03A8greek", "\u03A8value"); - - EncryptionMaterialsProvider provider = - new SymmetricStaticProvider(aes, hmac, description); - - Set tables = generateStandardData(provider); - writeTablesAsTestVector("static-aes-hmac-nonbmp-desc-1.json", tables.toArray(new String[0])); - - client.close(); - localDynamoDb.stop(); - } - - @Test(enabled = false) - public void generateWrappedAesRsaVector() throws IOException { - // wrapping/unwrapping key = aes, signing = RSA - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - ScenarioManifest.KeyData aesData = keyDataMap.get("aesKey"); - ScenarioManifest.KeyData rsaPubData = keyDataMap.get("rsaSignPub"); - ScenarioManifest.KeyData rsaPrivData = keyDataMap.get("rsaSignPriv"); - SecretKey aes = new SecretKeySpec(Base64.decode(aesData.material), aesData.algorithm); - try { - KeyFactory rsaFact = KeyFactory.getInstance("RSA"); - PublicKey pub = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(rsaPubData.material))); - PrivateKey priv = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(rsaPrivData.material))); - EncryptionMaterialsProvider provider = - new WrappedMaterialsProvider(aes, aes, new KeyPair(pub, priv)); - - Set tables = generateStandardData(provider); - writeTablesAsTestVector("wrapped-aes-rsa-1.json", tables.toArray(new String[0])); - } catch (java.security.GeneralSecurityException ex) { - throw new RuntimeException(ex); - } - - client.close(); - localDynamoDb.stop(); - } - - @Test(enabled = false) - public void generateWrappedRsaHmacVector() throws IOException { - // wrapping/unwrapping key = rsa, signing = hmac - localDynamoDb.start(); - client = localDynamoDb.createLimitedWrappedClient(); - createCiphertextTables(client); - - ScenarioManifest scenarioManifest = getManifestFromFile( - SCENARIO_MANIFEST_PATH, - new TypeReference() {} - ); - loadKeyData(scenarioManifest.keyDataPath); - - ScenarioManifest.KeyData rsaEncPubData = keyDataMap.get("rsaEncPub"); - ScenarioManifest.KeyData rsaEncPrivData = keyDataMap.get("rsaEncPriv"); - ScenarioManifest.KeyData hmacData = keyDataMap.get("hmacKey"); - SecretKey hmac = new SecretKeySpec(Base64.decode(hmacData.material), hmacData.algorithm); - try { - KeyFactory rsaFact = KeyFactory.getInstance("RSA"); - PublicKey wrappingKey = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(rsaEncPubData.material))); - PrivateKey unwrappingKey = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(rsaEncPrivData.material))); - EncryptionMaterialsProvider provider = - new WrappedMaterialsProvider(wrappingKey, unwrappingKey, hmac); - - Set tables = generateStandardData(provider); - writeTablesAsTestVector("wrapped-rsa-hmac-1.json", tables.toArray(new String[0])); - } catch (java.security.GeneralSecurityException ex) { - throw new RuntimeException(ex); - } - - client.close(); - localDynamoDb.stop(); - } - - private void writeTablesAsTestVector(String outputFile, String... tableNames) - throws IOException { - com.fasterxml.jackson.databind.module.SimpleModule module = - new com.fasterxml.jackson.databind.module.SimpleModule(); - module.addSerializer(AttributeValue.class, - new com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueSerializer()); - ObjectMapper jsonMapper = new ObjectMapper(); - jsonMapper.registerModule(module); - - Map>> testVector = new HashMap<>(); - for (String table : tableNames) { - testVector.put(table, client.scan( - ScanRequest.builder().tableName(table).build()).items()); - } - - java.nio.file.Path vectorPath = java.nio.file.Paths.get( - "src", "test", "resources", "vectors", "encrypted_item", - "ciphertext", "java", outputFile); - java.nio.file.Files.createDirectories(vectorPath.getParent()); - java.nio.file.Files.write(vectorPath, - jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsBytes(testVector)); - } -} diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 9046006a47..f5794a8f56 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -30,6 +30,7 @@ import java.io.File; import java.io.IOException; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; import java.security.KeyFactory; import java.security.KeyPair; @@ -619,7 +620,7 @@ public void decryptTestVector(Scenario scenario) for (Map item : items) { AttributeValue descAttr = item.get("*amzn-ddb-map-desc*"); if (descAttr != null && descAttr.b() != null) { - String descBlob = new String(descAttr.b().asByteArray(), java.nio.charset.StandardCharsets.ISO_8859_1); + String descBlob = new String(descAttr.b().asByteArray(), StandardCharsets.UTF_8); for (Map.Entry entry : scenario.materialDescription.entrySet()) { assertTrue( "Expected " + entry.getValue() + " in *amzn-ddb-map-desc* but not found", @@ -652,6 +653,7 @@ public void decryptTestVector(Scenario scenario) @Test(dataProvider = "getEncryptTestVectors") public void encryptWithTestVector(Scenario scenario) throws IOException { + boolean saveToJson = false; localDynamoDb.start(); client = localDynamoDb.createLimitedWrappedClient(); @@ -670,7 +672,9 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { .writeCapacityUnits(100L) .build() ); - putDataFromFile(client, scenario.metastore.path); + if (!saveToJson) { + putDataFromFile(client, scenario.metastore.path); + } EncryptionMaterialsProvider metaProvider = createProvider( scenario.metastore.providerName, scenario.materialName, @@ -694,7 +698,20 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { metastore, scenario.materialDescription ); - generateStandardData(provider); + Set tables = generateStandardData(provider); + + if (saveToJson && "v1".equals(scenario.version)) { + String outputFile = java.nio.file.Paths.get( + scenario.ciphertextPath.replace("file://", "")).getFileName().toString(); + HolisticITHelper.writeTablesAsTestVector(client, outputFile, tables.toArray(new String[0])); + if (scenario.metastore != null) { + String metastorePath = java.nio.file.Paths.get( + scenario.metastore.path.replace("file://", "")).getFileName().toString(); + HolisticITHelper.writeTablesAsTestVector( + client, metastorePath, scenario.metastore.tableName); + } + } + client.close(); localDynamoDb.stop(); } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java index 9ac539b162..c5fa30eb88 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java @@ -17,7 +17,11 @@ import java.util.List; import java.util.Map; import java.util.Set; + +import com.fasterxml.jackson.databind.ObjectMapper; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; +import software.amazon.awssdk.services.dynamodb.model.ScanRequest; public class HolisticITHelper { @@ -135,4 +139,40 @@ public static void decryptNonBmpHashKeyVectorAndWithNullKeyId( assertEquals(nonBmpKey, decrypted.get("hashKey").s()); } } + + public static void writeTablesAsTestVector(DynamoDbClient client, String outputFile, String... tableNames) + throws IOException { + com.fasterxml.jackson.databind.module.SimpleModule module = + new com.fasterxml.jackson.databind.module.SimpleModule(); + module.addSerializer( + AttributeValue.class, + new com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueSerializer() + ); + ObjectMapper jsonMapper = new ObjectMapper(); + jsonMapper.registerModule(module); + + Map>> testVector = new HashMap<>(); + for (String table : tableNames) { + testVector.put( + table, + client.scan(ScanRequest.builder().tableName(table).build()).items() + ); + } + + java.nio.file.Path vectorPath = java.nio.file.Paths.get( + "src", + "test", + "resources", + "vectors", + "encrypted_item", + "ciphertext", + "java", + outputFile + ); + java.nio.file.Files.createDirectories(vectorPath.getParent()); + java.nio.file.Files.write( + vectorPath, + jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsBytes(testVector) + ); + } } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/AttributeValueSerializer.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/AttributeValueSerializer.java index 568b36a23a..7c108422a8 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/AttributeValueSerializer.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/testing/AttributeValueSerializer.java @@ -20,7 +20,10 @@ public void serialize( if (value.s() != null) { jgen.writeStringField("S", value.s()); } else if (value.b() != null) { - jgen.writeStringField("B", Base64.encodeAsString(value.b().asByteArray())); + jgen.writeStringField( + "B", + Base64.encodeAsString(value.b().asByteArray()) + ); } else if (value.n() != null) { jgen.writeStringField("N", value.n()); } else if (value.hasSs()) { From 0ec0b24c23e9666cdfb04f6f8117078296491b02 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Mon, 16 Mar 2026 22:35:01 -0700 Subject: [PATCH 57/60] m --- .../datamodeling/TransformerHolisticIT.java | 112 ++++++++++++------ 1 file changed, 76 insertions(+), 36 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index dd2e76be8e..3b22c1790f 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -1204,79 +1204,119 @@ private EncryptionMaterialsProvider createProvider( KeyData decryptKeyData = keyDataMap.get(keys.decryptName); KeyData verifyKeyData = keyDataMap.get(keys.verifyName); SecretKey decryptKey = new SecretKeySpec( - Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + Base64.decode(decryptKeyData.material), + decryptKeyData.algorithm + ); Map desc = (materialDescription != null) - ? materialDescription : Collections.emptyMap(); + ? materialDescription + : Collections.emptyMap(); if (verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE)) { - SecretKey verifyKey = new SecretKeySpec( - Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); - return new SymmetricStaticProvider(decryptKey, verifyKey, desc); + SecretKey verifyKey = new SecretKeySpec( + Base64.decode(verifyKeyData.material), + verifyKeyData.algorithm + ); + return new SymmetricStaticProvider(decryptKey, verifyKey, desc); } else { - try { - KeyData signKeyData = keyDataMap.get(keys.signName); - KeyFactory rsaFact = KeyFactory.getInstance(RSA); - PublicKey verifyMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); - PrivateKey signingMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); - KeyPair sigPair = new KeyPair(verifyMaterial, signingMaterial); - return new SymmetricStaticProvider(decryptKey, sigPair, desc); - } catch (GeneralSecurityException ex) { - throw new RuntimeException(ex); - } + try { + KeyData signKeyData = keyDataMap.get(keys.signName); + KeyFactory rsaFact = KeyFactory.getInstance(RSA); + PublicKey verifyMaterial = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material)) + ); + PrivateKey signingMaterial = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material)) + ); + KeyPair sigPair = new KeyPair(verifyMaterial, signingMaterial); + return new SymmetricStaticProvider(decryptKey, sigPair, desc); + } catch (GeneralSecurityException ex) { + throw new RuntimeException(ex); + } } case ScenarioManifest.WRAPPED_PROVIDER_NAME: decryptKeyData = keyDataMap.get(keys.decryptName); verifyKeyData = keyDataMap.get(keys.verifyName); - boolean symDecrypt = decryptKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE); - boolean symVerify = verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE); + boolean symDecrypt = decryptKeyData.keyType.equals( + ScenarioManifest.SYMMETRIC_KEY_TYPE + ); + boolean symVerify = verifyKeyData.keyType.equals( + ScenarioManifest.SYMMETRIC_KEY_TYPE + ); try { if (symDecrypt && symVerify) { // AES wrapping + HMAC signing - decryptKey = new SecretKeySpec( - Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + decryptKey = + new SecretKeySpec( + Base64.decode(decryptKeyData.material), + decryptKeyData.algorithm + ); SecretKey verifyKey = new SecretKeySpec( - Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); - return new WrappedMaterialsProvider(decryptKey, decryptKey, verifyKey); + Base64.decode(verifyKeyData.material), + verifyKeyData.algorithm + ); + return new WrappedMaterialsProvider( + decryptKey, + decryptKey, + verifyKey + ); } else if (symDecrypt) { // AES wrapping + RSA signing - decryptKey = new SecretKeySpec( - Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + decryptKey = + new SecretKeySpec( + Base64.decode(decryptKeyData.material), + decryptKeyData.algorithm + ); KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); PublicKey verifyMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material)) + ); PrivateKey signingMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material)) + ); return new WrappedMaterialsProvider( - decryptKey, decryptKey, new KeyPair(verifyMaterial, signingMaterial)); + decryptKey, + decryptKey, + new KeyPair(verifyMaterial, signingMaterial) + ); } else if (symVerify) { // RSA wrapping + HMAC signing KeyData encryptKeyData = keyDataMap.get(keys.encryptName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); PublicKey wrappingKey = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(encryptKeyData.material))); + new X509EncodedKeySpec(Base64.decode(encryptKeyData.material)) + ); PrivateKey unwrappingKey = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material))); + new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material)) + ); SecretKey verifyKey = new SecretKeySpec( - Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); - return new WrappedMaterialsProvider(wrappingKey, unwrappingKey, verifyKey); + Base64.decode(verifyKeyData.material), + verifyKeyData.algorithm + ); + return new WrappedMaterialsProvider( + wrappingKey, + unwrappingKey, + verifyKey + ); } else { // RSA wrapping + RSA signing KeyData encryptKeyData = keyDataMap.get(keys.encryptName); KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); PublicKey encryptMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(encryptKeyData.material))); + new X509EncodedKeySpec(Base64.decode(encryptKeyData.material)) + ); PrivateKey decryptMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material))); + new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material)) + ); KeyPair decryptPair = new KeyPair(encryptMaterial, decryptMaterial); PublicKey verifyMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material)) + ); PrivateKey signingMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material)) + ); KeyPair sigPair = new KeyPair(verifyMaterial, signingMaterial); return new AsymmetricStaticProvider(decryptPair, sigPair); } From 6161d5c1b198c2b3cbf8544e6aef56faa4f125a8 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Tue, 17 Mar 2026 09:56:10 -0700 Subject: [PATCH 58/60] formatting --- .../datamodeling/sdkv2/HolisticIT.java | 194 +++++++++++++----- .../datamodeling/sdkv2/HolisticITHelper.java | 40 ++-- 2 files changed, 162 insertions(+), 72 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index f5794a8f56..76180faae6 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -620,10 +620,18 @@ public void decryptTestVector(Scenario scenario) for (Map item : items) { AttributeValue descAttr = item.get("*amzn-ddb-map-desc*"); if (descAttr != null && descAttr.b() != null) { - String descBlob = new String(descAttr.b().asByteArray(), StandardCharsets.UTF_8); - for (Map.Entry entry : scenario.materialDescription.entrySet()) { + String descBlob = new String( + descAttr.b().asByteArray(), + StandardCharsets.UTF_8 + ); + for (Map.Entry< + String, + String + > entry : scenario.materialDescription.entrySet()) { assertTrue( - "Expected " + entry.getValue() + " in *amzn-ddb-map-desc* but not found", + "Expected " + + entry.getValue() + + " in *amzn-ddb-map-desc* but not found", descBlob.contains(entry.getValue()) ); } @@ -701,14 +709,25 @@ public void encryptWithTestVector(Scenario scenario) throws IOException { Set tables = generateStandardData(provider); if (saveToJson && "v1".equals(scenario.version)) { - String outputFile = java.nio.file.Paths.get( - scenario.ciphertextPath.replace("file://", "")).getFileName().toString(); - HolisticITHelper.writeTablesAsTestVector(client, outputFile, tables.toArray(new String[0])); + String outputFile = java.nio.file.Paths + .get(scenario.ciphertextPath.replace("file://", "")) + .getFileName() + .toString(); + HolisticITHelper.writeTablesAsTestVector( + client, + outputFile, + tables.toArray(new String[0]) + ); if (scenario.metastore != null) { - String metastorePath = java.nio.file.Paths.get( - scenario.metastore.path.replace("file://", "")).getFileName().toString(); + String metastorePath = java.nio.file.Paths + .get(scenario.metastore.path.replace("file://", "")) + .getFileName() + .toString(); HolisticITHelper.writeTablesAsTestVector( - client, metastorePath, scenario.metastore.tableName); + client, + metastorePath, + scenario.metastore.tableName + ); } } @@ -730,79 +749,119 @@ private EncryptionMaterialsProvider createProvider( KeyData decryptKeyData = keyDataMap.get(keys.decryptName); KeyData verifyKeyData = keyDataMap.get(keys.verifyName); SecretKey decryptKey = new SecretKeySpec( - Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + Base64.decode(decryptKeyData.material), + decryptKeyData.algorithm + ); Map desc = (materialDescription != null) - ? materialDescription : Collections.emptyMap(); + ? materialDescription + : Collections.emptyMap(); if (verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE)) { - SecretKey verifyKey = new SecretKeySpec( - Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); - return new SymmetricStaticProvider(decryptKey, verifyKey, desc); + SecretKey verifyKey = new SecretKeySpec( + Base64.decode(verifyKeyData.material), + verifyKeyData.algorithm + ); + return new SymmetricStaticProvider(decryptKey, verifyKey, desc); } else { - try { - KeyData signKeyData = keyDataMap.get(keys.signName); - KeyFactory rsaFact = KeyFactory.getInstance(RSA); - PublicKey verifyMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); - PrivateKey signingMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); - KeyPair sigPair = new KeyPair(verifyMaterial, signingMaterial); - return new SymmetricStaticProvider(decryptKey, sigPair, desc); - } catch (GeneralSecurityException ex) { - throw new RuntimeException(ex); - } + try { + KeyData signKeyData = keyDataMap.get(keys.signName); + KeyFactory rsaFact = KeyFactory.getInstance(RSA); + PublicKey verifyMaterial = rsaFact.generatePublic( + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material)) + ); + PrivateKey signingMaterial = rsaFact.generatePrivate( + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material)) + ); + KeyPair sigPair = new KeyPair(verifyMaterial, signingMaterial); + return new SymmetricStaticProvider(decryptKey, sigPair, desc); + } catch (GeneralSecurityException ex) { + throw new RuntimeException(ex); + } } case ScenarioManifest.WRAPPED_PROVIDER_NAME: decryptKeyData = keyDataMap.get(keys.decryptName); verifyKeyData = keyDataMap.get(keys.verifyName); - boolean symDecrypt = decryptKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE); - boolean symVerify = verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE); + boolean symDecrypt = decryptKeyData.keyType.equals( + ScenarioManifest.SYMMETRIC_KEY_TYPE + ); + boolean symVerify = verifyKeyData.keyType.equals( + ScenarioManifest.SYMMETRIC_KEY_TYPE + ); try { if (symDecrypt && symVerify) { // AES wrapping + HMAC signing - decryptKey = new SecretKeySpec( - Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + decryptKey = + new SecretKeySpec( + Base64.decode(decryptKeyData.material), + decryptKeyData.algorithm + ); SecretKey verifyKey = new SecretKeySpec( - Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); - return new WrappedMaterialsProvider(decryptKey, decryptKey, verifyKey); + Base64.decode(verifyKeyData.material), + verifyKeyData.algorithm + ); + return new WrappedMaterialsProvider( + decryptKey, + decryptKey, + verifyKey + ); } else if (symDecrypt) { // AES wrapping + RSA signing - decryptKey = new SecretKeySpec( - Base64.decode(decryptKeyData.material), decryptKeyData.algorithm); + decryptKey = + new SecretKeySpec( + Base64.decode(decryptKeyData.material), + decryptKeyData.algorithm + ); KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); PublicKey verifyMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material)) + ); PrivateKey signingMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material)) + ); return new WrappedMaterialsProvider( - decryptKey, decryptKey, new KeyPair(verifyMaterial, signingMaterial)); + decryptKey, + decryptKey, + new KeyPair(verifyMaterial, signingMaterial) + ); } else if (symVerify) { // RSA wrapping + HMAC signing KeyData encryptKeyData = keyDataMap.get(keys.encryptName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); PublicKey wrappingKey = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(encryptKeyData.material))); + new X509EncodedKeySpec(Base64.decode(encryptKeyData.material)) + ); PrivateKey unwrappingKey = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material))); + new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material)) + ); SecretKey verifyKey = new SecretKeySpec( - Base64.decode(verifyKeyData.material), verifyKeyData.algorithm); - return new WrappedMaterialsProvider(wrappingKey, unwrappingKey, verifyKey); + Base64.decode(verifyKeyData.material), + verifyKeyData.algorithm + ); + return new WrappedMaterialsProvider( + wrappingKey, + unwrappingKey, + verifyKey + ); } else { // RSA wrapping + RSA signing KeyData encryptKeyData = keyDataMap.get(keys.encryptName); KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); PublicKey encryptMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(encryptKeyData.material))); + new X509EncodedKeySpec(Base64.decode(encryptKeyData.material)) + ); PrivateKey decryptMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material))); + new PKCS8EncodedKeySpec(Base64.decode(decryptKeyData.material)) + ); KeyPair decryptPair = new KeyPair(encryptMaterial, decryptMaterial); PublicKey verifyMaterial = rsaFact.generatePublic( - new X509EncodedKeySpec(Base64.decode(verifyKeyData.material))); + new X509EncodedKeySpec(Base64.decode(verifyKeyData.material)) + ); PrivateKey signingMaterial = rsaFact.generatePrivate( - new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material))); + new PKCS8EncodedKeySpec(Base64.decode(signKeyData.material)) + ); KeyPair sigPair = new KeyPair(verifyMaterial, signingMaterial); return new AsymmetricStaticProvider(decryptPair, sigPair); } @@ -1096,25 +1155,54 @@ public Set generateStandardData(EncryptionMaterialsProvider prov) { putItems(UNTOUCHED_TEST_VALUE_2, tableName); // HashKeyOnly items - EncryptionContext hashOnlyCtx = EncryptionContext.builder() - .tableName("HashKeyOnly").hashKeyName("hashKey").build(); + EncryptionContext hashOnlyCtx = EncryptionContext + .builder() + .tableName("HashKeyOnly") + .hashKeyName("hashKey") + .build(); Map> hashOnlyActions = new HashMap<>(); hashOnlyActions.put("hashKey", signOnly); - for (Map hk : new Map[]{hashKey1, hashKey2, hashKey3}) { + for (Map hk : new Map[] { + hashKey1, + hashKey2, + hashKey3, + }) { tables.add("HashKeyOnly"); - putItems(encryptor.encryptRecord(hk, hashOnlyActions, hashOnlyCtx), "HashKeyOnly"); + putItems( + encryptor.encryptRecord(hk, hashOnlyActions, hashOnlyCtx), + "HashKeyOnly" + ); } // KeysOnly items Map> keysOnlyActions = new HashMap<>(); keysOnlyActions.put("hashKey", signOnly); keysOnlyActions.put("rangeKey", signOnly); - int[][] keysOnlyPairs = {{0,1},{0,2},{0,3},{1,1},{1,2},{1,3},{5,1},{6,2},{7,3}}; + int[][] keysOnlyPairs = { + { 0, 1 }, + { 0, 2 }, + { 0, 3 }, + { 1, 1 }, + { 1, 2 }, + { 1, 3 }, + { 5, 1 }, + { 6, 2 }, + { 7, 3 }, + }; for (int[] pair : keysOnlyPairs) { Map item = new HashMap<>(); - item.put("hashKey", AttributeValue.builder().n(String.valueOf(pair[0])).build()); - item.put("rangeKey", AttributeValue.builder().n(String.valueOf(pair[1])).build()); - putItems(encryptor.encryptRecord(item, keysOnlyActions, encryptionContext), tableName); + item.put( + "hashKey", + AttributeValue.builder().n(String.valueOf(pair[0])).build() + ); + item.put( + "rangeKey", + AttributeValue.builder().n(String.valueOf(pair[1])).build() + ); + putItems( + encryptor.encryptRecord(item, keysOnlyActions, encryptionContext), + tableName + ); } return tables; } diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java index c5fa30eb88..c102decda0 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticITHelper.java @@ -11,14 +11,13 @@ import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.DdbRecordMatcher; import com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.ScenarioManifest; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; - -import com.fasterxml.jackson.databind.ObjectMapper; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.ScanRequest; @@ -140,13 +139,16 @@ public static void decryptNonBmpHashKeyVectorAndWithNullKeyId( } } - public static void writeTablesAsTestVector(DynamoDbClient client, String outputFile, String... tableNames) - throws IOException { + public static void writeTablesAsTestVector( + DynamoDbClient client, + String outputFile, + String... tableNames + ) throws IOException { com.fasterxml.jackson.databind.module.SimpleModule module = - new com.fasterxml.jackson.databind.module.SimpleModule(); + new com.fasterxml.jackson.databind.module.SimpleModule(); module.addSerializer( - AttributeValue.class, - new com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueSerializer() + AttributeValue.class, + new com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.testing.AttributeValueSerializer() ); ObjectMapper jsonMapper = new ObjectMapper(); jsonMapper.registerModule(module); @@ -154,25 +156,25 @@ public static void writeTablesAsTestVector(DynamoDbClient client, String outputF Map>> testVector = new HashMap<>(); for (String table : tableNames) { testVector.put( - table, - client.scan(ScanRequest.builder().tableName(table).build()).items() + table, + client.scan(ScanRequest.builder().tableName(table).build()).items() ); } java.nio.file.Path vectorPath = java.nio.file.Paths.get( - "src", - "test", - "resources", - "vectors", - "encrypted_item", - "ciphertext", - "java", - outputFile + "src", + "test", + "resources", + "vectors", + "encrypted_item", + "ciphertext", + "java", + outputFile ); java.nio.file.Files.createDirectories(vectorPath.getParent()); java.nio.file.Files.write( - vectorPath, - jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsBytes(testVector) + vectorPath, + jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsBytes(testVector) ); } } From 04418dca635cedede6f69b4c6c7b4ceb9e9099d1 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Tue, 17 Mar 2026 11:55:53 -0700 Subject: [PATCH 59/60] m --- .../dynamodbv2/datamodeling/TransformerHolisticIT.java | 9 +++++---- .../dynamodbv2/datamodeling/sdkv2/HolisticIT.java | 10 ++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java index 3b22c1790f..891054fcde 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -1212,12 +1212,14 @@ private EncryptionMaterialsProvider createProvider( : Collections.emptyMap(); if (verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE)) { + // Symmetric encryption key + Symmetric verify key SecretKey verifyKey = new SecretKeySpec( Base64.decode(verifyKeyData.material), verifyKeyData.algorithm ); return new SymmetricStaticProvider(decryptKey, verifyKey, desc); } else { + // Symmetric encryption key + Asymmetric verify key try { KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); @@ -1245,7 +1247,6 @@ private EncryptionMaterialsProvider createProvider( try { if (symDecrypt && symVerify) { - // AES wrapping + HMAC signing decryptKey = new SecretKeySpec( Base64.decode(decryptKeyData.material), @@ -1261,7 +1262,7 @@ private EncryptionMaterialsProvider createProvider( verifyKey ); } else if (symDecrypt) { - // AES wrapping + RSA signing + // Symmetric wrapping + Asymmetric signing decryptKey = new SecretKeySpec( Base64.decode(decryptKeyData.material), @@ -1281,7 +1282,7 @@ private EncryptionMaterialsProvider createProvider( new KeyPair(verifyMaterial, signingMaterial) ); } else if (symVerify) { - // RSA wrapping + HMAC signing + // Asymmetric wrapping + Symmetric signing KeyData encryptKeyData = keyDataMap.get(keys.encryptName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); PublicKey wrappingKey = rsaFact.generatePublic( @@ -1300,7 +1301,7 @@ private EncryptionMaterialsProvider createProvider( verifyKey ); } else { - // RSA wrapping + RSA signing + // Asymmetric wrapping + Asymmetric signing KeyData encryptKeyData = keyDataMap.get(keys.encryptName); KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); diff --git a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java index 76180faae6..8df710b550 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java +++ b/DynamoDbEncryption/runtimes/java/src/test/sdkv2/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/HolisticIT.java @@ -757,12 +757,14 @@ private EncryptionMaterialsProvider createProvider( : Collections.emptyMap(); if (verifyKeyData.keyType.equals(ScenarioManifest.SYMMETRIC_KEY_TYPE)) { + // Symmetric encryption key + Symmetric verify key SecretKey verifyKey = new SecretKeySpec( Base64.decode(verifyKeyData.material), verifyKeyData.algorithm ); return new SymmetricStaticProvider(decryptKey, verifyKey, desc); } else { + // Symmetric encryption key + Asymmetric verify key try { KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); @@ -790,7 +792,7 @@ private EncryptionMaterialsProvider createProvider( try { if (symDecrypt && symVerify) { - // AES wrapping + HMAC signing + // Symmetric wrapping + Symmetric signing decryptKey = new SecretKeySpec( Base64.decode(decryptKeyData.material), @@ -806,7 +808,7 @@ private EncryptionMaterialsProvider createProvider( verifyKey ); } else if (symDecrypt) { - // AES wrapping + RSA signing + // Symmetric wrapping + Asymmetric signing decryptKey = new SecretKeySpec( Base64.decode(decryptKeyData.material), @@ -826,7 +828,7 @@ private EncryptionMaterialsProvider createProvider( new KeyPair(verifyMaterial, signingMaterial) ); } else if (symVerify) { - // RSA wrapping + HMAC signing + // Asymmetric wrapping + Symmetric signing KeyData encryptKeyData = keyDataMap.get(keys.encryptName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); PublicKey wrappingKey = rsaFact.generatePublic( @@ -845,7 +847,7 @@ private EncryptionMaterialsProvider createProvider( verifyKey ); } else { - // RSA wrapping + RSA signing + // Asymmetric wrapping + Asymmetric signing KeyData encryptKeyData = keyDataMap.get(keys.encryptName); KeyData signKeyData = keyDataMap.get(keys.signName); KeyFactory rsaFact = KeyFactory.getInstance(RSA); From 34b976a731fbfc583c52ee1d4a6acb68936e7f10 Mon Sep 17 00:00:00 2001 From: rishav-karanjit Date: Tue, 17 Mar 2026 12:00:46 -0700 Subject: [PATCH 60/60] formatting --- .../ciphertext/java/aws-kms-aes128-1.json | 598 +++++++++--------- .../java/metastore-nonascii-name-1.json | 60 +- .../java/nonascii-material-name-1.json | 598 +++++++++--------- .../java/static-aes-hmac-nonbmp-desc-1.json | 598 +++++++++--------- .../ciphertext/java/static-aes-rsa-1.json | 598 +++++++++--------- .../ciphertext/java/wrapped-aes-rsa-1.json | 598 +++++++++--------- .../ciphertext/java/wrapped-rsa-hmac-1.json | 598 +++++++++--------- 7 files changed, 1879 insertions(+), 1769 deletions(-) diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json index c52c6181cc..cba25646d5 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-aes128-1.json @@ -1,293 +1,311 @@ { - "TableName" : [ { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURJSi9mY0M1SWJuanpOWWIwQUlCRUlBN0plYjdkL2VzcDlUeXpNTm02c290K3hvZlVwOS9KdjZTeGhmME0vcnFDSnhIdFVrOEVKeEVhanVFZEdqZzdqWlB2VHF4aGlIV0FQS0syU0U9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "qGocewScUQ1c8aq3C/vzn5ny8ticJsDzS032sYqWMFg=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURITy9OQlBzcVg4c1ExdWFCd0lCRUlBN3hEeVRQZHRBQkV0cTRsNlRCWURtaWIrVlZpNWFhSEJUTjFwZkpjSkhiRUFUbkRIRVFleHVCbFdFWGF2Z21YeTB5N0VKb09JRjFkUmw1dmM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "NHoCI+Fptt1+EbeLvlFfwgeJ//6cwEThIwd5lnfSUHQ=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKZ2tlcExOL1NEUjk1VTU4QUlCRUlBN01MV1NFRHJWc1NodXJVeGdiSXh2a0JnbEYwQzFaQUJMNWJJM3VQTjhaT0NrODFFRDdMQ2lmSysxRktPaFhCMjdWa0xXUmtmQ3hwNFI5SHM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "n3p9vPZFUXYtrROqMcSN7DbA43o4/d/i+GvjC3QRijk=" + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURJSi9mY0M1SWJuanpOWWIwQUlCRUlBN0plYjdkL2VzcDlUeXpNTm02c290K3hvZlVwOS9KdjZTeGhmME0vcnFDSnhIdFVrOEVKeEVhanVFZEdqZzdqWlB2VHF4aGlIV0FQS0syU0U9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "qGocewScUQ1c8aq3C/vzn5ny8ticJsDzS032sYqWMFg=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURITy9OQlBzcVg4c1ExdWFCd0lCRUlBN3hEeVRQZHRBQkV0cTRsNlRCWURtaWIrVlZpNWFhSEJUTjFwZkpjSkhiRUFUbkRIRVFleHVCbFdFWGF2Z21YeTB5N0VKb09JRjFkUmw1dmM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "NHoCI+Fptt1+EbeLvlFfwgeJ//6cwEThIwd5lnfSUHQ=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKZ2tlcExOL1NEUjk1VTU4QUlCRUlBN01MV1NFRHJWc1NodXJVeGdiSXh2a0JnbEYwQzFaQUJMNWJJM3VQTjhaT0NrODFFRDdMQ2lmSysxRktPaFhCMjdWa0xXUmtmQ3hwNFI5SHM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "n3p9vPZFUXYtrROqMcSN7DbA43o4/d/i+GvjC3QRijk=" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURBRTVXanBkNUxSNlVtQldCUUlCRUlBNzI1NnB5ZHhyeFRoVFZhTFlvaVpJd000eVZjdTF2M0g1MTV0cHdYVjc1RkhXMEdJRFBCaDFFV0pVbktzSno3ZWhOK29paDQrR0hUTTd0aEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "b33u94fPe98fWv/8yxljlAX50oZHzYAdSkgR47fyuEk=" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "ulvmiUjfdoADRULkSCt0TMJR41SeJ3tGhB0eo9klbkimDpH+kLvSFssShNNiw58D" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURHYzM3OXduNThwSFJNdngzUUlCRUlBN1hsOGxsY2JtcCsveDQ1UTJxbXJIWUVOa09hSnhiNTdMV3p5eUJQd3F5dFVPUkxEdEFoMTlwVTRZSXAwekkxcjFZak9WY2FrMFpCejhnTzA9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "B": "mWj/x2i5ZVnF85M+0DlMuA8auGMTpxRneHTT4nC4INLQKb9g4wjrh/fBxP3+ThRMd+cVPZkzIfzX5StxSQ5SDQ==" + }, + "doubleSet": { + "B": "e7pTh2Vvf64nSyfaM1Tl42gqZ1ikadrZWSQx4h5Zukk1EketDPQ7nKwDdttO6H/67NLodz3KwyUC4knfsdxJhg==" + }, + "byteArrayValue": { + "B": "8wRbF6KLOdOaBfOLlzEaX78McJs0XCUcmE1T9gyDmik=" + }, + "intValue": { + "B": "Zjtk/o2pOnTFE8pWQx2oi6q3ZS/+kuq4cQUV+uSJbng=" + }, + "stringSet": { + "B": "tRT+oPWeTbD21GsKGKbMLi2NQA3HFPuTHCwbk+640+uPx4jolsrPAe9XxIClIvL9QUzJElVfcOHMrYmHMixAnw==" + }, + "doubleValue": { + "B": "3t0FHOiVXalm/MeTcqgtQVFbbtcHOd5zT4e+kid1GHE=" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "AOq0OZXtbC2AR0EKzuPuD85LV79rN82ilhNn9JZreVY=" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQOGkrVGtJS2luaU1mVGN0UUlCRUlBNzNsUWVHVTM0ZERxSXBTbW45ZWliR0t6M3oxMVZPTWkvTFRMWXR4YlZGRlllS0Y4Mk5ZSUN3NGZKN0tlaG1tTWFnYWtHQW9xalJrYjhUZnc9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "GqTn5MsMdwzJhu5fvFXFTU+r254fIwM6ExTZ+ztCWIk=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURDNWtLak9BcTVNVit5NU9QQUlCRUlBN0ovdUduR2puNjZ2bWNZQWkzM3JXRVgvL3pGVnI4MVlJYTVRMTJrNEN6MldOMTUraERETHlheDRaUGo5R2ZNSWN2VDIrQXZzQWlWcEh5WnM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "vUHDVrOUX1uUzpGQh9Hh/RKdo4f/9mlJque0ASKUmWU=" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFSmxkYm5KZDdqVHlnd3ZYd0lCRUlBNzl2cEpiVFh6YThWbVpMdnRpZHQxbjVQYmV3MFdZa2NaSHpObkdzbm9uMDg5bWlydEpJSkVFWjRkVzg0UFR4ZHg2d0pTRlB0Ui9iQmMxSkE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "yUILbNFQqe62ny1BxHji2E4EVr72JxIQl8vqA5xTudI=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKNWx1c2ZhckhqK3dFR1E3QUlCRUlBNzhqNUpad01FQndtUWlrbjBGQWdFZEhLRTUrVm5EY2U4cmk5VjRQSmgwUU5OT3pOT2FRUE8wWm11Y0t2TWhJd2V5QWp1d3N4TnI3YUdKcWs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "vE2UBbTXt8CEA9ldbV+SxkaJInmuM4F+0iagwL3jlfQ=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURETkxaUy8vVXJUVDFjQVZUUUlCRUlBN2liWXZFTDJ4b3dvNlppQy9KRDVJeUkzUzNDQ1pkSkVXejREUW8ySVpYZEdMVG5iQTlLNlIvM21pUFBXVGJpeHRaL2tRMzErSHpmQ3JzQkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "8jebfjADsrOFu2bWru8RPkxuagYBe6pNhCffKmGBBa4=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIK1BjOSsvT254N28wQjFSUUlCRUlBN2lxMmpEMjhsOXYvTHROTXNtMmpKMFU4T0JHRWd0MHo3UGJSZm9SNTFDY2ZlN2RSYmhVUVJHQmd2SjZPejJ1Zk82YUlTeEZDeStXSEFsYWs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "EdDDCOj5LtUz41YfujnxAFBAEVrDMxNOOgC//5g+Ga0=" + } + }, + { + "rangeKey": { + "N": "8" + }, + "hashKey": { + "N": "6" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUROTkNxR2JhNDNGL09ZcUJ4QUlCRUlBN1V3Mkxyd0VSdVVCZ0txUkJDSG9GbTFKNythS2twNnNZdysya1F2YktjcHhCSkhTaUQ5c2UrTkFORDJ4NmUxL3FZZHdoMmluTUp4N1dHVlE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "B": "G9pyhYAvW+lcI045VGJzLjNok83QYmo25EhzxLu+pmPFu1TOzYYGq0L9UbZhptH0lkIUA3JDEos7hojNhrXH7Q==" + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "pfV5LK+VlC8exIfWuz6gYpHzOOco5DkHlEubLTG6ryU=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "6c6Vs3V4v1d0VcKwH4mZ1X23X4yBmzRkDSa9njnpGsiUCikKOf9roouTmOSFTDTBnJg5+ONeQ+eUP0he71s4VA==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "snEytpzx8XslpZ2twaYuJ90aO10GGm/QHpT31XISj68=" + } } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "5" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURBRTVXanBkNUxSNlVtQldCUUlCRUlBNzI1NnB5ZHhyeFRoVFZhTFlvaVpJd000eVZjdTF2M0g1MTV0cHdYVjc1RkhXMEdJRFBCaDFFV0pVbktzSno3ZWhOK29paDQrR0hUTTd0aEE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "b33u94fPe98fWv/8yxljlAX50oZHzYAdSkgR47fyuEk=" - } - }, { - "rangeKey" : { - "N" : "7" - }, - "hashKey" : { - "N" : "5" - }, - "stringValue" : { - "B" : "ulvmiUjfdoADRULkSCt0TMJR41SeJ3tGhB0eo9klbkimDpH+kLvSFssShNNiw58D" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURHYzM3OXduNThwSFJNdngzUUlCRUlBN1hsOGxsY2JtcCsveDQ1UTJxbXJIWUVOa09hSnhiNTdMV3p5eUJQd3F5dFVPUkxEdEFoMTlwVTRZSXAwekkxcjFZak9WY2FrMFpCejhnTzA9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet" : { - "B" : "mWj/x2i5ZVnF85M+0DlMuA8auGMTpxRneHTT4nC4INLQKb9g4wjrh/fBxP3+ThRMd+cVPZkzIfzX5StxSQ5SDQ==" - }, - "doubleSet" : { - "B" : "e7pTh2Vvf64nSyfaM1Tl42gqZ1ikadrZWSQx4h5Zukk1EketDPQ7nKwDdttO6H/67NLodz3KwyUC4knfsdxJhg==" - }, - "byteArrayValue" : { - "B" : "8wRbF6KLOdOaBfOLlzEaX78McJs0XCUcmE1T9gyDmik=" - }, - "intValue" : { - "B" : "Zjtk/o2pOnTFE8pWQx2oi6q3ZS/+kuq4cQUV+uSJbng=" - }, - "stringSet" : { - "B" : "tRT+oPWeTbD21GsKGKbMLi2NQA3HFPuTHCwbk+640+uPx4jolsrPAe9XxIClIvL9QUzJElVfcOHMrYmHMixAnw==" - }, - "doubleValue" : { - "B" : "3t0FHOiVXalm/MeTcqgtQVFbbtcHOd5zT4e+kid1GHE=" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "AOq0OZXtbC2AR0EKzuPuD85LV79rN82ilhNn9JZreVY=" - } - }, { - "rangeKey" : { - "N" : "10" - }, - "hashKey" : { - "N" : "8" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURQOGkrVGtJS2luaU1mVGN0UUlCRUlBNzNsUWVHVTM0ZERxSXBTbW45ZWliR0t6M3oxMVZPTWkvTFRMWXR4YlZGRlllS0Y4Mk5ZSUN3NGZKN0tlaG1tTWFnYWtHQW9xalJrYjhUZnc9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "GqTn5MsMdwzJhu5fvFXFTU+r254fIwM6ExTZ+ztCWIk=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "7" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURDNWtLak9BcTVNVit5NU9QQUlCRUlBN0ovdUduR2puNjZ2bWNZQWkzM3JXRVgvL3pGVnI4MVlJYTVRMTJrNEN6MldOMTUraERETHlheDRaUGo5R2ZNSWN2VDIrQXZzQWlWcEh5WnM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "vUHDVrOUX1uUzpGQh9Hh/RKdo4f/9mlJque0ASKUmWU=" - } - }, { - "rangeKey" : { - "N" : "9" - }, - "hashKey" : { - "N" : "7" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFSmxkYm5KZDdqVHlnd3ZYd0lCRUlBNzl2cEpiVFh6YThWbVpMdnRpZHQxbjVQYmV3MFdZa2NaSHpObkdzbm9uMDg5bWlydEpJSkVFWjRkVzg0UFR4ZHg2d0pTRlB0Ui9iQmMxSkE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "yUILbNFQqe62ny1BxHji2E4EVr72JxIQl8vqA5xTudI=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKNWx1c2ZhckhqK3dFR1E3QUlCRUlBNzhqNUpad01FQndtUWlrbjBGQWdFZEhLRTUrVm5EY2U4cmk5VjRQSmgwUU5OT3pOT2FRUE8wWm11Y0t2TWhJd2V5QWp1d3N4TnI3YUdKcWs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "vE2UBbTXt8CEA9ldbV+SxkaJInmuM4F+0iagwL3jlfQ=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURETkxaUy8vVXJUVDFjQVZUUUlCRUlBN2liWXZFTDJ4b3dvNlppQy9KRDVJeUkzUzNDQ1pkSkVXejREUW8ySVpYZEdMVG5iQTlLNlIvM21pUFBXVGJpeHRaL2tRMzErSHpmQ3JzQkk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "8jebfjADsrOFu2bWru8RPkxuagYBe6pNhCffKmGBBa4=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "6" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIK1BjOSsvT254N28wQjFSUUlCRUlBN2lxMmpEMjhsOXYvTHROTXNtMmpKMFU4T0JHRWd0MHo3UGJSZm9SNTFDY2ZlN2RSYmhVUVJHQmd2SjZPejJ1Zk82YUlTeEZDeStXSEFsYWs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "EdDDCOj5LtUz41YfujnxAFBAEVrDMxNOOgC//5g+Ga0=" - } - }, { - "rangeKey" : { - "N" : "8" - }, - "hashKey" : { - "N" : "6" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUROTkNxR2JhNDNGL09ZcUJ4QUlCRUlBN1V3Mkxyd0VSdVVCZ0txUkJDSG9GbTFKNythS2twNnNZdysya1F2YktjcHhCSkhTaUQ5c2UrTkFORDJ4NmUxL3FZZHdoMmluTUp4N1dHVlE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet" : { - "B" : "G9pyhYAvW+lcI045VGJzLjNok83QYmo25EhzxLu+pmPFu1TOzYYGq0L9UbZhptH0lkIUA3JDEos7hojNhrXH7Q==" - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "pfV5LK+VlC8exIfWuz6gYpHzOOco5DkHlEubLTG6ryU=" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "B" : "6c6Vs3V4v1d0VcKwH4mZ1X23X4yBmzRkDSa9njnpGsiUCikKOf9roouTmOSFTDTBnJg5+ONeQ+eUP0he71s4VA==" - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "snEytpzx8XslpZ2twaYuJ90aO10GGm/QHpT31XISj68=" - } - } ], - "HashKeyOnly" : [ { - "hashKey" : { - "S" : "Bar" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURBY3FjeXN3bzVpRXJ0bDZLQUlCRUlBN095WTFMUEcwWlord0hKeEJBREI5R3k0R015bDBXSHVSVjlGQ2I1aXd3M2psVXZnMG8ydDJ0ZTNwWUw4d0xpRm5icFBQMDc0MmE4ejNzc3c9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "UtWxrrB03cfrQVcEX5vCaKPzYq8U+KGLaFyXJO358EM=" - } - }, { - "hashKey" : { - "S" : "Baz" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFcXpkVWhRUmxNMmRPVkxUUUlCRUlBN0VwdXRQZ0h3T0xHMW1qSmEyRjl1M095QVdBd2JidnhGTzJ1THdETVJGR2NSbUd1MThlcUg3RUxycWFCSm5jODdtS2RDU05PNkVLSTJUSzQ9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "oMgtd70jhH3e42b43WZsHcQ8dh2WFLHTa7LSbPfRkx8=" - } - }, { - "hashKey" : { - "S" : "Foo" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREM3NJVDhuVVJtUnVaQWJkZ0lCRUlBN1VGN3RkVW9tRHBUUlJjcXBobEVMNFJZV2F6MHMyMVRDNnlHZmQ0Zy85STdZcVpHVkZLL3owbGJTT1djTHFlaTNySFUxR2gwYkxFMHJDRTg9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "vv4kUq+PG3AdqUeLeiFuoywRAyOdlcufZavixrqkePI=" + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURBY3FjeXN3bzVpRXJ0bDZLQUlCRUlBN095WTFMUEcwWlord0hKeEJBREI5R3k0R015bDBXSHVSVjlGQ2I1aXd3M2psVXZnMG8ydDJ0ZTNwWUw4d0xpRm5icFBQMDc0MmE4ejNzc3c9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "UtWxrrB03cfrQVcEX5vCaKPzYq8U+KGLaFyXJO358EM=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFcXpkVWhRUmxNMmRPVkxUUUlCRUlBN0VwdXRQZ0h3T0xHMW1qSmEyRjl1M095QVdBd2JidnhGTzJ1THdETVJGR2NSbUd1MThlcUg3RUxycWFCSm5jODdtS2RDU05PNkVLSTJUSzQ9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "oMgtd70jhH3e42b43WZsHcQ8dh2WFLHTa7LSbPfRkx8=" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREM3NJVDhuVVJtUnVaQWJkZ0lCRUlBN1VGN3RkVW9tRHBUUlJjcXBobEVMNFJZV2F6MHMyMVRDNnlHZmQ0Zy85STdZcVpHVkZLL3owbGJTT1djTHFlaTNySFUxR2gwYkxFMHJDRTg9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMTI4AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "vv4kUq+PG3AdqUeLeiFuoywRAyOdlcufZavixrqkePI=" + } } - } ] -} \ No newline at end of file + ] +} diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-nonascii-name-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-nonascii-name-1.json index c53e8f73da..491a10b984 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-nonascii-name-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-nonascii-name-1.json @@ -1,31 +1,33 @@ { - "nonascii-metatable" : [ { - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURGMVo0eVNOSFpjbXo0Ky9vZ0lCRUlBN3hwL1J4K2Z4OE4yRzBiZFppM3dvWHpiejJ5ZXJIWk80TmlqWVBhWHZENzcxbmY3Q1cxRm1YUzY5Um1GRjBjRXlVTkNmVHk4anZJa0JlWVE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "t" : { - "B" : "Aytthuzqg8+ovuhyjSrnJPdCrSCzr0hGq+P25QjM5Lk=" - }, - "V" : { - "N" : "0" - }, - "encAlg" : { - "B" : "EU2NEt5cohFAUdVGVUzAKB7ywZJ7fukGfX5LwvZ5d38=" - }, - "enc" : { - "B" : "Ctyt15L9T3dtnDZgwxMwaLVsPUqLajsm2on+NFyPE+K20EbThFVZlfL8tBeKg95zhfpV3SMk6Tr3H3V72ttCLg==" - }, - "intAlg" : { - "B" : "slaBhG/rQuJGdfN1xk1l010iAu8o0FNRYSeZonAzMRSkxDGR2ZPoxwx4KhTtfLaV" - }, - "N" : { - "S" : "テストΨ素材\uD83D\uDE00" - }, - "int" : { - "B" : "1SFTmZuykcMQo0iPoJy14xNhRqPlSSmPFx9YAuDCv+JrW+/FfUAZiZxei1Du5MOLTPBXv6a1bAK9v4LWc3N2EQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "LHsI6noUN3eS6FK03l8Cd/IfXZgCa2xIKmmXHaZijZ4=" + "nonascii-metatable": [ + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURGMVo0eVNOSFpjbXo0Ky9vZ0lCRUlBN3hwL1J4K2Z4OE4yRzBiZFppM3dvWHpiejJ5ZXJIWk80TmlqWVBhWHZENzcxbmY3Q1cxRm1YUzY5Um1GRjBjRXlVTkNmVHk4anZJa0JlWVE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "t": { + "B": "Aytthuzqg8+ovuhyjSrnJPdCrSCzr0hGq+P25QjM5Lk=" + }, + "V": { + "N": "0" + }, + "encAlg": { + "B": "EU2NEt5cohFAUdVGVUzAKB7ywZJ7fukGfX5LwvZ5d38=" + }, + "enc": { + "B": "Ctyt15L9T3dtnDZgwxMwaLVsPUqLajsm2on+NFyPE+K20EbThFVZlfL8tBeKg95zhfpV3SMk6Tr3H3V72ttCLg==" + }, + "intAlg": { + "B": "slaBhG/rQuJGdfN1xk1l010iAu8o0FNRYSeZonAzMRSkxDGR2ZPoxwx4KhTtfLaV" + }, + "N": { + "S": "テストΨ素材\uD83D\uDE00" + }, + "int": { + "B": "1SFTmZuykcMQo0iPoJy14xNhRqPlSSmPFx9YAuDCv+JrW+/FfUAZiZxei1Du5MOLTPBXv6a1bAK9v4LWc3N2EQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "LHsI6noUN3eS6FK03l8Cd/IfXZgCa2xIKmmXHaZijZ4=" + } } - } ] -} \ No newline at end of file + ] +} diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/nonascii-material-name-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/nonascii-material-name-1.json index 3f75b06b29..9b3b513c9f 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/nonascii-material-name-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/nonascii-material-name-1.json @@ -1,293 +1,311 @@ { - "TableName" : [ { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOENGam1pdlJnTjBza1lHbTlVWmZuekM5WnlIMjZsR2Q4d0laRTZWVG9PNDBhWitVVURBMVdTZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "PFr8lpiLEHLuX/cKx9uP3+uSPkjdCXDtlcQ5gPoUBxQ=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOERHK0Z1WHZXUWxnd1Q3cGNXRlNoMEk2WG81YnpLTENtRml6N3J3dkdlYW5wd0hHTW15RXltUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "eNQ30yLupNzPT2YOE4LTujQrW0GzVZKkM4C38hkHZKI=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEtlcGpQZTdiTDE5Q2dtTnA4ak5iekE0SXJYa00yckpVV3Jxc3FmREgydDE5S1kvalk2Q005Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "kd5jrrYMhisPrN8LBinaGped9Bpd++DSyhtcChNXxHI=" + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOENGam1pdlJnTjBza1lHbTlVWmZuekM5WnlIMjZsR2Q4d0laRTZWVG9PNDBhWitVVURBMVdTZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "PFr8lpiLEHLuX/cKx9uP3+uSPkjdCXDtlcQ5gPoUBxQ=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOERHK0Z1WHZXUWxnd1Q3cGNXRlNoMEk2WG81YnpLTENtRml6N3J3dkdlYW5wd0hHTW15RXltUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "eNQ30yLupNzPT2YOE4LTujQrW0GzVZKkM4C38hkHZKI=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEtlcGpQZTdiTDE5Q2dtTnA4ak5iekE0SXJYa00yckpVV3Jxc3FmREgydDE5S1kvalk2Q005Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "kd5jrrYMhisPrN8LBinaGped9Bpd++DSyhtcChNXxHI=" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGFGN3ZxYUlaUmxkNFdCNk5hbDRLaFpqUTFNcXdLSlhaczZIUTZ6Sm4yeWxxdWVEcmhVUWtnQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "W8hStNhjqAymY5ZBjGRqw08/63SU3N87Q6WCS94tYoA=" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "FHDgEDmLyUUv5wYGfq6lqBSAi9PUuEZiHEdaKEaEougJZhz11cGoFQuTF4ydu+ez" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODVTb3laeExVcDFJUEZyekV4UThBa1BBcWlmczd5aVV6bXBYZjRuSHpoWWtRdzdmTkhKQ2ZqZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "wsQgIwKrPEk3VoYLDCP5wOTGBKMmBFok0XjFIA08fEl/KmpS71VrQiKvg2MpIuaTyoqXGq5hUSXbUZkR6VujqQ==" + }, + "doubleSet": { + "B": "flgSLsQ5VMukZDfrwwwO8+rVuMAcexvrn+vqhJLst8tuE0gU2wXKM5ZYXifw1V9mTcDgTXQdXBNTvHLdzQ45QQ==" + }, + "byteArrayValue": { + "B": "AvkM2y8LkS3zcDw4sUH0Hu2FNGy+La3jCRrEkJGY88w=" + }, + "intValue": { + "B": "PZwP0jZggL0gNzKBf/XcvvqEnGhOpzLhkEnNIQOAv90=" + }, + "stringSet": { + "B": "sVPWa+AkzXaeG0vnerk3AoemAltp+mLsrfnRtRq3YIBrH7ePlb3JIGxP+Kz1ZJwMh54HOmIyr3+BcSPDKAsZJw==" + }, + "doubleValue": { + "B": "QCI7NPbUidAc6Kl4S4GKm+S8ycD0slUtyqzQZd9nmAI=" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "7L1OrgAj3+5G6PIFRiNF20VfnkkrOO4nRqotd8IvbWI=" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGpvQjhYL3puRWdJNVN5S3l0ZXRZZFpDWS8zR3k5Nkd2UVF2eVZpZVNFcDZjcnJ1aWZqNmJsZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "LGJAXl7XkqCIDyvvbLTE2cXHLcP0Q51oFLy6z14bP7E=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODJRZmtnZWxXeXZITmNubzhFWU5GUFFhWHoweVI4S01uL1BSUWlYUWU0TEJzY1FFVmE2eFVCdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "M/ygfKm1pSiDLfM8ndOPaFcreHykwjTWJ99bZ8RifBM=" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHhxMjA4YUpPRHAxd1lBQ1hGSERDRXRnQzNlVlNTK2wwcWRFQ2h5T2VyTXFuM0RxUW82QXBTZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "kVnmGSSwcE61fbTJiy2uPUWiSe4cXPIA3N0lMb78wJY=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOElMdjhEWE0zS1VoN0puT0hKTVpTeDJnVVRrc3owendQSmF1L3haZGYvRENvNTJNRHBiaUFrdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "fliK8KzRmgEb1P6NWb8JV79Z1QZW8sKXPTfnStQo5qk=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG1iOWRrQ1dKNUk0UWhXM2lhTDJFVEhzZ0MwbXVLTGcrN3VRbGhnc2lQLzJRT3VObUJPUzF2dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "tFuoBD99KJd7ArlC4s8wVun2Q5Hn59uzCpYzJ0JDO+U=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODE2SGhydVFmWkE4ZFlYRW9lRVhRVmlRUWFBaXNBT3k0UnhIVlUrV0VpRlFwWG1LbG80NkF5Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "rHXyZmeg7oDf//vlyfgP7eckc+FbzhCiCetadTYysL8=" + } + }, + { + "rangeKey": { + "N": "8" + }, + "hashKey": { + "N": "6" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODZpTk1NZ2FqQTRnQkREMVRDdWVTaTdlQkY3WC9GMUo4K0FRbnJka1M4M1EvbU1tSE5INkhsZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "sRSQoizMT+OvqksMiyIseEwj+92uOL9v090qLGfPHXPpurfBIbJlK5jakvnW6fg+OO/b8P/zfwTnJ93RoVbmJA==" + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "nnoV9ZoF6GM6uFQwxEh3nOsKut/2HrfUBFA4eC347F8=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "EdkGy4yaFhE2P92uhurBMlbMnJLuvrPGpn3AmAcClUwGXzazfdbbPdP5akxJaqutNsEZsFVOmCSNG37+cyIy1g==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "Y2DTFZHVoz7FZFnF3HTE+azRW8KFf+MWIBM+boAYkwQ=" + } } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "5" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGFGN3ZxYUlaUmxkNFdCNk5hbDRLaFpqUTFNcXdLSlhaczZIUTZ6Sm4yeWxxdWVEcmhVUWtnQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "W8hStNhjqAymY5ZBjGRqw08/63SU3N87Q6WCS94tYoA=" - } - }, { - "rangeKey" : { - "N" : "7" - }, - "hashKey" : { - "N" : "5" - }, - "stringValue" : { - "B" : "FHDgEDmLyUUv5wYGfq6lqBSAi9PUuEZiHEdaKEaEougJZhz11cGoFQuTF4ydu+ez" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODVTb3laeExVcDFJUEZyekV4UThBa1BBcWlmczd5aVV6bXBYZjRuSHpoWWtRdzdmTkhKQ2ZqZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "intSet" : { - "B" : "wsQgIwKrPEk3VoYLDCP5wOTGBKMmBFok0XjFIA08fEl/KmpS71VrQiKvg2MpIuaTyoqXGq5hUSXbUZkR6VujqQ==" - }, - "doubleSet" : { - "B" : "flgSLsQ5VMukZDfrwwwO8+rVuMAcexvrn+vqhJLst8tuE0gU2wXKM5ZYXifw1V9mTcDgTXQdXBNTvHLdzQ45QQ==" - }, - "byteArrayValue" : { - "B" : "AvkM2y8LkS3zcDw4sUH0Hu2FNGy+La3jCRrEkJGY88w=" - }, - "intValue" : { - "B" : "PZwP0jZggL0gNzKBf/XcvvqEnGhOpzLhkEnNIQOAv90=" - }, - "stringSet" : { - "B" : "sVPWa+AkzXaeG0vnerk3AoemAltp+mLsrfnRtRq3YIBrH7ePlb3JIGxP+Kz1ZJwMh54HOmIyr3+BcSPDKAsZJw==" - }, - "doubleValue" : { - "B" : "QCI7NPbUidAc6Kl4S4GKm+S8ycD0slUtyqzQZd9nmAI=" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "7L1OrgAj3+5G6PIFRiNF20VfnkkrOO4nRqotd8IvbWI=" - } - }, { - "rangeKey" : { - "N" : "10" - }, - "hashKey" : { - "N" : "8" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGpvQjhYL3puRWdJNVN5S3l0ZXRZZFpDWS8zR3k5Nkd2UVF2eVZpZVNFcDZjcnJ1aWZqNmJsZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "LGJAXl7XkqCIDyvvbLTE2cXHLcP0Q51oFLy6z14bP7E=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "7" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODJRZmtnZWxXeXZITmNubzhFWU5GUFFhWHoweVI4S01uL1BSUWlYUWU0TEJzY1FFVmE2eFVCdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "M/ygfKm1pSiDLfM8ndOPaFcreHykwjTWJ99bZ8RifBM=" - } - }, { - "rangeKey" : { - "N" : "9" - }, - "hashKey" : { - "N" : "7" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHhxMjA4YUpPRHAxd1lBQ1hGSERDRXRnQzNlVlNTK2wwcWRFQ2h5T2VyTXFuM0RxUW82QXBTZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "kVnmGSSwcE61fbTJiy2uPUWiSe4cXPIA3N0lMb78wJY=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOElMdjhEWE0zS1VoN0puT0hKTVpTeDJnVVRrc3owendQSmF1L3haZGYvRENvNTJNRHBiaUFrdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "fliK8KzRmgEb1P6NWb8JV79Z1QZW8sKXPTfnStQo5qk=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG1iOWRrQ1dKNUk0UWhXM2lhTDJFVEhzZ0MwbXVLTGcrN3VRbGhnc2lQLzJRT3VObUJPUzF2dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "tFuoBD99KJd7ArlC4s8wVun2Q5Hn59uzCpYzJ0JDO+U=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "6" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODE2SGhydVFmWkE4ZFlYRW9lRVhRVmlRUWFBaXNBT3k0UnhIVlUrV0VpRlFwWG1LbG80NkF5Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "rHXyZmeg7oDf//vlyfgP7eckc+FbzhCiCetadTYysL8=" - } - }, { - "rangeKey" : { - "N" : "8" - }, - "hashKey" : { - "N" : "6" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODZpTk1NZ2FqQTRnQkREMVRDdWVTaTdlQkY3WC9GMUo4K0FRbnJka1M4M1EvbU1tSE5INkhsZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "intSet" : { - "B" : "sRSQoizMT+OvqksMiyIseEwj+92uOL9v090qLGfPHXPpurfBIbJlK5jakvnW6fg+OO/b8P/zfwTnJ93RoVbmJA==" - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "nnoV9ZoF6GM6uFQwxEh3nOsKut/2HrfUBFA4eC347F8=" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "B" : "EdkGy4yaFhE2P92uhurBMlbMnJLuvrPGpn3AmAcClUwGXzazfdbbPdP5akxJaqutNsEZsFVOmCSNG37+cyIy1g==" - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "Y2DTFZHVoz7FZFnF3HTE+azRW8KFf+MWIBM+boAYkwQ=" - } - } ], - "HashKeyOnly" : [ { - "hashKey" : { - "S" : "Bar" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHVManh0OWpLOXAwTGl5S3AxWHRsN0tXM0RzWW5jS3ZyRGJQWS9pUTZ5OTNJVWF3MVBzTTJTUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "yZxl3mhu2fAJGfhlJLDaUWOBdT0Q5FojTqGHKthDOhg=" - } - }, { - "hashKey" : { - "S" : "Baz" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFg1d3BIUlE0QkxId3pUUjlrM0lCcEsybEY0VFQzS0NVUkRSZWtYS05VZHpkUVVwZGRjajN4UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "WPZZ4TzN724wJ0hWo+Hvmr7dPjdZVUNpilBsr9w4WCw=" - } - }, { - "hashKey" : { - "S" : "Foo" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHRObzhBbnIyRWEreHpIN3pOb2pXMm9kMnYrcU5EYU5SQmNZSjJ4ZkpETEJyUldUdHlYTkU0UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "kUZ2o3A6kxRf5ImPL14KwinOcvv7gVes8GQ5jBTzrc4=" + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHVManh0OWpLOXAwTGl5S3AxWHRsN0tXM0RzWW5jS3ZyRGJQWS9pUTZ5OTNJVWF3MVBzTTJTUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "yZxl3mhu2fAJGfhlJLDaUWOBdT0Q5FojTqGHKthDOhg=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFg1d3BIUlE0QkxId3pUUjlrM0lCcEsybEY0VFQzS0NVUkRSZWtYS05VZHpkUVVwZGRjajN4UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "WPZZ4TzN724wJ0hWo+Hvmr7dPjdZVUNpilBsr9w4WCw=" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHRObzhBbnIyRWEreHpIN3pOb2pXMm9kMnYrcU5EYU5SQmNZSjJ4ZkpETEJyUldUdHlYTkU0UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAX44OG44K544OIzqjntKDmnZDwn5iAIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "kUZ2o3A6kxRf5ImPL14KwinOcvv7gVes8GQ5jBTzrc4=" + } } - } ] -} \ No newline at end of file + ] +} diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonbmp-desc-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonbmp-desc-1.json index 575ce02ad5..4eeaea0242 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonbmp-desc-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-nonbmp-desc-1.json @@ -1,293 +1,311 @@ { - "TableName" : [ { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "8HoNPftDkC6gi4Ti9RDl0R3uvAQh84zFZ4xOB8u8ZLQAkcqfPxyPVOivOzBd2in2" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "B": "881Z7FYW3IYDucseX7rF3gP1ybF82XgGZYfpUa1usH48WWj8kFFD9SPEEk/8sc7cDlydkSlFL8CNiubUufJ0LQ==" + }, + "doubleSet": { + "B": "b60lXmzsbZ39apoaYKkgY+aWo8LWfzAkIGQlNvWkur2IiWcG6owxFzrdr4L+c8P5Kk2X4kWNuDSfWY+w7S8BJw==" + }, + "byteArrayValue": { + "B": "3jR3t/sJDnCIAzKyYaEOeyuRdbOvxshJ5tYUFnUdh5A=" + }, + "intValue": { + "B": "IjdNh5/lKDA6enzBZK+X6H4m4Xm9yEX2H40Juth0Q24=" + }, + "stringSet": { + "B": "y73CITSPLvZnxOZc69JWzhqhrZVLx3erb9bO2pzw59pQsh5eKYU7tulHZ42wi4bwGetDd6m5WZI44e0WpuUITQ==" + }, + "doubleValue": { + "B": "1zJZjhbVoI/n4gm9v9AMEed4ERqQC31WgBtZAeT+CW4=" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "jdpG76kptkAXRvykyzuhVSE+T16+jax0SVjbOlmJvkc=" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "RBAsheB0kh7XA4EPlHGJFTaq5p08xJg+8YX/O6iC+7Y=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + } + }, + { + "rangeKey": { + "N": "8" + }, + "hashKey": { + "N": "6" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "B": "bCRH9NVdBsNPims1VSQ6yIzaBTyd9GzG0jlXZTd3pJVtYEtoKS+3KZTWEaL7mjw4YuN1fcGxOXwry1ZyPGQwKw==" + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "czUZ62g+6Uo9aA2rVM5hWpgFwGo3ciRuL+feWYAATlg=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "ahQmHHwye0i8CxrjiiFYAaBcekI4h02CfNDIAssp2s/bykeiCjsAADrL1Zse08DhZvesPK6SMr8fCwrLssNVGg==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "co23v5PFdj3JBxYAwyC8F5J08Q4GOjXKoPUAR+EjwvY=" + } } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "5" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" - } - }, { - "rangeKey" : { - "N" : "7" - }, - "hashKey" : { - "N" : "5" - }, - "stringValue" : { - "B" : "8HoNPftDkC6gi4Ti9RDl0R3uvAQh84zFZ4xOB8u8ZLQAkcqfPxyPVOivOzBd2in2" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet" : { - "B" : "881Z7FYW3IYDucseX7rF3gP1ybF82XgGZYfpUa1usH48WWj8kFFD9SPEEk/8sc7cDlydkSlFL8CNiubUufJ0LQ==" - }, - "doubleSet" : { - "B" : "b60lXmzsbZ39apoaYKkgY+aWo8LWfzAkIGQlNvWkur2IiWcG6owxFzrdr4L+c8P5Kk2X4kWNuDSfWY+w7S8BJw==" - }, - "byteArrayValue" : { - "B" : "3jR3t/sJDnCIAzKyYaEOeyuRdbOvxshJ5tYUFnUdh5A=" - }, - "intValue" : { - "B" : "IjdNh5/lKDA6enzBZK+X6H4m4Xm9yEX2H40Juth0Q24=" - }, - "stringSet" : { - "B" : "y73CITSPLvZnxOZc69JWzhqhrZVLx3erb9bO2pzw59pQsh5eKYU7tulHZ42wi4bwGetDd6m5WZI44e0WpuUITQ==" - }, - "doubleValue" : { - "B" : "1zJZjhbVoI/n4gm9v9AMEed4ERqQC31WgBtZAeT+CW4=" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "jdpG76kptkAXRvykyzuhVSE+T16+jax0SVjbOlmJvkc=" - } - }, { - "rangeKey" : { - "N" : "10" - }, - "hashKey" : { - "N" : "8" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "RBAsheB0kh7XA4EPlHGJFTaq5p08xJg+8YX/O6iC+7Y=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "7" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" - } - }, { - "rangeKey" : { - "N" : "9" - }, - "hashKey" : { - "N" : "7" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "6" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" - } - }, { - "rangeKey" : { - "N" : "8" - }, - "hashKey" : { - "N" : "6" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "intSet" : { - "B" : "bCRH9NVdBsNPims1VSQ6yIzaBTyd9GzG0jlXZTd3pJVtYEtoKS+3KZTWEaL7mjw4YuN1fcGxOXwry1ZyPGQwKw==" - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "czUZ62g+6Uo9aA2rVM5hWpgFwGo3ciRuL+feWYAATlg=" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "B" : "ahQmHHwye0i8CxrjiiFYAaBcekI4h02CfNDIAssp2s/bykeiCjsAADrL1Zse08DhZvesPK6SMr8fCwrLssNVGg==" - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "co23v5PFdj3JBxYAwyC8F5J08Q4GOjXKoPUAR+EjwvY=" - } - } ], - "HashKeyOnly" : [ { - "hashKey" : { - "S" : "Bar" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" - } - }, { - "hashKey" : { - "S" : "Baz" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" - } - }, { - "hashKey" : { - "S" : "Foo" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAAAfOqGdyZWVrAAAAB86odmFsdWUAAAAMZW1vamnwn5SRa2V5AAAADXZhbHVl8J+UkmxvY2sAAAAJ8J2Enm11c2ljAAAACPCdhKJjbGVmAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + } } - } ] -} \ No newline at end of file + ] +} diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-rsa-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-rsa-1.json index d36734b938..10d8bcb692 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-rsa-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-rsa-1.json @@ -1,293 +1,311 @@ { - "TableName" : [ { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "WzJrn54GcMHwEsjlY7Q8sbj6vyNvLlinLXkKS4iok6aPi7SK3KvBaiuvTeSg50lo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "intSet": { + "B": "1quqfVABNbNgKQ7sUfeVTiTa4UkGlf/ovHewrp5GNT+0hYoccAuiyVG3lKTgVaL3Gk1DVVo8xY7SG7nG52+7pA==" + }, + "doubleSet": { + "B": "q40QummaNeoy+KcszMyFXyTgUIZrGv9+b1XbEr3BIsApCjDjrRIu6xg1AOrvfq4K0DAy0oJESFBN4fPtElZR8w==" + }, + "byteArrayValue": { + "B": "jcDbafnUHhIwPh4a3/vkAbJukMQY4nAhJsLsI1Y/MJk=" + }, + "intValue": { + "B": "BqwAmcd2nuJzj3/O4K7jDKFv3uz9ueUWDVrm83AVbG8=" + }, + "stringSet": { + "B": "y61JZU9ggiEtxAySIhgUUoy9igR7+vegC0mBFboh49Da9WWtMEjw4Zf166mWuy3gFlngMeMMuSt8JxoK063S2g==" + }, + "doubleValue": { + "B": "ygH0LAHYM10H11rOMS7L+hCU9J6Jnc5WCebgKlo55h8=" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "nrrYM34GT6U84RVwsaizBfdrp7jVwJaVYHtjyH205tRLG4mNUMJjKhfDn5dWQyP7aoY8fqyYIUwTiSPJx4cvtcAuZ6/GndRYG3X9QfTQEPprKn8wGzh35zBEx/fJqhWiVoohrHqhg8P5GWSGmQiLttdId0K3jSHIyN/xXix0FXEaF8g5+rCXWPW+gqhFh/9ghBPgLTKLiB6ubeRRcuFLUQSe4c2gctDt61EVXO1HYGgY+Q0CHYhQ1q2uDVchUJ0041YlpkjNPXIDow9Tnn/WXA6AlHkSJh6OL0+Es2zgBerzxgDGO56nm+alz0f1sgiqJcb95GyqnlC0a1yL5yYI+Q==" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "ZGgH3th12g5smQYjM4V1ZJ6lQ90A32YHIQ+e1dkTix7jbg0F+EldPBQQ2VXZKO9LbQcSziWQuGL7HYuZ0Rm3QQgpuCF5fM5DtMBGwHxuF8SdW4iWaeoY9TKkmvaLSMdHLyRUuJi3mvh388saVwai1WKqiq1uebpNv6eJdrxE0UnmLEgtSfUmeh/KMUu97Llhhpi8I3HSjDhRaFNLpck39wuFUjmaMzwhSQ7Ml9gmSSj8fyVSurdM7aNW3whLRUKCaxHjB3S5obbu68fN1uoXKDl1qSE9/VPr654pPpSu/aC8ffCKLpdDMi6OWx5+mZaKihIgkOEVoehrbCSk5XjbjA==" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" + } + }, + { + "rangeKey": { + "N": "8" + }, + "hashKey": { + "N": "6" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "intSet": { + "B": "+GW1lOUJedn3jzV8JJKiw5Dq4ximdSmsmKaOoLIM/qPSXAl/l7haOe3IsQQICSbZWJfbs8/B+FCUCum2n0pP9A==" + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "wHspV5Q2cj2Tt1S8YkY6Eka2L6Grx8ctnu+s3dqCCiE=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "nQwzoDVQ+F5waf8Q+WwYqDfeHz4pm8s9IhH82UIc4dOkHMkMh/6bqnqZc53quOik5ZYrXtIsHatkIDll/m8ghQ==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "kEPqYLQp0YCO1Dg1dSg7ZcemSc4HR4FbhDaDFc26vgnWpSc05ZU4Owx13hjNWmAAI3JrKI5fJMoHhBMmhaAoJVRa3fOPr6nL+GXVlOXEYQsNio9+d3rhtwyWwNyT611ONvWLObtQihzOmozuI/qXdsHxW0tTcGoIvBqnyrHQ86tu03WS63DARIIs8pvBgsu5rG6/6XenY/VPXm4QF+U03mic1ACpeVEsNDGlrVXWNiIIsPabf8crZEdW9GXUidp9tq232PNjSi/QpwZ+2761iiLqQr9qIbyx7QbWWABumtm+yGWw7mHFLgolekToOyUTvqNurugSigO3k6a/jJgpEw==" + } } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "5" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" - } - }, { - "rangeKey" : { - "N" : "7" - }, - "hashKey" : { - "N" : "5" - }, - "stringValue" : { - "B" : "WzJrn54GcMHwEsjlY7Q8sbj6vyNvLlinLXkKS4iok6aPi7SK3KvBaiuvTeSg50lo" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "intSet" : { - "B" : "1quqfVABNbNgKQ7sUfeVTiTa4UkGlf/ovHewrp5GNT+0hYoccAuiyVG3lKTgVaL3Gk1DVVo8xY7SG7nG52+7pA==" - }, - "doubleSet" : { - "B" : "q40QummaNeoy+KcszMyFXyTgUIZrGv9+b1XbEr3BIsApCjDjrRIu6xg1AOrvfq4K0DAy0oJESFBN4fPtElZR8w==" - }, - "byteArrayValue" : { - "B" : "jcDbafnUHhIwPh4a3/vkAbJukMQY4nAhJsLsI1Y/MJk=" - }, - "intValue" : { - "B" : "BqwAmcd2nuJzj3/O4K7jDKFv3uz9ueUWDVrm83AVbG8=" - }, - "stringSet" : { - "B" : "y61JZU9ggiEtxAySIhgUUoy9igR7+vegC0mBFboh49Da9WWtMEjw4Zf166mWuy3gFlngMeMMuSt8JxoK063S2g==" - }, - "doubleValue" : { - "B" : "ygH0LAHYM10H11rOMS7L+hCU9J6Jnc5WCebgKlo55h8=" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "nrrYM34GT6U84RVwsaizBfdrp7jVwJaVYHtjyH205tRLG4mNUMJjKhfDn5dWQyP7aoY8fqyYIUwTiSPJx4cvtcAuZ6/GndRYG3X9QfTQEPprKn8wGzh35zBEx/fJqhWiVoohrHqhg8P5GWSGmQiLttdId0K3jSHIyN/xXix0FXEaF8g5+rCXWPW+gqhFh/9ghBPgLTKLiB6ubeRRcuFLUQSe4c2gctDt61EVXO1HYGgY+Q0CHYhQ1q2uDVchUJ0041YlpkjNPXIDow9Tnn/WXA6AlHkSJh6OL0+Es2zgBerzxgDGO56nm+alz0f1sgiqJcb95GyqnlC0a1yL5yYI+Q==" - } - }, { - "rangeKey" : { - "N" : "10" - }, - "hashKey" : { - "N" : "8" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "ZGgH3th12g5smQYjM4V1ZJ6lQ90A32YHIQ+e1dkTix7jbg0F+EldPBQQ2VXZKO9LbQcSziWQuGL7HYuZ0Rm3QQgpuCF5fM5DtMBGwHxuF8SdW4iWaeoY9TKkmvaLSMdHLyRUuJi3mvh388saVwai1WKqiq1uebpNv6eJdrxE0UnmLEgtSfUmeh/KMUu97Llhhpi8I3HSjDhRaFNLpck39wuFUjmaMzwhSQ7Ml9gmSSj8fyVSurdM7aNW3whLRUKCaxHjB3S5obbu68fN1uoXKDl1qSE9/VPr654pPpSu/aC8ffCKLpdDMi6OWx5+mZaKihIgkOEVoehrbCSk5XjbjA==" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "7" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" - } - }, { - "rangeKey" : { - "N" : "9" - }, - "hashKey" : { - "N" : "7" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "6" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" - } - }, { - "rangeKey" : { - "N" : "8" - }, - "hashKey" : { - "N" : "6" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "intSet" : { - "B" : "+GW1lOUJedn3jzV8JJKiw5Dq4ximdSmsmKaOoLIM/qPSXAl/l7haOe3IsQQICSbZWJfbs8/B+FCUCum2n0pP9A==" - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "wHspV5Q2cj2Tt1S8YkY6Eka2L6Grx8ctnu+s3dqCCiE=" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "B" : "nQwzoDVQ+F5waf8Q+WwYqDfeHz4pm8s9IhH82UIc4dOkHMkMh/6bqnqZc53quOik5ZYrXtIsHatkIDll/m8ghQ==" - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "kEPqYLQp0YCO1Dg1dSg7ZcemSc4HR4FbhDaDFc26vgnWpSc05ZU4Owx13hjNWmAAI3JrKI5fJMoHhBMmhaAoJVRa3fOPr6nL+GXVlOXEYQsNio9+d3rhtwyWwNyT611ONvWLObtQihzOmozuI/qXdsHxW0tTcGoIvBqnyrHQ86tu03WS63DARIIs8pvBgsu5rG6/6XenY/VPXm4QF+U03mic1ACpeVEsNDGlrVXWNiIIsPabf8crZEdW9GXUidp9tq232PNjSi/QpwZ+2761iiLqQr9qIbyx7QbWWABumtm+yGWw7mHFLgolekToOyUTvqNurugSigO3k6a/jJgpEw==" - } - } ], - "HashKeyOnly" : [ { - "hashKey" : { - "S" : "Bar" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" - } - }, { - "hashKey" : { - "S" : "Baz" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" - } - }, { - "hashKey" : { - "S" : "Foo" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" - }, - "*amzn-ddb-map-sig*" : { - "B" : "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + } } - } ] -} \ No newline at end of file + ] +} diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-rsa-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-rsa-1.json index 538d2c8a3a..61190ca0dd 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-rsa-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-rsa-1.json @@ -1,293 +1,311 @@ { - "TableName" : [ { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGZyOWZESWt5bEpVVUU2VktEc0lHcThjcVQzb0lldkhhWFovMHErTjFNeFlmdUZUSVF6VzlWQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOElGbnRVb0xsUElaOERnWm92R0E3ZnIva3F1ay85SkU2cllyRDdFdUFCd1g4eWcyOWY2UG5NUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGtoZm1JNEt6OXRMR2l6ZUhXUnYwMlRmdDBldmRMV1BHMkRLVXlBWkpGbm1ISGxyRk9KVE9Edz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGZyOWZESWt5bEpVVUU2VktEc0lHcThjcVQzb0lldkhhWFovMHErTjFNeFlmdUZUSVF6VzlWQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOElGbnRVb0xsUElaOERnWm92R0E3ZnIva3F1ay85SkU2cllyRDdFdUFCd1g4eWcyOWY2UG5NUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGtoZm1JNEt6OXRMR2l6ZUhXUnYwMlRmdDBldmRMV1BHMkRLVXlBWkpGbm1ISGxyRk9KVE9Edz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHBJZitQdkNqK0VreFp2aG9oSGVzaEQ1UWgxaGg5eEp3K2RLckdQUFhSbTBaQlF2M0ZsbWRaUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "umLEEBYb1tu3d4bHFiU/qDy2aBANsYijmbmd2MY/6KTPyJX4jToisbf1IFEv98Vt" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODBuZk5aUjVXSlVGQ1dpY3NOeklYbGJVWkNKVHhDcHk0K295b2ZFSkt1c2hqaFA4QjlETjhuUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "0k+MS5+E2z3qUqbtymenHWYX8vFTAZ/3Y7TabRFv270zIY7KJXQ1afR8Gu7wCyzokY4fJ9uazBRnakbe/btU+A==" + }, + "doubleSet": { + "B": "FPNZipxAOKhIC9jkzAICEtVQfE2/0gsOYDKjxmu+6w6jHP8/jRhbfmURReiBSHCWLdXnLgxJIdbbmERk/vgqAw==" + }, + "byteArrayValue": { + "B": "s5+7Nw3zgxukEvb4zhGyFCpI9hcibwAnVC72mK45dEA=" + }, + "intValue": { + "B": "FmIcibB9h7/4Ym2NE7FUFbAnLd83zwjddgtDMV85uco=" + }, + "stringSet": { + "B": "JD88XixzdYD+4q658J4h0F1ND6pxuv26nvaptK7vC/H0J0cxhDKsEO4N3ykKRdoRBLCmHurSS54B1RkkARqkAg==" + }, + "doubleValue": { + "B": "1amQVT8K7MFfjriJYYD/UqQHG0eqWkbOEL2LDF0MpUQ=" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "lq0Mj71SzeAa9lsSba7Qu7PwphnuxLruDIeYeoVo7GS8y0hYZZdCT3xcbOFEfnfYCteWMEXTkMVvHd59mF6HxFtlShywxx9+QMadTDz18YC+wYZUMB3/U8oqViWjivemLtg0+9ZfLOxCpUP9d4OC+uUUIIXgTwVEYKJ4v4oStSKRtLrZ4aaK19d1dHZjajkVXcoCAYgwQyrcLsUkl0+GmiBtfF9LYyfWJqow/3TXh1t5v/H8U9H+RfMZgFSQE/CL+eI2BTUvSt4xj4u2G2EFBqWTfKDh59+gYMZMLNkuY5mk9h9Tpy8o7PuV3OUzn9xBHAE2AMi6z2X3ofuF8Hy+fg==" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOExtamVEMzAwQzJhVU1zemlGNVdjc21CMldmWkl4Um1XMUlZRGJoTHNZdVVLZUN1ejlOK2h6Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "ZGgH3th12g5smQYjM4V1ZJ6lQ90A32YHIQ+e1dkTix7jbg0F+EldPBQQ2VXZKO9LbQcSziWQuGL7HYuZ0Rm3QQgpuCF5fM5DtMBGwHxuF8SdW4iWaeoY9TKkmvaLSMdHLyRUuJi3mvh388saVwai1WKqiq1uebpNv6eJdrxE0UnmLEgtSfUmeh/KMUu97Llhhpi8I3HSjDhRaFNLpck39wuFUjmaMzwhSQ7Ml9gmSSj8fyVSurdM7aNW3whLRUKCaxHjB3S5obbu68fN1uoXKDl1qSE9/VPr654pPpSu/aC8ffCKLpdDMi6OWx5+mZaKihIgkOEVoehrbCSk5XjbjA==" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFNNZms1dmdrREVQejRZLzhDc1FkbWdMYlZyZ1NBb3gwZVRBSkMrODRsNWhWV1o2SkRXZTRVQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODJTOWVJeWp4ZW9YTnNxNldVL09IaXVLMERrdWdtWjlHemdqRGNSV2VTOTVqMWtabTVaQ0JaUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG42WDNYakJEZGVVcFNtdHNwMCtZQXJoM2tuTFpOK0FWc2Vnc0dqcFozZUN4TUkyTy9LSkRPdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGlDUGVaYmxMMjErQnV6YUwxUW02WDEyaUw4dWYwZTU5N1lLTDdaSFZ0dThIYUdNaXhxcjVIUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEFadHNuRmJKYjRGdEZqMmt4anZETXU1ck1EK3ZNckZlaU91QXRiSDNPWC9iUmpUZTlKY1hGdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" + } + }, + { + "rangeKey": { + "N": "8" + }, + "hashKey": { + "N": "6" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFd5eWVLWlhTQlI1enlwcWpETElLNS81M1pjNnhJZDZhelVhNFhTaHI1aUNBVlZjcjBxUnhpdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "BCxzLimnWGgSLipbleaJrxhyhM0DVbLXmhic97+WFS4v2f+wUw3GqWDiidnUbbzDlgJKxNL88hLkXwHKRIuc7g==" + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "bSLPxcoBUNFp5ngpN+vW00uak2gIZBTlZ4/Dpu45IRs=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "gqoZ6E0+b8Su4/VnUEwmET3Ig5NcDtfO/iJ2c7wJ9rSijkBZFX2wiRK70jdieyvnPKhQlmenvUit8VAgeDeB5w==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "cEAa61z6f+qk7E4dgsvqz7io2+UsL40UVBng1H/relvx52iWqmDs0uH8uaa1RAPbDBBtn9S4SlyUDl63Oc6VRkZxKtpMUTigDPccJ09zmj8UPXe5vcmahseSWlUh7xXJRxp9EKYVYorKjDUdDMWqiv/xInrkJ+rbMCjFfaE9LuI0VheB2VlAZMzLoSwpo+CENqLKvSDoI1LZeIoMLns3mVrsAbND7HYVI6DCugBh5BSWlSfgKTho5R1mCMIdPhr/u7H5I8YLZkEhdhv8QhDnhgRTXtkeABbZVSBwIqzB2oGnQYd2FY71p0j83ZqjwQffluAAO2fa1GgtBHbQe9x3WQ==" + } } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "5" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHBJZitQdkNqK0VreFp2aG9oSGVzaEQ1UWgxaGg5eEp3K2RLckdQUFhSbTBaQlF2M0ZsbWRaUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" - } - }, { - "rangeKey" : { - "N" : "7" - }, - "hashKey" : { - "N" : "5" - }, - "stringValue" : { - "B" : "umLEEBYb1tu3d4bHFiU/qDy2aBANsYijmbmd2MY/6KTPyJX4jToisbf1IFEv98Vt" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODBuZk5aUjVXSlVGQ1dpY3NOeklYbGJVWkNKVHhDcHk0K295b2ZFSkt1c2hqaFA4QjlETjhuUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "intSet" : { - "B" : "0k+MS5+E2z3qUqbtymenHWYX8vFTAZ/3Y7TabRFv270zIY7KJXQ1afR8Gu7wCyzokY4fJ9uazBRnakbe/btU+A==" - }, - "doubleSet" : { - "B" : "FPNZipxAOKhIC9jkzAICEtVQfE2/0gsOYDKjxmu+6w6jHP8/jRhbfmURReiBSHCWLdXnLgxJIdbbmERk/vgqAw==" - }, - "byteArrayValue" : { - "B" : "s5+7Nw3zgxukEvb4zhGyFCpI9hcibwAnVC72mK45dEA=" - }, - "intValue" : { - "B" : "FmIcibB9h7/4Ym2NE7FUFbAnLd83zwjddgtDMV85uco=" - }, - "stringSet" : { - "B" : "JD88XixzdYD+4q658J4h0F1ND6pxuv26nvaptK7vC/H0J0cxhDKsEO4N3ykKRdoRBLCmHurSS54B1RkkARqkAg==" - }, - "doubleValue" : { - "B" : "1amQVT8K7MFfjriJYYD/UqQHG0eqWkbOEL2LDF0MpUQ=" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "lq0Mj71SzeAa9lsSba7Qu7PwphnuxLruDIeYeoVo7GS8y0hYZZdCT3xcbOFEfnfYCteWMEXTkMVvHd59mF6HxFtlShywxx9+QMadTDz18YC+wYZUMB3/U8oqViWjivemLtg0+9ZfLOxCpUP9d4OC+uUUIIXgTwVEYKJ4v4oStSKRtLrZ4aaK19d1dHZjajkVXcoCAYgwQyrcLsUkl0+GmiBtfF9LYyfWJqow/3TXh1t5v/H8U9H+RfMZgFSQE/CL+eI2BTUvSt4xj4u2G2EFBqWTfKDh59+gYMZMLNkuY5mk9h9Tpy8o7PuV3OUzn9xBHAE2AMi6z2X3ofuF8Hy+fg==" - } - }, { - "rangeKey" : { - "N" : "10" - }, - "hashKey" : { - "N" : "8" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOExtamVEMzAwQzJhVU1zemlGNVdjc21CMldmWkl4Um1XMUlZRGJoTHNZdVVLZUN1ejlOK2h6Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "ZGgH3th12g5smQYjM4V1ZJ6lQ90A32YHIQ+e1dkTix7jbg0F+EldPBQQ2VXZKO9LbQcSziWQuGL7HYuZ0Rm3QQgpuCF5fM5DtMBGwHxuF8SdW4iWaeoY9TKkmvaLSMdHLyRUuJi3mvh388saVwai1WKqiq1uebpNv6eJdrxE0UnmLEgtSfUmeh/KMUu97Llhhpi8I3HSjDhRaFNLpck39wuFUjmaMzwhSQ7Ml9gmSSj8fyVSurdM7aNW3whLRUKCaxHjB3S5obbu68fN1uoXKDl1qSE9/VPr654pPpSu/aC8ffCKLpdDMi6OWx5+mZaKihIgkOEVoehrbCSk5XjbjA==" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "7" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFNNZms1dmdrREVQejRZLzhDc1FkbWdMYlZyZ1NBb3gwZVRBSkMrODRsNWhWV1o2SkRXZTRVQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" - } - }, { - "rangeKey" : { - "N" : "9" - }, - "hashKey" : { - "N" : "7" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODJTOWVJeWp4ZW9YTnNxNldVL09IaXVLMERrdWdtWjlHemdqRGNSV2VTOTVqMWtabTVaQ0JaUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG42WDNYakJEZGVVcFNtdHNwMCtZQXJoM2tuTFpOK0FWc2Vnc0dqcFozZUN4TUkyTy9LSkRPdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGlDUGVaYmxMMjErQnV6YUwxUW02WDEyaUw4dWYwZTU5N1lLTDdaSFZ0dThIYUdNaXhxcjVIUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "6" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEFadHNuRmJKYjRGdEZqMmt4anZETXU1ck1EK3ZNckZlaU91QXRiSDNPWC9iUmpUZTlKY1hGdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" - } - }, { - "rangeKey" : { - "N" : "8" - }, - "hashKey" : { - "N" : "6" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFd5eWVLWlhTQlI1enlwcWpETElLNS81M1pjNnhJZDZhelVhNFhTaHI1aUNBVlZjcjBxUnhpdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "intSet" : { - "B" : "BCxzLimnWGgSLipbleaJrxhyhM0DVbLXmhic97+WFS4v2f+wUw3GqWDiidnUbbzDlgJKxNL88hLkXwHKRIuc7g==" - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "bSLPxcoBUNFp5ngpN+vW00uak2gIZBTlZ4/Dpu45IRs=" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "B" : "gqoZ6E0+b8Su4/VnUEwmET3Ig5NcDtfO/iJ2c7wJ9rSijkBZFX2wiRK70jdieyvnPKhQlmenvUit8VAgeDeB5w==" - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "cEAa61z6f+qk7E4dgsvqz7io2+UsL40UVBng1H/relvx52iWqmDs0uH8uaa1RAPbDBBtn9S4SlyUDl63Oc6VRkZxKtpMUTigDPccJ09zmj8UPXe5vcmahseSWlUh7xXJRxp9EKYVYorKjDUdDMWqiv/xInrkJ+rbMCjFfaE9LuI0VheB2VlAZMzLoSwpo+CENqLKvSDoI1LZeIoMLns3mVrsAbND7HYVI6DCugBh5BSWlSfgKTho5R1mCMIdPhr/u7H5I8YLZkEhdhv8QhDnhgRTXtkeABbZVSBwIqzB2oGnQYd2FY71p0j83ZqjwQffluAAO2fa1GgtBHbQe9x3WQ==" - } - } ], - "HashKeyOnly" : [ { - "hashKey" : { - "S" : "Bar" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOC9zWTJEeXQzR3Q4dW9ucW0vVzNDZ09LMjEvdGFTYWc0aFZmdEVpTWg5Rit0ZHIyOHlFRElUdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" - } - }, { - "hashKey" : { - "S" : "Baz" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFVGamN0RWQ5ZjBHQnRFL0V0V1BKMXhOcitqYVIrKzBqalJiem9YbkdXQWlaYVUrTHVSSk5sUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" - } - }, { - "hashKey" : { - "S" : "Foo" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOE5FN0lWek1mV0VkdW5RbEphUmxPa002UTJYRzQ0UTE2ZS9LSlNQMWc0Rk1pa3J0bFU3Y0VmZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" - }, - "*amzn-ddb-map-sig*" : { - "B" : "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOC9zWTJEeXQzR3Q4dW9ucW0vVzNDZ09LMjEvdGFTYWc0aFZmdEVpTWg5Rit0ZHIyOHlFRElUdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFVGamN0RWQ5ZjBHQnRFL0V0V1BKMXhOcitqYVIrKzBqalJiem9YbkdXQWlaYVUrTHVSSk5sUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOE5FN0lWek1mV0VkdW5RbEphUmxPa002UTJYRzQ0UTE2ZS9LSlNQMWc0Rk1pa3J0bFU3Y0VmZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + } } - } ] -} \ No newline at end of file + ] +} diff --git a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-hmac-1.json b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-hmac-1.json index d39752c078..a20ca612fb 100644 --- a/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-hmac-1.json +++ b/DynamoDbEncryption/runtimes/java/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-hmac-1.json @@ -1,293 +1,311 @@ { - "TableName" : [ { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHRacDhMbmdHUDB1M0p3amJjTERJaG5OYk8xR1VMditEa0lQVkpTc2E0OVdKM3Z4eFovbFVSUE1KTmU3SjBRQTZCK0NNNXNPTCtnZzg5cXQrYXpvZ2tmYW5IU28zZ3hwWWdyRURBRlNOWlJMRXZidHVlRHlrOUFzdzVsV3hZVE1vc1FGQlFNYnBiSmprVHNlOUVnR3RSN2s5djNFckluVEFsK0N5dXY1RTlmZzYxcUdqQ3BGMHIyR1NDakpsd2FuUkNpYjRXWGxoNldYTnkyY3g1VTF2ZmJ2M3F1S0hGeStLSUxtSnc2bHJ2elpTN09IQW9GUXlhS09IRUJZeGRXd3F5ditwS3FJUFRVWVd0K0RvdktibTVYVkk0eWovaGJuK2dUbTdXbTNqYVNTZ2pVdDhENi93RGZ5MUp2ZVdidHZlVk1pbS96K1ptbVBOeTR3UG1FTndHUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEYxcmZBN2QrNkhhajJJMjdDV1NvRmhFaW4vK0hwUjhpUVJ2c0tIRWlORGoxN2FEeWJvMHY4ZjM2TmFuZlREdzM2RzJodTgweFUrQ3JiUFdrRzhvbGx4MUhXcTkzT05ONkp0SG9LUEgxVWxTMU4xb0UrNmM4SzB4SDlBVmlTNU0vT01jZnVtWGEySm9VcjBSSlovb0lOYjhCT3NJbmZnSWRSMFRvMUJGS09razU5ZGphcEJka2lKSUxFdFdlaWNBN25Vdm9PNm91QzlKMUNOVEhncWZUUFJiRHE4WHpMNUJjc2R3bjl3Sy9KTURXVHQ5bUVhV0pzc2hCKzVZR3pualBObjNPMzdnd2gxeWRGRzdvcU42VkpkU1k0TDNaOU1qN3JqUWhubUR2UmZaT1Z1dmhuVnN2bnEzY1RiTStCQzRSM1ZQVmh3WEVVV01lNDduL2wrMXFIZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "1" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWE5hK1ZWVTZDVm9iUTMwY1BOdmd5SFlxK3d0TWc2a0pPd054ZGtaTm9UMmR0UVhLRnE4Y2ZISTJSYzF0QklsYzdPS2hJVUwvUXNuTlNobitJTDIxZ3pLTUtRbEJIYlVMeGgyTnBXeHhackxkRmkzdjFKZXBFSU8vTEppM0c4TXYvektFQ2t1Mk1Qd1AwMVRzcUhFOUphUWx0R01hbkpYdkF4RTVYV2c0aGZrRFRtdGMvc0NWVHRaM1hZUTNJQU4vU2VMdWdudkJqWDhjdWw3UUVhc2lLbmNWNklhTitEaW5Bd3JyRFhvSVI5TjhoSStoRXYvb29hUk85ZjRoNkZjcWxxYVBFdTRXemY0bVlPeXRlcmVzbmRKYnd4elN0T2ZhYno0NE02emloUkUyRThBSkNJcGV4NEIrSDUvdW1jOTd3ZklOMUlYZzNDcnBkY3lBcDFaM1VhQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHRacDhMbmdHUDB1M0p3amJjTERJaG5OYk8xR1VMditEa0lQVkpTc2E0OVdKM3Z4eFovbFVSUE1KTmU3SjBRQTZCK0NNNXNPTCtnZzg5cXQrYXpvZ2tmYW5IU28zZ3hwWWdyRURBRlNOWlJMRXZidHVlRHlrOUFzdzVsV3hZVE1vc1FGQlFNYnBiSmprVHNlOUVnR3RSN2s5djNFckluVEFsK0N5dXY1RTlmZzYxcUdqQ3BGMHIyR1NDakpsd2FuUkNpYjRXWGxoNldYTnkyY3g1VTF2ZmJ2M3F1S0hGeStLSUxtSnc2bHJ2elpTN09IQW9GUXlhS09IRUJZeGRXd3F5ditwS3FJUFRVWVd0K0RvdktibTVYVkk0eWovaGJuK2dUbTdXbTNqYVNTZ2pVdDhENi93RGZ5MUp2ZVdidHZlVk1pbS96K1ptbVBOeTR3UG1FTndHUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEYxcmZBN2QrNkhhajJJMjdDV1NvRmhFaW4vK0hwUjhpUVJ2c0tIRWlORGoxN2FEeWJvMHY4ZjM2TmFuZlREdzM2RzJodTgweFUrQ3JiUFdrRzhvbGx4MUhXcTkzT05ONkp0SG9LUEgxVWxTMU4xb0UrNmM4SzB4SDlBVmlTNU0vT01jZnVtWGEySm9VcjBSSlovb0lOYjhCT3NJbmZnSWRSMFRvMUJGS09razU5ZGphcEJka2lKSUxFdFdlaWNBN25Vdm9PNm91QzlKMUNOVEhncWZUUFJiRHE4WHpMNUJjc2R3bjl3Sy9KTURXVHQ5bUVhV0pzc2hCKzVZR3pualBObjNPMzdnd2gxeWRGRzdvcU42VkpkU1k0TDNaOU1qN3JqUWhubUR2UmZaT1Z1dmhuVnN2bnEzY1RiTStCQzRSM1ZQVmh3WEVVV01lNDduL2wrMXFIZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWE5hK1ZWVTZDVm9iUTMwY1BOdmd5SFlxK3d0TWc2a0pPd054ZGtaTm9UMmR0UVhLRnE4Y2ZISTJSYzF0QklsYzdPS2hJVUwvUXNuTlNobitJTDIxZ3pLTUtRbEJIYlVMeGgyTnBXeHhackxkRmkzdjFKZXBFSU8vTEppM0c4TXYvektFQ2t1Mk1Qd1AwMVRzcUhFOUphUWx0R01hbkpYdkF4RTVYV2c0aGZrRFRtdGMvc0NWVHRaM1hZUTNJQU4vU2VMdWdudkJqWDhjdWw3UUVhc2lLbmNWNklhTitEaW5Bd3JyRFhvSVI5TjhoSStoRXYvb29hUk85ZjRoNkZjcWxxYVBFdTRXemY0bVlPeXRlcmVzbmRKYnd4elN0T2ZhYno0NE02emloUkUyRThBSkNJcGV4NEIrSDUvdW1jOTd3ZklOMUlYZzNDcnBkY3lBcDFaM1VhQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEhhNU85OFFwQzJ5YmcrZkFESHh2TjhTaGZUdVBSQk41TStzcVJXbG5lZEJsSktHaWxkN24xTjNXSVlNMkxQRmhLTUJvNytJUC9OMjREdEdoYXkzVnJiWHZZVEpLb0RJeEN2RDYxSXNGaDNWTUQyN29KdnpQemx1ZkQ0UndWV2Z5UzNvbzNiaVlROUFCTE94cG5HM1NiYzhLMUtHZEptNnhFR1dBd1FwUVdOK0RzeEtkTk50Mkp6VGxvb3ZWUWhTQXQyVksxMWsvM2RsVTEweEw0c2cyUDJ6M2wzYk1SWS9uU1Jka1N6VXZBRUwyZG5LS2tMbSswWjNMTkdWcHNXZmxaS2xweGwvWFVPV3ZWOERUSWs5NTBvL1BBSkZSUlQzZUp2SUNuMkNUY0xydm1VVHFySUltSmJVVjJSNVB2bXVONG5OU2JpeERsc2RqQzFxL3BESjh0Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "KiO3tgTZErY3zPEn+A9bSBUBzqsSIJcP2DSCmCeDl6pObxeNkaloc3Hc25TYFEb0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWE5zRHJHRUZIb2NaTzIzRzcrVlllOENMZitabjNaT3Q0N2tmRVBnaVZ6Q1Q2QVVSaGVoOGVNcDJXVUd1Y2FSdzI4amJmR1pQanVKNndJTWg1bUE0cmhubUxaUzdZM0QzUWdibytVTURLWUVic3VIcE9tZFRPUVpSTjFFWW10WGFsRTFrcjhxeXptNHV1SXA0VHJwQmlhNFd0dklNRytZY1A1NjVTaThEcHBwMlVUOEt0elhFN2JseW9Ob0dvRE1TZlZ0K05BN1ZmdmJnTHhhcDB5ZTBJc1Q2UjcrTVd0UVRnMkx3cjJPMkZsR0RLQWVqdVk2TytHbkF2SGQ5V3Frc29PWG1qMDIxVGlDNHU4TWhVcDNnTVVLU2RRUUs3Z25qQXZ5eVJscFR1Qi9FdG1vcDh6TEZoVFdNdi9FOHArUU1PWDlIQnVmRWJVelFIVzcvNytqb0p1QT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "intSet": { + "B": "64kXa8pRAflpD63+KAlDVYxKQCyd3umG5JtpD8TkbLroWxknf8wr4Bbq60GEMDZeeYmmvL4nbEBnhHkU/96TCQ==" + }, + "doubleSet": { + "B": "zTrh4n1QV7GprvBl+0SGZHrpwLCzlU4PMjXmuYwZ1VGZ3U8ZnmRmTp4MnWmhx1lOs+QJj3SjuEhlw7d5uZ7uCg==" + }, + "byteArrayValue": { + "B": "ozqegfAhdkXdVkebF1KC4G48XdtpQTsgt+2zIdCutqI=" + }, + "intValue": { + "B": "2/ytG7LALLoO/wSVDSmvOR1amO0C06NkizQX9vztXBI=" + }, + "stringSet": { + "B": "HovxICA0tySSb/nORaKsZInFgQAvm5vvS9A8rilirumqF9iVFYaT487HCa46ty6d5PaLYQ8BeKG0S7YmyqKLqQ==" + }, + "doubleValue": { + "B": "b62bBPKQbkSyigK6dM1EL6OPMOW8j88qh8r9WcwvG8E=" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "jGJOy9PoGejN4ZdzNR6kVFBXv3G46dFVj66z/Ae8e4I=" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWFVvRDNneG5jd1VDa01tQ2xUUHJWaWpXejlzc0NZdFVHNVQwQkJBZDl6czgvNURGZndCdVY1dFhEVGpxVkpTSVJRYmFUK0ROUy9nUFNzb3ZtWVpGTGF4dWJqRE4vd2ZRTXB1OGZEOEhVQmV5S1pKTEYwNTg5OG5SNmZSSGZaVEljUmNXRE5VV2tVVlRMbUVTcFc1MXFlSFJqaDNldGlEOVFWN1JoY20ySGZOSHlZZlQ5dlNZeXBpK3pETDE5bDA1MzBMZmUxWitDQXlIczQ0cGVmemIwQnNxbGg0KzY2Z2IyY1hnOXA5bHNKdVVLdDF3dS9BNklDL1FYMTJKRmFiWlRPMCswL2FXdzZTc2RjcjczL0FvYzdRekJpK1lGVFRvZ3liNFlQZUtYV2RKazdSblNicldXVlFlWktLV3pSMTNzcEN2WS95OWtYcW9JYnA1anorYmZIUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "RBAsheB0kh7XA4EPlHGJFTaq5p08xJg+8YX/O6iC+7Y=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWE1hS3lIbnJjOXZqeEplVC9CbEZnZW15bzBNV29yNDR6ZnVyKzBUK3FZbGZYcDJOKzRReGQ1Mk1jNDNJVmNwRzUwWTNoS2FxdDhBcHFSL1VQVjVxTDVVVUJQY1p6Zms3RnlLYjcwM01UeEpObmt3SGk5ZDQxOGc2S05wYW9LbHJUSlRVOU5HUVZFYkIwSGUvRU9zeS94azl4NVZiTVhkeUt1ZWtpMElobmtBL1BPOTNIQzNKU2t2NjFoL3dpLzkrdmZtNWJYS2ZWSzdGY3JYNDRLaFhmSDgyd0xvOERtU2I3cEw2a1hRYURaUUw3WXJhTUVrL3lDWnlwMXdtdHFaTm05OExRY3NCK3FZVmhYdGxCVlJlTXhEZU8wTzNCcWd5VFJrdy9sVzVQa1NtRzZwOVBqMnJhVmJJYXViME9iUjMrOXdldFZ5RzZsL2pOSHliN1E4MFZIQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": ["0", "1", "10", "15", "200"] + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": ["?", "Cruel", "Goodbye", "World"] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHJWS3lIa1ZjeGhqa3hrSUU5ai9RSTlmcWNtc2Y5SmpUV2dRQlpuRkhVTVFHczQyK0dmeE1idUJkUkE4MjEwb0pGaDlXbGVhMCs5Zlp3azAvd1J2SlF0UTRBbmdoaVoxS0FueXc1NmV3TnBrOE03S1BGN2ZKRmd2Vlc3WnRXVDdqakRHWjFmZ1MzOHF4RG11RDNWVFpBVzJpNFBHV3F2bEFZQTYvc3hSRzUwM28rN0pVOVFsaEM5V0lzVVI5MndxbXhnQlNFcEdWendjcTNsYkJwM1Ztc0oyYmw2TU1nYWZIZkNsc0l3dVJXcU44UUsvMFRNeU4yWERFcGFpZFcxUDIrWjNQVGx5a214RDg0WVd1cWtGaHB0aVR6NzBUMHNJSnNZTGRyVFl4M3F6dzlJYVNwZjlRZXIwNVRWMWxVOVkyRTJQYW5NUWZXZnBUeDdSK0F1TWZEUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEg1WWJvRGlFdmkrVkpiZm9HdHBPcFhsTzJiRDJ2S3RMSU1UdUtqN1dTN2QyWCtJdmhSeHNvS0hMd20xdVM5YnNMbEpOUkcySnpBZzlVaU5rUHlnOEFLT3JMR21RYUFOMUp1VmVqaFpKcENURW5pRFlsRExHZ3B3UzY4TCsyUFl4eUZqMWZXN0FvSHVjZDljWWJjV1JZOUpHeGxZWnNKREJkLzVFZUhRVktaalRCNmdVd21HbmlEOVgrazI1SzhQazE5K1k3QVZkblhKZDRyOTVNOEY4ZmJUdmtKV3pZaTRoaEM5dGpPWk5qVjd6L2FMN1gyeE1yMXpVQ21XU3RqKy85QnorbkRBMXovYXZ3bG1hTTN2dmRwRHo2RGhiRmZiTFlMancvYU5JT0czOHkxOUo2ekljZkl6WDI0cFBaZGNYRHdTVUJOMHpiQlZYUEtsVHdRVXpKQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEd5d1E4dGM2Qk8wNERWL3JOc1UrVGhrcTZWL3RqN2E4ekFHTEhQeVM4TTV4SzJqK1MzbFVjbFhBR2U1OEhIN2hHMlVJc1hTLzRqbERCY0dwWmFTeExaaytNRjV3TUhxTkhOM0tzdGo1aTQxZ1ZjSkljdGJPTjhsZEhJeWFNSHgzUi9Dd1BVYmUyc0wvYk1pd2xuUUxBUVZZU25jY2VEaS9qRExESUt6ZWdhZjFVdjBBS2h1cjdtczhOeGJEY2l4Zko1NkNVNVdQZVl5ZE56Y3NFSnZGVTVqT1lkNkdQTFEram1iVVNYQytOT0M5RXluSEpDTC9pR1paSWw3eVBvYUZEY25qQ2pVbzhSQlAxaVBtMVBCWmU1N3lTblg2c0Mzb05ocWg2a2lnR0k3UEVPWkhSM0xLT2gralQreHFjWVB0ejFteGxndTBlQnFBOGE1MGJSNkJSUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHNqb1Jyb3ZYSVlaOW55UFFWajNHSytoOGx4SndpMGVYMHVGRU5HNzVQVWY5REVqUytYR0lnZHpPaDYxSlZBUllCWW9BM2ltckpGWjVzNUlnUGhFazQ0bjhkYWJJWG96WVdJU2VHYm5RbTgzUlZvV3NUS0x1R0pOTkV5T2hNVVRJK3NwVERMMzVxbndmZmJ3U3F6VmYxNmpwVUFMMEVpUVNFbTF5WkJXREk5OURIWkE0VnJaUGhCbUx5R1UxQkQxZi9FSERFK1Z5OVYwL3N1dGtsQldCMkI0bE9yUkxYUmEwelhVcDMyZWhKVk94a1o5eXVMeFU4OEdsbm5UZ1dpUGRaK1NTbzZsek1iUkdoN1VyNmtlMm02c1c0WXJaTmJGdVhUUEVWd1BuSXdycWtDVDc0WUl4ODA3VWdtRk5qckpDbTZxVWppWDdKVWFaaDJFUUlWZDJuQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + } + }, + { + "rangeKey": { + "N": "8" + }, + "hashKey": { + "N": "6" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHFoZnBVOCtSZndndTd6U2ZKMkVnb3E2anJZQjZGMUlGWWdIaFhhSzZiMk9YMkgzZUIrWkdlVEZWYkdUQWlJVm1NSjhRK2hEbWwxeTBaUThudTNjdFpVWHVhYXRUQzZOWW9rR20xVTFYbVg1cXpTcGQ2R2R3RndCamVYQXQrcStUMmR6UDVQOVRZTjZhMlZBSmd6eVEra21FSkpIWmdUb1FBWVlrRENST3ZtSnVETGpkWE1pM1BoWm91dTZTMVNJSDVINUNyWnVPdVBmc1ZiWC9LUGNnckhhVmtnL2tSQ3ozTXdmRDA4MVRUc3F4bTZQRWE5TzFCaFkwSlladXFYZlZodlhZNCtqVmd1OEhBWTlteGxaQzdkdWVXa0lXK3k1TVJIeWdDVTBVNitlRVdlSlVWK1RzbThFYkxRMmtFd25vS3RsOXVKOUw2UGJRU28xR0FHYjZLQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "intSet": { + "B": "mwGiX9m/HbHVkhpyZaSJQwRW/EfiGwa/BppMim0JM4zAUF3JufkOXBpDQZpItSbOcwAQwEI1iEUpz1cFfZsxvA==" + }, + "doubleSet": { + "NS": ["-34.2", "-3", "0", "7.6", "15"] + }, + "byteArrayValue": { + "B": "QJBfCt0G7U8ndcYZt1uyMVFGSFT/ZGfdJNgQxX7B9h8=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "C284N/u/d04heIWNVGfX6HaZW1BbcKKHNRPUP8+c0zLqPgSxn0raBppjlvEPGyciFe12kcn+fNbuQMQbDYsqKw==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "W2iOpDKlcvuPnNm3SPrPn8YhhjnG1jsJVdXwtK8vq20=" + } } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "5" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEhhNU85OFFwQzJ5YmcrZkFESHh2TjhTaGZUdVBSQk41TStzcVJXbG5lZEJsSktHaWxkN24xTjNXSVlNMkxQRmhLTUJvNytJUC9OMjREdEdoYXkzVnJiWHZZVEpLb0RJeEN2RDYxSXNGaDNWTUQyN29KdnpQemx1ZkQ0UndWV2Z5UzNvbzNiaVlROUFCTE94cG5HM1NiYzhLMUtHZEptNnhFR1dBd1FwUVdOK0RzeEtkTk50Mkp6VGxvb3ZWUWhTQXQyVksxMWsvM2RsVTEweEw0c2cyUDJ6M2wzYk1SWS9uU1Jka1N6VXZBRUwyZG5LS2tMbSswWjNMTkdWcHNXZmxaS2xweGwvWFVPV3ZWOERUSWs5NTBvL1BBSkZSUlQzZUp2SUNuMkNUY0xydm1VVHFySUltSmJVVjJSNVB2bXVONG5OU2JpeERsc2RqQzFxL3BESjh0Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" - } - }, { - "rangeKey" : { - "N" : "7" - }, - "hashKey" : { - "N" : "5" - }, - "stringValue" : { - "B" : "KiO3tgTZErY3zPEn+A9bSBUBzqsSIJcP2DSCmCeDl6pObxeNkaloc3Hc25TYFEb0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWE5zRHJHRUZIb2NaTzIzRzcrVlllOENMZitabjNaT3Q0N2tmRVBnaVZ6Q1Q2QVVSaGVoOGVNcDJXVUd1Y2FSdzI4amJmR1pQanVKNndJTWg1bUE0cmhubUxaUzdZM0QzUWdibytVTURLWUVic3VIcE9tZFRPUVpSTjFFWW10WGFsRTFrcjhxeXptNHV1SXA0VHJwQmlhNFd0dklNRytZY1A1NjVTaThEcHBwMlVUOEt0elhFN2JseW9Ob0dvRE1TZlZ0K05BN1ZmdmJnTHhhcDB5ZTBJc1Q2UjcrTVd0UVRnMkx3cjJPMkZsR0RLQWVqdVk2TytHbkF2SGQ5V3Frc29PWG1qMDIxVGlDNHU4TWhVcDNnTVVLU2RRUUs3Z25qQXZ5eVJscFR1Qi9FdG1vcDh6TEZoVFdNdi9FOHArUU1PWDlIQnVmRWJVelFIVzcvNytqb0p1QT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "intSet" : { - "B" : "64kXa8pRAflpD63+KAlDVYxKQCyd3umG5JtpD8TkbLroWxknf8wr4Bbq60GEMDZeeYmmvL4nbEBnhHkU/96TCQ==" - }, - "doubleSet" : { - "B" : "zTrh4n1QV7GprvBl+0SGZHrpwLCzlU4PMjXmuYwZ1VGZ3U8ZnmRmTp4MnWmhx1lOs+QJj3SjuEhlw7d5uZ7uCg==" - }, - "byteArrayValue" : { - "B" : "ozqegfAhdkXdVkebF1KC4G48XdtpQTsgt+2zIdCutqI=" - }, - "intValue" : { - "B" : "2/ytG7LALLoO/wSVDSmvOR1amO0C06NkizQX9vztXBI=" - }, - "stringSet" : { - "B" : "HovxICA0tySSb/nORaKsZInFgQAvm5vvS9A8rilirumqF9iVFYaT487HCa46ty6d5PaLYQ8BeKG0S7YmyqKLqQ==" - }, - "doubleValue" : { - "B" : "b62bBPKQbkSyigK6dM1EL6OPMOW8j88qh8r9WcwvG8E=" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "jGJOy9PoGejN4ZdzNR6kVFBXv3G46dFVj66z/Ae8e4I=" - } - }, { - "rangeKey" : { - "N" : "10" - }, - "hashKey" : { - "N" : "8" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWFVvRDNneG5jd1VDa01tQ2xUUHJWaWpXejlzc0NZdFVHNVQwQkJBZDl6czgvNURGZndCdVY1dFhEVGpxVkpTSVJRYmFUK0ROUy9nUFNzb3ZtWVpGTGF4dWJqRE4vd2ZRTXB1OGZEOEhVQmV5S1pKTEYwNTg5OG5SNmZSSGZaVEljUmNXRE5VV2tVVlRMbUVTcFc1MXFlSFJqaDNldGlEOVFWN1JoY20ySGZOSHlZZlQ5dlNZeXBpK3pETDE5bDA1MzBMZmUxWitDQXlIczQ0cGVmemIwQnNxbGg0KzY2Z2IyY1hnOXA5bHNKdVVLdDF3dS9BNklDL1FYMTJKRmFiWlRPMCswL2FXdzZTc2RjcjczL0FvYzdRekJpK1lGVFRvZ3liNFlQZUtYV2RKazdSblNicldXVlFlWktLV3pSMTNzcEN2WS95OWtYcW9JYnA1anorYmZIUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "RBAsheB0kh7XA4EPlHGJFTaq5p08xJg+8YX/O6iC+7Y=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "7" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWE1hS3lIbnJjOXZqeEplVC9CbEZnZW15bzBNV29yNDR6ZnVyKzBUK3FZbGZYcDJOKzRReGQ1Mk1jNDNJVmNwRzUwWTNoS2FxdDhBcHFSL1VQVjVxTDVVVUJQY1p6Zms3RnlLYjcwM01UeEpObmt3SGk5ZDQxOGc2S05wYW9LbHJUSlRVOU5HUVZFYkIwSGUvRU9zeS94azl4NVZiTVhkeUt1ZWtpMElobmtBL1BPOTNIQzNKU2t2NjFoL3dpLzkrdmZtNWJYS2ZWSzdGY3JYNDRLaFhmSDgyd0xvOERtU2I3cEw2a1hRYURaUUw3WXJhTUVrL3lDWnlwMXdtdHFaTm05OExRY3NCK3FZVmhYdGxCVlJlTXhEZU8wTzNCcWd5VFJrdy9sVzVQa1NtRzZwOVBqMnJhVmJJYXViME9iUjMrOXdldFZ5RzZsL2pOSHliN1E4MFZIQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" - } - }, { - "rangeKey" : { - "N" : "9" - }, - "hashKey" : { - "N" : "7" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "intSet" : { - "NS" : [ "0", "1", "10", "15", "200" ] - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "AAECAwQF" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "SS" : [ "?", "Cruel", "Goodbye", "World" ] - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - } - }, { - "rangeKey" : { - "N" : "1" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHJWS3lIa1ZjeGhqa3hrSUU5ai9RSTlmcWNtc2Y5SmpUV2dRQlpuRkhVTVFHczQyK0dmeE1idUJkUkE4MjEwb0pGaDlXbGVhMCs5Zlp3azAvd1J2SlF0UTRBbmdoaVoxS0FueXc1NmV3TnBrOE03S1BGN2ZKRmd2Vlc3WnRXVDdqakRHWjFmZ1MzOHF4RG11RDNWVFpBVzJpNFBHV3F2bEFZQTYvc3hSRzUwM28rN0pVOVFsaEM5V0lzVVI5MndxbXhnQlNFcEdWendjcTNsYkJwM1Ztc0oyYmw2TU1nYWZIZkNsc0l3dVJXcU44UUsvMFRNeU4yWERFcGFpZFcxUDIrWjNQVGx5a214RDg0WVd1cWtGaHB0aVR6NzBUMHNJSnNZTGRyVFl4M3F6dzlJYVNwZjlRZXIwNVRWMWxVOVkyRTJQYW5NUWZXZnBUeDdSK0F1TWZEUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEg1WWJvRGlFdmkrVkpiZm9HdHBPcFhsTzJiRDJ2S3RMSU1UdUtqN1dTN2QyWCtJdmhSeHNvS0hMd20xdVM5YnNMbEpOUkcySnpBZzlVaU5rUHlnOEFLT3JMR21RYUFOMUp1VmVqaFpKcENURW5pRFlsRExHZ3B3UzY4TCsyUFl4eUZqMWZXN0FvSHVjZDljWWJjV1JZOUpHeGxZWnNKREJkLzVFZUhRVktaalRCNmdVd21HbmlEOVgrazI1SzhQazE5K1k3QVZkblhKZDRyOTVNOEY4ZmJUdmtKV3pZaTRoaEM5dGpPWk5qVjd6L2FMN1gyeE1yMXpVQ21XU3RqKy85QnorbkRBMXovYXZ3bG1hTTN2dmRwRHo2RGhiRmZiTFlMancvYU5JT0czOHkxOUo2ekljZkl6WDI0cFBaZGNYRHdTVUJOMHpiQlZYUEtsVHdRVXpKQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" - } - }, { - "rangeKey" : { - "N" : "3" - }, - "hashKey" : { - "N" : "0" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWEd5d1E4dGM2Qk8wNERWL3JOc1UrVGhrcTZWL3RqN2E4ekFHTEhQeVM4TTV4SzJqK1MzbFVjbFhBR2U1OEhIN2hHMlVJc1hTLzRqbERCY0dwWmFTeExaaytNRjV3TUhxTkhOM0tzdGo1aTQxZ1ZjSkljdGJPTjhsZEhJeWFNSHgzUi9Dd1BVYmUyc0wvYk1pd2xuUUxBUVZZU25jY2VEaS9qRExESUt6ZWdhZjFVdjBBS2h1cjdtczhOeGJEY2l4Zko1NkNVNVdQZVl5ZE56Y3NFSnZGVTVqT1lkNkdQTFEram1iVVNYQytOT0M5RXluSEpDTC9pR1paSWw3eVBvYUZEY25qQ2pVbzhSQlAxaVBtMVBCWmU1N3lTblg2c0Mzb05ocWg2a2lnR0k3UEVPWkhSM0xLT2gralQreHFjWVB0ejFteGxndTBlQnFBOGE1MGJSNkJSUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" - } - }, { - "rangeKey" : { - "N" : "2" - }, - "hashKey" : { - "N" : "6" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHNqb1Jyb3ZYSVlaOW55UFFWajNHSytoOGx4SndpMGVYMHVGRU5HNzVQVWY5REVqUytYR0lnZHpPaDYxSlZBUllCWW9BM2ltckpGWjVzNUlnUGhFazQ0bjhkYWJJWG96WVdJU2VHYm5RbTgzUlZvV3NUS0x1R0pOTkV5T2hNVVRJK3NwVERMMzVxbndmZmJ3U3F6VmYxNmpwVUFMMEVpUVNFbTF5WkJXREk5OURIWkE0VnJaUGhCbUx5R1UxQkQxZi9FSERFK1Z5OVYwL3N1dGtsQldCMkI0bE9yUkxYUmEwelhVcDMyZWhKVk94a1o5eXVMeFU4OEdsbm5UZ1dpUGRaK1NTbzZsek1iUkdoN1VyNmtlMm02c1c0WXJaTmJGdVhUUEVWd1BuSXdycWtDVDc0WUl4ODA3VWdtRk5qckpDbTZxVWppWDdKVWFaaDJFUUlWZDJuQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" - } - }, { - "rangeKey" : { - "N" : "8" - }, - "hashKey" : { - "N" : "6" - }, - "stringValue" : { - "S" : "Hello world!" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWHFoZnBVOCtSZndndTd6U2ZKMkVnb3E2anJZQjZGMUlGWWdIaFhhSzZiMk9YMkgzZUIrWkdlVEZWYkdUQWlJVm1NSjhRK2hEbWwxeTBaUThudTNjdFpVWHVhYXRUQzZOWW9rR20xVTFYbVg1cXpTcGQ2R2R3RndCamVYQXQrcStUMmR6UDVQOVRZTjZhMlZBSmd6eVEra21FSkpIWmdUb1FBWVlrRENST3ZtSnVETGpkWE1pM1BoWm91dTZTMVNJSDVINUNyWnVPdVBmc1ZiWC9LUGNnckhhVmtnL2tSQ3ozTXdmRDA4MVRUc3F4bTZQRWE5TzFCaFkwSlladXFYZlZodlhZNCtqVmd1OEhBWTlteGxaQzdkdWVXa0lXK3k1TVJIeWdDVTBVNitlRVdlSlVWK1RzbThFYkxRMmtFd25vS3RsOXVKOUw2UGJRU28xR0FHYjZLQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "intSet" : { - "B" : "mwGiX9m/HbHVkhpyZaSJQwRW/EfiGwa/BppMim0JM4zAUF3JufkOXBpDQZpItSbOcwAQwEI1iEUpz1cFfZsxvA==" - }, - "doubleSet" : { - "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] - }, - "byteArrayValue" : { - "B" : "QJBfCt0G7U8ndcYZt1uyMVFGSFT/ZGfdJNgQxX7B9h8=" - }, - "intValue" : { - "N" : "123" - }, - "stringSet" : { - "B" : "C284N/u/d04heIWNVGfX6HaZW1BbcKKHNRPUP8+c0zLqPgSxn0raBppjlvEPGyciFe12kcn+fNbuQMQbDYsqKw==" - }, - "doubleValue" : { - "N" : "15" - }, - "version" : { - "N" : "0" - }, - "*amzn-ddb-map-sig*" : { - "B" : "W2iOpDKlcvuPnNm3SPrPn8YhhjnG1jsJVdXwtK8vq20=" - } - } ], - "HashKeyOnly" : [ { - "hashKey" : { - "S" : "Bar" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWFJsSENoT0V2WGpJdU1ma3BDTGtITUppQ0c5VkIzY1VPRU9lOXh1Z1dQVFQ5dzdLZjhzSkxjbDNOSHFGZ1pWUzdHU2trVDFjaG0yRlUrR3AyNHdDbEZ5M1AxZmovTGV0QjdBN3Y3MmhhTmxsZGE5RFJYT1l2OStpd2VQMFBMM2pwL2FoYmRCSTIvREl5ZGpJWDB0Wm5FK0xRcGlWT0huOEJ6NjhKM2xpOHM5TS9TQ0U2WWRuUHYwdEhKaEVER0pSWUFhdlFSUytaTTh5Mk1uZy9NUE9obnYwWkVGdmlpU2QxNzlyOTZFSGFUV1ErcXh2T0R5NkFnUVZYMkRRUExKRDJpemZFRDhYSVpuLzBOcHhBc3RSVzBPbXlRTEd0K1gyM0dwbjgzWkdZNjFUNGNqRTR6MUtGVUU0N0J2QjJVeDd1NlIzUzVsMmxNSm8xN1g1TDFmblM3QT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" - } - }, { - "hashKey" : { - "S" : "Baz" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWGdWbUNTMGZWanFieTkwRmVZL2VvTlQzallUblpwRXJjSm5DbGFFbHhVZUhRcTlWanRDbGltVWtPTmFLcnR3K2dvM3JPcXo2cDlWWDJtdkxyZDBUVWR3amRvdVpiUnc0UE5mcFRPeEZQUzdYN0FzU2tmZ2lNdzcvY3h6V1NESVI1OXhDejB4alM1MksxemRpeW0vTHFVWktiY2c2dTJ4QUtRbFM2cFpzTGVnOWk0bXd0YTNMK2hXQ084L0lveEhyUkc0N1UwYmhGVEVCRVdHc2gvTHZUdFdIT2J0YVNBek5vcS9XTHcwY2hRMlZzYWYybTUzeWxhNURjbEkvUFF5aVNIU3V6Rk11bmpSaGtUSzJzNE9IbEdaalVKcmUzUTdhQWY4SkZQNE1kQWVQWVVrdjl0TWdmc1dvVkVFOXVEb2tQT2I5S0l1dHA5amY0bjlOSEhZbEE2dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" - } - }, { - "hashKey" : { - "S" : "Foo" - }, - "*amzn-ddb-map-desc*" : { - "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWFh3eGFWY3JrdDZLZ1JNUG81UjdwZVFsa3pvZW5ScElkZ3BkRlNyakdBYnNzWUVGQTNnaGlEeDJzK2p5c1lxbE1WVERSZFlwTDE0a1VqeDdBQUNHUXh2Z0Fvb1BIMEtnemFDV1orRE9OOEMzVGVYb0ZkbkFEL05ISHpLM1Fjd0lrK0U3WTVrTWVsdDZqcjd2NS9ZVkRGTUliYUxnWlpZMVJCOUluc0RoWUtDZ3JSYXZJVDJVb1VvdHNwNnZJWElYVS9PZ0FRN21vdFNQdHlkbTArVnNVaEFxVENvdWI5NE1lRVFkNXZDSDRrQU02dCtFd2JqZGlkUDY2d3B2NDd3NWdLck00dVhHRkU5a2FJWDdVbGFMMWZXZFJQQVBwcGJqeFFrWTB5UHQrM0Zzd2tiY2lhME5DbjI0azFiSUFQREgzTTZwTWFPdXpmSlgvcmwvcXJ0NTNCUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" - }, - "*amzn-ddb-map-sig*" : { - "B" : "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWFJsSENoT0V2WGpJdU1ma3BDTGtITUppQ0c5VkIzY1VPRU9lOXh1Z1dQVFQ5dzdLZjhzSkxjbDNOSHFGZ1pWUzdHU2trVDFjaG0yRlUrR3AyNHdDbEZ5M1AxZmovTGV0QjdBN3Y3MmhhTmxsZGE5RFJYT1l2OStpd2VQMFBMM2pwL2FoYmRCSTIvREl5ZGpJWDB0Wm5FK0xRcGlWT0huOEJ6NjhKM2xpOHM5TS9TQ0U2WWRuUHYwdEhKaEVER0pSWUFhdlFSUytaTTh5Mk1uZy9NUE9obnYwWkVGdmlpU2QxNzlyOTZFSGFUV1ErcXh2T0R5NkFnUVZYMkRRUExKRDJpemZFRDhYSVpuLzBOcHhBc3RSVzBPbXlRTEd0K1gyM0dwbjgzWkdZNjFUNGNqRTR6MUtGVUU0N0J2QjJVeDd1NlIzUzVsMmxNSm8xN1g1TDFmblM3QT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWGdWbUNTMGZWanFieTkwRmVZL2VvTlQzallUblpwRXJjSm5DbGFFbHhVZUhRcTlWanRDbGltVWtPTmFLcnR3K2dvM3JPcXo2cDlWWDJtdkxyZDBUVWR3amRvdVpiUnc0UE5mcFRPeEZQUzdYN0FzU2tmZ2lNdzcvY3h6V1NESVI1OXhDejB4alM1MksxemRpeW0vTHFVWktiY2c2dTJ4QUtRbFM2cFpzTGVnOWk0bXd0YTNMK2hXQ084L0lveEhyUkc0N1UwYmhGVEVCRVdHc2gvTHZUdFdIT2J0YVNBek5vcS9XTHcwY2hRMlZzYWYybTUzeWxhNURjbEkvUFF5aVNIU3V6Rk11bmpSaGtUSzJzNE9IbEdaalVKcmUzUTdhQWY4SkZQNE1kQWVQWVVrdjl0TWdmc1dvVkVFOXVEb2tQT2I5S0l1dHA5amY0bjlOSEhZbEE2dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWFh3eGFWY3JrdDZLZ1JNUG81UjdwZVFsa3pvZW5ScElkZ3BkRlNyakdBYnNzWUVGQTNnaGlEeDJzK2p5c1lxbE1WVERSZFlwTDE0a1VqeDdBQUNHUXh2Z0Fvb1BIMEtnemFDV1orRE9OOEMzVGVYb0ZkbkFEL05ISHpLM1Fjd0lrK0U3WTVrTWVsdDZqcjd2NS9ZVkRGTUliYUxnWlpZMVJCOUluc0RoWUtDZ3JSYXZJVDJVb1VvdHNwNnZJWElYVS9PZ0FRN21vdFNQdHlkbTArVnNVaEFxVENvdWI5NE1lRVFkNXZDSDRrQU02dCtFd2JqZGlkUDY2d3B2NDd3NWdLck00dVhHRkU5a2FJWDdVbGFMMWZXZFJQQVBwcGJqeFFrWTB5UHQrM0Zzd2tiY2lhME5DbjI0azFiSUFQREgzTTZwTWFPdXpmSlgvcmwvcXJ0NTNCUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + } } - } ] -} \ No newline at end of file + ] +}