diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c28e211..dac50f7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,21 @@ # Changelog +## 1.15.0 -- 2021-02-04 +Adds the CachingMostRecentProvider and deprecates MostRecentProvider. + +Time-based key reauthorization logic in MostRecentProvider did not re-authorize the use of the key +after key usage permissions were changed at the key provider +(for example AWS Key Management Service). +This created the potential for keys to be used in the DynamoDB Encryption Client after permissions +to do so were revoked. + +CachingMostRecentProvider replaces MostRecentProvider and provides a cache entry TTL to reauthorize +the key with the key provider. + +MostRecentProvider is now deprecated, and is removed in 2.0.0. +See https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/most-recent-provider.html#mrp-versions for more details. + +1.15.0 also fixes interoperability issues between the Python and Java implementations of DynamoDB Encryption Client. + ## 1.14.1 -- 2019-10-14 Fixes `com.amazonaws:aws-dynamodb-encryption-java` so that it may be consumed in mavenCentral. diff --git a/README.md b/README.md index 3d8f478f..f7630405 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ You can download the [latest snapshot release][download] or pick it up from Mave com.amazonaws aws-dynamodb-encryption-java - 1.14.1 + 1.15.0 ``` @@ -177,4 +177,4 @@ For signing, the user specified signing key can be either symmetric or asymmetri [materialprovider]: sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/EncryptionMaterialsProvider.java [privatekey]: http://docs.oracle.com/javase/7/docs/api/java/security/PrivateKey.html [secretkey]: http://docs.oracle.com/javase/7/docs/api/javax/crypto/SecretKey.html -[download]: https://github.com/aws/aws-dynamodb-encryption-java/releases/tag/1.13.0 +[download]: https://github.com/aws/aws-dynamodb-encryption-java/releases diff --git a/common/pom.xml b/common/pom.xml deleted file mode 100644 index c4e59171..00000000 --- a/common/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - - software.amazon.cryptools - dynamodbencryptionclient-pom - 0.1.0-SNAPSHOT - - - dynamodbencryptionclient-common - jar - 0.1.0-SNAPSHOT - aws-dynamodb-encryption-java :: Common - AWS DynamoDB Encryption Client Common Library - diff --git a/ddej-build-tools/pom.xml b/ddej-build-tools/pom.xml deleted file mode 100644 index d4f82afb..00000000 --- a/ddej-build-tools/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - software.amazon.cryptools - ddej-build-tools - 0.1.0 - aws-dynamodb-encryption-java :: Build Tools - Houses configuration for checkstyle - - - UTF-8 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.0 - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-deploy-plugin - 3.0.0-M1 - - true - - - - - diff --git a/examples/pom.xml b/examples/pom.xml index 86c82683..695f9534 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -8,24 +8,152 @@ software.amazon.cryptools dynamodbencryptionclient-pom - 0.1.0-SNAPSHOT + 1.15.0 dynamodbencryptionclient-sdk1examples jar - 0.1.0-SNAPSHOT + 1.15.0 aws-dynamodb-encryption-java :: SDK1 Examples Examples for AWS DynamoDB Encryption Client for AWS Java SDK v1 + + 1.0.392 + 3.0.0-M3 + 3.0.0-M3 + + com.amazonaws aws-dynamodb-encryption-java - 1.13.0 + 1.15.0 + + + + org.testng + testng + 6.10 + test + + + + com.amazonaws + DynamoDBLocal + 1.10.5.1 + test + + + + com.almworks.sqlite4java + sqlite4java + ${sqlite4java.version} + test + + + + com.almworks.sqlite4java + libsqlite4java-osx + ${sqlite4java.version} + dylib + test + + + + com.almworks.sqlite4java + sqlite4java-win32-x64 + ${sqlite4java.version} + dll + test + + + + com.almworks.sqlite4java + libsqlite4java-linux-amd64 + so + ${sqlite4java.version} + test + + + + dynamodb-local + DynamoDB Local Release Repository + https://s3-us-west-2.amazonaws.com/dynamodb-local/release + + + - . + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy + test-compile + + copy-dependencies + + + test + so,dll,dylib + ${project.build.directory}/test-lib + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + false + + + sqlite4java.library.path + ${project.build.directory}/test-lib + + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + false + + + sqlite4java.library.path + ${project.build.directory}/test-lib + + + + + + + integration-test + verify + + + + + diff --git a/examples/com/amazonaws/examples/AsymmetricEncryptedItem.java b/examples/src/main/java/com/amazonaws/examples/AsymmetricEncryptedItem.java similarity index 73% rename from examples/com/amazonaws/examples/AsymmetricEncryptedItem.java rename to examples/src/main/java/com/amazonaws/examples/AsymmetricEncryptedItem.java index 6de2ed8a..2bf245f9 100644 --- a/examples/com/amazonaws/examples/AsymmetricEncryptedItem.java +++ b/examples/src/main/java/com/amazonaws/examples/AsymmetricEncryptedItem.java @@ -34,7 +34,11 @@ * For ease of the example, we create new random ones every time. */ public class AsymmetricEncryptedItem { - + private static final String STRING_FIELD_NAME = "example"; + private static final String BINARY_FIELD_NAME = "and some binary"; + private static final String NUMBER_FIELD_NAME = "some numbers"; + private static final String IGNORED_FIELD_NAME = "leave me"; + public static void main(String[] args) throws GeneralSecurityException { final String tableName = args[0]; final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); @@ -42,21 +46,21 @@ public static void main(String[] args) throws GeneralSecurityException { // You should never use the same key for encryption and signing final KeyPair wrappingKeys = keyGen.generateKeyPair(); final KeyPair signingKeys = keyGen.generateKeyPair(); - + encryptRecord(tableName, wrappingKeys, signingKeys); } - private static void encryptRecord(String tableName, KeyPair wrappingKeys, KeyPair signingKeys) throws GeneralSecurityException { + public static void encryptRecord(String tableName, KeyPair wrappingKeys, KeyPair signingKeys) throws GeneralSecurityException { // Sample record to be encrypted final String partitionKeyName = "partition_attribute"; final String sortKeyName = "sort_attribute"; final Map record = new HashMap<>(); record.put(partitionKeyName, new AttributeValue().withS("is this")); record.put(sortKeyName, new AttributeValue().withN("55")); - record.put("example", new AttributeValue().withS("data")); - record.put("some numbers", new AttributeValue().withN("99")); - record.put("and some binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); - record.put("leave me", new AttributeValue().withS("alone")); // We want to ignore this attribute + record.put(STRING_FIELD_NAME, new AttributeValue().withS("data")); + record.put(NUMBER_FIELD_NAME, new AttributeValue().withN("99")); + record.put(BINARY_FIELD_NAME, new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); + record.put(IGNORED_FIELD_NAME, new AttributeValue().withS("alone")); // We want to ignore this attribute // Set up our configuration and clients. All of this is thread-safe and can be reused across calls. // Provider Configuration @@ -82,7 +86,7 @@ private static void encryptRecord(String tableName, KeyPair wrappingKeys, KeyPai // Partition and sort keys must not be encrypted but should be signed actions.put(attributeName, signOnly); break; - case "leave me": + case IGNORED_FIELD_NAME: // For this example, we are neither signing nor encrypting this field break; default: @@ -96,6 +100,12 @@ private static void encryptRecord(String tableName, KeyPair wrappingKeys, KeyPai // Encrypt the plaintext record directly final Map encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext); + // Encrypted record fields change as expected + assert encrypted_record.get(STRING_FIELD_NAME).getB() != null; // the encrypted string is stored as bytes + assert encrypted_record.get(NUMBER_FIELD_NAME).getB() != null; // the encrypted number is stored as bytes + assert !record.get(BINARY_FIELD_NAME).getB().equals(encrypted_record.get(BINARY_FIELD_NAME).getB()); // the encrypted bytes have updated + assert record.get(IGNORED_FIELD_NAME).getS().equals(encrypted_record.get(IGNORED_FIELD_NAME).getS()); // ignored field is left as is + // We could now put the encrypted item to DynamoDB just as we would any other item. // We're skipping it to to keep the example simpler. @@ -105,5 +115,10 @@ private static void encryptRecord(String tableName, KeyPair wrappingKeys, KeyPai // Decryption is identical. We'll pretend that we retrieved the record from DynamoDB. final Map decrypted_record = encryptor.decryptRecord(encrypted_record, actions, encryptionContext); System.out.println("Decrypted Record: " + decrypted_record); - } + + // The decrypted fields match the original fields before encryption + assert record.get(STRING_FIELD_NAME).getS().equals(decrypted_record.get(STRING_FIELD_NAME).getS()); + assert record.get(NUMBER_FIELD_NAME).getN().equals(decrypted_record.get(NUMBER_FIELD_NAME).getN()); + assert record.get(BINARY_FIELD_NAME).getB().equals(decrypted_record.get(BINARY_FIELD_NAME).getB()); + } } diff --git a/examples/com/amazonaws/examples/AwsKmsEncryptedItem.java b/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java similarity index 67% rename from examples/com/amazonaws/examples/AwsKmsEncryptedItem.java rename to examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java index 848c1363..7c9f8431 100644 --- a/examples/com/amazonaws/examples/AwsKmsEncryptedItem.java +++ b/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java @@ -33,31 +33,43 @@ * Example showing use of AWS KMS CMP with record encryption functions directly. */ public class AwsKmsEncryptedItem { - + private static final String STRING_FIELD_NAME = "example"; + private static final String BINARY_FIELD_NAME = "and some binary"; + private static final String NUMBER_FIELD_NAME = "some numbers"; + private static final String IGNORED_FIELD_NAME = "leave me"; + public static void main(String[] args) throws GeneralSecurityException { final String tableName = args[0]; final String cmkArn = args[1]; final String region = args[2]; - - encryptRecord(tableName, cmkArn, region); + + AWSKMS kms = null; + try { + kms = AWSKMSClientBuilder.standard().withRegion(region).build(); + encryptRecord(tableName, cmkArn, kms); + } finally { + if (kms != null) { + kms.shutdown(); + } + } } - private static void encryptRecord(String tableName, String cmkArn, String region) throws GeneralSecurityException { + public static void encryptRecord(final String tableName, final String cmkArn, final AWSKMS kmsClient) throws GeneralSecurityException { // Sample record to be encrypted final String partitionKeyName = "partition_attribute"; final String sortKeyName = "sort_attribute"; final Map record = new HashMap<>(); record.put(partitionKeyName, new AttributeValue().withS("is this")); record.put(sortKeyName, new AttributeValue().withN("55")); - record.put("example", new AttributeValue().withS("data")); - record.put("some numbers", new AttributeValue().withN("99")); - record.put("and some binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); - record.put("leave me", new AttributeValue().withS("alone")); // We want to ignore this attribute + record.put(STRING_FIELD_NAME, new AttributeValue().withS("data")); + record.put(NUMBER_FIELD_NAME, new AttributeValue().withN("99")); + record.put(BINARY_FIELD_NAME, new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); + record.put(IGNORED_FIELD_NAME, new AttributeValue().withS("alone")); // We want to ignore this attribute // Set up our configuration and clients. All of this is thread-safe and can be reused across calls. + // This example assumes we already have a AWS KMS client `kmsClient` // Provider Configuration - final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); - final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, cmkArn); + final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kmsClient, cmkArn); // Encryptor creation final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp); @@ -79,7 +91,7 @@ private static void encryptRecord(String tableName, String cmkArn, String region // Partition and sort keys must not be encrypted but should be signed actions.put(attributeName, signOnly); break; - case "leave me": + case IGNORED_FIELD_NAME: // For this example, we are neither signing nor encrypting this field break; default: @@ -93,6 +105,12 @@ private static void encryptRecord(String tableName, String cmkArn, String region // Encrypt the plaintext record directly final Map encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext); + // Encrypted record fields change as expected + assert encrypted_record.get(STRING_FIELD_NAME).getB() != null; // the encrypted string is stored as bytes + assert encrypted_record.get(NUMBER_FIELD_NAME).getB() != null; // the encrypted number is stored as bytes + assert !record.get(BINARY_FIELD_NAME).getB().equals(encrypted_record.get(BINARY_FIELD_NAME).getB()); // the encrypted bytes have updated + assert record.get(IGNORED_FIELD_NAME).getS().equals(encrypted_record.get(IGNORED_FIELD_NAME).getS()); // ignored field is left as is + // We could now put the encrypted item to DynamoDB just as we would any other item. // We're skipping it to to keep the example simpler. @@ -102,5 +120,10 @@ private static void encryptRecord(String tableName, String cmkArn, String region // Decryption is identical. We'll pretend that we retrieved the record from DynamoDB. final Map decrypted_record = encryptor.decryptRecord(encrypted_record, actions, encryptionContext); System.out.println("Decrypted Record: " + decrypted_record); - } + + // The decrypted fields match the original fields before encryption + assert record.get(STRING_FIELD_NAME).getS().equals(decrypted_record.get(STRING_FIELD_NAME).getS()); + assert record.get(NUMBER_FIELD_NAME).getN().equals(decrypted_record.get(NUMBER_FIELD_NAME).getN()); + assert record.get(BINARY_FIELD_NAME).getB().equals(decrypted_record.get(BINARY_FIELD_NAME).getB()); + } } diff --git a/examples/com/amazonaws/examples/AwsKmsEncryptedObject.java b/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedObject.java similarity index 63% rename from examples/com/amazonaws/examples/AwsKmsEncryptedObject.java rename to examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedObject.java index 29742730..b148fed5 100644 --- a/examples/com/amazonaws/examples/AwsKmsEncryptedObject.java +++ b/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedObject.java @@ -14,6 +14,7 @@ */ package com.amazonaws.examples; +import java.nio.ByteBuffer; import java.security.GeneralSecurityException; import java.util.Arrays; import java.util.HashMap; @@ -38,18 +39,42 @@ /** * This demonstrates how to use the {@link DynamoDBMapper} with the {@link AttributeEncryptor} - * to encrypt your data. Before you can use this you need to set up a table called "ExampleTable" + * to encrypt your data. Before you can use this you need to set up a DynamoDB table called "ExampleTable" * to hold the encrypted data. + * "ExampleTable" should have a partition key named "partition_attribute" for Strings + * and a sort (range) key named "sort_attribute" for numbers. */ public class AwsKmsEncryptedObject { + public static final String EXAMPLE_TABLE_NAME = "ExampleTable"; + public static final String PARTITION_ATTRIBUTE = "partition_attribute"; + public static final String SORT_ATTRIBUTE = "sort_attribute"; + + private static final String STRING_FIELD_NAME = "example"; + private static final String BINARY_FIELD_NAME = "and some binary"; + private static final String NUMBER_FIELD_NAME = "some numbers"; + private static final String IGNORED_FIELD_NAME = "leave me"; + public static void main(String[] args) throws GeneralSecurityException { final String cmkArn = args[0]; final String region = args[1]; - - encryptRecord(cmkArn, region); + + AmazonDynamoDB ddb = null; + AWSKMS kms = null; + try { + ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); + kms = AWSKMSClientBuilder.standard().withRegion(region).build(); + encryptRecord(cmkArn, ddb, kms); + } finally { + if (ddb != null) { + ddb.shutdown(); + } + if (kms != null) { + kms.shutdown(); + } + } } - public static void encryptRecord(final String cmkArn, final String region) { + public static void encryptRecord(final String cmkArn, final AmazonDynamoDB ddbClient, final AWSKMS kmsClient) { // Sample object to be encrypted DataPoJo record = new DataPoJo(); record.setPartitionAttribute("is this"); @@ -60,16 +85,15 @@ public static void encryptRecord(final String cmkArn, final String region) { record.setLeaveMe("alone"); // Set up our configuration and clients - final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); - final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); - final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, cmkArn); + // This example assumes we already have a DynamoDB client `ddbClient` and AWS KMS client `kmsClient` + final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kmsClient, cmkArn); // Encryptor creation final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp); // Mapper Creation // Please note the use of SaveBehavior.PUT (SaveBehavior.CLOBBER works as well). // Omitting this can result in data-corruption. DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build(); - DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor)); + DynamoDBMapper mapper = new DynamoDBMapper(ddbClient, mapperConfig, new AttributeEncryptor(encryptor)); System.out.println("Plaintext Record: " + record); // Save the item to the DynamoDB table @@ -77,16 +101,28 @@ public static void encryptRecord(final String cmkArn, final String region) { // Retrieve the encrypted item (directly without decrypting) from Dynamo so we can see it in our example final Map itemKey = new HashMap<>(); - itemKey.put("partition_attribute", new AttributeValue().withS("is this")); - itemKey.put("sort_attribute", new AttributeValue().withN("55")); - System.out.println("Encrypted Record: " + ddb.getItem("ExampleTable", itemKey).getItem()); - + itemKey.put(PARTITION_ATTRIBUTE, new AttributeValue().withS("is this")); + itemKey.put(SORT_ATTRIBUTE, new AttributeValue().withN("55")); + final Map encrypted_record = ddbClient.getItem(EXAMPLE_TABLE_NAME, itemKey).getItem(); + System.out.println("Encrypted Record: " + encrypted_record); + + // Encrypted record fields change as expected + assert encrypted_record.get(STRING_FIELD_NAME).getB() != null; // the encrypted string is stored as bytes + assert encrypted_record.get(NUMBER_FIELD_NAME).getB() != null; // the encrypted number is stored as bytes + assert !ByteBuffer.wrap(record.getSomeBinary()).equals(encrypted_record.get(BINARY_FIELD_NAME).getB()); // the encrypted bytes have updated + assert record.getLeaveMe().equals(encrypted_record.get(IGNORED_FIELD_NAME).getS()); // ignored field is left as is + // Retrieve (and decrypt) it from DynamoDB DataPoJo decrypted_record = mapper.load(DataPoJo.class, "is this", 55); System.out.println("Decrypted Record: " + decrypted_record); + + // The decrypted fields match the original fields before encryption + assert record.getExample().equals(decrypted_record.getExample()); + assert record.getSomeNumbers() == decrypted_record.getSomeNumbers(); + assert Arrays.equals(record.getSomeBinary(), decrypted_record.getSomeBinary()); } - @DynamoDBTable(tableName = "ExampleTable") + @DynamoDBTable(tableName = EXAMPLE_TABLE_NAME) public static final class DataPoJo { private String partitionAttribute; private int sortAttribute; @@ -95,7 +131,7 @@ public static final class DataPoJo { private byte[] someBinary; private String leaveMe; - @DynamoDBHashKey(attributeName = "partition_attribute") + @DynamoDBHashKey(attributeName = PARTITION_ATTRIBUTE) public String getPartitionAttribute() { return partitionAttribute; } @@ -104,7 +140,7 @@ public void setPartitionAttribute(String partitionAttribute) { this.partitionAttribute = partitionAttribute; } - @DynamoDBRangeKey(attributeName = "sort_attribute") + @DynamoDBRangeKey(attributeName = SORT_ATTRIBUTE) public int getSortAttribute() { return sortAttribute; } @@ -113,7 +149,7 @@ public void setSortAttribute(int sortAttribute) { this.sortAttribute = sortAttribute; } - @DynamoDBAttribute(attributeName = "example") + @DynamoDBAttribute(attributeName = STRING_FIELD_NAME) public String getExample() { return example; } @@ -122,7 +158,7 @@ public void setExample(String example) { this.example = example; } - @DynamoDBAttribute(attributeName = "some numbers") + @DynamoDBAttribute(attributeName = NUMBER_FIELD_NAME) public long getSomeNumbers() { return someNumbers; } @@ -131,7 +167,7 @@ public void setSomeNumbers(long someNumbers) { this.someNumbers = someNumbers; } - @DynamoDBAttribute(attributeName = "and some binary") + @DynamoDBAttribute(attributeName = BINARY_FIELD_NAME) public byte[] getSomeBinary() { return someBinary; } @@ -140,7 +176,7 @@ public void setSomeBinary(byte[] someBinary) { this.someBinary = someBinary; } - @DynamoDBAttribute(attributeName = "leave me") + @DynamoDBAttribute(attributeName = IGNORED_FIELD_NAME) @DoNotTouch public String getLeaveMe() { return leaveMe; diff --git a/examples/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapper.java b/examples/src/main/java/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapper.java similarity index 71% rename from examples/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapper.java rename to examples/src/main/java/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapper.java index a665b997..3ea7c218 100644 --- a/examples/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapper.java +++ b/examples/src/main/java/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapper.java @@ -39,7 +39,23 @@ import static com.amazonaws.services.dynamodbv2.datamodeling.encryption.utils.EncryptionContextOperators.overrideEncryptionContextTableNameUsingMap; +/** + * This demonstrates how to use an operator to override the table name used in the encryption context. + * Before you can use this you need to set up a DynamoDB table called "ExampleTableForEncryptionContextOverrides" + * to hold the encrypted data. + * "ExampleTableForEncryptionContextOverrides" should have a partition key named "partition_attribute" for Strings + * and a sort (range) key named "sort_attribute" for numbers. + */ public class EncryptionContextOverridesWithDynamoDBMapper { + public static final String TABLE_NAME_TO_OVERRIDE = "ExampleTableForEncryptionContextOverrides"; + public static final String PARTITION_ATTRIBUTE = "partition_attribute"; + public static final String SORT_ATTRIBUTE = "sort_attribute"; + + private static final String STRING_FIELD_NAME = "example"; + private static final String BINARY_FIELD_NAME = "and some binary"; + private static final String NUMBER_FIELD_NAME = "some numbers"; + private static final String IGNORED_FIELD_NAME = "leave me"; + public static void main(String[] args) throws GeneralSecurityException { final String cmkArn = args[0]; final String region = args[1]; @@ -63,8 +79,8 @@ public static void main(String[] args) throws GeneralSecurityException { public static void encryptRecord(final String cmkArn, final String newEncryptionContextTableName, - AmazonDynamoDB ddb, - AWSKMS kms) throws GeneralSecurityException { + AmazonDynamoDB ddbClient, + AWSKMS kmsClient) throws GeneralSecurityException { // Sample object to be encrypted ExampleItem record = new ExampleItem(); record.setPartitionAttribute("is this"); @@ -72,11 +88,12 @@ public static void encryptRecord(final String cmkArn, record.setExample("my data"); // Set up our configuration and clients - final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, cmkArn); + // This example assumes we already have a DynamoDB client `ddbClient` and AWS KMS client `kmsClient` + final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kmsClient, cmkArn); final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp); Map tableNameEncryptionContextOverrides = new HashMap<>(); - tableNameEncryptionContextOverrides.put("ExampleTableForEncryptionContextOverrides", newEncryptionContextTableName); + tableNameEncryptionContextOverrides.put(TABLE_NAME_TO_OVERRIDE, newEncryptionContextTableName); tableNameEncryptionContextOverrides.put("AnotherExampleTableForEncryptionContextOverrides", "this table doesn't exist"); // Supply an operator to override the table name used in the encryption context @@ -89,7 +106,7 @@ public static void encryptRecord(final String cmkArn, // Omitting this can result in data-corruption. DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder() .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.PUT).build(); - DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor)); + DynamoDBMapper mapper = new DynamoDBMapper(ddbClient, mapperConfig, new AttributeEncryptor(encryptor)); System.out.println("Plaintext Record: " + record.toString()); // Save the record to the DynamoDB table @@ -99,41 +116,47 @@ public static void encryptRecord(final String cmkArn, ExampleItem decrypted_record = mapper.load(ExampleItem.class, "is this", 55); System.out.println("Decrypted Record: " + decrypted_record.toString()); + // The decrypted field matches the original field before encryption + assert record.getExample().equals(decrypted_record.getExample()); + // Setup new configuration to decrypt without using an overridden EncryptionContext final Map itemKey = new HashMap<>(); - itemKey.put("partition_attribute", new AttributeValue().withS("is this")); - itemKey.put("sort_attribute", new AttributeValue().withN("55")); + itemKey.put(PARTITION_ATTRIBUTE, new AttributeValue().withS("is this")); + itemKey.put(SORT_ATTRIBUTE, new AttributeValue().withN("55")); final EnumSet signOnly = EnumSet.of(EncryptionFlags.SIGN); final EnumSet encryptAndSign = EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN); - final Map encryptedItem = ddb.getItem("ExampleTableForEncryptionContextOverrides", itemKey) + final Map encryptedItem = ddbClient.getItem(TABLE_NAME_TO_OVERRIDE, itemKey) .getItem(); System.out.println("Encrypted Record: " + encryptedItem); Map> encryptionFlags = new HashMap<>(); - encryptionFlags.put("partition_attribute", signOnly); - encryptionFlags.put("sort_attribute", signOnly); - encryptionFlags.put("example", encryptAndSign); + encryptionFlags.put(PARTITION_ATTRIBUTE, signOnly); + encryptionFlags.put(SORT_ATTRIBUTE, signOnly); + encryptionFlags.put(STRING_FIELD_NAME, encryptAndSign); final DynamoDBEncryptor encryptorWithoutOverrides = DynamoDBEncryptor.getInstance(cmp); // Decrypt the record without using an overridden EncryptionContext - encryptorWithoutOverrides.decryptRecord(encryptedItem, + Map decrypted_without_override_record = encryptorWithoutOverrides.decryptRecord(encryptedItem, encryptionFlags, - new EncryptionContext.Builder().withHashKeyName("partition_attribute") - .withRangeKeyName("sort_attribute") + new EncryptionContext.Builder().withHashKeyName(PARTITION_ATTRIBUTE) + .withRangeKeyName(SORT_ATTRIBUTE) .withTableName(newEncryptionContextTableName) .build()); System.out.printf("The example item was encrypted using the table name '%s' in the EncryptionContext%n", newEncryptionContextTableName); + + // The decrypted field matches the original field before encryption + assert record.getExample().equals(decrypted_without_override_record.get(STRING_FIELD_NAME).getS()); } - @DynamoDBTable(tableName = "ExampleTableForEncryptionContextOverrides") + @DynamoDBTable(tableName = TABLE_NAME_TO_OVERRIDE) public static final class ExampleItem { private String partitionAttribute; private int sortAttribute; private String example; - @DynamoDBHashKey(attributeName = "partition_attribute") + @DynamoDBHashKey(attributeName = PARTITION_ATTRIBUTE) public String getPartitionAttribute() { return partitionAttribute; } @@ -142,7 +165,7 @@ public void setPartitionAttribute(String partitionAttribute) { this.partitionAttribute = partitionAttribute; } - @DynamoDBRangeKey(attributeName = "sort_attribute") + @DynamoDBRangeKey(attributeName = SORT_ATTRIBUTE) public int getSortAttribute() { return sortAttribute; } @@ -151,7 +174,7 @@ public void setSortAttribute(int sortAttribute) { this.sortAttribute = sortAttribute; } - @DynamoDBAttribute(attributeName = "example") + @DynamoDBAttribute(attributeName = STRING_FIELD_NAME) public String getExample() { return example; } diff --git a/examples/com/amazonaws/examples/MostRecentEncryptedItem.java b/examples/src/main/java/com/amazonaws/examples/MostRecentEncryptedItem.java similarity index 59% rename from examples/com/amazonaws/examples/MostRecentEncryptedItem.java rename to examples/src/main/java/com/amazonaws/examples/MostRecentEncryptedItem.java index 232cac73..5f6e870e 100644 --- a/examples/com/amazonaws/examples/MostRecentEncryptedItem.java +++ b/examples/src/main/java/com/amazonaws/examples/MostRecentEncryptedItem.java @@ -26,8 +26,8 @@ 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.CachingMostRecentProvider; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.DirectKmsMaterialProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.MostRecentProvider; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.store.MetaStore; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; @@ -35,13 +35,21 @@ import com.amazonaws.services.kms.AWSKMSClientBuilder; /** - * This demonstrates how to use the {@link MostRecentProvider} backed by a + * This demonstrates how to use the {@link CachingMostRecentProvider} backed by a * {@link MetaStore} and the {@link DirectKmsMaterialProvider} to encrypt * your data. Before you can use this, you need to set up a table to hold the - * intermediate keys. + * intermediate keys or use --setup mode to construct the table once + * and then re-run the example without the --setup mode */ public class MostRecentEncryptedItem { - + public static final String PARTITION_ATTRIBUTE = "partition_attribute"; + public static final String SORT_ATTRIBUTE = "sort_attribute"; + + private static final String STRING_FIELD_NAME = "example"; + private static final String BINARY_FIELD_NAME = "and some binary"; + private static final String NUMBER_FIELD_NAME = "some numbers"; + private static final String IGNORED_FIELD_NAME = "leave me"; + public static void main(String[] args) throws GeneralSecurityException { final String mode = args[0]; final String region = args[1]; @@ -49,37 +57,48 @@ public static void main(String[] args) throws GeneralSecurityException { final String keyTableName = args[3]; final String cmkArn = args[4]; final String materialName = args[5]; - + if (mode.equalsIgnoreCase("--setup")) { AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); MetaStore.createTable(ddb, keyTableName, new ProvisionedThroughput(1L, 1L)); return; } - - encryptRecord(tableName, keyTableName, region, cmkArn, materialName); + + AmazonDynamoDB ddb = null; + AWSKMS kms = null; + try { + ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); + kms = AWSKMSClientBuilder.standard().withRegion(region).build(); + encryptRecord(tableName, keyTableName, cmkArn, materialName, ddb, kms); + } finally { + if (ddb != null) { + ddb.shutdown(); + } + if (kms != null) { + kms.shutdown(); + } + } } - private static void encryptRecord(String tableName, String keyTableName, String region, String cmkArn, String materialName) throws GeneralSecurityException { + public static void encryptRecord(String tableName, String keyTableName, String cmkArn, String materialName, + AmazonDynamoDB ddbClient, AWSKMS kmsClient) throws GeneralSecurityException { // Sample record to be encrypted - final String partitionKeyName = "partition_attribute"; - final String sortKeyName = "sort_attribute"; final Map record = new HashMap<>(); - record.put(partitionKeyName, new AttributeValue().withS("is this")); - record.put(sortKeyName, new AttributeValue().withN("55")); - record.put("example", new AttributeValue().withS("data")); - record.put("some numbers", new AttributeValue().withN("99")); - record.put("and some binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); - record.put("leave me", new AttributeValue().withS("alone")); // We want to ignore this attribute + record.put(PARTITION_ATTRIBUTE, new AttributeValue().withS("is this")); + record.put(SORT_ATTRIBUTE, new AttributeValue().withN("55")); + record.put(STRING_FIELD_NAME, new AttributeValue().withS("data")); + record.put(NUMBER_FIELD_NAME, new AttributeValue().withN("99")); + record.put(BINARY_FIELD_NAME, new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); + record.put(IGNORED_FIELD_NAME, new AttributeValue().withS("alone")); // We want to ignore this attribute // Set up our configuration and clients. All of this is thread-safe and can be reused across calls. // Provider Configuration to protect the data keys - final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); - final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); - final DirectKmsMaterialProvider kmsProv = new DirectKmsMaterialProvider(kms, cmkArn); + // This example assumes we already have a DynamoDB client `ddbClient` and AWS KMS client `kmsClient` + final DirectKmsMaterialProvider kmsProv = new DirectKmsMaterialProvider(kmsClient, cmkArn); final DynamoDBEncryptor keyEncryptor = DynamoDBEncryptor.getInstance(kmsProv); - final MetaStore metaStore = new MetaStore(ddb, keyTableName, keyEncryptor); + final MetaStore metaStore = new MetaStore(ddbClient, keyTableName, keyEncryptor); //Provider configuration to protect the data - final MostRecentProvider cmp = new MostRecentProvider(metaStore, materialName, 60_000); + final CachingMostRecentProvider cmp = new CachingMostRecentProvider(metaStore, materialName, 60_000); // Encryptor creation final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp); @@ -87,8 +106,8 @@ private static void encryptRecord(String tableName, String keyTableName, String // Information about the context of our data (normally just Table information) final EncryptionContext encryptionContext = new EncryptionContext.Builder() .withTableName(tableName) - .withHashKeyName(partitionKeyName) - .withRangeKeyName(sortKeyName) + .withHashKeyName(PARTITION_ATTRIBUTE) + .withRangeKeyName(SORT_ATTRIBUTE) .build(); // Describe what actions need to be taken for each attribute @@ -97,12 +116,12 @@ private static void encryptRecord(String tableName, String keyTableName, String final Map> actions = new HashMap<>(); for (final String attributeName : record.keySet()) { switch (attributeName) { - case partitionKeyName: // fall through - case sortKeyName: + case PARTITION_ATTRIBUTE: // fall through + case SORT_ATTRIBUTE: // Partition and sort keys must not be encrypted but should be signed actions.put(attributeName, signOnly); break; - case "leave me": + case IGNORED_FIELD_NAME: // For this example, we are neither signing nor encrypting this field break; default: @@ -116,6 +135,12 @@ private static void encryptRecord(String tableName, String keyTableName, String // Encrypt the plaintext record directly final Map encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext); + // Encrypted record fields change as expected + assert encrypted_record.get(STRING_FIELD_NAME).getB() != null; // the encrypted string is stored as bytes + assert encrypted_record.get(NUMBER_FIELD_NAME).getB() != null; // the encrypted number is stored as bytes + assert !record.get(BINARY_FIELD_NAME).getB().equals(encrypted_record.get(BINARY_FIELD_NAME).getB()); // the encrypted bytes have updated + assert record.get(IGNORED_FIELD_NAME).getS().equals(encrypted_record.get(IGNORED_FIELD_NAME).getS()); // ignored field is left as is + // We could now put the encrypted item to DynamoDB just as we would any other item. // We're skipping it to to keep the example simpler. @@ -125,5 +150,10 @@ private static void encryptRecord(String tableName, String keyTableName, String // Decryption is identical. We'll pretend that we retrieved the record from DynamoDB. final Map decrypted_record = encryptor.decryptRecord(encrypted_record, actions, encryptionContext); System.out.println("Decrypted Record: " + decrypted_record); - } + + // The decrypted fields match the original fields before encryption + assert record.get(STRING_FIELD_NAME).getS().equals(decrypted_record.get(STRING_FIELD_NAME).getS()); + assert record.get(NUMBER_FIELD_NAME).getN().equals(decrypted_record.get(NUMBER_FIELD_NAME).getN()); + assert record.get(BINARY_FIELD_NAME).getB().equals(decrypted_record.get(BINARY_FIELD_NAME).getB()); + } } diff --git a/examples/com/amazonaws/examples/SymmetricEncryptedItem.java b/examples/src/main/java/com/amazonaws/examples/SymmetricEncryptedItem.java similarity index 75% rename from examples/com/amazonaws/examples/SymmetricEncryptedItem.java rename to examples/src/main/java/com/amazonaws/examples/SymmetricEncryptedItem.java index e54c4e75..e5f54645 100644 --- a/examples/com/amazonaws/examples/SymmetricEncryptedItem.java +++ b/examples/src/main/java/com/amazonaws/examples/SymmetricEncryptedItem.java @@ -36,7 +36,12 @@ * For ease of the example, we create new random ones every time. */ public class SymmetricEncryptedItem { - + + private static final String STRING_FIELD_NAME = "example"; + private static final String BINARY_FIELD_NAME = "and some binary"; + private static final String NUMBER_FIELD_NAME = "some numbers"; + private static final String IGNORED_FIELD_NAME = "leave me"; + public static void main(String[] args) throws GeneralSecurityException { final String tableName = args[0]; // Both AES and HMAC keys are just random bytes. @@ -48,21 +53,21 @@ public static void main(String[] args) throws GeneralSecurityException { secureRandom.nextBytes(rawHmac); final SecretKey wrappingKey = new SecretKeySpec(rawAes, "AES"); final SecretKey signingKey = new SecretKeySpec(rawHmac, "HmacSHA256"); - + encryptRecord(tableName, wrappingKey, signingKey); } - private static void encryptRecord(String tableName, SecretKey wrappingKey, SecretKey signingKey) throws GeneralSecurityException { + public static void encryptRecord(String tableName, SecretKey wrappingKey, SecretKey signingKey) throws GeneralSecurityException { // Sample record to be encrypted final String partitionKeyName = "partition_attribute"; final String sortKeyName = "sort_attribute"; final Map record = new HashMap<>(); record.put(partitionKeyName, new AttributeValue().withS("is this")); record.put(sortKeyName, new AttributeValue().withN("55")); - record.put("example", new AttributeValue().withS("data")); - record.put("some numbers", new AttributeValue().withN("99")); - record.put("and some binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); - record.put("leave me", new AttributeValue().withS("alone")); // We want to ignore this attribute + record.put(STRING_FIELD_NAME, new AttributeValue().withS("data")); + record.put(NUMBER_FIELD_NAME, new AttributeValue().withN("99")); + record.put(BINARY_FIELD_NAME, new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); + record.put(IGNORED_FIELD_NAME, new AttributeValue().withS("alone")); // We want to ignore this attribute // Set up our configuration and clients. All of this is thread-safe and can be reused across calls. // Provider Configuration @@ -91,7 +96,7 @@ private static void encryptRecord(String tableName, SecretKey wrappingKey, Secre // Partition and sort keys must not be encrypted but should be signed actions.put(attributeName, signOnly); break; - case "leave me": + case IGNORED_FIELD_NAME: // For this example, we are neither signing nor encrypting this field break; default: @@ -105,6 +110,12 @@ private static void encryptRecord(String tableName, SecretKey wrappingKey, Secre // Encrypt the plaintext record directly final Map encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext); + // Encrypted record fields change as expected + assert encrypted_record.get(STRING_FIELD_NAME).getB() != null; // the encrypted string is stored as bytes + assert encrypted_record.get(NUMBER_FIELD_NAME).getB() != null; // the encrypted number is stored as bytes + assert !record.get(BINARY_FIELD_NAME).getB().equals(encrypted_record.get(BINARY_FIELD_NAME).getB()); // the encrypted bytes have updated + assert record.get(IGNORED_FIELD_NAME).getS().equals(encrypted_record.get(IGNORED_FIELD_NAME).getS()); // ignored field is left as is + // We could now put the encrypted item to DynamoDB just as we would any other item. // We're skipping it to to keep the example simpler. @@ -114,5 +125,10 @@ private static void encryptRecord(String tableName, SecretKey wrappingKey, Secre // Decryption is identical. We'll pretend that we retrieved the record from DynamoDB. final Map decrypted_record = encryptor.decryptRecord(encrypted_record, actions, encryptionContext); System.out.println("Decrypted Record: " + decrypted_record); - } + + // The decrypted fields match the original fields before encryption + assert record.get(STRING_FIELD_NAME).getS().equals(decrypted_record.get(STRING_FIELD_NAME).getS()); + assert record.get(NUMBER_FIELD_NAME).getN().equals(decrypted_record.get(NUMBER_FIELD_NAME).getN()); + assert record.get(BINARY_FIELD_NAME).getB().equals(decrypted_record.get(BINARY_FIELD_NAME).getB()); + } } diff --git a/examples/src/test/java/com/amazonaws/examples/AsymmetricEncryptedItemTest.java b/examples/src/test/java/com/amazonaws/examples/AsymmetricEncryptedItemTest.java new file mode 100644 index 00000000..3ead80f5 --- /dev/null +++ b/examples/src/test/java/com/amazonaws/examples/AsymmetricEncryptedItemTest.java @@ -0,0 +1,24 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.amazonaws.examples; + +import org.testng.annotations.Test; + +import java.security.GeneralSecurityException; +import java.security.KeyPair; +import java.security.KeyPairGenerator; + +public class AsymmetricEncryptedItemTest { + private static final String TABLE_NAME = "java-ddbec-test-table-asym-example"; + + @Test + public void testEncryptAndDecrypt() throws GeneralSecurityException { + final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(2048); + final KeyPair wrappingKeys = keyGen.generateKeyPair(); + final KeyPair signingKeys = keyGen.generateKeyPair(); + + AsymmetricEncryptedItem.encryptRecord(TABLE_NAME, wrappingKeys, signingKeys); + } +} diff --git a/examples/src/test/java/com/amazonaws/examples/AwsKmsEncryptedItemIT.java b/examples/src/test/java/com/amazonaws/examples/AwsKmsEncryptedItemIT.java new file mode 100644 index 00000000..43dc5acf --- /dev/null +++ b/examples/src/test/java/com/amazonaws/examples/AwsKmsEncryptedItemIT.java @@ -0,0 +1,23 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.amazonaws.examples; + +import com.amazonaws.services.kms.AWSKMS; +import com.amazonaws.services.kms.AWSKMSClientBuilder; +import org.testng.annotations.Test; + +import java.security.GeneralSecurityException; + +import static com.amazonaws.examples.TestUtils.US_WEST_2; +import static com.amazonaws.examples.TestUtils.US_WEST_2_KEY_ID; + +public class AwsKmsEncryptedItemIT { + private static final String TABLE_NAME = "java-ddbec-test-table-kms-item-example"; + + @Test + public void testEncryptAndDecrypt() throws GeneralSecurityException { + final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(US_WEST_2).build(); + AwsKmsEncryptedItem.encryptRecord(TABLE_NAME, US_WEST_2_KEY_ID, kms); + } +} diff --git a/examples/src/test/java/com/amazonaws/examples/AwsKmsEncryptedObjectIT.java b/examples/src/test/java/com/amazonaws/examples/AwsKmsEncryptedObjectIT.java new file mode 100644 index 00000000..c2e31831 --- /dev/null +++ b/examples/src/test/java/com/amazonaws/examples/AwsKmsEncryptedObjectIT.java @@ -0,0 +1,31 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.amazonaws.examples; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded; +import com.amazonaws.services.kms.AWSKMS; +import com.amazonaws.services.kms.AWSKMSClientBuilder; +import org.testng.annotations.Test; + +import static com.amazonaws.examples.AwsKmsEncryptedObject.EXAMPLE_TABLE_NAME; +import static com.amazonaws.examples.AwsKmsEncryptedObject.PARTITION_ATTRIBUTE; +import static com.amazonaws.examples.AwsKmsEncryptedObject.SORT_ATTRIBUTE; +import static com.amazonaws.examples.TestUtils.US_WEST_2; +import static com.amazonaws.examples.TestUtils.US_WEST_2_KEY_ID; +import static com.amazonaws.examples.TestUtils.createDDBTable; + +public class AwsKmsEncryptedObjectIT { + + @Test + public void testEncryptAndDecrypt() { + final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(US_WEST_2).build(); + final AmazonDynamoDB ddb = DynamoDBEmbedded.create(); + + // Create the table under test + createDDBTable(ddb, EXAMPLE_TABLE_NAME, PARTITION_ATTRIBUTE, SORT_ATTRIBUTE); + + AwsKmsEncryptedObject.encryptRecord(US_WEST_2_KEY_ID, ddb, kms); + } +} diff --git a/examples/src/test/java/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapperIT.java b/examples/src/test/java/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapperIT.java new file mode 100644 index 00000000..fa32dd88 --- /dev/null +++ b/examples/src/test/java/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapperIT.java @@ -0,0 +1,35 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.amazonaws.examples; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded; + +import com.amazonaws.services.kms.AWSKMS; +import com.amazonaws.services.kms.AWSKMSClientBuilder; +import org.testng.annotations.Test; + +import java.security.GeneralSecurityException; + +import static com.amazonaws.examples.EncryptionContextOverridesWithDynamoDBMapper.PARTITION_ATTRIBUTE; +import static com.amazonaws.examples.EncryptionContextOverridesWithDynamoDBMapper.SORT_ATTRIBUTE; +import static com.amazonaws.examples.EncryptionContextOverridesWithDynamoDBMapper.TABLE_NAME_TO_OVERRIDE; +import static com.amazonaws.examples.TestUtils.US_WEST_2; +import static com.amazonaws.examples.TestUtils.US_WEST_2_KEY_ID; +import static com.amazonaws.examples.TestUtils.createDDBTable; + +public class EncryptionContextOverridesWithDynamoDBMapperIT { + private static final String OVERRIDE_TABLE_NAME = "java-ddbec-test-table-encctx-override-example"; + + @Test + public void testEncryptAndDecrypt() throws GeneralSecurityException { + final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(US_WEST_2).build(); + final AmazonDynamoDB ddb = DynamoDBEmbedded.create(); + + // Create the table under test + createDDBTable(ddb, TABLE_NAME_TO_OVERRIDE, PARTITION_ATTRIBUTE, SORT_ATTRIBUTE); + + EncryptionContextOverridesWithDynamoDBMapper.encryptRecord(US_WEST_2_KEY_ID, OVERRIDE_TABLE_NAME, ddb, kms); + } +} diff --git a/examples/src/test/java/com/amazonaws/examples/MostRecentEncryptedItemIT.java b/examples/src/test/java/com/amazonaws/examples/MostRecentEncryptedItemIT.java new file mode 100644 index 00000000..420f0a7b --- /dev/null +++ b/examples/src/test/java/com/amazonaws/examples/MostRecentEncryptedItemIT.java @@ -0,0 +1,38 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.amazonaws.examples; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.store.MetaStore; +import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded; +import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; +import com.amazonaws.services.kms.AWSKMS; +import com.amazonaws.services.kms.AWSKMSClientBuilder; +import org.testng.annotations.Test; + +import java.security.GeneralSecurityException; + +import static com.amazonaws.examples.MostRecentEncryptedItem.PARTITION_ATTRIBUTE; +import static com.amazonaws.examples.MostRecentEncryptedItem.SORT_ATTRIBUTE; +import static com.amazonaws.examples.TestUtils.*; + +public class MostRecentEncryptedItemIT { + private static final String TABLE_NAME = "java-ddbec-test-table-mostrecent-example"; + private static final String KEY_TABLE_NAME = "java-ddbec-test-table-mostrecent-example-keys"; + private static final String MATERIAL_NAME = "testMaterial"; + + @Test + public void testEncryptAndDecrypt() throws GeneralSecurityException { + final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(US_WEST_2).build(); + final AmazonDynamoDB ddb = DynamoDBEmbedded.create(); + + // Create the key table under test + MetaStore.createTable(ddb, KEY_TABLE_NAME, new ProvisionedThroughput(1L, 1L)); + + // Create the table under test + createDDBTable(ddb, TABLE_NAME, PARTITION_ATTRIBUTE, SORT_ATTRIBUTE); + + MostRecentEncryptedItem.encryptRecord(TABLE_NAME, KEY_TABLE_NAME, US_WEST_2_KEY_ID, MATERIAL_NAME, ddb, kms); + } +} diff --git a/examples/src/test/java/com/amazonaws/examples/SymmetricEncryptedItemTest.java b/examples/src/test/java/com/amazonaws/examples/SymmetricEncryptedItemTest.java new file mode 100644 index 00000000..54c14353 --- /dev/null +++ b/examples/src/test/java/com/amazonaws/examples/SymmetricEncryptedItemTest.java @@ -0,0 +1,28 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.amazonaws.examples; + +import org.testng.annotations.Test; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.security.GeneralSecurityException; +import java.security.SecureRandom; + +public class SymmetricEncryptedItemTest { + private static final String TABLE_NAME = "java-ddbec-test-table-sym-example"; + + @Test + public void testEncryptAndDecrypt() throws GeneralSecurityException { + final SecureRandom secureRandom = new SecureRandom(); + byte[] rawAes = new byte[32]; + byte[] rawHmac = new byte[32]; + secureRandom.nextBytes(rawAes); + secureRandom.nextBytes(rawHmac); + final SecretKey wrappingKey = new SecretKeySpec(rawAes, "AES"); + final SecretKey signingKey = new SecretKeySpec(rawHmac, "HmacSHA256"); + + SymmetricEncryptedItem.encryptRecord(TABLE_NAME, wrappingKey, signingKey); + } +} diff --git a/examples/src/test/java/com/amazonaws/examples/TestUtils.java b/examples/src/test/java/com/amazonaws/examples/TestUtils.java new file mode 100644 index 00000000..15030b50 --- /dev/null +++ b/examples/src/test/java/com/amazonaws/examples/TestUtils.java @@ -0,0 +1,41 @@ +package com.amazonaws.examples; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.model.*; + +import java.util.ArrayList; + +import static com.amazonaws.examples.AwsKmsEncryptedObject.*; + +public class TestUtils { + private TestUtils() { + throw new UnsupportedOperationException( + "This class exists to hold static resources and cannot be instantiated." + ); + } + + /** + * These special test keys have been configured to allow Encrypt, Decrypt, and GenerateDataKey operations from any + * AWS principal and should be used when adding new KMS tests. + * + * This should go without saying, but never use these keys for production purposes (as anyone in the world can + * decrypt data encrypted using them). + */ + public static final String US_WEST_2_KEY_ID = "arn:aws:kms:us-west-2:658956600833:key/b3537ef1-d8dc-4780-9f5a-55776cbb2f7f"; + public static final String US_WEST_2 = "us-west-2"; + + public static void createDDBTable(AmazonDynamoDB ddb, String tableName, String partitionName, String sortName) { + ArrayList attrDef = new ArrayList(); + attrDef.add(new AttributeDefinition().withAttributeName(partitionName).withAttributeType(ScalarAttributeType.S)); + attrDef.add(new AttributeDefinition().withAttributeName(sortName).withAttributeType(ScalarAttributeType.N)); + + ArrayList keySchema = new ArrayList(); + keySchema.add(new KeySchemaElement().withAttributeName(partitionName).withKeyType(KeyType.HASH)); + keySchema.add(new KeySchemaElement().withAttributeName(sortName).withKeyType(KeyType.RANGE)); + + ddb.createTable(new CreateTableRequest().withTableName(tableName) + .withAttributeDefinitions(attrDef) + .withKeySchema(keySchema) + .withProvisionedThroughput(new ProvisionedThroughput(100L, 100L))); + } +} diff --git a/pom.xml b/pom.xml index 240ded06..79ce1b75 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 software.amazon.cryptools dynamodbencryptionclient-pom - 0.1.0-SNAPSHOT + 1.15.0 pom aws-dynamodb-encryption-java :: POM @@ -20,8 +20,6 @@ - ddej-build-tools - common sdk1 examples @@ -34,20 +32,6 @@ - - UTF-8 - 1.0.392 - 8.29 - 3.1.0 - 0.1.0 - 0.8.3 - 3.0.1 - 3.0.0 - 3.0.0-M3 - 3.0.0-M3 - 3.1.1 - - amazonwebservices @@ -59,244 +43,16 @@ - - - org.testng - testng - 6.10 - test - - - - org.quicktheories - quicktheories - 0.25 - test - - - - org.hamcrest - hamcrest-all - 1.3 - test - - - - org.bouncycastle - bcprov-ext-jdk15on - 1.65 - test - - - - com.amazonaws - DynamoDBLocal - 1.10.5.1 - test - - - - com.almworks.sqlite4java - sqlite4java - ${sqlite4java.version} - test - - - - com.almworks.sqlite4java - libsqlite4java-osx - ${sqlite4java.version} - dylib - test - - - - com.almworks.sqlite4java - sqlite4java-win32-x64 - ${sqlite4java.version} - dll - test - - - - com.almworks.sqlite4java - libsqlite4java-linux-amd64 - so - ${sqlite4java.version} - test - - - - - - - dynamodb-local - DynamoDB Local Release Repository - https://s3-us-west-2.amazonaws.com/dynamodb-local/release - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.0 - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-source-plugin - 3.0.1 - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.0.1 - - *.internal:*.transform - 128m - 1024m - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.1.1 - - - copy - test-compile - - copy-dependencies - - - test - so,dll,dylib - ${project.build.directory}/test-lib - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - false - - **/Test*.java - **/*Test.java - **/*TestCase.java - **/*Tests.java - **/*TestCases.java - - - - sqlite4java.library.path - ${project.build.directory}/test-lib - - - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${maven-checkstyle-plugin.version} - - - com.puppycrawl.tools - checkstyle - ${checkstyle.version} - - - software.amazon.cryptools - ddej-build-tools - ${ddej-build-tools.version} - - - - - checkstyle - validate - - check - - - - - software/amazon/cryptools/ddej-build-tools/checkstyle/checkstyle.xml - software/amazon/cryptools/ddej-build-tools/checkstyle/checkstyle-suppressions.xml - true - true - true - true - - - - - org.apache.maven.plugins - maven-failsafe-plugin - ${maven-failsafe-plugin.version} - - false - - - sqlite4java.library.path - ${project.build.directory}/test-lib - - - - **/*ITCase.java - - - - - - integration-test - verify - - - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco-maven-plugin.version} - - - - prepare-agent - - - - report - test - - report - - - - - - - - org.apache.maven.plugins - maven-jxr-plugin - ${maven-jxr-plugin.version} + maven-deploy-plugin + 2.8.2 + + true + - + diff --git a/ddej-build-tools/src/main/resources/software/amazon/cryptools/ddej-build-tools/checkstyle/checkstyle-suppressions.xml b/sdk1/checkstyle/checkstyle-suppressions.xml similarity index 100% rename from ddej-build-tools/src/main/resources/software/amazon/cryptools/ddej-build-tools/checkstyle/checkstyle-suppressions.xml rename to sdk1/checkstyle/checkstyle-suppressions.xml diff --git a/ddej-build-tools/src/main/resources/software/amazon/cryptools/ddej-build-tools/checkstyle/checkstyle.xml b/sdk1/checkstyle/checkstyle.xml similarity index 68% rename from ddej-build-tools/src/main/resources/software/amazon/cryptools/ddej-build-tools/checkstyle/checkstyle.xml rename to sdk1/checkstyle/checkstyle.xml index 3b20f72d..bb85ec5b 100644 --- a/ddej-build-tools/src/main/resources/software/amazon/cryptools/ddej-build-tools/checkstyle/checkstyle.xml +++ b/sdk1/checkstyle/checkstyle.xml @@ -8,6 +8,6 @@ + value="^(/*|// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.)\n( * Copyright \d{4}([-]\d{4})? Amazon\.com, Inc\. or its affiliates\. All Rights Reserved\.)?$"/> diff --git a/sdk1/pom.xml b/sdk1/pom.xml index d72a09e6..36d9325e 100644 --- a/sdk1/pom.xml +++ b/sdk1/pom.xml @@ -4,16 +4,60 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - com.amazonaws aws-dynamodb-encryption-java - 1.14.1 + 1.15.0 jar aws-dynamodb-encryption-java :: SDK1 AWS DynamoDB Encryption Client for AWS Java SDK v1 https://github.com/aws/aws-dynamodb-encryption-java + + publishingCodeArtifact + + + + + codeartifact + codeartifact + + + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + --pinentry-mode + loopback + + + + + + + + + publishing @@ -81,7 +125,6 @@ 1.0.392 8.29 3.1.0 - 0.1.0 0.8.3 3.0.1 3.0.0 @@ -148,7 +191,7 @@ org.bouncycastle bcprov-ext-jdk15on - 1.60 + 1.68 test @@ -189,6 +232,34 @@ ${sqlite4java.version} test + + + com.fasterxml.jackson.core + jackson-annotations + 2.9.0 + test + + + + com.fasterxml.jackson.core + jackson-core + 2.9.8 + test + + + + com.googlecode.multithreadedtc + multithreadedtc + 1.01 + test + + + + junit + junit + 4.13.1 + test + @@ -281,11 +352,6 @@ checkstyle ${checkstyle.version} - - software.amazon.cryptools - ddej-build-tools - ${ddej-build-tools.version} - @@ -297,8 +363,8 @@ - software/amazon/cryptools/ddej-build-tools/checkstyle/checkstyle.xml - software/amazon/cryptools/ddej-build-tools/checkstyle/checkstyle-suppressions.xml + checkstyle/checkstyle.xml + checkstyle/checkstyle-suppressions.xml true true true @@ -320,6 +386,7 @@ **/*ITCase.java + **/*HolisticIT.java @@ -351,6 +418,14 @@ + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + false + + diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/materials/WrappedRawMaterials.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/materials/WrappedRawMaterials.java index bd809947..d70b5bd5 100644 --- a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/materials/WrappedRawMaterials.java +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/materials/WrappedRawMaterials.java @@ -162,9 +162,15 @@ protected SecretKey unwrapKey(Map description, byte[] encryptedK description.get(CONTENT_KEY_ALGORITHM), Cipher.SECRET_KEY, null, wrappingAlgorithm); } else { Cipher cipher = Cipher.getInstance(wrappingAlgorithm); + + // This can be of the form "AES/256" as well as "AES" e.g., + // but we want to set the SecretKey with just "AES" in either case + String[] algPieces = description.get(CONTENT_KEY_ALGORITHM).split("/", 2); + String contentKeyAlgorithm = algPieces[0]; + cipher.init(Cipher.UNWRAP_MODE, unwrappingKey, Utils.getRng()); return (SecretKey) cipher.unwrap(encryptedKey, - description.get(CONTENT_KEY_ALGORITHM), Cipher.SECRET_KEY); + contentKeyAlgorithm, Cipher.SECRET_KEY); } } diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/CachingMostRecentProvider.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/CachingMostRecentProvider.java new file mode 100644 index 00000000..1a575f8a --- /dev/null +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/CachingMostRecentProvider.java @@ -0,0 +1,183 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers; + +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.DecryptionMaterials; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.EncryptionMaterials; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.store.ProviderStore; +import com.amazonaws.services.dynamodbv2.datamodeling.internal.TTLCache; +import com.amazonaws.services.dynamodbv2.datamodeling.internal.TTLCache.EntryLoader; + +import java.util.concurrent.TimeUnit; + +import static com.amazonaws.services.dynamodbv2.datamodeling.internal.Utils.checkNotNull; + +/** + * This meta-Provider encrypts data with the most recent version of keying materials from a + * {@link ProviderStore} and decrypts using whichever version is appropriate. It also caches the + * results from the {@link ProviderStore} to avoid excessive load on the backing systems. + */ +public class CachingMostRecentProvider implements EncryptionMaterialsProvider { + private static final long INITIAL_VERSION = 0; + private static final String PROVIDER_CACHE_KEY_DELIM = "#"; + private static final int DEFAULT_CACHE_MAX_SIZE = 1000; + + private final long ttlInNanos; + private final ProviderStore keystore; + protected final String defaultMaterialName; + private final TTLCache providerCache; + private final TTLCache versionCache; + + private final EntryLoader versionLoader = new EntryLoader() { + @Override + public Long load(String entryKey) { + return keystore.getMaxVersion(entryKey); + } + }; + + private final EntryLoader providerLoader = new EntryLoader() { + @Override + public EncryptionMaterialsProvider load(String entryKey) { + final String[] parts = entryKey.split(PROVIDER_CACHE_KEY_DELIM, 2); + if (parts.length != 2) { + throw new IllegalStateException("Invalid cache key for provider cache: " + entryKey); + } + return keystore.getProvider(parts[0], Long.parseLong(parts[1])); + } + }; + + + /** + * Creates a new {@link CachingMostRecentProvider}. + * + * @param keystore + * The key store that this provider will use to determine which material and which version of material to use + * @param materialName + * The name of the materials associated with this provider + * @param ttlInMillis + * The length of time in milliseconds to cache the most recent provider + */ + public CachingMostRecentProvider(final ProviderStore keystore, final String materialName, final long ttlInMillis) { + this(keystore, materialName, ttlInMillis, DEFAULT_CACHE_MAX_SIZE); + } + + /** + * Creates a new {@link CachingMostRecentProvider}. + * + * @param keystore + * The key store that this provider will use to determine which material and which version of material to use + * @param materialName + * The name of the materials associated with this provider + * @param ttlInMillis + * The length of time in milliseconds to cache the most recent provider + * @param maxCacheSize + * The maximum size of the underlying caches this provider uses. Entries will be evicted from the cache + * once this size is exceeded. + */ + public CachingMostRecentProvider(final ProviderStore keystore, final String materialName, final long ttlInMillis, final int maxCacheSize) { + this.keystore = checkNotNull(keystore, "keystore must not be null"); + this.defaultMaterialName = materialName; + this.ttlInNanos = TimeUnit.MILLISECONDS.toNanos(ttlInMillis); + + this.providerCache = new TTLCache<>(maxCacheSize, ttlInMillis, providerLoader); + this.versionCache = new TTLCache<>(maxCacheSize, ttlInMillis, versionLoader); + } + + @Override + public EncryptionMaterials getEncryptionMaterials(EncryptionContext context) { + final String materialName = getMaterialName(context); + final long currentVersion = versionCache.load(materialName); + + if (currentVersion < 0) { + // The material hasn't been created yet, so specify a loading function + // to create the first version of materials and update both caches. + // We want this to be done as part of the cache load to ensure that this logic + // only happens once in a multithreaded environment, + // in order to limit calls to the keystore's dependencies. + final String cacheKey = buildCacheKey(materialName, INITIAL_VERSION); + EncryptionMaterialsProvider newProvider = providerCache.load( + cacheKey, + s -> { + // Create the new material in the keystore + final String[] parts = s.split(PROVIDER_CACHE_KEY_DELIM, 2); + if (parts.length != 2) { + throw new IllegalStateException("Invalid cache key for provider cache: " + s); + } + EncryptionMaterialsProvider provider = keystore.getOrCreate(parts[0], Long.parseLong(parts[1])); + + // We now should have version 0 in our keystore. + // Update the version cache for this material as a side effect + versionCache.put(materialName, INITIAL_VERSION); + + // Return the new materials to be put into the cache + return provider; + } + ); + + return newProvider.getEncryptionMaterials(context); + } else { + final String cacheKey = buildCacheKey(materialName, currentVersion); + return providerCache.load(cacheKey).getEncryptionMaterials(context); + } + } + + public DecryptionMaterials getDecryptionMaterials(EncryptionContext context) { + final long version = keystore.getVersionFromMaterialDescription( + context.getMaterialDescription()); + final String materialName = getMaterialName(context); + final String cacheKey = buildCacheKey(materialName, version); + + EncryptionMaterialsProvider provider = providerCache.load(cacheKey); + return provider.getDecryptionMaterials(context); + } + + /** + * Completely empties the cache of both the current and old versions. + */ + @Override + public void refresh() { + versionCache.clear(); + providerCache.clear(); + } + + public String getMaterialName() { + return defaultMaterialName; + } + + public long getTtlInMills() { + return TimeUnit.NANOSECONDS.toMillis(ttlInNanos); + } + + /** + * The current version of the materials being used for encryption. Returns -1 if we do not + * currently have a current version. + */ + public long getCurrentVersion() { + return versionCache.load(getMaterialName()); + } + + /** + * The last time the current version was updated. Returns 0 if we do not currently have a + * current version. + */ + public long getLastUpdated() { + // We cache a version of -1 to mean that there is not a current version + if (versionCache.load(getMaterialName()) < 0) { + return 0; + } + // Otherwise, return the last update time of that entry + return TimeUnit.NANOSECONDS.toMillis(versionCache.getLastUpdated(getMaterialName())); + } + + protected String getMaterialName(final EncryptionContext context) { + return defaultMaterialName; + } + + private static String buildCacheKey(final String materialName, final long version) { + StringBuilder result = new StringBuilder(materialName); + result.append(PROVIDER_CACHE_KEY_DELIM); + result.append(version); + return result.toString(); + } +} diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java index b7a7865e..bee842ba 100644 --- a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java @@ -263,6 +263,7 @@ protected GenerateDataKeyResult generateDataKey(final GenerateDataKeyRequest req *
{@code RangeKeyValue}
*
{@link #TABLE_NAME_EC_KEY}
*
{@code TableName}
+ * */ protected void populateKmsEcFromEc(EncryptionContext context, Map kmsEc) { final String hashKeyName = context.getHashKeyName(); diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/MostRecentProvider.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/MostRecentProvider.java index 9edf116b..ce926f16 100644 --- a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/MostRecentProvider.java +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/MostRecentProvider.java @@ -1,15 +1,5 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except - * in compliance with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers; import java.util.concurrent.atomic.AtomicReference; @@ -21,12 +11,24 @@ import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.store.ProviderStore; import com.amazonaws.services.dynamodbv2.datamodeling.internal.LRUCache; +import static com.amazonaws.services.dynamodbv2.datamodeling.internal.Utils.checkNotNull; + /** * This meta-Provider encrypts data with the most recent version of keying materials from a * {@link ProviderStore} and decrypts using whichever version is appropriate. It also caches the * results from the {@link ProviderStore} to avoid excessive load on the backing systems. The cache * is not currently configurable. + * + * @deprecated This provider uses a TTL value to determine when to ping the keystore + * to get the current materials version, instead of using the TTL value to determine + * when to expire cached materials. This is unintuitive behavior for users of this provider + * who may wish to use a TTL to force the keystore to re-obtain materials. + * + * Use the CachingMostRecentProvider, which uses a user defined TTL value to + * also expire the cached materials themselves, forcing + * the keystore to regularly re-obtain materials. */ +@Deprecated public class MostRecentProvider implements EncryptionMaterialsProvider { private static final long MILLI_TO_NANO = 1000000L; private static final long TTL_GRACE_IN_NANO = 500 * MILLI_TO_NANO; @@ -165,14 +167,6 @@ private static String buildCacheKey(final String materialName, final long versio return result.toString(); } - private static V checkNotNull(final V ref, final String errMsg) { - if (ref == null) { - throw new NullPointerException(errMsg); - } else { - return ref; - } - } - private static class LockedState { private final ReentrantLock lock = new ReentrantLock(true); private volatile AtomicReference state = new AtomicReference<>(new State()); diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/LRUCache.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/LRUCache.java index 00c79eb7..e4efb3b6 100644 --- a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/LRUCache.java +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/LRUCache.java @@ -1,26 +1,11 @@ -/* - * Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazonaws.services.dynamodbv2.datamodeling.internal; import com.amazonaws.annotation.ThreadSafe; -import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -36,10 +21,7 @@ public final class LRUCache { * Used for the internal cache. */ private final Map map; - /** - * Listener for cache entry eviction. - */ - private final RemovalListener listener; + /** * Maximum size of the cache. */ @@ -48,25 +30,13 @@ public final class LRUCache { /** * @param maxSize * the maximum number of entries of the cache - * @param listener - * object which is notified immediately prior to the removal of - * any objects from the cache */ - public LRUCache(final int maxSize, final RemovalListener listener) { + public LRUCache(final int maxSize) { if (maxSize < 1) { throw new IllegalArgumentException("maxSize " + maxSize + " must be at least 1"); } this.maxSize = maxSize; - this.listener = listener; - map = Collections.synchronizedMap(new LRUHashMap(maxSize, listener)); - } - - /** - * @param maxSize - * the maximum number of entries of the cache - */ - public LRUCache(final int maxSize) { - this(maxSize, null); + map = Collections.synchronizedMap(new LRUHashMap<>(maxSize)); } /** @@ -96,23 +66,11 @@ public int getMaxSize() { } public void clear() { - // The more complicated logic is to ensure that the listener is - // actually called for all entries. - if (listener != null) { - List> removedEntries = new ArrayList>(); - synchronized (map) { - Iterator> it = map.entrySet().iterator(); - while(it.hasNext()) { - removedEntries.add(it.next()); - it.remove(); - } - } - for (Entry entry : removedEntries) { - listener.onRemoval(entry); - } - } else { - map.clear(); - } + map.clear(); + } + + public T remove(String key) { + return map.remove(key); } @Override @@ -123,27 +81,15 @@ public String toString() { @SuppressWarnings("serial") private static class LRUHashMap extends LinkedHashMap { private final int maxSize; - private final RemovalListener listener; - private LRUHashMap(final int maxSize, final RemovalListener listener) { + private LRUHashMap(final int maxSize) { super(10, 0.75F, true); this.maxSize = maxSize; - this.listener = listener; } @Override protected boolean removeEldestEntry(final Entry eldest) { - if (size() > maxSize) { - if (listener != null) { - listener.onRemoval(eldest); - } - return true; - } - return false; + return size() > maxSize; } } - - public static interface RemovalListener { - public void onRemoval(Entry entry); - } } diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/MsClock.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/MsClock.java new file mode 100644 index 00000000..f0f77b48 --- /dev/null +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/MsClock.java @@ -0,0 +1,20 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except + * in compliance with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.amazonaws.services.dynamodbv2.datamodeling.internal; + +interface MsClock { + MsClock WALLCLOCK = System::nanoTime; + + public long timestampNano(); +} diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/TTLCache.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/TTLCache.java new file mode 100644 index 00000000..18a3af1f --- /dev/null +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/TTLCache.java @@ -0,0 +1,259 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package com.amazonaws.services.dynamodbv2.datamodeling.internal; + +import com.amazonaws.annotation.ThreadSafe; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Function; + +import static com.amazonaws.services.dynamodbv2.datamodeling.internal.Utils.checkNotNull; + +/** + * A cache, backed by an LRUCache, that uses a loader to calculate values on cache miss + * or expired TTL. + * + * Note that this cache does not proactively evict expired entries, + * however will immediately evict entries discovered to be expired on load. + * + * @param + * value type + */ +@ThreadSafe +public final class TTLCache { + /** + * Used for the internal cache. + */ + private final LRUCache> cache; + + /** + * Time to live for entries in the cache. + */ + private final long ttlInNanos; + + /** + * Used for loading new values into the cache on cache miss or expiration. + */ + private final EntryLoader defaultLoader; + + // Mockable time source, to allow us to test TTL behavior. + // package access for tests + MsClock clock = MsClock.WALLCLOCK; + + private static final long TTL_GRACE_IN_NANO = TimeUnit.MILLISECONDS.toNanos(500); + + /** + * @param maxSize + * the maximum number of entries of the cache + * @param ttlInMillis + * the time to live value for entries of the cache, in milliseconds + */ + public TTLCache(final int maxSize, final long ttlInMillis, final EntryLoader loader) { + if (maxSize < 1) { + throw new IllegalArgumentException("maxSize " + maxSize + " must be at least 1"); + } + if (ttlInMillis < 1) { + throw new IllegalArgumentException("ttlInMillis " + maxSize + " must be at least 1"); + } + this.ttlInNanos = TimeUnit.MILLISECONDS.toNanos(ttlInMillis); + this.cache = new LRUCache<>(maxSize); + this.defaultLoader = checkNotNull(loader, "loader must not be null"); + } + + /** + * Uses the default loader to calculate the value at key and insert it into the cache, + * if it doesn't already exist or is expired according to the TTL. + * + * This immediately evicts entries past the TTL such that a load failure results + * in the removal of the entry. + * + * Entries that are not expired according to the TTL are returned without recalculating the value. + * + * Within a grace period past the TTL, the cache may either return the cached value without recalculating + * or use the loader to recalculate the value. This is implemented such that, in a multi-threaded environment, + * only one thread per cache key uses the loader to recalculate the value at one time. + * + * @param key + * The cache key to load the value at + * @return + * The value of the given value (already existing or re-calculated). + */ + public T load(final String key) { + return load(key, defaultLoader::load); + } + + /** + * Uses the inputted function to calculate the value at key and insert it into the cache, + * if it doesn't already exist or is expired according to the TTL. + * + * This immediately evicts entries past the TTL such that a load failure results + * in the removal of the entry. + * + * Entries that are not expired according to the TTL are returned without recalculating the value. + * + * Within a grace period past the TTL, the cache may either return the cached value without recalculating + * or use the loader to recalculate the value. This is implemented such that, in a multi-threaded environment, + * only one thread per cache key uses the loader to recalculate the value at one time. + * + * Returns the value of the given key (already existing or re-calculated). + * + * @param key + * The cache key to load the value at + * @param f + * The function to use to load the value, given key as input + * @return + * The value of the given value (already existing or re-calculated). + */ + public T load(final String key, Function f) { + final LockedState ls = cache.get(key); + + if (ls == null) { + // The entry doesn't exist yet, so load a new one. + return loadNewEntryIfAbsent(key, f); + } else if (clock.timestampNano() - ls.getState().lastUpdatedNano > ttlInNanos + TTL_GRACE_IN_NANO) { + // The data has expired past the grace period. + // Evict the old entry and load a new entry. + cache.remove(key); + return loadNewEntryIfAbsent(key, f); + } else if (clock.timestampNano() - ls.getState().lastUpdatedNano <= ttlInNanos) { + // The data hasn't expired. Return as-is from the cache. + return ls.getState().data; + } else if (!ls.tryLock()) { + // We are in the TTL grace period. If we couldn't grab the lock, then some other + // thread is currently loading the new value. Because we are in the grace period, + // use the cached data instead of waiting for the lock. + return ls.getState().data; + } + + // We are in the grace period and have acquired a lock. + // Update the cache with the value determined by the loading function. + try { + T loadedData = f.apply(key); + ls.update(loadedData, clock.timestampNano()); + return ls.getState().data; + } finally { + ls.unlock(); + } + } + + // Synchronously calculate the value for a new entry in the cache if it doesn't already exist. + // Otherwise return the cached value. + // It is important that this is the only place where we use the loader for a new entry, + // given that we don't have the entry yet to lock on. + // This ensures that the loading function is only called once if multiple threads + // attempt to add a new entry for the same key at the same time. + private synchronized T loadNewEntryIfAbsent(final String key, Function f) { + // If the entry already exists in the cache, return it + final LockedState cachedState = cache.get(key); + if (cachedState != null) { + return cachedState.getState().data; + } + + // Otherwise, load the data and create a new entry + T loadedData = f.apply(key); + LockedState ls = new LockedState<>(loadedData, clock.timestampNano()); + cache.add(key, ls); + return loadedData; + } + + /** + * Put a new entry in the cache. + * Returns the value previously at that key in the cache, + * or null if the entry previously didn't exist or + * is expired. + */ + public synchronized T put(final String key, final T value) { + LockedState ls = new LockedState<>(value, clock.timestampNano()); + LockedState oldLockedState = cache.add(key, ls); + if (oldLockedState == null || clock.timestampNano() - oldLockedState.getState().lastUpdatedNano > ttlInNanos + TTL_GRACE_IN_NANO) { + return null; + } + return oldLockedState.getState().data; + } + + /** + * Get when the entry at this key was last updated. + * Returns 0 if the entry doesn't exist at key. + */ + public long getLastUpdated(String key) { + LockedState ls = cache.get(key); + if (ls == null) { + return 0; + } + return ls.getState().lastUpdatedNano; + } + + /** + * Returns the current size of the cache. + */ + public int size() { + return cache.size(); + } + + /** + * Returns the maximum size of the cache. + */ + public int getMaxSize() { + return cache.getMaxSize(); + } + + /** + * Clears all entries from the cache. + */ + public void clear() { + cache.clear(); + } + + @Override + public String toString() { + return cache.toString(); + } + + public interface EntryLoader { + T load(String entryKey); + } + + // An object which stores a state alongside a lock, + // and performs updates to that state atomically. + // The state may only be updated if the lock is acquired by the current thread. + private static class LockedState { + private final ReentrantLock lock = new ReentrantLock(true); + private final AtomicReference> state; + + public LockedState(T data, long createTimeNano) { + state = new AtomicReference<>(new State<>(data, createTimeNano)); + } + + public State getState() { + return state.get(); + } + + public void unlock() { + lock.unlock(); + } + + public boolean tryLock() { + return lock.tryLock(); + } + + public void update(T data, long createTimeNano) { + if (!lock.isHeldByCurrentThread()) { + throw new IllegalStateException("Lock not held by current thread"); + } + state.set(new State<>(data, createTimeNano)); + } + } + + // An object that holds some data and the time at which this object was created + private static class State { + public final T data; + public final long lastUpdatedNano; + + public State(T data, long lastUpdatedNano) { + this.data = data; + this.lastUpdatedNano = lastUpdatedNano; + } + } +} diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/Utils.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/Utils.java index a4beb8ac..5ee04895 100644 --- a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/Utils.java +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/Utils.java @@ -39,4 +39,12 @@ public static byte[] getRandom(int len) { getRng().nextBytes(result); return result; } + + public static V checkNotNull(final V ref, final String errMsg) { + if (ref == null) { + throw new NullPointerException(errMsg); + } else { + return ref; + } + } } diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java new file mode 100644 index 00000000..e982121f --- /dev/null +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticIT.java @@ -0,0 +1,840 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package com.amazonaws.services.dynamodbv2.datamodeling; + +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.providers.AsymmetricStaticProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.CachingMostRecentProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.DirectKmsMaterialProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.EncryptionMaterialsProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.SymmetricStaticProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.WrappedMaterialsProvider; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.store.MetaStore; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.store.ProviderStore; +import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded; +import com.amazonaws.services.dynamodbv2.model.AttributeAction; +import com.amazonaws.services.dynamodbv2.model.AttributeDefinition; +import com.amazonaws.services.dynamodbv2.model.AttributeValue; +import com.amazonaws.services.dynamodbv2.model.AttributeValueUpdate; +import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException; +import com.amazonaws.services.dynamodbv2.model.CreateTableRequest; +import com.amazonaws.services.dynamodbv2.model.KeySchemaElement; +import com.amazonaws.services.dynamodbv2.model.KeyType; +import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; +import com.amazonaws.services.dynamodbv2.model.PutItemRequest; +import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType; +import com.amazonaws.services.dynamodbv2.model.ScanRequest; +import com.amazonaws.services.dynamodbv2.model.ScanResult; +import com.amazonaws.services.dynamodbv2.model.UpdateItemRequest; +import com.amazonaws.services.dynamodbv2.testing.AttributeValueDeserializer; +import com.amazonaws.services.dynamodbv2.testing.AttributeValueSerializer; +import com.amazonaws.services.dynamodbv2.testing.ScenarioManifest; +import com.amazonaws.services.dynamodbv2.testing.ScenarioManifest.KeyData; +import com.amazonaws.services.dynamodbv2.testing.ScenarioManifest.Keys; +import com.amazonaws.services.dynamodbv2.testing.ScenarioManifest.Scenario; +import com.amazonaws.services.dynamodbv2.testing.types.BaseClass; +import com.amazonaws.services.dynamodbv2.testing.types.HashKeyOnly; +import com.amazonaws.services.dynamodbv2.testing.types.KeysOnly; +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.kms.AWSKMS; +import com.amazonaws.services.kms.AWSKMSClientBuilder; +import com.amazonaws.util.Base64; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.junit.Before; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.security.GeneralSecurityException; +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.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNull; +import static org.testng.AssertJUnit.assertTrue; +import static org.testng.AssertJUnit.fail; + +public class TransformerHolisticIT { + private static final SecretKey aesKey = new SecretKeySpec(new byte[]{0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, "AES"); + private static final SecretKey hmacKey = new SecretKeySpec(new byte[]{0, + 1, 2, 3, 4, 5, 6, 7}, "HmacSHA256"); + private static final String rsaEncPub = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtiNSLSvT9cExXOcD0dGZ" + + "9DFEMHw8895gAZcCdSppDrxbD7XgZiQYTlgt058i5fS+l11guAUJtKt5sZ2u8Fx0" + + "K9pxMdlczGtvQJdx/LQETEnLnfzAijvHisJ8h6dQOVczM7t01KIkS24QZElyO+kY" + + "qMWLytUV4RSHnrnIuUtPHCe6LieDWT2+1UBguxgtFt1xdXlquACLVv/Em3wp40Xc" + + "bIwzhqLitb98rTY/wqSiGTz1uvvBX46n+f2j3geZKCEDGkWcXYw3dH4lRtDWTbqw" + + "eRcaNDT/MJswQlBk/Up9KCyN7gjX67gttiCO6jMoTNDejGeJhG4Dd2o0vmn8WJlr" + + "5wIDAQAB"; + private static final String rsaEncPriv = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2I1ItK9P1wTFc" + + "5wPR0Zn0MUQwfDzz3mABlwJ1KmkOvFsPteBmJBhOWC3TnyLl9L6XXWC4BQm0q3mx" + + "na7wXHQr2nEx2VzMa29Al3H8tARMScud/MCKO8eKwnyHp1A5VzMzu3TUoiRLbhBk" + + "SXI76RioxYvK1RXhFIeeuci5S08cJ7ouJ4NZPb7VQGC7GC0W3XF1eWq4AItW/8Sb" + + "fCnjRdxsjDOGouK1v3ytNj/CpKIZPPW6+8Ffjqf5/aPeB5koIQMaRZxdjDd0fiVG" + + "0NZNurB5Fxo0NP8wmzBCUGT9Sn0oLI3uCNfruC22II7qMyhM0N6MZ4mEbgN3ajS+" + + "afxYmWvnAgMBAAECggEBAIIU293zDWDZZ73oJ+w0fHXQsdjHAmlRitPX3CN99KZX" + + "k9m2ldudL9bUV3Zqk2wUzgIg6LDEuFfWmAVojsaP4VBopKtriEFfAYfqIbjPgLpT" + + "gh8FoyWW6D6MBJCFyGALjUAHQ7uRScathvt5ESMEqV3wKJTmdsfX97w/B8J+rLN3" + + "3fT3ZJUck5duZ8XKD+UtX1Y3UE1hTWo3Ae2MFND964XyUqy+HaYXjH0x6dhZzqyJ" + + "/OJ/MPGeMJgxp+nUbMWerwxrLQceNFVgnQgHj8e8k4fd04rkowkkPua912gNtmz7" + + "DuIEvcMnY64z585cn+cnXUPJwtu3JbAmn/AyLsV9FLECgYEA798Ut/r+vORB16JD" + + "KFu38pQCgIbdCPkXeI0DC6u1cW8JFhgRqi+AqSrEy5SzY3IY7NVMSRsBI9Y026Bl" + + "R9OQwTrOzLRAw26NPSDvbTkeYXlY9+hX7IovHjGkho/OxyTJ7bKRDYLoNCz56BC1" + + "khIWvECpcf/fZU0nqOFVFqF3H/UCgYEAwmJ4rjl5fksTNtNRL6ivkqkHIPKXzk5w" + + "C+L90HKNicic9bqyX8K4JRkGKSNYN3mkjrguAzUlEld390qNBw5Lu7PwATv0e2i+" + + "6hdwJsjTKNpj7Nh4Mieq6d7lWe1L8FLyHEhxgIeQ4BgqrVtPPOH8IBGpuzVZdWwI" + + "dgOvEvAi/usCgYBdfk3NB/+SEEW5jn0uldE0s4vmHKq6fJwxWIT/X4XxGJ4qBmec" + + "NbeoOAtMbkEdWbNtXBXHyMbA+RTRJctUG5ooNou0Le2wPr6+PMAVilXVGD8dIWpj" + + "v9htpFvENvkZlbU++IKhCY0ICR++3ARpUrOZ3Hou/NRN36y9nlZT48tSoQKBgES2" + + "Bi6fxmBsLUiN/f64xAc1lH2DA0I728N343xRYdK4hTMfYXoUHH+QjurvwXkqmI6S" + + "cEFWAdqv7IoPYjaCSSb6ffYRuWP+LK4WxuAO0QV53SSViDdCalntHmlhRhyXVVnG" + + "CckDIqT0JfHNev7savDzDWpNe2fUXlFJEBPDqrstAoGBAOpd5+QBHF/tP5oPILH4" + + "aD/zmqMH7VtB+b/fOPwtIM+B/WnU7hHLO5t2lJYu18Be3amPkfoQIB7bpkM3Cer2" + + "G7Jw+TcHrY+EtIziDB5vwau1fl4VcbA9SfWpBojJ5Ifo9ELVxGiK95WxeQNSmLUy" + + "7AJzhK1Gwey8a/v+xfqiu9sE"; + private static final PrivateKey rsaPriv; + private static final PublicKey rsaPub; + private static final KeyPair rsaPair; + private 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 AmazonDynamoDB client; + private static AWSKMS kmsClient = AWSKMSClientBuilder.standard().build(); + + private static Map keyDataMap = new HashMap<>(); + + // AttributeEncryptor *must* be used with SaveBehavior.CLOBBER to avoid the risk of data corruption. + private static final DynamoDBMapperConfig CLOBBER_CONFIG = + DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.CLOBBER).build(); + private 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(); + + private static final BaseClass ENCRYPTED_TEST_VALUE_2 = new BaseClass(); + private static final Mixed MIXED_TEST_VALUE_2 = new Mixed(); + private static final SignOnly SIGNED_TEST_VALUE_2 = new SignOnly(); + private static final Untouched UNTOUCHED_TEST_VALUE_2 = new Untouched(); + + private static final String TEST_VECTOR_MANIFEST_DIR = "/vectors/encrypted_item/"; + private static final String SCENARIO_MANIFEST_PATH = TEST_VECTOR_MANIFEST_DIR + "scenarios.json"; + private static final String JAVA_DIR = "java"; + + static { + try { + KeyFactory rsaFact = KeyFactory.getInstance("RSA"); + rsaPub = rsaFact.generatePublic(new X509EncodedKeySpec(Base64 + .decode(rsaEncPub))); + rsaPriv = rsaFact.generatePrivate(new PKCS8EncodedKeySpec(Base64 + .decode(rsaEncPriv))); + rsaPair = new KeyPair(rsaPub, rsaPriv); + } catch (GeneralSecurityException ex) { + throw new RuntimeException(ex); + } + symProv = new SymmetricStaticProvider(aesKey, hmacKey); + asymProv = new AsymmetricStaticProvider(rsaPair, rsaPair); + symWrappedProv = new WrappedMaterialsProvider(aesKey, aesKey, hmacKey); + + ENCRYPTED_TEST_VALUE.setHashKey(5); + ENCRYPTED_TEST_VALUE.setRangeKey(7); + ENCRYPTED_TEST_VALUE.setVersion(0); + ENCRYPTED_TEST_VALUE.setIntValue(123); + ENCRYPTED_TEST_VALUE.setStringValue("Hello world!"); + ENCRYPTED_TEST_VALUE.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); + ENCRYPTED_TEST_VALUE.setStringSet(new HashSet(Arrays.asList( + "Goodbye", "Cruel", "World", "?"))); + ENCRYPTED_TEST_VALUE.setIntSet(new HashSet(Arrays.asList(1, + 200, 10, 15, 0))); + + MIXED_TEST_VALUE.setHashKey(6); + MIXED_TEST_VALUE.setRangeKey(8); + MIXED_TEST_VALUE.setVersion(0); + MIXED_TEST_VALUE.setIntValue(123); + MIXED_TEST_VALUE.setStringValue("Hello world!"); + MIXED_TEST_VALUE.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); + MIXED_TEST_VALUE.setStringSet(new HashSet(Arrays.asList( + "Goodbye", "Cruel", "World", "?"))); + MIXED_TEST_VALUE.setIntSet(new HashSet(Arrays.asList(1, 200, + 10, 15, 0))); + + SIGNED_TEST_VALUE.setHashKey(8); + SIGNED_TEST_VALUE.setRangeKey(10); + SIGNED_TEST_VALUE.setVersion(0); + SIGNED_TEST_VALUE.setIntValue(123); + SIGNED_TEST_VALUE.setStringValue("Hello world!"); + SIGNED_TEST_VALUE.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); + SIGNED_TEST_VALUE.setStringSet(new HashSet(Arrays.asList( + "Goodbye", "Cruel", "World", "?"))); + SIGNED_TEST_VALUE.setIntSet(new HashSet(Arrays.asList(1, 200, + 10, 15, 0))); + + UNTOUCHED_TEST_VALUE.setHashKey(7); + UNTOUCHED_TEST_VALUE.setRangeKey(9); + UNTOUCHED_TEST_VALUE.setVersion(0); + UNTOUCHED_TEST_VALUE.setIntValue(123); + UNTOUCHED_TEST_VALUE.setStringValue("Hello world!"); + UNTOUCHED_TEST_VALUE.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); + UNTOUCHED_TEST_VALUE.setStringSet(new HashSet(Arrays.asList( + "Goodbye", "Cruel", "World", "?"))); + UNTOUCHED_TEST_VALUE.setIntSet(new HashSet(Arrays.asList(1, + 200, 10, 15, 0))); + + // Now storing doubles + ENCRYPTED_TEST_VALUE_2.setHashKey(5); + ENCRYPTED_TEST_VALUE_2.setRangeKey(7); + ENCRYPTED_TEST_VALUE_2.setVersion(0); + ENCRYPTED_TEST_VALUE_2.setIntValue(123); + ENCRYPTED_TEST_VALUE_2.setStringValue("Hello world!"); + ENCRYPTED_TEST_VALUE_2.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); + ENCRYPTED_TEST_VALUE_2.setStringSet(new HashSet(Arrays.asList( + "Goodbye", "Cruel", "World", "?"))); + ENCRYPTED_TEST_VALUE_2.setIntSet(new HashSet(Arrays.asList(1, + 200, 10, 15, 0))); + ENCRYPTED_TEST_VALUE_2.setDoubleValue(15); + ENCRYPTED_TEST_VALUE_2.setDoubleSet( + new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); + + MIXED_TEST_VALUE_2.setHashKey(6); + MIXED_TEST_VALUE_2.setRangeKey(8); + MIXED_TEST_VALUE_2.setVersion(0); + MIXED_TEST_VALUE_2.setIntValue(123); + MIXED_TEST_VALUE_2.setStringValue("Hello world!"); + MIXED_TEST_VALUE_2.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); + MIXED_TEST_VALUE_2.setStringSet(new HashSet(Arrays.asList( + "Goodbye", "Cruel", "World", "?"))); + MIXED_TEST_VALUE_2.setIntSet(new HashSet(Arrays.asList(1, 200, + 10, 15, 0))); + MIXED_TEST_VALUE_2.setDoubleValue(15); + MIXED_TEST_VALUE_2.setDoubleSet( + new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); + + SIGNED_TEST_VALUE_2.setHashKey(8); + SIGNED_TEST_VALUE_2.setRangeKey(10); + SIGNED_TEST_VALUE_2.setVersion(0); + SIGNED_TEST_VALUE_2.setIntValue(123); + SIGNED_TEST_VALUE_2.setStringValue("Hello world!"); + SIGNED_TEST_VALUE_2.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); + SIGNED_TEST_VALUE_2.setStringSet(new HashSet(Arrays.asList( + "Goodbye", "Cruel", "World", "?"))); + SIGNED_TEST_VALUE_2.setIntSet(new HashSet(Arrays.asList(1, 200, + 10, 15, 0))); + SIGNED_TEST_VALUE_2.setDoubleValue(15); + SIGNED_TEST_VALUE_2.setDoubleSet( + new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); + + UNTOUCHED_TEST_VALUE_2.setHashKey(7); + UNTOUCHED_TEST_VALUE_2.setRangeKey(9); + UNTOUCHED_TEST_VALUE_2.setVersion(0); + UNTOUCHED_TEST_VALUE_2.setIntValue(123); + UNTOUCHED_TEST_VALUE_2.setStringValue("Hello world!"); + UNTOUCHED_TEST_VALUE_2.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); + UNTOUCHED_TEST_VALUE_2.setStringSet(new HashSet(Arrays.asList( + "Goodbye", "Cruel", "World", "?"))); + UNTOUCHED_TEST_VALUE_2.setIntSet(new HashSet(Arrays.asList(1, + 200, 10, 15, 0))); + UNTOUCHED_TEST_VALUE_2.setDoubleValue(15); + UNTOUCHED_TEST_VALUE_2.setDoubleSet( + new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); + + } + + @DataProvider(name = "getEncryptTestVectors") + public static Object[][] getEncryptTestVectors() throws IOException { + ScenarioManifest scenarioManifest = getManifestFromFile(SCENARIO_MANIFEST_PATH, + new TypeReference() {}); + loadKeyData(scenarioManifest.keyDataPath); + + // Only use Java generated test vectors to dedupe the scenarios for encrypt, + // we only care that we are able to generate data using the different provider configurations + List dedupedScenarios = scenarioManifest.scenarios.stream() + .filter(s -> s.ciphertextPath.contains(JAVA_DIR)) + .map(s -> new Object[] { s }) + .collect(Collectors.toList()); + return dedupedScenarios.toArray(new Object[dedupedScenarios.size()][]); + } + + @DataProvider(name = "getDecryptTestVectors") + public static Object[][] getDecryptTestVectors() throws IOException { + ScenarioManifest scenarioManifest = getManifestFromFile(SCENARIO_MANIFEST_PATH, + new TypeReference() {}); + loadKeyData(scenarioManifest.keyDataPath); + + List scenarios = scenarioManifest.scenarios.stream() + .map(s -> new Object[] { s }) + .collect(Collectors.toList()); + return scenarios.toArray(new Object[scenarios.size()][]); + } + + // Set up for non-parameterized tests + @Before + public void setUp() { + System.setProperty("sqlite4java.library.path", "target/test-lib"); + client = DynamoDBEmbedded.create(); + + // load data into ciphertext tables + createCiphertextTables(client); + } + + @Test(dataProvider = "getDecryptTestVectors") + public void decryptTestVector(Scenario scenario) throws IOException { + System.setProperty("sqlite4java.library.path", "target/test-lib"); + client = DynamoDBEmbedded.create(); + + // load data into ciphertext tables + createCiphertextTables(client); + + // load data from vector file + putDataFromFile(client, scenario.ciphertextPath); + + // create and load metastore table if necessary + ProviderStore metastore = null; + if (scenario.metastore != null) { + MetaStore.createTable(client, scenario.metastore.tableName, new ProvisionedThroughput(100L, 100L)); + putDataFromFile(client, scenario.metastore.path); + EncryptionMaterialsProvider metaProvider = createProvider(scenario.metastore.providerName, + scenario.materialName, scenario.metastore.keys, null); + metastore = new MetaStore(client, scenario.metastore.tableName, DynamoDBEncryptor.getInstance(metaProvider)); + } + + // Create the mapper with the provider under test + EncryptionMaterialsProvider provider = createProvider(scenario.providerName, scenario.materialName, scenario.keys, metastore); + DynamoDBMapper mapper = new DynamoDBMapper(client, + new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(provider)); + + // Verify successful decryption + switch (scenario.version) { + case "v0": + assertVersionCompatibility(mapper); + break; + case "v1": + assertVersionCompatibility_2(mapper); + break; + default: + throw new IllegalStateException("Version " + scenario.version + " not yet implemented in test vector runner"); + } + } + + @Test(dataProvider = "getEncryptTestVectors") + public void encryptWithTestVector(Scenario scenario) throws IOException { + System.setProperty("sqlite4java.library.path", "target/test-lib"); + client = DynamoDBEmbedded.create(); + + // load data into ciphertext tables + createCiphertextTables(client); + + // create and load metastore table if necessary + ProviderStore metastore = null; + if (scenario.metastore != null) { + MetaStore.createTable(client, scenario.metastore.tableName, new ProvisionedThroughput(100L, 100L)); + putDataFromFile(client, scenario.metastore.path); + EncryptionMaterialsProvider metaProvider = createProvider(scenario.metastore.providerName, + scenario.materialName, scenario.metastore.keys, null); + metastore = new MetaStore(client, scenario.metastore.tableName, DynamoDBEncryptor.getInstance(metaProvider)); + } + + // Encrypt data with the provider under test, only ensure that no exception is thrown + EncryptionMaterialsProvider provider = createProvider(scenario.providerName, scenario.materialName, scenario.keys, metastore); + generateStandardData(provider); + } + + @Test + public void simpleSaveLoad() { + DynamoDBMapper mapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor(symProv)); + Mixed obj = new Mixed(); + obj.setHashKey(0); + obj.setRangeKey(15); + obj.setIntSet(new HashSet()); + obj.getIntSet().add(3); + obj.getIntSet().add(5); + obj.getIntSet().add(7); + obj.setDoubleValue(15); + obj.setStringValue("Blargh!"); + obj.setDoubleSet( + new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); + + mapper.save(obj); + + Mixed result = mapper.load(Mixed.class, 0, 15); + assertEquals(obj, result); + + result.setStringValue("Foo"); + mapper.save(result); + + Mixed result2 = mapper.load(Mixed.class, 0, 15); + assertEquals(result, result2); + + mapper.delete(result); + assertNull(mapper.load(Mixed.class, 0, 15)); + } + + /** + * This test ensures that optimistic locking can be successfully done through the {@link DynamoDBMapper} when + * combined with the @{link AttributeEncryptor}. Specifically it checks that {@link SaveBehavior#PUT} properly + * enforces versioning and will result in a {@link ConditionalCheckFailedException} when optimistic locking should + * prevent a write. Finally, it checks that {@link SaveBehavior#CLOBBER} properly ignores optimistic locking and + * overwrites the old value. + */ + @Test + public void optimisticLockingTest() { + DynamoDBMapper mapper = new DynamoDBMapper(client, + DynamoDBMapperConfig.builder() + .withSaveBehavior(SaveBehavior.PUT).build(), + new AttributeEncryptor(symProv)); + DynamoDBMapper clobberMapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor(symProv)); + + /* + * Lineage of objects + * expected -> v1 -> v2 -> v3 + * | + * -> v2_2 -> clobbered + * Splitting the lineage after v1 is what should + * cause the ConditionalCheckFailedException. + */ + final int hashKey = 0; + final int rangeKey = 15; + final Mixed expected = new Mixed(); + expected.setHashKey(hashKey); + expected.setRangeKey(rangeKey); + expected.setIntSet(new HashSet()); + expected.getIntSet().add(3); + expected.getIntSet().add(5); + expected.getIntSet().add(7); + expected.setDoubleValue(15); + expected.setStringValue("Blargh!"); + expected.setDoubleSet( + new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); + + mapper.save(expected); + Mixed v1 = mapper.load(Mixed.class, hashKey, rangeKey); + assertEquals(expected, v1); + v1.setStringValue("New value"); + mapper.save(v1); + Mixed v2 = mapper.load(Mixed.class, hashKey, rangeKey); + assertEquals(v1, v2); + Mixed v2_2 = mapper.load(Mixed.class, hashKey, rangeKey); + + v2.getIntSet().add(-37); + mapper.save(v2); + Mixed v3 = mapper.load(Mixed.class, hashKey, rangeKey); + assertEquals(v2, v3); + assertTrue(v3.getIntSet().contains(-37)); + + // This should fail due to optimistic locking + v2_2.getIntSet().add(38); + try { + mapper.save(v2_2); + fail("Expected ConditionalCheckFailedException"); + } catch (ConditionalCheckFailedException ex) { + // Expected exception + } + + // Force the update with clobber + clobberMapper.save(v2_2); + Mixed clobbered = mapper.load(Mixed.class, hashKey, rangeKey); + assertEquals(v2_2, clobbered); + assertTrue(clobbered.getIntSet().contains(38)); + assertFalse(clobbered.getIntSet().contains(-37)); + } + + @Test + public void leadingAndTrailingZeros() { + DynamoDBMapper mapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor(symProv)); + Mixed obj = new Mixed(); + obj.setHashKey(0); + obj.setRangeKey(15); + obj.setIntSet(new HashSet()); + obj.getIntSet().add(3); + obj.getIntSet().add(5); + obj.getIntSet().add(7); + obj.setStringValue("Blargh!"); + obj.setDoubleValue(15); + obj.setDoubleSet( + new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); + + mapper.save(obj); + + + // TODO: Update the mock to handle this appropriately. + // DynamoDb discards leading and trailing zeros from numbers + Map key = new HashMap(); + key.put(HASH_KEY, new AttributeValue().withN("0")); + key.put(RANGE_KEY, new AttributeValue().withN("15")); + Map attributeUpdates = new HashMap(); + attributeUpdates.put("doubleValue", new AttributeValueUpdate(new AttributeValue().withN("15"), AttributeAction.PUT)); + UpdateItemRequest update = new UpdateItemRequest("TableName", key, attributeUpdates); + client.updateItem(update); + + + Mixed result = mapper.load(Mixed.class, 0, 15); + assertEquals(obj, result); + + result.setStringValue("Foo"); + mapper.save(result); + + Mixed result2 = mapper.load(Mixed.class, 0, 15); + assertEquals(result, result2); + + mapper.delete(result); + assertNull(mapper.load(Mixed.class, 0, 15)); + } + + @Test + public void simpleSaveLoadAsym() { + DynamoDBMapper mapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor(asymProv)); + + BaseClass obj = new BaseClass(); + obj.setHashKey(0); + obj.setRangeKey(15); + obj.setIntSet(new HashSet()); + obj.getIntSet().add(3); + obj.getIntSet().add(5); + obj.getIntSet().add(7); + obj.setDoubleValue(15); + obj.setStringValue("Blargh!"); + obj.setDoubleSet( + new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); + mapper.save(obj); + + BaseClass result = mapper.load(BaseClass.class, 0, 15); + assertEquals(obj, result); + + result.setStringValue("Foo"); + mapper.save(result); + + BaseClass result2 = mapper.load(BaseClass.class, 0, 15); + assertEquals(result, result2); + + mapper.delete(result); + assertNull(mapper.load(BaseClass.class, 0, 15)); + } + + @Test + public void simpleSaveLoadHashOnly() { + DynamoDBMapper mapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor( + symProv)); + + HashKeyOnly obj = new HashKeyOnly(""); + obj.setHashKey("Foo"); + + mapper.save(obj); + + HashKeyOnly result = mapper.load(HashKeyOnly.class, "Foo"); + assertEquals(obj, result); + + mapper.delete(obj); + assertNull(mapper.load(BaseClass.class, 0, 15)); + } + + @Test + public void simpleSaveLoadKeysOnly() { + DynamoDBMapper mapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor( + asymProv)); + + KeysOnly obj = new KeysOnly(); + obj.setHashKey(0); + obj.setRangeKey(15); + + mapper.save(obj); + + KeysOnly result = mapper.load(KeysOnly.class, 0, 15); + assertEquals(obj, result); + + mapper.delete(obj); + assertNull(mapper.load(BaseClass.class, 0, 15)); + } + + public void generateStandardData(EncryptionMaterialsProvider prov) { + DynamoDBMapper mapper = new DynamoDBMapper(client, + new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(prov)); + mapper.save(new HashKeyOnly("Foo")); + mapper.save(new HashKeyOnly("Bar")); + mapper.save(new HashKeyOnly("Baz")); + + mapper.save(new KeysOnly(0, 1)); + mapper.save(new KeysOnly(0, 2)); + mapper.save(new KeysOnly(0, 3)); + mapper.save(new KeysOnly(1, 1)); + mapper.save(new KeysOnly(1, 2)); + mapper.save(new KeysOnly(1, 3)); + mapper.save(new KeysOnly(5, 1)); + mapper.save(new KeysOnly(6, 2)); + mapper.save(new KeysOnly(7, 3)); + + mapper.save(ENCRYPTED_TEST_VALUE_2); + mapper.save(MIXED_TEST_VALUE_2); + mapper.save(SIGNED_TEST_VALUE_2); + mapper.save(UNTOUCHED_TEST_VALUE_2); + + // Uncomment the function below to print the generated data + // in our test vector format. + + // printTablesAsTestVectors(); + } + + private void assertVersionCompatibility(DynamoDBMapper mapper) { + assertEquals(UNTOUCHED_TEST_VALUE, mapper.load( + UNTOUCHED_TEST_VALUE.getClass(), + UNTOUCHED_TEST_VALUE.getHashKey(), + UNTOUCHED_TEST_VALUE.getRangeKey())); + assertEquals( + SIGNED_TEST_VALUE, + mapper.load(SIGNED_TEST_VALUE.getClass(), + SIGNED_TEST_VALUE.getHashKey(), + SIGNED_TEST_VALUE.getRangeKey())); + assertEquals( + MIXED_TEST_VALUE, + mapper.load(MIXED_TEST_VALUE.getClass(), + MIXED_TEST_VALUE.getHashKey(), + MIXED_TEST_VALUE.getRangeKey())); + assertEquals(ENCRYPTED_TEST_VALUE, mapper.load( + ENCRYPTED_TEST_VALUE.getClass(), + ENCRYPTED_TEST_VALUE.getHashKey(), + ENCRYPTED_TEST_VALUE.getRangeKey())); + + assertEquals("Foo", mapper.load(HashKeyOnly.class, "Foo").getHashKey()); + assertEquals("Bar", mapper.load(HashKeyOnly.class, "Bar").getHashKey()); + assertEquals("Baz", mapper.load(HashKeyOnly.class, "Baz").getHashKey()); + + for (int x = 1; x <= 3; ++x) { + KeysOnly obj = mapper.load(KeysOnly.class, 0, x); + assertEquals(0, obj.getHashKey()); + assertEquals(x, obj.getRangeKey()); + + obj = mapper.load(KeysOnly.class, 1, x); + assertEquals(1, obj.getHashKey()); + assertEquals(x, obj.getRangeKey()); + + obj = mapper.load(KeysOnly.class, 4 + x, x); + assertEquals(4 + x, obj.getHashKey()); + assertEquals(x, obj.getRangeKey()); + } + } + + private void assertVersionCompatibility_2(DynamoDBMapper mapper) { + assertEquals(UNTOUCHED_TEST_VALUE_2, mapper.load( + UNTOUCHED_TEST_VALUE_2.getClass(), + UNTOUCHED_TEST_VALUE_2.getHashKey(), + UNTOUCHED_TEST_VALUE_2.getRangeKey())); + assertEquals( + SIGNED_TEST_VALUE_2, + mapper.load(SIGNED_TEST_VALUE_2.getClass(), + SIGNED_TEST_VALUE_2.getHashKey(), + SIGNED_TEST_VALUE_2.getRangeKey())); + assertEquals( + MIXED_TEST_VALUE_2, + mapper.load(MIXED_TEST_VALUE_2.getClass(), + MIXED_TEST_VALUE_2.getHashKey(), + MIXED_TEST_VALUE_2.getRangeKey())); + assertEquals(ENCRYPTED_TEST_VALUE_2, mapper.load( + ENCRYPTED_TEST_VALUE_2.getClass(), + ENCRYPTED_TEST_VALUE_2.getHashKey(), + ENCRYPTED_TEST_VALUE_2.getRangeKey())); + + assertEquals("Foo", mapper.load(HashKeyOnly.class, "Foo").getHashKey()); + assertEquals("Bar", mapper.load(HashKeyOnly.class, "Bar").getHashKey()); + assertEquals("Baz", mapper.load(HashKeyOnly.class, "Baz").getHashKey()); + + for (int x = 1; x <= 3; ++x) { + KeysOnly obj = mapper.load(KeysOnly.class, 0, x); + assertEquals(0, obj.getHashKey()); + assertEquals(x, obj.getRangeKey()); + + obj = mapper.load(KeysOnly.class, 1, x); + assertEquals(1, obj.getHashKey()); + assertEquals(x, obj.getRangeKey()); + + obj = mapper.load(KeysOnly.class, 4 + x, x); + assertEquals(4 + x, obj.getHashKey()); + assertEquals(x, obj.getRangeKey()); + } + } + + // Prints all current tables in the expected test vector format. + // You may need to edit the output to grab the tables you care about, or + // separate the tables into separate files for test vectors (metastores e.g.). + private void printTablesAsTestVectors() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + SimpleModule module = new SimpleModule(); + module.addSerializer(AttributeValue.class, new AttributeValueSerializer()); + mapper.registerModule(module); + + Map>> testVector = new HashMap<>(); + for (String table : client.listTables().getTableNames()) { + ScanResult scanResult; + Map lastKey = null; + do { + scanResult = client.scan(new ScanRequest().withTableName(table).withExclusiveStartKey(lastKey)); + lastKey = scanResult.getLastEvaluatedKey(); + + testVector.put(table, scanResult.getItems()); + + } while (lastKey != null); + } + String jsonResult = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(testVector); + System.out.println(jsonResult); + } + + private EncryptionMaterialsProvider createProvider(String providerName, String materialName, Keys keys, ProviderStore metastore) { + switch (providerName) { + case ScenarioManifest.MOST_RECENT_PROVIDER_NAME: + return new CachingMostRecentProvider(metastore, materialName, 1000); + case ScenarioManifest.STATIC_PROVIDER_NAME: + 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); + 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); + 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. + KeyFactory rsaFact = KeyFactory.getInstance(RSA); + + PublicKey encryptMaterial = rsaFact.generatePublic(new X509EncodedKeySpec(Base64 + .decode(encryptKeyData.material))); + PrivateKey decryptMaterial = rsaFact.generatePrivate(new PKCS8EncodedKeySpec(Base64 + .decode(decryptKeyData.material))); + KeyPair decryptPair = new KeyPair(encryptMaterial, decryptMaterial); + + + 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 AsymmetricStaticProvider(decryptPair, sigPair); + } catch (GeneralSecurityException ex) { + throw new RuntimeException(ex); + } + } + case ScenarioManifest.AWS_KMS_PROVIDER_NAME: + return new DirectKmsMaterialProvider(kmsClient, keyDataMap.get(keys.decryptName).keyId); + default: + throw new IllegalStateException("Provider " + providerName + " not yet implemented in test vector runner"); + } + } + + // 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(AmazonDynamoDB client) { + ArrayList attrDef = new ArrayList(); + attrDef.add(new AttributeDefinition().withAttributeName(HASH_KEY).withAttributeType(ScalarAttributeType.N)); + attrDef.add(new AttributeDefinition().withAttributeName(RANGE_KEY).withAttributeType(ScalarAttributeType.N)); + + ArrayList keySchema = new ArrayList(); + keySchema.add(new KeySchemaElement().withAttributeName(HASH_KEY).withKeyType(KeyType.HASH)); + keySchema.add(new KeySchemaElement().withAttributeName(RANGE_KEY).withKeyType(KeyType.RANGE)); + + client.createTable(new CreateTableRequest().withTableName("TableName") + .withAttributeDefinitions(attrDef) + .withKeySchema(keySchema) + .withProvisionedThroughput(new ProvisionedThroughput(100L, 100L))); + + attrDef = new ArrayList(); + attrDef.add(new AttributeDefinition().withAttributeName(HASH_KEY).withAttributeType(ScalarAttributeType.S)); + keySchema = new ArrayList(); + keySchema.add(new KeySchemaElement().withAttributeName(HASH_KEY).withKeyType(KeyType.HASH)); + + client.createTable(new CreateTableRequest().withTableName("HashKeyOnly") + .withAttributeDefinitions(attrDef) + .withKeySchema(keySchema) + .withProvisionedThroughput(new ProvisionedThroughput(100L, 100L))); + + attrDef = new ArrayList(); + attrDef.add(new AttributeDefinition().withAttributeName(HASH_KEY).withAttributeType(ScalarAttributeType.B)); + attrDef.add(new AttributeDefinition().withAttributeName(RANGE_KEY).withAttributeType(ScalarAttributeType.N)); + + keySchema = new ArrayList(); + keySchema.add(new KeySchemaElement().withAttributeName(HASH_KEY).withKeyType(KeyType.HASH)); + keySchema.add(new KeySchemaElement().withAttributeName(RANGE_KEY).withKeyType(KeyType.RANGE)); + + client.createTable(new CreateTableRequest().withTableName("DeterministicTable") + .withAttributeDefinitions(attrDef) + .withKeySchema(keySchema) + .withProvisionedThroughput(new ProvisionedThroughput(100L, 100L))); + } + + // Given a file in the test vector ciphertext format, put those entries into their tables. + // This assumes the expected tables have already been created. + private void putDataFromFile(AmazonDynamoDB client, String filename) throws IOException { + Map>> manifest = getCiphertextManifestFromFile(filename); + for (String tableName : manifest.keySet()) { + for (Map attributes : manifest.get(tableName)) { + client.putItem(new PutItemRequest(tableName, attributes)); + } + } + } + + private Map>> getCiphertextManifestFromFile(String filename) throws IOException { + return getManifestFromFile(TEST_VECTOR_MANIFEST_DIR + stripFilePath(filename), + new TypeReference>>>() {}); + } + + private static T getManifestFromFile(String filename, TypeReference typeRef) throws IOException { + final URL url = TransformerHolisticIT.class.getResource(filename); + if (url == null) { + throw new IllegalStateException("Missing file " + filename + " in src/test/resources."); + } + final File manifestFile = new File(url.getPath()); + final ObjectMapper manifestMapper = new ObjectMapper(); + return manifestMapper.readValue( + manifestFile, + typeRef + ); + } + + private static void loadKeyData(String filename) throws IOException { + keyDataMap = getManifestFromFile(TEST_VECTOR_MANIFEST_DIR + stripFilePath(filename), + new TypeReference>() {}); + } + + private static String stripFilePath(String path) { + return path.replaceFirst("file://", ""); + } + + @JsonDeserialize(using = AttributeValueDeserializer.class) + public static class DeserializedAttributeValue extends AttributeValue { + } +} diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticTests.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticTests.java deleted file mode 100644 index 7feb3b0d..00000000 --- a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/TransformerHolisticTests.java +++ /dev/null @@ -1,2042 +0,0 @@ -/* - * Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ -package com.amazonaws.services.dynamodbv2.datamodeling; - -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.providers.AsymmetricStaticProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.EncryptionMaterialsProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.MostRecentProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.SymmetricStaticProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.WrappedMaterialsProvider; -import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.store.MetaStore; -import com.amazonaws.services.dynamodbv2.datamodeling.internal.AttributeValueMarshaller; -import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded; -import com.amazonaws.services.dynamodbv2.model.AttributeAction; -import com.amazonaws.services.dynamodbv2.model.AttributeDefinition; -import com.amazonaws.services.dynamodbv2.model.AttributeValue; -import com.amazonaws.services.dynamodbv2.model.AttributeValueUpdate; -import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException; -import com.amazonaws.services.dynamodbv2.model.CreateTableRequest; -import com.amazonaws.services.dynamodbv2.model.KeySchemaElement; -import com.amazonaws.services.dynamodbv2.model.KeyType; -import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; -import com.amazonaws.services.dynamodbv2.model.PutItemRequest; -import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType; -import com.amazonaws.services.dynamodbv2.model.ScanRequest; -import com.amazonaws.services.dynamodbv2.model.ScanResult; -import com.amazonaws.services.dynamodbv2.model.UpdateItemRequest; -import com.amazonaws.services.dynamodbv2.testing.types.BaseClass; -import com.amazonaws.services.dynamodbv2.testing.types.HashKeyOnly; -import com.amazonaws.services.dynamodbv2.testing.types.KeysOnly; -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.util.Base64; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import javax.crypto.SecretKey; -import javax.crypto.spec.SecretKeySpec; -import java.nio.ByteBuffer; -import java.security.GeneralSecurityException; -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.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; - -import static org.testng.AssertJUnit.assertEquals; -import static org.testng.AssertJUnit.assertFalse; -import static org.testng.AssertJUnit.assertNull; -import static org.testng.AssertJUnit.assertTrue; -import static org.testng.AssertJUnit.fail; - -public class TransformerHolisticTests { - private static final SecretKey aesKey = new SecretKeySpec(new byte[]{0, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, "AES"); - private static final SecretKey hmacKey = new SecretKeySpec(new byte[]{0, - 1, 2, 3, 4, 5, 6, 7}, "HmacSHA256"); - private static final String rsaEncPub = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtiNSLSvT9cExXOcD0dGZ" - + "9DFEMHw8895gAZcCdSppDrxbD7XgZiQYTlgt058i5fS+l11guAUJtKt5sZ2u8Fx0" - + "K9pxMdlczGtvQJdx/LQETEnLnfzAijvHisJ8h6dQOVczM7t01KIkS24QZElyO+kY" - + "qMWLytUV4RSHnrnIuUtPHCe6LieDWT2+1UBguxgtFt1xdXlquACLVv/Em3wp40Xc" - + "bIwzhqLitb98rTY/wqSiGTz1uvvBX46n+f2j3geZKCEDGkWcXYw3dH4lRtDWTbqw" - + "eRcaNDT/MJswQlBk/Up9KCyN7gjX67gttiCO6jMoTNDejGeJhG4Dd2o0vmn8WJlr" - + "5wIDAQAB"; - private static final String rsaEncPriv = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2I1ItK9P1wTFc" - + "5wPR0Zn0MUQwfDzz3mABlwJ1KmkOvFsPteBmJBhOWC3TnyLl9L6XXWC4BQm0q3mx" - + "na7wXHQr2nEx2VzMa29Al3H8tARMScud/MCKO8eKwnyHp1A5VzMzu3TUoiRLbhBk" - + "SXI76RioxYvK1RXhFIeeuci5S08cJ7ouJ4NZPb7VQGC7GC0W3XF1eWq4AItW/8Sb" - + "fCnjRdxsjDOGouK1v3ytNj/CpKIZPPW6+8Ffjqf5/aPeB5koIQMaRZxdjDd0fiVG" - + "0NZNurB5Fxo0NP8wmzBCUGT9Sn0oLI3uCNfruC22II7qMyhM0N6MZ4mEbgN3ajS+" - + "afxYmWvnAgMBAAECggEBAIIU293zDWDZZ73oJ+w0fHXQsdjHAmlRitPX3CN99KZX" - + "k9m2ldudL9bUV3Zqk2wUzgIg6LDEuFfWmAVojsaP4VBopKtriEFfAYfqIbjPgLpT" - + "gh8FoyWW6D6MBJCFyGALjUAHQ7uRScathvt5ESMEqV3wKJTmdsfX97w/B8J+rLN3" - + "3fT3ZJUck5duZ8XKD+UtX1Y3UE1hTWo3Ae2MFND964XyUqy+HaYXjH0x6dhZzqyJ" - + "/OJ/MPGeMJgxp+nUbMWerwxrLQceNFVgnQgHj8e8k4fd04rkowkkPua912gNtmz7" - + "DuIEvcMnY64z585cn+cnXUPJwtu3JbAmn/AyLsV9FLECgYEA798Ut/r+vORB16JD" - + "KFu38pQCgIbdCPkXeI0DC6u1cW8JFhgRqi+AqSrEy5SzY3IY7NVMSRsBI9Y026Bl" - + "R9OQwTrOzLRAw26NPSDvbTkeYXlY9+hX7IovHjGkho/OxyTJ7bKRDYLoNCz56BC1" - + "khIWvECpcf/fZU0nqOFVFqF3H/UCgYEAwmJ4rjl5fksTNtNRL6ivkqkHIPKXzk5w" - + "C+L90HKNicic9bqyX8K4JRkGKSNYN3mkjrguAzUlEld390qNBw5Lu7PwATv0e2i+" - + "6hdwJsjTKNpj7Nh4Mieq6d7lWe1L8FLyHEhxgIeQ4BgqrVtPPOH8IBGpuzVZdWwI" - + "dgOvEvAi/usCgYBdfk3NB/+SEEW5jn0uldE0s4vmHKq6fJwxWIT/X4XxGJ4qBmec" - + "NbeoOAtMbkEdWbNtXBXHyMbA+RTRJctUG5ooNou0Le2wPr6+PMAVilXVGD8dIWpj" - + "v9htpFvENvkZlbU++IKhCY0ICR++3ARpUrOZ3Hou/NRN36y9nlZT48tSoQKBgES2" - + "Bi6fxmBsLUiN/f64xAc1lH2DA0I728N343xRYdK4hTMfYXoUHH+QjurvwXkqmI6S" - + "cEFWAdqv7IoPYjaCSSb6ffYRuWP+LK4WxuAO0QV53SSViDdCalntHmlhRhyXVVnG" - + "CckDIqT0JfHNev7savDzDWpNe2fUXlFJEBPDqrstAoGBAOpd5+QBHF/tP5oPILH4" - + "aD/zmqMH7VtB+b/fOPwtIM+B/WnU7hHLO5t2lJYu18Be3amPkfoQIB7bpkM3Cer2" - + "G7Jw+TcHrY+EtIziDB5vwau1fl4VcbA9SfWpBojJ5Ifo9ELVxGiK95WxeQNSmLUy" - + "7AJzhK1Gwey8a/v+xfqiu9sE"; - private static final PrivateKey rsaPriv; - private static final PublicKey rsaPub; - private static final KeyPair rsaPair; - private static final EncryptionMaterialsProvider symProv; - private static final EncryptionMaterialsProvider asymProv; - private static final EncryptionMaterialsProvider symWrappedProv; - - private AmazonDynamoDB client; - // AttributeEncryptor *must* be used with SaveBehavior.CLOBBER to avoid the risk of data corruption. - private static final DynamoDBMapperConfig CLOBBER_CONFIG = - DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.CLOBBER).build(); - private 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(); - - private static final BaseClass ENCRYPTED_TEST_VALUE_2 = new BaseClass(); - private static final Mixed MIXED_TEST_VALUE_2 = new Mixed(); - private static final SignOnly SIGNED_TEST_VALUE_2 = new SignOnly(); - private static final Untouched UNTOUCHED_TEST_VALUE_2 = new Untouched(); - - private EncryptionMaterialsProvider mrProv; - - static { - try { - KeyFactory rsaFact = KeyFactory.getInstance("RSA"); - rsaPub = rsaFact.generatePublic(new X509EncodedKeySpec(Base64 - .decode(rsaEncPub))); - rsaPriv = rsaFact.generatePrivate(new PKCS8EncodedKeySpec(Base64 - .decode(rsaEncPriv))); - rsaPair = new KeyPair(rsaPub, rsaPriv); - } catch (GeneralSecurityException ex) { - throw new RuntimeException(ex); - } - symProv = new SymmetricStaticProvider(aesKey, hmacKey); - asymProv = new AsymmetricStaticProvider(rsaPair, rsaPair); - symWrappedProv = new WrappedMaterialsProvider(aesKey, aesKey, hmacKey); - - ENCRYPTED_TEST_VALUE.setHashKey(5); - ENCRYPTED_TEST_VALUE.setRangeKey(7); - ENCRYPTED_TEST_VALUE.setVersion(0); - ENCRYPTED_TEST_VALUE.setIntValue(123); - ENCRYPTED_TEST_VALUE.setStringValue("Hello world!"); - ENCRYPTED_TEST_VALUE.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); - ENCRYPTED_TEST_VALUE.setStringSet(new HashSet(Arrays.asList( - "Goodbye", "Cruel", "World", "?"))); - ENCRYPTED_TEST_VALUE.setIntSet(new HashSet(Arrays.asList(1, - 200, 10, 15, 0))); - - MIXED_TEST_VALUE.setHashKey(6); - MIXED_TEST_VALUE.setRangeKey(8); - MIXED_TEST_VALUE.setVersion(0); - MIXED_TEST_VALUE.setIntValue(123); - MIXED_TEST_VALUE.setStringValue("Hello world!"); - MIXED_TEST_VALUE.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); - MIXED_TEST_VALUE.setStringSet(new HashSet(Arrays.asList( - "Goodbye", "Cruel", "World", "?"))); - MIXED_TEST_VALUE.setIntSet(new HashSet(Arrays.asList(1, 200, - 10, 15, 0))); - - SIGNED_TEST_VALUE.setHashKey(8); - SIGNED_TEST_VALUE.setRangeKey(10); - SIGNED_TEST_VALUE.setVersion(0); - SIGNED_TEST_VALUE.setIntValue(123); - SIGNED_TEST_VALUE.setStringValue("Hello world!"); - SIGNED_TEST_VALUE.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); - SIGNED_TEST_VALUE.setStringSet(new HashSet(Arrays.asList( - "Goodbye", "Cruel", "World", "?"))); - SIGNED_TEST_VALUE.setIntSet(new HashSet(Arrays.asList(1, 200, - 10, 15, 0))); - - UNTOUCHED_TEST_VALUE.setHashKey(7); - UNTOUCHED_TEST_VALUE.setRangeKey(9); - UNTOUCHED_TEST_VALUE.setVersion(0); - UNTOUCHED_TEST_VALUE.setIntValue(123); - UNTOUCHED_TEST_VALUE.setStringValue("Hello world!"); - UNTOUCHED_TEST_VALUE.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); - UNTOUCHED_TEST_VALUE.setStringSet(new HashSet(Arrays.asList( - "Goodbye", "Cruel", "World", "?"))); - UNTOUCHED_TEST_VALUE.setIntSet(new HashSet(Arrays.asList(1, - 200, 10, 15, 0))); - - // Now storing doubles - ENCRYPTED_TEST_VALUE_2.setHashKey(5); - ENCRYPTED_TEST_VALUE_2.setRangeKey(7); - ENCRYPTED_TEST_VALUE_2.setVersion(0); - ENCRYPTED_TEST_VALUE_2.setIntValue(123); - ENCRYPTED_TEST_VALUE_2.setStringValue("Hello world!"); - ENCRYPTED_TEST_VALUE_2.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); - ENCRYPTED_TEST_VALUE_2.setStringSet(new HashSet(Arrays.asList( - "Goodbye", "Cruel", "World", "?"))); - ENCRYPTED_TEST_VALUE_2.setIntSet(new HashSet(Arrays.asList(1, - 200, 10, 15, 0))); - ENCRYPTED_TEST_VALUE_2.setDoubleValue(15); - ENCRYPTED_TEST_VALUE_2.setDoubleSet( - new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); - - MIXED_TEST_VALUE_2.setHashKey(6); - MIXED_TEST_VALUE_2.setRangeKey(8); - MIXED_TEST_VALUE_2.setVersion(0); - MIXED_TEST_VALUE_2.setIntValue(123); - MIXED_TEST_VALUE_2.setStringValue("Hello world!"); - MIXED_TEST_VALUE_2.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); - MIXED_TEST_VALUE_2.setStringSet(new HashSet(Arrays.asList( - "Goodbye", "Cruel", "World", "?"))); - MIXED_TEST_VALUE_2.setIntSet(new HashSet(Arrays.asList(1, 200, - 10, 15, 0))); - MIXED_TEST_VALUE_2.setDoubleValue(15); - MIXED_TEST_VALUE_2.setDoubleSet( - new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); - - SIGNED_TEST_VALUE_2.setHashKey(8); - SIGNED_TEST_VALUE_2.setRangeKey(10); - SIGNED_TEST_VALUE_2.setVersion(0); - SIGNED_TEST_VALUE_2.setIntValue(123); - SIGNED_TEST_VALUE_2.setStringValue("Hello world!"); - SIGNED_TEST_VALUE_2.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); - SIGNED_TEST_VALUE_2.setStringSet(new HashSet(Arrays.asList( - "Goodbye", "Cruel", "World", "?"))); - SIGNED_TEST_VALUE_2.setIntSet(new HashSet(Arrays.asList(1, 200, - 10, 15, 0))); - SIGNED_TEST_VALUE_2.setDoubleValue(15); - SIGNED_TEST_VALUE_2.setDoubleSet( - new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); - - UNTOUCHED_TEST_VALUE_2.setHashKey(7); - UNTOUCHED_TEST_VALUE_2.setRangeKey(9); - UNTOUCHED_TEST_VALUE_2.setVersion(0); - UNTOUCHED_TEST_VALUE_2.setIntValue(123); - UNTOUCHED_TEST_VALUE_2.setStringValue("Hello world!"); - UNTOUCHED_TEST_VALUE_2.setByteArrayValue(new byte[]{0, 1, 2, 3, 4, 5}); - UNTOUCHED_TEST_VALUE_2.setStringSet(new HashSet(Arrays.asList( - "Goodbye", "Cruel", "World", "?"))); - UNTOUCHED_TEST_VALUE_2.setIntSet(new HashSet(Arrays.asList(1, - 200, 10, 15, 0))); - UNTOUCHED_TEST_VALUE_2.setDoubleValue(15); - UNTOUCHED_TEST_VALUE_2.setDoubleSet( - new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); - - } - - @BeforeMethod - public void setUp() { - client = DynamoDBEmbedded.create(); - - ArrayList attrDef = new ArrayList(); - attrDef.add(new AttributeDefinition().withAttributeName("hashKey").withAttributeType(ScalarAttributeType.N)); - attrDef.add(new AttributeDefinition().withAttributeName("rangeKey").withAttributeType(ScalarAttributeType.N)); - - ArrayList keySchema = new ArrayList(); - keySchema.add(new KeySchemaElement().withAttributeName("hashKey").withKeyType(KeyType.HASH)); - keySchema.add(new KeySchemaElement().withAttributeName("rangeKey").withKeyType(KeyType.RANGE)); - - client.createTable(new CreateTableRequest().withTableName("TableName") - .withAttributeDefinitions(attrDef) - .withKeySchema(keySchema) - .withProvisionedThroughput(new ProvisionedThroughput(100L, 100L))); - - attrDef = new ArrayList(); - attrDef.add(new AttributeDefinition().withAttributeName("hashKey").withAttributeType(ScalarAttributeType.S)); - keySchema = new ArrayList(); - keySchema.add(new KeySchemaElement().withAttributeName("hashKey").withKeyType(KeyType.HASH)); - - client.createTable(new CreateTableRequest().withTableName("HashKeyOnly") - .withAttributeDefinitions(attrDef) - .withKeySchema(keySchema) - .withProvisionedThroughput(new ProvisionedThroughput(100L, 100L))); - - attrDef = new ArrayList(); - attrDef.add(new AttributeDefinition().withAttributeName("hashKey").withAttributeType(ScalarAttributeType.B)); - attrDef.add(new AttributeDefinition().withAttributeName("rangeKey").withAttributeType(ScalarAttributeType.N)); - - keySchema = new ArrayList(); - keySchema.add(new KeySchemaElement().withAttributeName("hashKey").withKeyType(KeyType.HASH)); - keySchema.add(new KeySchemaElement().withAttributeName("rangeKey").withKeyType(KeyType.RANGE)); - - client.createTable(new CreateTableRequest().withTableName("DeterministicTable") - .withAttributeDefinitions(attrDef) - .withKeySchema(keySchema) - .withProvisionedThroughput(new ProvisionedThroughput(100L, 100L))); - - MetaStore.createTable(client, "metastore", new ProvisionedThroughput(100L, 100L)); - mrProv = new MostRecentProvider(new MetaStore(client, "metastore", DynamoDBEncryptor.getInstance(symProv)), "materialName", 1000); - - } - - @Test - public void simpleSaveLoad() { - DynamoDBMapper mapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor(symProv)); - Mixed obj = new Mixed(); - obj.setHashKey(0); - obj.setRangeKey(15); - obj.setIntSet(new HashSet()); - obj.getIntSet().add(3); - obj.getIntSet().add(5); - obj.getIntSet().add(7); - obj.setDoubleValue(15); - obj.setStringValue("Blargh!"); - obj.setDoubleSet( - new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); - - mapper.save(obj); - - Mixed result = mapper.load(Mixed.class, 0, 15); - assertEquals(obj, result); - - result.setStringValue("Foo"); - mapper.save(result); - - Mixed result2 = mapper.load(Mixed.class, 0, 15); - assertEquals(result, result2); - - mapper.delete(result); - assertNull(mapper.load(Mixed.class, 0, 15)); - } - - /** - * This test ensures that optimistic locking can be successfully done through the {@link DynamoDBMapper} when - * combined with the @{link AttributeEncryptor}. Specifically it checks that {@link SaveBehavior#PUT} properly - * enforces versioning and will result in a {@link ConditionalCheckFailedException} when optimistic locking should - * prevent a write. Finally, it checks that {@link SaveBehavior#CLOBBER} properly ignores optimistic locking and - * overwrites the old value. - */ - @Test - public void optimisticLockingTest() { - DynamoDBMapper mapper = new DynamoDBMapper(client, - DynamoDBMapperConfig.builder() - .withSaveBehavior(SaveBehavior.PUT).build(), - new AttributeEncryptor(symProv)); - DynamoDBMapper clobberMapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor(symProv)); - - /* - * Lineage of objects - * expected -> v1 -> v2 -> v3 - * | - * -> v2_2 -> clobbered - * Splitting the lineage after v1 is what should - * cause the ConditionalCheckFailedException. - */ - final int hashKey = 0; - final int rangeKey = 15; - final Mixed expected = new Mixed(); - expected.setHashKey(hashKey); - expected.setRangeKey(rangeKey); - expected.setIntSet(new HashSet()); - expected.getIntSet().add(3); - expected.getIntSet().add(5); - expected.getIntSet().add(7); - expected.setDoubleValue(15); - expected.setStringValue("Blargh!"); - expected.setDoubleSet( - new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); - - mapper.save(expected); - Mixed v1 = mapper.load(Mixed.class, hashKey, rangeKey); - assertEquals(expected, v1); - v1.setStringValue("New value"); - mapper.save(v1); - Mixed v2 = mapper.load(Mixed.class, hashKey, rangeKey); - assertEquals(v1, v2); - Mixed v2_2 = mapper.load(Mixed.class, hashKey, rangeKey); - - v2.getIntSet().add(-37); - mapper.save(v2); - Mixed v3 = mapper.load(Mixed.class, hashKey, rangeKey); - assertEquals(v2, v3); - assertTrue(v3.getIntSet().contains(-37)); - - // This should fail due to optimistic locking - v2_2.getIntSet().add(38); - try { - mapper.save(v2_2); - fail("Expected ConditionalCheckFailedException"); - } catch (ConditionalCheckFailedException ex) { - // Expected exception - } - - // Force the update with clobber - clobberMapper.save(v2_2); - Mixed clobbered = mapper.load(Mixed.class, hashKey, rangeKey); - assertEquals(v2_2, clobbered); - assertTrue(clobbered.getIntSet().contains(38)); - assertFalse(clobbered.getIntSet().contains(-37)); - } - - @Test - public void leadingAndTrailingZeros() { - DynamoDBMapper mapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor(symProv)); - Mixed obj = new Mixed(); - obj.setHashKey(0); - obj.setRangeKey(15); - obj.setIntSet(new HashSet()); - obj.getIntSet().add(3); - obj.getIntSet().add(5); - obj.getIntSet().add(7); - obj.setStringValue("Blargh!"); - obj.setDoubleValue(15); - obj.setDoubleSet( - new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); - - mapper.save(obj); - - - // TODO: Update the mock to handle this appropriately. - // DynamoDb discards leading and trailing zeros from numbers - Map key = new HashMap(); - key.put("hashKey", new AttributeValue().withN("0")); - key.put("rangeKey", new AttributeValue().withN("15")); - Map attributeUpdates = new HashMap(); - attributeUpdates.put("doubleValue", new AttributeValueUpdate(new AttributeValue().withN("15"), AttributeAction.PUT)); - UpdateItemRequest update = new UpdateItemRequest("TableName", key, attributeUpdates); - client.updateItem(update); - - - Mixed result = mapper.load(Mixed.class, 0, 15); - assertEquals(obj, result); - - result.setStringValue("Foo"); - mapper.save(result); - - Mixed result2 = mapper.load(Mixed.class, 0, 15); - assertEquals(result, result2); - - mapper.delete(result); - assertNull(mapper.load(Mixed.class, 0, 15)); - } - - @Test - public void simpleSaveLoadAsym() { - DynamoDBMapper mapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor(asymProv)); - - BaseClass obj = new BaseClass(); - obj.setHashKey(0); - obj.setRangeKey(15); - obj.setIntSet(new HashSet()); - obj.getIntSet().add(3); - obj.getIntSet().add(5); - obj.getIntSet().add(7); - obj.setDoubleValue(15); - obj.setStringValue("Blargh!"); - obj.setDoubleSet( - new HashSet(Arrays.asList(15.0D, 7.6D, -3D, -34.2D, 0.0D))); - mapper.save(obj); - - BaseClass result = mapper.load(BaseClass.class, 0, 15); - assertEquals(obj, result); - - result.setStringValue("Foo"); - mapper.save(result); - - BaseClass result2 = mapper.load(BaseClass.class, 0, 15); - assertEquals(result, result2); - - mapper.delete(result); - assertNull(mapper.load(BaseClass.class, 0, 15)); - } - - @Test - public void simpleSaveLoadHashOnly() { - DynamoDBMapper mapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor( - symProv)); - - HashKeyOnly obj = new HashKeyOnly(""); - obj.setHashKey("Foo"); - - mapper.save(obj); - - HashKeyOnly result = mapper.load(HashKeyOnly.class, "Foo"); - assertEquals(obj, result); - - mapper.delete(obj); - assertNull(mapper.load(BaseClass.class, 0, 15)); - } - - @Test - public void simpleSaveLoadKeysOnly() { - DynamoDBMapper mapper = new DynamoDBMapper(client, CLOBBER_CONFIG, new AttributeEncryptor( - asymProv)); - - KeysOnly obj = new KeysOnly(); - obj.setHashKey(0); - obj.setRangeKey(15); - - mapper.save(obj); - - KeysOnly result = mapper.load(KeysOnly.class, 0, 15); - assertEquals(obj, result); - - mapper.delete(obj); - assertNull(mapper.load(BaseClass.class, 0, 15)); - } - - // @Test - public void generateStandardAsymData() { - generateStandardData(asymProv); - } - - // @Test - public void generateStandardSymData() { - generateStandardData(symProv); - } - - // @Test - public void generateStandardSymWrappedData() { - generateStandardData(symWrappedProv); - } - - // @Test - public void generateStandardMetastoreData() { - generateStandardData(mrProv); - } - - public void generateStandardData(EncryptionMaterialsProvider prov) { - DynamoDBMapper mapper = new DynamoDBMapper(client, - new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(prov)); - mapper.save(new HashKeyOnly("Foo")); - mapper.save(new HashKeyOnly("Bar")); - mapper.save(new HashKeyOnly("Baz")); - - mapper.save(new KeysOnly(0, 1)); - mapper.save(new KeysOnly(0, 2)); - mapper.save(new KeysOnly(0, 3)); - mapper.save(new KeysOnly(1, 1)); - mapper.save(new KeysOnly(1, 2)); - mapper.save(new KeysOnly(1, 3)); - mapper.save(new KeysOnly(5, 1)); - mapper.save(new KeysOnly(6, 2)); - mapper.save(new KeysOnly(7, 3)); - - mapper.save(ENCRYPTED_TEST_VALUE_2); - mapper.save(MIXED_TEST_VALUE_2); - mapper.save(SIGNED_TEST_VALUE_2); - mapper.save(UNTOUCHED_TEST_VALUE_2); - - dumpTables(); - } - - // First released version of code. Likely no actual data stored this way - @Test - public void testV0SymCompatibility() { - DynamoDBMapper mapper = new DynamoDBMapper(client, - new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(symProv)); - insertV0SymData(client); - assertVersionCompatibility(mapper); - } - - @Test - public void testV0AsymCompatibility() { - DynamoDBMapper mapper = new DynamoDBMapper(client, - new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(asymProv)); - insertV0AsymData(client); - assertVersionCompatibility(mapper); - } - - // Identical to V0 except WrappedRawMaterials now stores the cipher - // transformation used to wrap the keys in "amzn-ddb-wrap-alg" for - // better compatibility with limited function devices (such as smart- - // cards) and better guarantees that data will be decrypted properly. - @Test - public void testV0FixedWrappingTransformSymCompatibility() { - DynamoDBMapper mapper = new DynamoDBMapper(client, - new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(symProv)); - insertV0FixedWrappingTransformSymData(client); - assertVersionCompatibility(mapper); - } - - @Test - public void testV0FixedWrappingTransformAsymCompatibility() { - DynamoDBMapper mapper = new DynamoDBMapper(client, - new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(asymProv)); - insertV0FixedWrappingTransformAsymData(client); - assertVersionCompatibility(mapper); - } - - @Test - public void testV0FixedWrappingTransformSymWrappedCompatibility() { - DynamoDBMapper mapper = new DynamoDBMapper(client, - new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(symWrappedProv)); - insertV0FixedWrappingTransformSymWrappedData(client); - assertVersionCompatibility_2(mapper); - } - - @Test - public void testV0FixedDoubleSymCompatibility() { - DynamoDBMapper mapper = new DynamoDBMapper(client, - new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(symProv)); - insertV0FixedDoubleSymData(client); - assertVersionCompatibility_2(mapper); - } - - @Test - public void testV0FixedDoubleAsymCompatibility() { - DynamoDBMapper mapper = new DynamoDBMapper(client, - new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(asymProv)); - insertV0FixedDoubleAsymData(client); - assertVersionCompatibility_2(mapper); - } - - @Test - public void testV0MetastoreCompatibility() { - DynamoDBMapper mapper = new DynamoDBMapper(client, - new DynamoDBMapperConfig(SaveBehavior.CLOBBER), new AttributeEncryptor(mrProv)); - insertV0MetastoreData(client); - assertVersionCompatibility_2(mapper); - } - - private void assertVersionCompatibility(DynamoDBMapper mapper) { - assertEquals(UNTOUCHED_TEST_VALUE, mapper.load( - UNTOUCHED_TEST_VALUE.getClass(), - UNTOUCHED_TEST_VALUE.getHashKey(), - UNTOUCHED_TEST_VALUE.getRangeKey())); - assertEquals( - SIGNED_TEST_VALUE, - mapper.load(SIGNED_TEST_VALUE.getClass(), - SIGNED_TEST_VALUE.getHashKey(), - SIGNED_TEST_VALUE.getRangeKey())); - assertEquals( - MIXED_TEST_VALUE, - mapper.load(MIXED_TEST_VALUE.getClass(), - MIXED_TEST_VALUE.getHashKey(), - MIXED_TEST_VALUE.getRangeKey())); - assertEquals(ENCRYPTED_TEST_VALUE, mapper.load( - ENCRYPTED_TEST_VALUE.getClass(), - ENCRYPTED_TEST_VALUE.getHashKey(), - ENCRYPTED_TEST_VALUE.getRangeKey())); - - assertEquals("Foo", mapper.load(HashKeyOnly.class, "Foo").getHashKey()); - assertEquals("Bar", mapper.load(HashKeyOnly.class, "Bar").getHashKey()); - assertEquals("Baz", mapper.load(HashKeyOnly.class, "Baz").getHashKey()); - - for (int x = 1; x <= 3; ++x) { - KeysOnly obj = mapper.load(KeysOnly.class, 0, x); - assertEquals(0, obj.getHashKey()); - assertEquals(x, obj.getRangeKey()); - - obj = mapper.load(KeysOnly.class, 1, x); - assertEquals(1, obj.getHashKey()); - assertEquals(x, obj.getRangeKey()); - - obj = mapper.load(KeysOnly.class, 4 + x, x); - assertEquals(4 + x, obj.getHashKey()); - assertEquals(x, obj.getRangeKey()); - } - } - - private void assertVersionCompatibility_2(DynamoDBMapper mapper) { - assertEquals(UNTOUCHED_TEST_VALUE_2, mapper.load( - UNTOUCHED_TEST_VALUE_2.getClass(), - UNTOUCHED_TEST_VALUE_2.getHashKey(), - UNTOUCHED_TEST_VALUE_2.getRangeKey())); - assertEquals( - SIGNED_TEST_VALUE_2, - mapper.load(SIGNED_TEST_VALUE_2.getClass(), - SIGNED_TEST_VALUE_2.getHashKey(), - SIGNED_TEST_VALUE_2.getRangeKey())); - assertEquals( - MIXED_TEST_VALUE_2, - mapper.load(MIXED_TEST_VALUE_2.getClass(), - MIXED_TEST_VALUE_2.getHashKey(), - MIXED_TEST_VALUE_2.getRangeKey())); - assertEquals(ENCRYPTED_TEST_VALUE_2, mapper.load( - ENCRYPTED_TEST_VALUE_2.getClass(), - ENCRYPTED_TEST_VALUE_2.getHashKey(), - ENCRYPTED_TEST_VALUE_2.getRangeKey())); - - assertEquals("Foo", mapper.load(HashKeyOnly.class, "Foo").getHashKey()); - assertEquals("Bar", mapper.load(HashKeyOnly.class, "Bar").getHashKey()); - assertEquals("Baz", mapper.load(HashKeyOnly.class, "Baz").getHashKey()); - - for (int x = 1; x <= 3; ++x) { - KeysOnly obj = mapper.load(KeysOnly.class, 0, x); - assertEquals(0, obj.getHashKey()); - assertEquals(x, obj.getRangeKey()); - - obj = mapper.load(KeysOnly.class, 1, x); - assertEquals(1, obj.getHashKey()); - assertEquals(x, obj.getRangeKey()); - - obj = mapper.load(KeysOnly.class, 4 + x, x); - assertEquals(4 + x, obj.getHashKey()); - assertEquals(x, obj.getRangeKey()); - } - } - - private void dumpTables() { - for (String table : client.listTables().getTableNames()) { - ScanResult scanResult; - Map lastKey = null; - do { - scanResult = client.scan(new ScanRequest().withTableName(table).withExclusiveStartKey(lastKey)); - lastKey = scanResult.getLastEvaluatedKey(); - for (Map map : scanResult.getItems()) { - for (Map.Entry item : map.entrySet()) { - System.out.print("item.put(\""); - System.out.print(item.getKey()); - System.out.print("\", b642Av(\""); - System.out.print(Base64.encodeAsString(AttributeValueMarshaller.marshall(item.getValue()).array())); - System.out.println("\"));"); - } - System.out.print("ddb.putItem(new PutItemRequest(\""); - System.out.print(table); - System.out.println("\", item));"); - System.out.println("item.clear();"); - System.out.println(); - } - } while (lastKey != null); - - } - } - - private void insertV0SymData(AmazonDynamoDB ddb) { - Map item = new HashMap(); - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAglBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAgcjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAguXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAgyT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAgYAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAg0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAgGl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAg66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAgcSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAgSAl9L6mP5YRNF8II0NsFXI9boH3t3lIKiF79HRTI/S4=")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put( - "intSet", - b642Av("AGIAAABAiev8e8T8ah3qIYPZ1n1KIxfRSzYIQuSnQt3bCSyuDHMf0iWGuHCe+n78jHZfaYwp5I1gB/6hZxtvN9eX64C+8A==")); - item.put( - "stringValue", - b642Av("AGIAAAAw4kfr8MUHJOhcnCX8KwlBWMXckr09wIg+o4DsYPZCdAL5HIQDaeVpd+RFmWdM3eDa")); - item.put( - "stringSet", - b642Av("AGIAAABA72pIpNYQv5fnqNV7hcxwtFM13JtmisBIRfW29VZVVgb7HQSV9ypTaDMwjqV0TyQOnEN/tDsHTfj0v4TvKYXYtw==")); - item.put("rangeKey", b642Av("AG4AAAABNw==")); - item.put("byteArrayValue", - b642Av("AGIAAAAg5ZYktI5VjhPx0mN97APhxdi8u6vzDB/8O4XIDHVeJ2A=")); - item.put("intValue", - b642Av("AGIAAAAgrfALMD+0hs7L1YzVVqLOraA4IOWnaOOTad7r7VErGm8=")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAg+rzZO2IBAmjcybCXzbPtI3sF+u8f9GzLMGJGEPXofAI=")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put( - "intSet", - b642Av("AGIAAABANLdRexuTujebNfVSeiYZ5RD6IZcmE1UDcvJ4PbiLP3Dng+MjwXWUt2+Eolw0HDm1Gd2rfITxs4Oor0ImZGlJBw==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put( - "stringSet", - b642Av("AGIAAABACZrDLG0nOoo9SDT0ib0zz7d0x5rN9UK8q7vhthuJxNJxo/3Qs+rjhYQYLI8DcLom35aTzsgyIIjyzFagyqtnBA==")); - item.put("rangeKey", b642Av("AG4AAAABOA==")); - item.put("byteArrayValue", - b642Av("AGIAAAAgVVFzWfSD4PO/bD9g8RQOgCpZ+KlRH5+vdN2i1Wn9bDA=")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAgiWWvGpcrzkUu241+NNtykoiWoeaSR3QHQMhHTmf0XAU=")); - item.put("hashKey", b642Av("AG4AAAABOA==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", - b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("rangeKey", b642Av("AG4AAAACMTA=")); - item.put( - "stringSet", - b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("intSet", - b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("rangeKey", b642Av("AG4AAAABOQ==")); - item.put( - "stringSet", - b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAgiZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=")); - item.put("hashKey", b642Av("AHMAAAADQmFy")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAgzh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=")); - item.put("hashKey", b642Av("AHMAAAADQmF6")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", - b642Av("AGIAAAAgHR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=")); - item.put("hashKey", b642Av("AHMAAAADRm9v")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - } - - private void insertV0AsymData(AmazonDynamoDB ddb) { - Map item = new HashMap(); - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAVRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYkRuNjVvVFdnenJYQmV5bGVwb2x4bm93TTBxa1AzYTRHdjFBS0pHUkhOK2hSMW8wL3ZBM1pEVUowRTczWk1HTGZ0UUtQSjQrbkRqd3kNCkQyTmkwekNlTjVaMnJIOW54cU1TeGI4VUlDNGNWMjRJYVhCa3hUU0IrRUN5b3VYVzBINnhBbFlGdzhZNTZvTEhYYjNqYkdWRFZyUmoNCjBoby9ZZ3FDTjRVZmhFUmxKN2hhTnZMTmVWNXBMa0FLRWlPa2cyMWZEZFBXUWZaYllMMGhYL0RtaVpLWVlSU0N1aS9KcWFudFhkREUNCmppMkZqUVlCRnp6cmxkTkFYckRKcnBFSk9STkRhRDJ3UXpJYVpFY2ZBY1RlR3oyUzM5a1Q2azN2MlBIWndaRFdKUVdKMWcxc2pvdWcNClNVUnZHVkZ3UThpUW5XdmNPRDBRQkF0aFhqZVhEOEd6eGZxSFZnPT0NCg==")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAMG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYmovWUFVaTV5N0tRUWQrVFl3a296ZURERXFuY2RpTWFWc3dKYmI2dERuM0VTeHVaRXpZempOMlN3dEJxSENia1NrZmpGMGZBMVNvdUQNCi9Yc21iRTJGaXlOSWRTZE5uSFQzak5xN0FHOTMrVG9rUCtrREx3Y1Y5VFJYMUNwK1FIbk5TVzN1ZmxqbGlKTDFPQTZCS294bHNmNEoNCng0elNvck8yUHhac1ZDY2g2LzFSNU8zNHJqcU1QZUxlTHBrYmpUcS9xK1RkNDNxODJoeUVQejFTdHo2NU9xUVkrellTcjlZOHp5WTANCmkxNWlwcGVyRzQ3aUIxc002aXV3YWhxNFBVVEdkdTZiQkRiQmRxb04wTFpwUldVMTdueDRHNDRhTUJlZFNHODk0NXpiVkUrRE1hNEINCitORUpYeDBzdkxmZXM1aEJIMUNBQzFyZml2ckFCaDRXQndLYTZ3PT0NCg==")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYlEzNXRBaXlVYWc2VjZpTGFPS3kxS2pJZ1AyekdydEI3QVpvS1UxNmVpbHF3WnN0emJIK3hwYkRYZTQxRVlIRjIwL1VrdVAxeWdwVG0NCmJTOEM2VjVVMHl3dnRaOE5CSmV3ZGFIeXNMemVZTEhiMmNaL3VrTWg4dUFXRjhIRjJ1NGF5eXVKZkZtcldIbGRMTGVRdENUUVA4eEUNCnFpMEtrcU5lcURGTitEeDVNeFpxaVhUd0MycmptT2N5MVBiOTBCQWJLRFNLVERsLzRNRzhWcVBCUjFhMENFalExL3dwOWRSdS9FRUoNCmN1eUhQdjFHVmp6YmFNUWRpem0yWmhOTnZvRWpCUlJkRFgyRGVDU1hNcjFIVXFnbVRuSVoza3l6SWtIVG5NNjl4MGErSDltNGZadEgNCnM1ckxmQjd2R3ZlQjgrQTRLdURTVDBueksrWHA3Q2o5YzIrZ1hnPT0NCg==")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAMaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYlZ5OTRVdHkweHVxUlFtNWl5S3ZkM2NNZHhPalBWSlBsWWZHdDVJaStseFNwb2pnKy9XRjQyNmkyWmVZb1Y4a1BBN284cnRXMlk2UHUNCnRJZzFtc2gzdDROYzZGTnJPOFNkR2JxZFE4TVdmYWVHSWdiaElmWmM3NVFQaE9UWWdSNytEOG4rbnpwZ2FqUDNiTWMyYkRDK1lac1INCnFmbnhTVDhYa2tGRGZqWFVlZGlld2VrcXloU2NUc0QrTkJZSUxEWU1vWCtoNUZZYTgyQWRMSWZNTHlmS3Y0Y2FIeTE4YklzcFM2TVMNCmJjcFJkcnBUNGI0M2c1Q295UTdLZTNwZHhQT3IyNEpKbHlEeWhDeFpLY1FUNi9GWjNMeDl3blBONW9IRXZaMEVqc0R5VUREeEdwOTUNCkF1TmVCbmN5UTRUTEhQTW9RSE9kSklnS3VvTUsvZ0xwUzQvamJ3PT0NCg==")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAfq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYkl0Qkp1TnJxeFdTVWk0OGVWR2RFUS9RdVpzL0JSWnlpTVYreVBkaFdIemNpZk9QbVROWndFckdybGhuS1ovZ1BWT2NzSlRGWHMyelcNCmJ1Rm12cVdZdlVYN1lnaDdacjJSQm0zbGRHQ25WRTFjZEluak4yU042clh3S1dzbzF2Z0RpUmJRcUF5TVpMS2dwbTZZTnlFZnhjSzYNCkVpZGNpKzhWRVlHdkYzYm5mVGtoMWVmK0RXbHYxTWxYSnYwcGRSaXFmU3dnZThjNmxGTUs2M2t5Y2JFWTFpNXV1NWZubEIydURJTTgNCnRrNUhDV2gzQlVoZ1B2Z01zQWM4SHN3QVNyazcxWFZlQzNXWVR1dTlTQVVOUS9Va25IdzNvcitvT09POW5YTXVEWFFWbjF3WGhpUUQNCkFxNWgzN0hULy8vYmZDUDlWQ3cxQXRwY0ZKRXNHNzViNjg3N0JRPT0NCg==")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAraKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYmdvZVVuaFU5YTBoR3hiWVl4MXZnckE0MFcvYmRLTjEraHBvUi9wazZsOVpXM05kNlV6cmhlR3VWN3NCSG1sSUVqcXVCemIyd3FnTncNCnFCRy9hZ3FvZ2lsdGQ3ZUZpNmdVdXQ4N3MvMm5kMjZFL1JiRERPd1QvUUxCYzRGZWtxSlEzTmZzaitPL25VeDVWeVJKTU82ZStHOVENCjRYWWRXcG5OWmlmMTRVTWMzZlR3YlBmY3BzYWFUQm1VTzJ6WS84d0lhbzlNb1hPYXd3ZVlydWZJSXdZZEp5bWhTTnIyZFBqTUVVWUQNCnJjOW1oOXZZQklTRWIyZnNOTFBObWFRL2FKK25NK0VBVGN2SDJVWTBCMjU3a2dVOENqOEhhbG82VGswVEZ3ckIxVXhoVkRvZ0dUZHUNCmdiTHpFMHFjbDZNbHkwNS9wT1lLeU1rcGV4MzM5M1Rzc2xRR0pnPT0NCg==")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAMlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYnBSTWdtTmwvdjl0QUtOUXdhVjNCTVRaU2pVSjIxd3d4UHVWcU9wLzBtRzl1c2ZXeHU1WEJMQ1hqOFNtM2RaalBEbzJwdldYeEFhNVANCkxBZnBxZG1sVUlOVFJzVG9PaWdrTWFVaEx3bEwyTEZtTVpDUXJPZElPdWV1aFhqN1NvblUvaXRvRlZTYTBxU2hNZjVsbld3OHVGWlkNCnNmUjhXM3B2NDNuRjc3ZHF4SU1KWnkwR1kvdENjeFNtcUZBSkl3YW5PQVVZVXVPQWo4Qmpld3Y4U2lkTVFTWkExY3krV0NkdHkrVFQNClg1cUJubDFvNHI1c1NhSENjNHU0OFBkcGpmczF3ZDY5SVRQMnFCZVZBM3hxVFMyejN4bkJ2Z0VEZWtlWEJlNzE1Q0JvM1ZsM0RVSW0NCndkbVppejdKTEVUYVQvVXpmVGZ1NlVGYUZzR2Q2ODN4dzgvS0hBPT0NCg==")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAm2vH2mT8PqjrYI2ljgT6HlMeXhNylQvKZQmz8JkoLr50ks+SZ7WAQ/u+l6OMowXQ9pIWadzSsDiwX47UJTcE2gibTVfbBj8XTnvxOerQeYKm1wJ6rSpFDCt1I75xmbxr3GVbD+eCFS/kPPLR8U0uOVW1RY3vhg2qlrOFVYeOEEWQK1Ds7UF12EQm51ClL+UwH1RoPo/SCABqkiU998a4hvWV57TIefrOtrQBs//ZOGm2BswAtnVjmOd9OZmmnwyVQC6/i50YJOcaON1qiW5+Yl9o8gfE7kRXJ+iCuoOzT4iR2i7Z0xOsMuKme1M1ZNBirBNSpHKvJnTpRJ7K2fzXQA==")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put( - "intSet", - b642Av("AGIAAABAw1+zjeZeeNkjUAgxg6HrlPi++MwbD8DSvM0jSvQQ+lQyzmVEB5IT5/6CoEtPVMasQUVTE/iODio0Yjkdek6vcA==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYnJ5ZGJGRzVFbWkxVURXS1htTEdQZ05zaXh0SURPYXd4Ty9yVXlsWVFTTFduYjB1NTlyM0xWdzVlcmx1Rk5YdC9mS1RYQWdOVFhNeDANClhiSm9Oa3BvcFRDWFlQRnFPSkVINWwxNnBDWXpyU1N3ZXJWdWlRMk5ZcHJ0KytwNlRZOWFKTzZvOVhEUW4wVzNEQmgrSWVUMDEzcDYNCmVCSnhyTjNHRzM0ejc3RHhUZnJRWENpVFp1c2E4WFp5akptVkh2eTdNMmxUdzlMUG00SjBNZ1lHNjBKMUFvd2N3ajdnSGpmaXRuNnkNCnhjL3RqUUg4VVBjcnBvME9HSFpjU0htZGhadlNtSzJnRlh4WkFuVFpLZ2hUL2VxRHFCODhISWJJbzl1QTBzQWdMN0tscjY0c3RvbEUNCmc3TkVhNzdqMGFpd0RKVmhzMk5ZTkdWcjg4UWgzVVNrZmk4akpnPT0NCg==")); - item.put( - "stringValue", - b642Av("AGIAAAAwWm3eBDw275auRay6J0l2m3KEn9sDTPC75ESTTKaE0mJXasDHiYEWWMt2ubWIMrYv")); - item.put("rangeKey", b642Av("AG4AAAABNw==")); - item.put( - "stringSet", - b642Av("AGIAAABAU6yqvtM7vMRXHD9uugPaJp68Ro9jNhoUyKwoItVSvkZDPNypGFXX1L42AuBQbeq4km4kXBwPbnLRfqoPVUG/tw==")); - item.put("byteArrayValue", - b642Av("AGIAAAAg5d/ldqZexHMg6B/GfymHSqxoSFNG3hJKVsof8P6fIgg=")); - item.put("intValue", - b642Av("AGIAAAAg4YeimDgZV76L9rTz+0Me0rXVvSvlPt3W0+1ah1roEqE=")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAjKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYm5TZFVpMlQzWjRNRjJQUjJVUHRweWZIK25CZU1wUEdKbzg0TUJneFVWek4rOXFvNStvaGRXSEp2NEsrTDRwRUJJVGVZTEllV3lGVmsNCkdEZ3dNTk5ZanNmYjgxVy9iekdpM3pzclFjUGFRTi9JZ2RaWTFEdFFKbkFvRUZSbmJ0SGkxaG5pSkdiUlljc3BOanY0NXpaOWd3K2cNCitMN2dnM1Q0WEY1dUg1QUsxY1lLUkVWZUJKb2RFdU43ZGVGZkRWZ3A1NjR6cDA0QXVaTldqcENmYmNOb0dsenJaSGtIZkhtTTVtQ0cNCmFPaUpzc2crZmM0Nm5tLy9BdUc1eUs2MnV5cyt1QWJ1d2RYZlNhUDZSbjY3ZXkrL1BBUVA3SUpYRWVKYndEb1U3djVTcngrWWEyaDYNCmtYbUZFLzhMbVMzM3Vad0lqeW1nNDRWTjE5cERYZUd4NWRLU3Z3PT0NCg==")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAhALCfRcpQ0FpzL1HJQQk5WbSRKN7pD9C1vkkzVlA74pYCsBmHm9GAKTrO7Thyw58BpZtFX8wiRO1aTkPpL5L1oh9rQ9+TlvMv7+MbBB/WwMnx57FbV9I4Cu5mMFiDXpTt7k8I+QEFRJwMdzs5HSv0bjz3FyOBbmXFqkMQaak61nz2KoM3kwUd38jb7sU+calk2Chlh5Rh6Y2JFgJ3L38h6DPrbsB6Hxqx1q8+vod80XWw2IyYmqZ2EKQte6Ot21AcDv3ECm2+XQZsFHAQTHJUSlFAilkhGv1FEtt0NwEUCsgR7Z6YE4gi0JCQ0bdQuVY7XrlY0A6ywT2+wkHBtYI/Q==")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put( - "intSet", - b642Av("AGIAAABAmMIiJONTWUfeTaBy+FgY9TkJadGmsLe4X3qaJ8H1pnebXSz+GiZKhz9P9UfTgkpmYdxEyIqK9Pyq3zMtPDoOXw==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYk8ycmIwcEZMWlV5cUQyT1JDM0xYMkdDZWxjNWtiTjJPaU1wYWxTSVNzVUhnV2ZuVjJ0ZmVoUlo3VGZPZEhrYXpDUVBzNDlQWDN6b1MNCldlV25NS0NjQ1YzS0g3NFN4V3VQTkVhZlVBRVl2RTMvRUtBdmhWc0t2K01tUWdYd2pJckJNUGN0THBKcUtOVU9hUWxkR3EzVnZ0eXYNCkFqam5CUktzTU13RVFJY2VMbUxWbTRkSjJhSTd3STBDL0pZZmtJU090MWdqY2gycTI2c3hiYzYzYXhwOEtnUWg3dms5WTQzQVpMeTkNCnhVL3NJNHVkck1DN2hOLzc0WEZkemdWbU1vbHk4S3lUUklCK2JTN2ZwV1F4RE9ESk0xK1RhNEZPd1Z2VHQrTVUrdUtCQnJ4aVkrT2QNCnkxYVVRSlVXakVHM3VSNW1raFdtVHVtemNYZm8yakNUNlJIYWdBPT0NCg==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("rangeKey", b642Av("AG4AAAABOA==")); - item.put( - "stringSet", - b642Av("AGIAAABAAbnuuD5NoWcpbMV05yWaeXoq/UDb6VcAxqC6JMaFFktVEYp3BWjmqtyFRrt6Gc0t03nzLvPOWs6Uj6k33J87bQ==")); - item.put("byteArrayValue", - b642Av("AGIAAAAgVkfWaVfJ9aQxJWHKPpPFyrAvQ3Eogu4H04hNNcG+bno=")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAUKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYkRjTHUzdlByS0xiN0g4eVZOTkJQMFZ3dXpGWU1ONkpDb2hCT3NscUpYN09wSGdORFgwNUhEZlRMNGFBRGFmamVvMUMrQ2pxZ0JLZVgNCkU1UTE0aTYxN0JyMDQwOHczRlNhdnRObkI4eTZEVXY3cmhSSElBMThGbTJqWVhvMkFZRUlXbzZFRkR6TGh4RUtIV0pmVnppYzZXSzcNCkc2L24xUFUwc2pEUFRtNC9DdE1STWRnbkk1SnA3c1BBSVFOZ0M1M3JPY0FaS0p0ZEU1UmJ1TllCTzJZaTE4eGVPMUNNUVVnOFlWWmkNCllDM25NQlVjZitSTGk0NE1IZHUzMnNCMHFtMGZoZnZ3WjlMaE8xL1VaWlRmK1ptejRFT3h0cDMyaTI5K09LQmxnUlFmNzZRaExGaEYNClVlZVhsRjdZRytKSG9iUTV4dlBzbmxXQUY0T3FaOXJwWGVIQUxnPT0NCg==")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("intSet", - b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put( - "stringSet", - b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("rangeKey", b642Av("AG4AAAABOQ==")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAfuTnJmdj2YTv+7PSKT/hVA/HaYJZCuXquvdCFafntAtjNqcQI371menVgbKHLKYZsqaTrCEHskNESd8qzXjJup2uOYdJOl01OKc0qasI+a0XwQspILlhIBo+TJ91/XyUTbqvRExXv+yJ3S1AY7vQmqIIumzy6kcVk0IR0pJjyqCKLbWumJdR+NgITuaowVMGi4BrjE8W3/ucJnB1yh1MZ5kQlINCgW+80MdEmCtxkZ9Lq40CMlhtXoXXXKNtZ5vh/TK0IDEoDMBQKMv3/MoSDxmRjkwCVRjJaD4ofpbmOaubInuVhMMQ2gPkQ8oxNRaNxoqhMv44rgry/sThLLOt7A==")); - item.put("hashKey", b642Av("AG4AAAABOA==")); - item.put("intSet", - b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYlZnejZZeFFlNEFBQTNEVzRZZUN5K1Z1OWJPWGs2NzNYbVREV1VRcnZZb00xRTUwTm1KRkNQNlhrWktnMDVNRmFKODRicVBkOHZwelQNCnlxS2pKOWdOQnJ6Sk02MVhvZitPeGErRm02MkIrSzRlVHlOa0U2aFV1Z2U2Q2pqa1pkaW54bHBIZlVBbVJXTXhxcW9JanluR3FWTUsNCm5qS0RYRWkzWHJFSDY3VkhIQnZrcFFVbGg5QVJLNlg1bXFFTHFRb2twamw0b1Z4d1RqakZ6L0c1b2VVSnFkR0R6eXdTSW12NjNESGkNCmhZeWRkSlEvQ1d4VUsxVG5UcVByWnVKMkNneVhQb1pkcEVrMHV5TllGb3dMWm9iNi9kb2VTWjJBdmdHaXBhQS9yZGFlbXZxdVdBbDMNClAxOHRZQ2FOaVhieHM3enRRMExSanp1U3R3Ung0OXRuL09vQUlnPT0NCg==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("rangeKey", b642Av("AG4AAAACMTA=")); - item.put( - "stringSet", - b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEASNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==")); - item.put("hashKey", b642Av("AHMAAAADQmFy")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYnJQOXA1YnN4eitlbW41dHdWY2dCSHZ0MHJBVW9xa2tzaktTeHJYdTZZTElsSkR3dWJ0MzdrbG90M2IxZGJvRU9mZVFBQkRtcHJFb28NCnVnbTk5Q2paQTBJN0ZRNzJIMElzTEkySUZwV3JzZzRHUTJOM0x4S084Zk5TYW41SGRIWUkwUVlIMjcvMExaQWprbGltckpVeGh2ZUoNCjJYYlFidzhlNWRWTmdLdG1sNkxsTEVWOGlXSG13Z0gwQmtoYzJBUFpIMzlLMHUzTzNBNjd2Yk9pTGlsUWxRaVBJRGhGdlRsWlhtSlgNCmtYYjUyU2R1UXhIMjJubWhFOUc0U0pRMG5BYVhOWkh6S2NZZFJSalBNZmV0VzExZlR2LzhucHRKeGs5YXpQOGl6YnhZR1R5cEh2K2gNCjd6T1NZc2hDUzdWZ0l0MGtsUmJtcDFFV0RtdW5vT2xNZStZaXRRPT0NCg==")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAV0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==")); - item.put("hashKey", b642Av("AHMAAAADQmF6")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYkhQZ3dZSWZzcjlhaVJ6bUIwdVg3WWxkbklUeVRkU3lHTnJIdHVqbytmd1RVUjJabFY3RmxpbjdPS0k3SzNaNE55bFM3RWY1cXk2ZHgNCjRhNkpOT0NCbzIwTTBjbnhEbWFsSG5iZ2p1aUs2ZUhvUzhqbFVvMFl3RDhFcnM1NFFaWExFZVNCQWxucDNUYk55dTlRNkNkTExoRXcNCmtxNkJ0akZNeGtmRk9SaUk3TmdwL21mVmVMSHhqajNleXFCbkpJSmM5RXZVSTVVWlZRK0wvRnAwa1pKdDFuMHdVMFU1UVNqVUVBeGgNCnNQUm5PWHpiZXhGSWdHc05jVE9wdy8vbGoySkZoWGJyWXowNFVqQkpLUEJibTErbllicmZPWi9yU0w2bDRCR3VUTUkwU0pta3ZxbmUNCjkyRmhpUlhJNjJZN0xIZWRzbFAwVnBQMWxXSEhaM1dkbTlVR2hRPT0NCg==")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put( - "*amzn-ddb-map-sig*", - b642Av("AGIAAAEAQZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==")); - item.put("hashKey", b642Av("AHMAAAADRm9v")); - item.put( - "*amzn-ddb-map-desc*", - b642Av("AGIAAAHzAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYmI1L0Y2NE5MRlk5eTdVZ05EeUxiYTEwTnpBck1hV2dIZ0hjNndGZncvK0RESVppRUUyRTZSY3NvYnM0U3F3QVROc0JlSHptZjQ4UWQNCjBIWXdyYlVsc3ZOWnl6WHZOMkNqdFVqa1dDdHJOTTJQRlRuVWZHUldPaFU5WDdaR1BPM3FHdzZ1cTVxc1d5eGU5SVhRZTUvbkUvNlUNCnZ1eHlZUG8yR1dwM3BxOS9GSEpIMG1oTCtIL3ROZzBIazRtQi9MV1BxZGphc0F3Zk5ldzQ1Wjh2T3V1aDFGc3hZaExFMmR6Y2VpcVUNCnI0M0dMZGNPVTlsWnpxajF0eW1HTjBubUY0cTBYeVBnVU5pdkJ6anlla1hRTEJBc1RYY0lqNVRrc1lKNHRPR0ZtN3pHdVlVanUrZ04NCm90SGRROThuaGlLMzhnbHFkdDRoOW4zc2FxdGVhMDQwcFA1SVFnPT0NCg==")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - } - - private void insertV0FixedWrappingTransformSymData(AmazonDynamoDB ddb) { - Map item = new HashMap(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgiZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=")); - item.put("hashKey", b642Av("AHMAAAADQmFy")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgzh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=")); - item.put("hashKey", b642Av("AHMAAAADQmF6")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgHR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=")); - item.put("hashKey", b642Av("AHMAAAADRm9v")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAglBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgcjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAguXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgyT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgYAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAg0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgGl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgOVOhmBYFqn8JmCr3U53n0gUHm9sOFlCzfslQTndM2d4=")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAABAOZ4q47AhicK3RzfypoCMvUy3qZNXNejFTSYygP00tL8ox0Zcr6xxxyAHNEf+L/gXv/D2/0fZ1ZXRkUx6I4Q/ag==")); - item.put("stringValue", b642Av("AGIAAAAwWr8LK3dNif8LCWIEVTk4LsShW/T0/KZqxRFOADzHbI0ou1IFHF+Oy3BwqIP+/zK3")); - item.put("stringSet", b642Av("AGIAAABAWyqt6ciL7p3eIoT5dnONVBoFLK6nUxnIcC6NylJfdrUWh7/ckBnGMl7c4CCq1ifPD601xrh4+TO99kMSHSaLNw==")); - item.put("rangeKey", b642Av("AG4AAAABNw==")); - item.put("byteArrayValue", b642Av("AGIAAAAgj47NBhEawqzHQb6prTGB6RvYyDuh+A4TIrTSwgZoxDA=")); - item.put("intValue", b642Av("AGIAAAAgrwlX4rD1gcqVpnTT4DfX79JPLAtOsw2CYssZ4VS7fnA=")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAg66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgxZvHJ377MCQ4hf1BZJGRgTF+l7YiaydAkILG+7CaQ8M=")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAABAoptMhPYvzeL68/ubOiJu32JBETi7ss0o9nqCSDAN22RaR17CGXge0r6OgJlfWfVFBhUebM/uN42OJpyB3VvuwQ==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("stringSet", b642Av("AGIAAABAp3shcn0B9/lVCp9UjP2mRcARZQ8PQC4hR5L0fAsC154j+2kUPu6iRhazVKxkJ8Fr25jtc61X2M9Q32kPwyRmwg==")); - item.put("rangeKey", b642Av("AG4AAAABOA==")); - item.put("byteArrayValue", b642Av("AGIAAAAgE1p3OH249idr68bawV56P5lo+nvBvJwbqVPTHMM40/c=")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgcSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("rangeKey", b642Av("AG4AAAABOQ==")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgiWWvGpcrzkUu241+NNtykoiWoeaSR3QHQMhHTmf0XAU=")); - item.put("hashKey", b642Av("AG4AAAABOA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("rangeKey", b642Av("AG4AAAACMTA=")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - } - - private void insertV0FixedWrappingTransformAsymData(AmazonDynamoDB ddb) { - Map item = new HashMap(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEASNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==")); - item.put("hashKey", b642Av("AHMAAAADQmFy")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWHFremNPOXl3MlpwUlh5U1pRQ2Jra1BxKzkyakJIZ2hpUmh2Q3hQTS8yNGVjdW83SFdvL2FDRHl1NTZ6eFJ5UkhiVkNnTUw5V2tua1dBTWhOL1UxMFJjOUhKQzlmd0pYM0h0cUVxVXl0T3NqZjRzUlhRWElKZmNoTjRKNFlYNHROQ3pZT3EzWE1BcUxCUng2L3ZkbFp3QUVCSURLVnJQWkZVcHEyZlVVYkNNeCtxSWV3NGJwWVRsVmhteC93MlZ1d2JldHRTT3huckxiOGZINCs4VGpGZ29MMlgrSnk5MERUV3EwNTdoVStDbUx3RjVxazJKaVRuenpSOFY4S1lVOUJTNXJydlBDcmd2N1g1S2QxYlc3akd4dlE5dk05cFI1TysrQ3dQUCtKVE9YbGNFMXluRXpRSFd3d3EvSG9RalJBaXRjaDFINDd0WUJPU3pPSHNYUUZGUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAV0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==")); - item.put("hashKey", b642Av("AHMAAAADQmF6")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFQ1WlltM0doNGZ3UnBmUE9MMWduSTdaekNSbWtXa1kzZjVqV2h0NGZ4a2QvMnF4NWNxNm5aa1IydFhoL09ZQjVvZVE3VDRBUVZBNE95TUsvVDJ6QUNSallhNlhSdE92Y05EdnVRalVGUHVBbThKRUlOZWd0cER4RjZreklYZG8zanhQenZscWNFakZxdnpBdDRBWGxCa2hZOFZGeFBCc2lRV2owUTdwYUJxak5DWGNjZ2lLdG83U0ZTaklCNmZNRFFtWkNaNUpFRHVLcXkrY1h4UytyOGJLODVaMTBwMlB0YzZUVVZZdEExVTdXUmxwOThIZExUL1lJZmhoQlVDT2hLN3ZXN3c3WWp0T3g0UTRUT2dnbndBQndxclEvUXlrZXZCaG9SVHRoQ2NkR1JqUVdrTXhSaW0yQkNaeWgwS0NtZStTUFhKcXAvbTZybVlxbEFxUUtyUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAQZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==")); - item.put("hashKey", b642Av("AHMAAAADRm9v")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWHJFbldWQmRWVHdpOERuOG9qTHQ5R20zV3dCTm9nYWZmbFBXdmRCODYzL1Buemtsc3N1QzVlaThUVGlOY09NVzlqZGZvTEtLTWRrVm5OQ3BpaDc5QWRTU0ZpalVERXNnODNZdHFlS1JYRzdsd1B5KytnYTBkOXhFWmMwZHlPN0FSS1ozekcwU25NcVBhTEFIdURaYUQvSzVIVDRPeDZpaGpmS21PQ1Y1QytFQlNRaFVRUTk0QjVOeG1EOUZObEl2MHp6QXpXUVo0R0htTTI4ZS9tMWJGZ1hITExLT0s3cVFhZjM1TWNqNHFoVUNJVzV0TjVFSW9hK0tTYWxtZkMvRE5ub29oU0JWejN4cDdpbU9wUkMwdUZXdW1HaHRpR2krYVl0czJwOUdodUpobHFvQi9RSk93TDVDKzNNelZRaHJWUG5aMWRYemhtTHBGblUrTTYrRDl5QT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAVRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWENNRDA0MG0reDd6am94YkZNb2FzRDJ5cU1MRGVzWnpwZlRGMXNNcDVHUDM0NXljTWlIbnhONDRLUEJQUlE5clh5bjE0T01wVko2bkNBVFMvMUdnRVRLdTYrQmdmeEtFZ3NYZ29wRWtVOE52QnJ5S1creHlyeFN1bHFvUG1JR2pnM0hpMEd2YnRvcnRkeGt0NTVEbXVyZkYyTjVKbnZtUmIvZmRscGRkdEJsTVNycTR2UFZtS0UrbTl2b0hwNVE3VzdoZ2RDODVxZGE5MVBkd1hsb1RRZU4xS0NhWmVlTUtnMlF2a1BSa2hWbHNZOFJwekVrZEFSRWxDLzBwT3VTQS82ZURhbU1hNTEzK3VqKzNlRmZ4ZzNPS2MzL1VSSHpGY2NGb1p2VjZJcmtkODN5TWwxVkpIaGVKbGxTU01UeGFwWitOSXp1THRJNGhUeHh6bElEYk1pUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAMG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWEhTY2swR0lJQXBPT1hvenpudVlpRjJNOUZQZG1FNUpsejBLTlBsaFJPcHVzaDliNzhseGxBK01QYkMySngveEQ5NnZVTmtqTW5Dc1BkbFZDcHQ5QmV4ZkdGNkYzbC92QWVOeVRMMEFvTkdYRCttMWVCL2tIbm5ZalVyWUJ0U2ZseWxlOHF1UEZZRzVxbkppZm12SGRzRXk3R2VnREZKM3M3NktqaU5RNDZGWW9KTXVUblN5OXlRekhtbm9uUDVrcXliYVB4b0E2TTE1Z0JQYjNiWlNTUHpTYmQ2M2M5cVU4UW1DMWVtY05TWUxYTFYyZGUrUmhaRFM2YnlnNTBuTkQrZXRPUEpnUmNCVjhVd3J0d0RFSGo3SUcvbXdqWWcwM0hxdUxjcUhUcG5BVFVOeVJVMHVYTGtlZmpRRStxSTZiS2xSTHdac1gvYndwOXFLdGJOOW1sQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGZLWHJVY0NjZjdSOGpTbERSVEkyOVRDMEFMbXlVQjBCQzE3WmZBLzlQTjNkYldNamhTb2FCNjhzUFU5ZkFCQld4YzliZDZRZFFndkxHM1cwWmgzZzFuWWpVYTVkbklUdU1TU0Rxdm81MENZbkI4QXp5dmU0NmVXNitJYWh5MlZJR3pWMVRkWHA5MnoycXhSUHNMOFlkVmswZ01MTUh3cERadXljZE9RYTAyQllJWVNZSHQ4NlNDSllxWjVoejBrc3hCaTFBTHM2ZzFBTGNiNHMwRU5nbWoyZ09wV2xQeGNXOCtVUVFjWVpHWEFGUDEyWkpzNk9rM0ZoM2tiMlhzR29uWFBweGZtaUpCU0paMjJ6UWNiekJ1S2VHOWxVdG5nSExLb3dqU0t1NTNKR3pjTXl4MHdCQmF2SGI2aFNicVh0YkRKcXRCaHMyRXRzMkdlZzlKZzRzdz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAMaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGJ2OTlUVTVNbUozRVJ1Und0ODdZNE0wVnptZXdnNXhRUFg3R0FSR2hkYXhDNGZQNFphMUlWOTQ5V3pQcjJvRXJsaVhLTjc2STY2bWJHd0piZ1Q2UzJtdmlFRWYwZXl2bDlKTTNSUmNzbFpsVmpMSzFFcDc2aGthNGpoclhVaURuaUNTZndPYXlYbm9GMDhIMml4S1YxazdPZFBvazRDcms3UHNFZlh3UmN0eGU5SmoyaTZ1Vzk5a3VielY1R215Q0FPRDNweTgzZEJtME4wVG9RMDJaMmlJYUlYb2I3cW5nTlBDZEtDakpyQ21xbE9KTUswOWJsRkFucUhvc3E4K2wyNXIrOVhtSnErajByZjZJQ09MMDlteGpFZkZnOHFYaVAxSGUrWUt6YStIbTU4MWZ4dnY1QUtpUngwaFlDc1p6VkZLODlVN0FJT1NISnlxaVUreTJuZz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAfq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFdpcEVnbm5uTm9adGZKZ1JibktFbWlJZlh1dDluNEorR3N4YTZ3NTZJVkFZQk5Oakg0Q1RXaGZKcXlEZjc3UVlNQTNhNVdQeG5SeDUzTk9JNStraWgxcmlrS3lqaFpXTDh1ZlQxOUwwWTZsd1FjTUFaekRGckVFSS9UZW5EWFJQZUR5UnBXR01NQWZCbnlaMzl0aGUrRXNzYk5aZ1poWndtaVRYNlYyUlVmQ0tuRUFlVk40eXB2NVdzUEJIcnFmdXBtVXNBVjF4MFdVNUVSSnhNNUl4SURhL24zOFlqOEVsa09mY3pYbzlNbTBmOE8xVmJKZGhQbVVmZEYzQkxIcWdMY1o3aDhNWDUwVjdlYm83ZWY2SkdWR293MFVVVGRwUC93K3l6RFUvK1dQQnpwR0wwSmgzaFhQK010M2dxZXBLQXBXOWtGRXBKTzhQOVMrMFN3VEhVZz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAraKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGljaldDWmg5dlNDTXhQZE1mNlVKdkpDME9jMGR5cFUycUJ3ZlZmOG9zRWxjb05ZdkVaeGtPQlFrcnpIVmtZaVI1dHBRelplOUZ6QzFnelZOSUNYSDVuWVNZN29sNTJISlN3azhtbDZaaGw5T0F5bHA1SVhISEkydnhyUFhRa3BsSzJjcDZLQjAxQWltQ3VwZTI4dCtQR3JUOGdka2Q3UG5TMlBTVmMzTnJpUXZVU1Q2Q0VpMnNaSUVnMDA1Ui84MDJUc252eGtGdnNyTVU4SVlhN2NodFEydHdEK1I3QXpzeE9OdnBjU25ud0t2NEtKd3RobjVnNlVNdVJHcXhKZHB4cUxKSGxqQXhNQTZiajFEWEVNNXgrUkF1NWExNEppbmRFSjJ4dUN3Yk1zSWVwR3BXTHFGeFA0SlZuL2F2bmUwcWVURGUxNXlMRnpWcmJPdkNFbEk3dz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAMlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGRMN05wNXRiTDQ2SEVhcDBlNCtGek5KditIMmo2WkZIdTdHQmZYZUdNTWlUaE1Ibklkb0hrVmQ3WUg1OEVaZVU5dElNVEh2cHVTT1NlV2V4NFVMbUZNYXVHM2o0aEFOZ0ZOOEtKR296STE3dlJQaWhmcmZ1VW1QQlVtVzZwTi8xYVpXejhtQlJBSUVyamRRMFFuWHFxaWoyNGl2QlNwVHB6SVY2MExTYndCeFJMYU9OYVhIVXNtTUF5U1k3NjJJZWtrbWMwWDd5MEJmRDRnQXVZbTdlU013SHdyR2l4QjZJbFJjQVp4dElPSVVoRGhIWWwxa1FWVExoZ1k0Q0N6eW1TbHo3bVlBNHBGVHhYeE5KRGZsYVg0TmE4eFBmVy9yL1hJZkZOdUZuajUxSzhKTHhueHNUM0VKV25FNXN0bktFcldHVEhHMFlhUXN0MmYvZ05QbEhKUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAcXwsjmUgMBWevJTnvjoJHkcpr4Lq9EynnWDVpHTuVT+981Dwfz9Tb77Ct9PrlpH2tmLAPa7Men6fweM96FHixKZprq4fpDtdS8/uYpwR/R1A3YJ2PV/7Z5tpnbcsK7vzWv5FFfu7ExiDhiyo3BO0tUfzmgIj+n6AC4t+Av1H+ezftU5RFvrZRLyXqznb4BgGMFw2hrp492AmgRmkyn7tH0gSH2ov5511xXTLDxb+4FN1pcFMXunegJ/mrTZbAEpA5cwSmFrAG5HF9+1HMaW4xkKngG/RDM1uAqW39cFwullfdwQrfGdWcjP8S3gwZjRBYBuVmmT4I9+iReWtKyffwQ==")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFNMbk1xMlcyM1lMbFZnUG16dUIwSGcySGlrRTE0VUowZlU4cG45SlVVSG0yUmZkNFR4aTd1MkpkWmRUcXB6NVNvOG9XNHBPQkw0ZlJKN09EUXpLN1U4dWZzTDJaa2gwL0U4STZoSVVHa3dlYnhXdll4eEtuUWYzRzd6ZG1BTWVVU0JDWGx5amgyTzFrMXVSZVAvREkzdDBhcThkVFpZVDhGZ1UvaWpPb0tNRzlTdk9SQjJJK0NlL2RPb21KTEhLSTloT2RvSHNsZ3BEUGlFR2JRemtrR2Z5SmJVQWdMN01UQnNnM1NreUFiQWNHa2NKM1lVTk5STDJaczBYdnR0cXdYWWpqRGZjUFFURlY2UXJHNWEzK3l5TzJKUkQ4UlZGcStTcUQrVjBHdGNHZlB3OE5aV1RyNnlnNHh4ejVMSnJuWStZbmo3ZUQ2SmtXMnp1SjZlSUp6Zz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAABA8ZtcMSFyLVWShX6ppvvQSieBh7o22ZgvG2W9YnfvAl0Skl8MSs5ARJBSFjfwu1ZUkkAu4TkSVDzYHQ6OyVqY3Q==")); - item.put("stringValue", b642Av("AGIAAAAwOai1ObEsra4j02oNBT/sjPPbs90yHVhv1sj/+JWeLADZb0BcIgjI/YZpJf16khFf")); - item.put("stringSet", b642Av("AGIAAABAvzb/AuXZQzfsY6g9eCX1bfnIaNrP4AmLmsEsG9c2vhV0DsRUBuJ7A5eRJCUkS6M3V41+kL1wl0kPQ2KE2ldVMg==")); - item.put("rangeKey", b642Av("AG4AAAABNw==")); - item.put("byteArrayValue", b642Av("AGIAAAAgKAywNi4WcQfbA327kGuM/gvIezcA4/jBlnZDXhl8M+U=")); - item.put("intValue", b642Av("AGIAAAAgZmWF+am2vPEV2IkuCb/6ULBiGYSvjR6OwCcQxfQ4uS8=")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAjKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFEzcXNQenFUZ1hJUStDYTVTakxJaXNuWXZEbEx0cHRId2Y5WFpNV1AyVzhFVEk3WG9tOGlaN3o2eE1KSjBrM1JYVFJ4ZEZWcHByVXlRc1owTnBYdElYTTdSSUtxZHkra0U2UUtqVk1FampHKzhxa0pHUmZTY0NraUZrQW1VRmRIWHFoVWRtTFFiUDVSYTc0RjBzSU9GU1JJd1Qrcy92cS9kNG5ialpkUEg0OGp1TE1lS2ovUEtrUkx0QzA4Qzl3bTdBMmxDTXc1SndMK1paY2JZc0RnY1c0UmFPcE1QeUtTWTZmc05QMHBlc1NuUDZjTkY1ODZ4Q0lYYkhpQ2dqbjN6dC9GbGxIbWR6UDhocUVwWlRibWFyOThWM0ZOOWczWXpaVm4rSXJTUWZ0V0VxYlpDWUxoZDBWRjdXaGNNZU85YXNIenJhVU5tUS92cmVLelI3QWJNUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAjyMvaawr9SVz2o2aZu9DTapsym/AbELIdz8JPKoWFbxmEQqmUmf1jaMDC91xLfBw5b9qjeCEgb0FmsSXtnT8QhrGrzsCYGwiAq8DVg4rxnSRGdILKzWeYpxJO1Laf1vzow5DIz2FWxMSaRzVYh8nGPoPdO8XiPWb9tp7uLF+s0vjt6UuGcwR+4aOw2Dr+1xL2jO18uKrCxGPtXUP5D0ThZctwiQaamP2Nz1RSHGGatKU2zPcMzp6zoIPIjdnMqX1g28La2IR2mxR0Miq7Mit5EkqYk+s7XdYlTPNhVXifJu9iHvFmsLtc/hJryvLG7hrzI3Bzg2b6mkdL7oVuH2wGQ==")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFVMWk1LekJhWnV4WHgxSDIvSUtiSHFMMnIwU3lJc1NTTnBWSkxuTlpXM2s0VzYvZkZ1SW5CaHdJdkxLUXFmY2tzcWtTSUFNbzdnd29KUVpneXZzUTZpeFRpS0ZuT1VFMS9aM3E0YnVjSGhKa3VOdmhFcExrZlYxNzg0QW93WFQzYVNEcGtuNUllc2p0ODRZVGdOVEEzUFBGSGZYMktaclBOT0tJWFdTUWtaQk8rK0Zvb0laQW5xQjkxZGs2NFZCMFRyTnRVbXYxcTlkbHgyWklqcFlIUU96aWZha1QzcWV4WVNLRStHSUs2cGdGSzd6dTBMTHRTREpVdnZUcHArSy9xNzMyVjdGY0dhK3VEY2NsUEM4SFdEaWEwN0RNa0hQN3o4WGkwdHcrM3VWU0NmVlA4R2YvUTIrODhyM0x0djRWRms1YUM4OUtlcEVNditZTlBhZXBXZz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAABAS+mU+2GCOyieXTCnXN6EW0aJ2q1u0lzYR+0Klp3ie7JKzT50zgGIfTTF7mL4UglTVEBsUGuTDB1InROrNkpU+A==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("stringSet", b642Av("AGIAAABAROVxXPL8ZIBOjE+SqmxNuWymmlubdUnMnlVzVAcZvWYQFtkQf7Fw7tgHYILDcn9x1MEsqq60wupRhyRLCJD7hQ==")); - item.put("rangeKey", b642Av("AG4AAAABOA==")); - item.put("byteArrayValue", b642Av("AGIAAAAgcEXPxkOed6M21vOTq5vi0KArgXdhtumzZkTxLH39N3w=")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAUKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWHRoUXFMR29QbkJydUNBa3FpeEROY3g5VEYycEIzZnRobmdZZ21NT3RUQ3pHSmtodVZxbzR6bnRoYzEyZkdjR05DY3UyRit1WC9NRTZ4bFY4UU8zblRjQVlXLzlScWw0UXo1OXB3dXBFV1NhR05aTDhVSlQ2UHhaa2w3WElTMzJvbnhuRVd4ZEJsR2U1a3RadFdSaUN6b0t5S3FZMXRCaHJKcVdWU2xsL0tYY3l0ci9FMk14WjRGT2NZRjlTVmdEeDIvSGtJL2VXaEpkbWFMWU16d3J3RWR0S295aXNwVVZLbUN3T2QxNFYvRGNSQkczM0VpK3hQbWtGOE8xTXJIMG5zeFBCQW0wYXQ3azJnQ0ZBMTBTUmJ3ejhFZFpMeTVlcS9HVTUzaFNuaHlnUmUvT2toWHdWMG5qMlU2YTYyd0lzVWhQdllVR2JIU0VzTkMzNVJmbDkyQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("rangeKey", b642Av("AG4AAAABOQ==")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAfuTnJmdj2YTv+7PSKT/hVA/HaYJZCuXquvdCFafntAtjNqcQI371menVgbKHLKYZsqaTrCEHskNESd8qzXjJup2uOYdJOl01OKc0qasI+a0XwQspILlhIBo+TJ91/XyUTbqvRExXv+yJ3S1AY7vQmqIIumzy6kcVk0IR0pJjyqCKLbWumJdR+NgITuaowVMGi4BrjE8W3/ucJnB1yh1MZ5kQlINCgW+80MdEmCtxkZ9Lq40CMlhtXoXXXKNtZ5vh/TK0IDEoDMBQKMv3/MoSDxmRjkwCVRjJaD4ofpbmOaubInuVhMMQ2gPkQ8oxNRaNxoqhMv44rgry/sThLLOt7A==")); - item.put("hashKey", b642Av("AG4AAAABOA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWG0xKzA3d2o4dUJZYTJyeEs4TkVBUUdnRmVDcWtqYlp5bndMdk92K1ZkdmVsWjZ2bkVqMHI0cnNFbG9SeVdocU5YZWJuMDBReXI0QVhsQW9aektFQWRPTkhxL3A3RWwxdnZ3VHB5NnpmYzF3dkhvc1RVdlRTLy9wRlRvaHptclNsTkFtNFVCb0JLNjJsbUZKTWlYUy9EakNoVzgxQmRvbFZHOHZUb25tTUhJS2Q5RFlJVmtxYUJBTUdYaENuc1NIQWpCUmxQWk5XU3pTZnQyRGc4dGx0b3poY3FwTitsZHNYdTVJSjZoUk44RjlXcW9hUUJLYVY1QXRDdG92dm1BWjU4c0l1SDZnVjVWSllSL0ZzUmZBUlo2UzNJWlErQ2ZsNzRXRXpueElJa2IwWElDMmc1enhTYlhFL0NTYW1pVTIrNm92NjQrSFlvR2tkWEw2ZmpDTUtoZz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("rangeKey", b642Av("AG4AAAACMTA=")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - } - - private void insertV0FixedDoubleAsymData(AmazonDynamoDB ddb) { - Map item = new HashMap(); - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgABNOeG5nexpOr+MWQa4B48/NZFBV/UTkeSCMbe5j8oM=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAAAwU2/wlRLHVZxqV4/1FiC8CWSdn7f+wZco9kdFttMyLrhkYBeS7d0dROTlsFK8BY9J")); - item.put("stringValue", b642Av("AHMAAAAHQmxhcmdoIQ==")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("rangeKey", b642Av("AG4AAAACMTU=")); - item.put("intValue", b642Av("AG4AAAABMA==")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgABNOeG5nexpOr+MWQa4B48/NZFBV/UTkeSCMbe5j8oM=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAAAwU2/wlRLHVZxqV4/1FiC8CWSdn7f+wZco9kdFttMyLrhkYBeS7d0dROTlsFK8BY9J")); - item.put("stringValue", b642Av("AHMAAAAHQmxhcmdoIQ==")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("rangeKey", b642Av("AG4AAAACMTU=")); - item.put("intValue", b642Av("AG4AAAABMA==")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEASNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==")); - item.put("hashKey", b642Av("AHMAAAADQmFy")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWEFWclNqZ2RNQTZkcEV0ajhkZU5oVEtXdVhGMlBCclFSeXBKRzRkdTRYWFZlTjRWYVBOT3NwY0dRNFcwVjQ4dVQzeWVzSXlad1JyamwwL2pIby9oOFlxb2Jya0hNOWNUMXQvN0h0VjNRamRzbWZHb0xGL1Q1QXBxaEttY2dYOTZ5V0hWZTYyMlFLRk5Sd3lHaHNTWE9MYnBLOTR4Yk1iWVh5Wkk2d1JwYVl4TTRaaStrTkJQZkpqekxycHdrTXNjN2Y4b3hxV1BZdUdxMzVzSFk4WStXRmc0bUNoMmpQZCtCUWRFeThEaFF3enFHRUtkcW1ObmY4UDFMMzZKbE9NUDVyU1RwUDUzVlVYM0ZVbmVxbG9zT1lGMStwdkdTQ3lScDlJcUZmdGE1N1BEbTkrVkRySnZXd2dXUDh0TVAzdkhDZzB2UnMyV01BN05MSkJRdStYTUdDQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAV0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==")); - item.put("hashKey", b642Av("AHMAAAADQmF6")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWG1sTElwc2ZrSWlLdFJjUWg1anpSY0hIelU2emIyRjB0dTJPNTVESWI0OHlGaVNrTENkUTJYNHZEL0Z6OWYwR1lkYSs1eVdwd2VrNkFCRmxFRHRuVUwwU2MxU2h3c1FOMCt0eE9PaHVYTTlnZjhEbjVmaWpLUVlxaE00N1JMRVlyNzZvak12eGtiR3JIUlIrd24vQjNwb3RKZlhBM3pGYVVRb0xybkJ6VnorR2lNeE04QnJNNnRxN1U5U2k1VDczUVJlRmdUdlluc1F0SVhsWEtMZFhzTG4zaHFlTmk4bzBsMVdxY1ZCSU4rcUNwMWpkZzF1Zmo3K3Q5aFJFbCtWQjd5dktDZ21Ld2J0MTgyVFZteGFZV0RRMGtyS1F4WWdOK0N2MXBlSENmYjZmWjllRW9SdjJ2VXgwZEg4RlpTV3h6K014Q09UVFkwU21jVHJiR1dEOUZRdz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAQZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==")); - item.put("hashKey", b642Av("AHMAAAADRm9v")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWEg2Skp6ZUR1RW5zZ2V5K1k4OE1ZZHNLeUx1c09NLzRuT25qRTdxNGVVYTZrRUFXcFpIQjhSMjVFckl3VW1TSXVCbk5rOHd4bmo0cjY2Kzg2VFd2SklHcWlSSTJ3QS9xL0x4U1FxUDY5YWE4YnBiMUhhWHlBZFZpVWhnT3I4MHAvSGpCTm90bFh6VjMvU1h4WXU1cTVxUVEwU3VrR3RkU2tIN1dZeU02YmpyaTE3aUZPQ3F4UzZNNGR6NWRtSU9SbEE1U1NSc0dUcjBmNXUvNWw3dXR0YVFvdG04UzFid3RIZVA2U1R5dWVUYjhLRU5mSm13OFc4K25TVXdhNGtHb3lTUDZ6L0E2NTlrVEc4SkVES2JuWTkxY2tycSswUUozU01OZmtuWG5BRGYreVYrTE1YTDNWMGprQ0hab3VBWktZNWxxelRoK1lTcjE0WGNGWkFlUG5zUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAVRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWE5ZbFNGc3FDcDg3Q09ia0FhcnllaUhCNkxEVGROMzZ2NUJBNnc4MEFnOTc0Um9IRkNibE1qcDJLZm80MW1NWjBhUFpXTllRL0RaWVNQRUtnelBsN3FvTktKS1ZweXIweU0rQXZpOXVoNUo2RGpxZTlka2pJMDE2WlFMbkFuQkdGK2ZRdm4wNUV6MWQ5TU82Q2hoQkcyckVxVUJvUWY5RUtjRG84VkJHU1FKaE1RVDROVGZKRmFHN254Z2p4Zjd6VnE0K3QzejNMMDlISHhjQ1A4VUZiUGlFUUpFNWVIOENJeFk0emljVHpIZ05mcTl0OFFXcjNEY3ptck9RSGVDQmNwcThVR3d1ejJ6WTFJd1g0ZkJrdlltTHA5ZnVPSEF2OVEzUXF5dWxpVXNpNlJUREFCMy9GeEtFbXpmQmZQMmlGVU9ycFdKTGRUNWJ1akxpa21mMjlWUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAMG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFpRSGxBa3NnNVRLeU1NMW1pUENnSFVnc2NoR2VwSWEyMVBsRVJPYk44N0dYWFN1SVJwK1QvZG9qVkxzaGlKdnQrWGZQT0ZGNE5uZTBZNWp5cEVYNXZCSTk0OVFwaEorSnM4U2FQMWNWTlNqV1pKdVUya0k0V0NCZGsxNXN1Z2hGdVFEN254eEVGa1lSQXNsZWl1d2x3TnlpN3FCOTVSMG44eUVWdmFHNmgxc0RXc0c5QlpxVUVCUXZrb0NKTDhFeWU4RmxUMkRZbkN4UDVmL05FYlJkTGZKYTFZbzI5Q0VWMDF3YlZ0ZFpYemhxZXRBc2ZkYmRnTW1KNXFySTRlSkxBeERwQm5jeVY5Z0dKT0xvV21BZTN5YWdveU9MalRaYkVWUkV3dDN2QnhHaGR3K0M5QXVqVitsblNYWjM2czR0Tm12dWxDeVlaTEYxWHByUEtGNlJYZz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGZpVVJXYnJtWXMrNllPUnYvUlk5NXM0RjhOaXBtS0V2MFVBV2FBVUhvQTlJSlJ1WnhGakNkUk1PWE50S0k5RW8rUjc5SXNVTXF4dm1wVjJLK2M1SzBKUjJDclZ5Vmw0ZVd3STRJekM0d3I0d0xPV0k0djU2S0tGeTN5TXIzSkpvTE9BMVdUUVBaRGl4Z0x5SlNoYlJsbjNaODJIOVFYT0hYUFdXR3VaN3ZDTm5HbVhnZVhSSVZlTkYrREFnZ2sxdDFydEU5ajJ3ZDdxZDdOeDRCb2pjM1JKa29STXJkRHFycXpMWjBsWUNPZFdvbVl6YXh5dGZnNzhkVlh1bVFCMHRvM3pnaHRDNUhTb3BRRzgwNk5vWG1rdXgyNTdHU0dWNGhERkMweGgrczB4SVYyTTZhWURYS2VnQWVJbjY0R0ZJYi84NFBvcWxoeEhQOWRKcUQ4NVBFQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAMaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFJNM1NvSmRpdUp0ZkpsUUNFeWtRUy9NS3MvbFZmTlFYK3U1OXhMVkRZTC9PcmFBeFR2em1HS3hCcjFLc2ZCZU4wQW82YlNEb21MSDdsRHdNSGpRZjVCZnQyRlliRUc4bm5rSnBhaVpHYnBCQlBUVHh6SURGbkZJZ3JMRnpTT21UanRTK2ZBTVpjYXJuNGVvTFJvbEd6OE5FbnNrQVBUNWV0QkFIMXg2UUJjQ3h3WUxtOENWeDZ2T3JyZDJUUThONTZ5WEpMOWpZZzFNczdoN3dYSitDV1lVRTI4ME40a3lId1ZCSk56aHVNNkFFdVkxcDdNNEtqSFpycHBXWm9QM0FCYmk0RW9GaCszdjdXYnNCbzFpSFltLzVSQnBqTFZyRW9RNkpuMDlHSllVMDNvM0dRcjIyaVozK3YrUVVnLzNmUWZGUy96UGsxS3NVQlpPOHRWNnhyQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAfq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWG1CWUs5Z05nRTBMYU9jL2NvaTZjdkJCbzlLVW45ZVpzbmdyZVE4UnR4R25OTVQvbkN6R3REcWlXajEreVd1REpHU1dlb1RBQysrYTR3KzJpNUx5WkV2bFg2K01uVzE2L0NyZ1VaWjBlcnp2eFVseVFDYU9ZbmJhcHM0UFR0NjdZYWxBaTRXaEE3Mjc1a29LQVltYzVBSFg1cFlnUWh3eFVzcys4ZDlJRkg1bGlhUldWY3hVTVQrMzBZcWhERkQ3bnE4TXVyZDNPY3h3eUljd1EwZDZacDdvRCtHMDRNeG5tWjM0cjUvRTRHYU5JYlpNVGE5VDBWUW1qYmJEM2piallKMWlrQkduRnlwemd5czJJVU9lREJ1SjRxVTJBek1nM3NqbkpIcmNWcGRzU2NQcnpISnJkZEtNblE5V2Y2NVkxSTFWNUpOOU9RbUtyQ1pxZ1VuVUtuUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAraKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWEt3NUpWUEZBVitPUkdYWmJBSFQ1eVhFMFhGdGo2NzZkOUVtaEo5dDJJVmF5VjIyZG9PN3JJUlZ6d2ZJOFdtbWxGeUZ5aHpwNlpaNk8wT1dhejhybUc1Vmdwc0o0cHRLVWU1Y2Q4d0VxeDQ3eEJEeXgraTNrUCs5bFhQQTdnc2VORk83OU9URkJCbG1qUjJnYU1OaTNjOXp0U3VVZjNpaGY5cTZ4TzhLcDRYL3F4dHVpNnhwaXBCK05xQVFjNlpYSHR0TVNDVXIvNTIvTjFBc0p4Nm1TcGsxTjFXQjdlY2VKVk1KUDYvSUh2Vm8wSUF2aWxicUVPVHY1OURYM2JzVEpTZmRUSlkrUHF3dzVRVXFLTXYxSEgxb2xMQnpPejVTZ3lsSlBlSzlFeGM1L1hnZnpXTWd1VzNlbzVpYlREUXdrM0FzSXk1R1ZZZnRQZmc2Yjg4NTArQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAMlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWG9SMjRkU1FWK0lNTXZIY0c0emlxWmpNLzgxQ0Y3VENJQk5HMFJEdjJlRDlLaU93MGNRdEJ2ZVgxamlPS0J4eGR5cThVeGQ4WnRXYnZUTzNWNXkwRno1aUY3TTBMK25TeHluei8yZ1NRdGg2UGZKZ1MyYzVGQTZBeFBRNkFTNmNsT3FmQTlGa1d4ZkdNVHkrRExSVm9DaDBFbGlyY0JIcGNZQUNqc3lWMkd3am1nZEpaVCtKeDAzZWZNV0RpdlNmWlI3cW01dkwzemhhTUZJU1gyK2dBdFZKaXpmQ2wxbllBYklnMjZzbHoxMkdjcjY4Z1VGaGM2ZlhvWVRMZTlNQ1dzRHF0UTh1eVJDMFBQNUZwWERqdVFEdzR2ZzJGZ3NFQy9scjRKY3FhYUJHTldMNTlHNWRpc091NXNTS0FFZkUyY0NIV2Y1TFpEU2xWamVPSnBSdzF2UT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("doubleSet", b642Av("AGIAAABAR/EUfopsFa4thzJjPi5wDKrD0xkQTxsqNBPQThG+FzXVtVojpI8hd82BLjWYjjTH6t20+rvutk9tXnfkywoygQ==")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAp8q1hUKl9fSZWKI8tvL2kxU8rPnTRACedH4snUgOB5u6ZQ/sTOI9fbRdbStCWnybYiAfGAcxrpDKED/t3tWGcWqUVWzinfDOi3qPrGi51JKE02j9Gl0wzgrVe65wvCDfrvaTGggWPkqOKyqgdzT8HPFVoGXGYdAFSo+v5XCXs8/PxWxWkYxJvFXprzQ56FKV0IFG+HZmpoltqI4cv+46NdcIerEd6W8J1LhjZU4PKID/6QwPLa0iY8LVC9pWyqR9GVZDQ/bRko52KrUp1BYwXyrmu7CyN/jWT+nacxMMHJuIkCsXBGFV3+CEbbxYXvjTg89d/rD++OBWoM6Celm3iQ==")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGlzOUlLakQ0dEZWcWxvVVc2QW5ESUhxbVRNa3djNnQvVkhoUnQrbVk3SGpTUU5UZ0hIbkJKOGZsWDF2QlpGbmJYN1FsMVBjMEViN0ZWSGJKbXV3SWp6L2xnVzF4K0FZT1RVYStvRzRNZEJJK2ZVUVkrMU1VNFh5RG9EVmN2TW8rUDFkL2hGNGxPcng0T2xOV3ovVm8zUzY0M1VVNitrWU43SVVCOC85RGp6Z1NTZkRIS3E3bEFsMEVCZm1MY3NtRkpmUFFLbVJ0WjIrbXRRNUhsV1Fubi9DVnQ3bmZGTGhEV1NEbEtYMm5uSVlCVmdrMEJHQWFOaGJFbVNqREFaaEJ6V1M4N2pOVTJnMGJkaHlyOHRNY2c1TmlCM1F5TDdPWERiS0orTXlrUmJvNlA0Vm9NY1lkTHk2OUdCYWM4WjZFQjFkNGdmTUtxNklnazRhelp0aDhVdz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAABA0Sj/sNRaozw9XKYKDVNLW4vFoEB0e76L6awEUvtOCBA8pL77j2CUtHIiBDB1HIf2pBb/i+oNF85lwptguFE6rA==")); - item.put("stringValue", b642Av("AGIAAAAww9aZNvR3yzxbGhub/qkSk+AK8+ltsl15eH9e37CudODt8OjztQo0YVwrP0o+JS3y")); - item.put("doubleValue", b642Av("AGIAAAAgisjjsah8rGZ78Af2gnP2yhWZ8Wq6PDLb5aP312l5zl0=")); - item.put("stringSet", b642Av("AGIAAABAgW/RgnOMZM9nZk7PRQ4qQwakhReiS2oaQC3OFTQkigx8nO+KAGlpdqSKZGV6vtVyDcgEtmA8zcphXizTCZGQiQ==")); - item.put("rangeKey", b642Av("AG4AAAABNw==")); - item.put("byteArrayValue", b642Av("AGIAAAAgGjoUlvWLhyxuSzUKtatZd4r/rUudD7hsajyQ0oOzjZ8=")); - item.put("intValue", b642Av("AGIAAAAg165MtGUmgndEpx90SVAKf7dSTkmwS0wrVmubkpMBxl8=")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAjKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWEJxTHVkd2Y1bFhPWUNTN3hJUnkyclJBMzBVZUk4WGYvd01yTFNMNG9zNHFvNjgyY29tNGx6M3IvOTE4bFFiMDhmazRZMktqUk1EdFpydkZsRVhrN3lDam85QmQ5OTNWMm1zeXBTUGIzYkt2R2d3NXFzeExJbWdDOUtrL1kvNkJRd0NUM3FxVWZ4aWlLZmdqNEs3ZHBsTXZJVFlPZzRlY29nMXVKQkl3cENhWE5YYTlWZkI5ZDlWRHg3bUhHSnpROG5vekdJUDdzU1dUaWRzakI0NW1NVXU3dTkwLzRoYTR2VGZ6czQ4QmhVZnZMczNvKzlIRmZxVks2cW1va3JlRWFvVjhPVFdIYThxMGxSekYwZ3J0M2hDamUrREdvNVpFcnUyclFmdmgvK1prTlpZbkw1V2p3Y2VhcEJnT1h3UDBPYjA0TWsrWldzZkdLRG5uYlF6V25iUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEARJpKAoXXSPxKUlYA3zxTAMIbaXJoIjo6Mq+Sy4CbGHQzsf4UkWEz157mdT+OCwMNGBUXUnvJhX+9GhTB/dU0pCkGrC9p7BwazNaAhGO4fcDPEsVP5LTSAAs5ZEw1CdopWQsK+mVMAw12XwO9NeOW/cUG7wDZ/u4Y01ejnO3nLaMIi24riIQRiMduk8AJTg41lU4rcSxDKWUn1pBweolLTX6W8zo50BcmAn/qeThVVQBoqDgJYPyUZ6UIDDl3OSg1Ujsn2c0JgzlAtxddWQ22uHSRKUbv7tURIO5N7WmK3RhUnumACekG4acXt9kAn8PBWj2Yvwr4Z3+w908RET7+vQ==")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFdZOCswY2ZZaFkyT1Fjek1Ya25YZDQ3UXZxZUxsQk82dTJvTS9Id1phZVVFb3FjNlhtNVd1VjJ5V1pZNW5qREorS3BrdGhaQ1RsTnU2QXdNcmpBbm5WVVZZdHkxWmtlRUVMWU9UZmhzN2ZGTkdqQ0d0a1FRWEpQb2lLOVB4OEt3N1VRdDAvTXJTY2k4Ylk5VHgwVmFVQ0I1MDV5ZG1IN21WeDN4bkZlVXRZekMzNWNlMEt3cDdqaG1iRTFTZVlocWxPTVRCRE1sQmZvcTJRSG83bmJUNHo0V0Z1RlhZbHdSMVJnRDNsK2cydjl4dkFIekF6SDZmeW5qTFM5c2RXYUc1Q0FESElqYXRJMmlqeGh4NXFmeEtIRmFBN1JraC92UEdFdkdLdEhsdkhBMmlwOGtRTTRmcVpVaC9lU2RhT3EzZ2RSR1NRUTE2aFZMT2JlZkNJZHlmdz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAABA1y82dQGX/4gbSZ9okCbwkWYt35CHvGRlHSwKR1K/NV/+AQ04tEWx3+HNze/t78qIa5ttNWw6gzFl6lop6iaVmQ==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("stringSet", b642Av("AGIAAABACNJWkRL3Rjm5akaVNBUizbKtQ13INgSUwMNQR+KYYKJPJQJpAQIrk1u8PALl7V7JvDEOAdwcv+gNjFT+WQGniw==")); - item.put("rangeKey", b642Av("AG4AAAABOA==")); - item.put("byteArrayValue", b642Av("AGIAAAAgfqCji3Cm6TKPeE6Huejc22X/1746VPMPVwrkqvNtGHw=")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAUKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGxjNFJBeDhFbllhaEk2ZFVaOUpQeDR4TVhpcEVpUzVxK25jMS9EQ2gxQXhwMXJIdjdPTUREWVV0cnQ0Z2djTjRwS2wvZi82WlU3aUE0VFZRZnFFMnNaTVJWSEVrUmR3ODFSKzNRMHJPVGthK09kN3BKSWNVOUprOTczM1orK2t2ZlhXNXlKYlZwQ2diRmV2WjhGS2NDdXZEMFE4WGltR1NTa1JXRXgwY2lHbG1mRm03MEs2aEd0ZW5RU3prZ3NBSnBCc2pMVCtYbXUwWjBiOU43b0hrWFRJZHVmd3pJa1lKSitBMW5ORG1nbEVhM2U3Mm1tMFBCRHJpVVlMUFhSaHdXQVo5TnRaSUF3ZkwzeFlMNGI1WUFqaGdJMk5KYm03YnRYb3F4WkdlWmdONkRyWkZSNGEyTVBBMm56OXpYNXFsQWYycVdMc3Q2SUlHbUlDeTVEWk12dz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("rangeKey", b642Av("AG4AAAABOQ==")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAEAPOVybkDUXTky3BszXwOiehdzQnXrOoFsVz9l6o9hxXSBQ30LzwwNSNe2UxGZsZGfnHW1BWhg+T4ycxdcXwImovTRRUNUAn1RFU1nJLZaVvAw9FSvDbRWbk4oTiyv3kr7NiCgCQfKOM0H1eUi6tDUYdnR5kPwP2aAyPVtJE0oLR5g2s+09IoOs5FSipYcPOtlN0rT5fOtMCEe2goCIMyluerqISBYmCnLrpg4fhWpQQTvCFuSCccJC4zoQjFrSQAd4hBHlS+xsCmXi1KS3ECwK2bRutntUzZJaeFjFpEn5y7CV0Y/9SuK5fc4QO/XBkubGhiHU74199/etB11rnETDw==")); - item.put("hashKey", b642Av("AG4AAAABOA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAInAAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFltNUt5NEFSaTZIZ3ZxQXVwMkcvM2puWFBXOHdoRGRpTTE5RG9OVlVTenYvU0F2Q1pScnNnMS9IM25jWVRYY2Fvc2wrU2xJc2NQSVlDTXBVYmhmd2F1aFM3ZE1TUEFqa3FaZnFpb0FLbmMwOWFGR015RHA2Qi8zU25VRm04TGs2Mit3S050R0pyclA5cTh6TFBsYWtJSzE1OGZwM1p6aFk2L0xtVjFrYVBoUms0azkyZGdFOHBMRVZzckVZZXVrYUdleXBFKzFaRnJCc2kraldoWVdIeHRNSS9kUzNqTnJYSFhXblVhV3pwNkQ5YmlONDk0YnhiRlR2b2s5bnk2R1o5ZVVIYXFPdDgxcDdSR1ovUHkwT2hLdThYQVp0TlJWRG1VZTc0T0prMkkzNjcyQzdheVVXeGRZOVB5ZThZcnRaUHY2em5RYlVvVFRybHRPNG8wbDFkdz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("rangeKey", b642Av("AG4AAAACMTA=")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - } - - private void insertV0FixedDoubleSymData(AmazonDynamoDB ddb) { - Map item = new HashMap(); - - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgm1KU7lGZlO6bNSxx1ZMr6pVmY1PuYw8uDIcFDisFjSw=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAAAwvTohJVr6lrUAhSuZT7nPaxgL6iW+IC0TZA1/ht30GWig2OO7JQFIS4O6Kk2ANI6w")); - item.put("stringValue", b642Av("AHMAAAAHQmxhcmdoIQ==")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("rangeKey", b642Av("AG4AAAACMTU=")); - item.put("intValue", b642Av("AG4AAAABMA==")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgm1KU7lGZlO6bNSxx1ZMr6pVmY1PuYw8uDIcFDisFjSw=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAAAwvTohJVr6lrUAhSuZT7nPaxgL6iW+IC0TZA1/ht30GWig2OO7JQFIS4O6Kk2ANI6w")); - item.put("stringValue", b642Av("AHMAAAAHQmxhcmdoIQ==")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("rangeKey", b642Av("AG4AAAACMTU=")); - item.put("intValue", b642Av("AG4AAAABMA==")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgiZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=")); - item.put("hashKey", b642Av("AHMAAAADQmFy")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgzh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=")); - item.put("hashKey", b642Av("AHMAAAADQmF6")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgHR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=")); - item.put("hashKey", b642Av("AHMAAAADRm9v")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAglBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgcjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAguXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgyT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgYAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAg0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgGl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("doubleSet", b642Av("AGIAAABAbu/qi2UnCw6Saur96Xjc+1sQQzo6ZUdeu9W0/uX958B9utw+rDlclexaDcf6VGnz7OYM18eeEXrpjIgLtH4iaQ==")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgfqIf7vj1G3qbcEv1nbyTqNoKSAFfj9fLMb3S8YEFjfM=")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAABAj0vcD4vvFrL/7JHHgnyBCIHb5u/WvT/Uc/kk4lBMFKV2NXshqqEmBu8UK96OLbYAK3+vW4mwm4rIZ7MqgV95LQ==")); - item.put("stringValue", b642Av("AGIAAAAwyV633bs6t+yjSw6vHtUgrpDNB5YyMgXue0prPMXVm6SmGiUxS5l93cJx4vPWF/bi")); - item.put("doubleValue", b642Av("AGIAAAAgBhZIjFx+b3DExrUfnOkJjYNw0/Bw+KoDxG4LUyzQoRA=")); - item.put("stringSet", b642Av("AGIAAABAWsWFF2IDOEl0f4PlW73arTFdMCyS6lMbvnrH9sPnCCMCQzEaSmdZmz1Kcb3ZDxRiaeLLWV2om/J9b260y2igRg==")); - item.put("rangeKey", b642Av("AG4AAAABNw==")); - item.put("byteArrayValue", b642Av("AGIAAAAgLB7p2Ewobv+WsSeh1KxHx0Gkw0e1sKTbZBfjkvoEZBs=")); - item.put("intValue", b642Av("AGIAAAAgO8EY3/1vRX0odEkXQejXrUP24ToyD+4EHJ6TmKZVPkk=")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAg66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMg==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgQWOgS/Ba8ZZa9Y2l8DolewfyZosDKcLysahlumr0MVk=")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", b642Av("AGIAAABAAtJqJj1aokidlC6qr8L3xZQNo7Yl2z8DsEXgJLRKnK73Oyg7jRDF0zjgp02qNae7mYNDkK2QeafeAexk8s7qdw==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("stringSet", b642Av("AGIAAABAnJNYeqOA5x3J3k3zO7CWUcbD1gU2xifPxQ4sraRhsnKyd+mE+ouhX2LpMwQ45nRXxV1nSeaN7MW+4vYn/sA/oQ==")); - item.put("rangeKey", b642Av("AG4AAAABOA==")); - item.put("byteArrayValue", b642Av("AGIAAAAg/icc0cvbG45rqCNdeMFJaklPx69nXo3/8XTE+vQafmI=")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgcSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("rangeKey", b642Av("AG4AAAABMw==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("rangeKey", b642Av("AG4AAAABOQ==")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAg5NHNzCBtZcVAUlz1ymLB7Ta+1n3VjffLj5WniFA9afo=")); - item.put("hashKey", b642Av("AG4AAAABOA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("rangeKey", b642Av("AG4AAAACMTA=")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - } - - private void insertV0FixedWrappingTransformSymWrappedData(final AmazonDynamoDB ddb) { - Map item = new HashMap(); - item.put("hashKey", b642Av("AHMAAAADQmFy")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODNvNHkzTTB3UUFCRXl1UXN0SFVQUGF1NkpPMUhiNk1OWGxXQW5aWDhYdmFYTlUwNUluTFUxZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgiZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("hashKey", b642Av("AHMAAAADQmF6")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODlZdEVSWXVDT3A4MHlKVnJOYytYREFoaVN6UHdlRnNJQk1YRXMxSEQ2eGdvdmYveldabmMrQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgzh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("hashKey", b642Av("AHMAAAADRm9v")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEw2YkExbWszYTZxek1YNUkyMkYyYzRvU0FmZ2VZdCtjQmtFYndDTzhYUzlkL0ZqV20wekpZUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgHR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEpKNDk2UGRpcDViOHlldTVxbEE0STNOUjFTVHdtZEd2REJwQWowNXprUmN0OFh6T3E1TmRJZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgyT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMg==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHNVQzNEekp5Tk1tZ3ZUSE1EVnh2Sng1OCtDT1h0UStwRzR4ZlVQL0pJTkRHOGI1M00wOFRBZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgYAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMw==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEZGdjVQNjAxZzF0eXhoaDhxQmlCdDB1d2JoODlRaDdyeTcxL2lJdWxvSWNvQzFBV3JHczhtdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAg0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHJ3OU5qdU53dkhENTZPTmlqWC9nbUlGZ051ZDk3OS94QXhlaTVjbmdJbmxhajdpSVg0RDdadz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgGl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABNw==")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("stringValue", b642Av("AGIAAAAwMyVrAzOuKFS+hAiVq0jlmIJcwMP2w62LdWChncBN0q0HMB3WpADYK2BF1q+oQP83")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHlUK09JWlpaWkE5VmU0dTdwRE1zNG9TUVZTNlFYZEFmQjZkVjlMMUg4QzBrRXliQ0Nad0JRQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("intSet", b642Av("AGIAAABA0iLxGtvyDaUNXY1iYwcDlZX3zIs+QOMsBQ+RbX6YlAgFdMK/k57OXPH3jMIptzkNAKNWFea+NAz+AXFd2jPC8w==")); - item.put("doubleSet", b642Av("AGIAAABA0nazy+tnY85GZpSANJzBLXZHPKzCvN4ggpopjujfAOO37wDi6zrSwhurLpjFIJGR27pn5azaroZWYA8GLfiGIw==")); - item.put("byteArrayValue", b642Av("AGIAAAAgw9sfXioZCE9luCt4qiOixyRJVlJ6zbTwFoFg0wQNJbA=")); - item.put("stringSet", b642Av("AGIAAABA8057NGIAJADqX/KzkjZl7XzFMI/6j7vAbp5F83tZjOQhguhp8hheXAzcsrCmM6sME1oGEmJEran4Svs1qT5ChA==")); - item.put("intValue", b642Av("AGIAAAAgLFHv7oLor2SoKypi/gubI0IsipoLd/I20qPr2wHOgOs=")); - item.put("doubleValue", b642Av("AGIAAAAguq8MBbPKDskxhyJ6VCmd9EC6+tD3EuiqhgFUpxckzdk=")); - item.put("version", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgFhpaX3jXqz+Pg4QETqcNBULC+OBOTkux2BFGCdnr5PY=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAACMTA=")); - item.put("hashKey", b642Av("AG4AAAABOA==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODRhOGRFc01ybDR6ODlVM1RkOWh4L0J2cms4cVZEODlOaklkMnU0d2NGSnBxbUVkc1lka2ZXZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("version", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAg5NHNzCBtZcVAUlz1ymLB7Ta+1n3VjffLj5WniFA9afo=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMw==")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOE55eTdqK3FkNEJMNzV2MTlnRHdHVHdtTGgrbmlMaER0cjdaL3ZZMVFmQTFEQmE5Y0JGdzIxdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgcSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABOQ==")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGcrY1NpV2I3eWZYZ2pQS2gzOVM0anBZZWFNeEhHRG90c2JCOG5sQkp3ei9vclBRQzhOZFNxdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAglBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMg==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHlKa2M4OW9HNEpoajhyazlEQnpVeEQ1cForN1Q4Z2pQUEU1TE9uVDhvd2tJWDJ6bGFpdUJKQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgcjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMw==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG9kQ2hPVmtiYkN3S3V3VHYrVjYvelNwcnZIUWVhWlpqaDZvU3JzMHV4T255bFQzSUZ0TjVVZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAguXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMg==")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEJLV0Z2T0hRVUxCMTcxTW56dkQrVVYyMVpmTUxhSXl4QjB3ekdZbStzY2VFd2pNekgxTFhVQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAg66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABOA==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAC9AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEdncWp2Q3JaYzhZL2RrMGxmQlk5K09tbWNXUWIvbjVYMW01YTNBcElZb3JLVzU0RVhRYTgrZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n")); - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("intSet", b642Av("AGIAAABAeBhcgBr8TocxVsTw8tJtcAK2VKFOkoZlWBUusFNtKbTulghzdpT3iTMqIJB86ViXXguO43XqMZWs1U3G/IaF+g==")); - item.put("byteArrayValue", b642Av("AGIAAAAgY3ciZfN54gf86a4mxRfon9CgzQkNIxrtWV8s6tg/6G0=")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("stringSet", b642Av("AGIAAABARhykbS8bqGEd2LEGtLV0S6Pj+4KjuVc15ExkUmlCKlClAgNpukA5Tp0FjU/XL0Qli4v6apZaraKgBC1l4YlRDg==")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("version", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgmC10Qiw1c/P8Bab4SaP3kmsPMBVfOZKjZ3SgvXyd3Vg=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - } - - private void insertV0MetastoreData(AmazonDynamoDB ddb) { - Map item = new HashMap<>(); - - item.put("hashKey", b642Av("AHMAAAADQmFy")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGR5Y1YrQW42bUVFVzJLK3RjVE1EQWw2MUNRSzNPZ2hpQ2Z2YTBYeGFVaU9odWJnRDhMelFwdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgiBDp77rZmalAcIlg0htWCjJ0BcYgMdPgzJj8fie5Ai0=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("hashKey", b642Av("AHMAAAADQmF6")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODlPZG50TUIwbHpoMUtKNHlYZXhrNXZsWVF4RUlWRDJZRWVybHlQNThXWkg1OUtxelM2MUIvdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgNo2a+yFlcr1phtcCGNXKfcUrfyMtPdihhh7UPWQNLog=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("hashKey", b642Av("AHMAAAADRm9v")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGtUMFY2bklwSHh2WTZ6bjMycHJHd0NJVFJRb1NyR3BsWGtoTlcxdUJZWnA2QVFUSURiT3dVUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgfy9BE3X7MyBJCQLvCN8TNUTf/zJvKEQQOdf9VhJbWdU=")); - ddb.putItem(new PutItemRequest("HashKeyOnly", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODJLUkJKQlBxbEFEM0ZYL2RiSjhlRHFoL2NvdVZhUnJUZmpISE0rWFRtbS9xYThybHZ3Rkw1UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgQv9omCLGhrq2cxeP+elq4UgbloK03bV+knv8uE9P7Mw=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMg==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHZyckFUOHhzOTJJNlpMdVFtcGs2SDR2RTJ6WlljMVRjZkNXb2VUVXdPcVN3K29Gb0JTWFlQUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgtgkdLHwtDS/NzFDFLQR8GQLsw4LURQMB/8yBoD4kKSI=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMw==")); - item.put("hashKey", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOENTT0dQcXZZM0d5QUJSZTB1MXVTLzR4ZGtQRlRSQlh0M3dkSGJ2bXoveUNCcEk3bGY3Qit1dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgUPLAdN9KAJNJRZzAtfpaloOYNa+gCVXg1diT6CGSqrU=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG1WcldlSy9CYkxsSDlnY0Zvb1Fjb0I4V082anlSa0hRT2NqN0NaZjFzMUk0RWRuV0NGai9CQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgDY8cXYd+66/OeHT+dOOh4FnJgwD4mMj/0EOZZdlrDGU=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABNw==")); - item.put("stringValue", b642Av("AGIAAAAwjmiBDtOhOzwPbKbPx15zZ+HeW0ElgRnRiGykEvmvpFux0U/LJQFRQ9KncAWd4nJM")); - item.put("hashKey", b642Av("AG4AAAABNQ==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGNaYlhrb0ZDLzZjVzlpNWNBanViTHdZaW1vNE9SdlUxQjZOSWRpRHovc1BsMUQwU1F2ajhWQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("doubleSet", b642Av("AGIAAABAS4kDtlVOu6tLMGoBhqD8oDGY8WnnUnZ6gN2E0TLmTn6+rJeFBQ3R0NfJtsXtx8pKKOZRG7z5nkJqVCXWA0YEtg==")); - item.put("intSet", b642Av("AGIAAABAuU3x6fQO9kF37qXb+KdB50EvDsAQSr7JEkKFo76XSF3q1jRNuXTvNL1MmCagMicOn8hGXWf3uXr3l/jeMXXTxw==")); - item.put("byteArrayValue", b642Av("AGIAAAAg1v7mQNUIJrvRrBqSBP8Ges17M8ylNfERqjAhpBtmtEg=")); - item.put("stringSet", b642Av("AGIAAABAMSooPgKThBmQfGl+MZ0PcPhwCWpykLn5VIYK8y17sa7S9HPC+ZZaXSZWAeEIe9tCsazs/GhYPNAk+J9+Ehr83A==")); - item.put("intValue", b642Av("AGIAAAAgFLAPKKtgQS0xyDmVtg8TM8NsK5Zt7HSPorfyxIzw920=")); - item.put("doubleValue", b642Av("AGIAAAAgIKFrRJV/QQ6bN880QRBKXR/K84kwc5O8cAFduodO5dU=")); - item.put("version", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgzZEKidI2XCh5bvadadW99btbRcOVSuavthxLMEIN86c=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAACMTA=")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("hashKey", b642Av("AG4AAAABOA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODlqNDlhRG51M1hBNVE0M0xxMDMvaTF3eUIzbHdSbng4eDNEK29JamM3Qlpxbno5VmhoRHc2Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("version", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgTUBX7q3xvSd+K/nMBdipsX+6nTyt+htT/qJUK5sPos0=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMw==")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHA3N1pGSEh5Wk5qZXErWDdHdHhsRkNzZDVqemhTSFVQVFc1V3YzU0xPaHFFdzQzUmJEdUVOUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgc4AE+L/ysYL+maoJmXJkaMeJ3Chh1Ed8KQA148yZK6M=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABOQ==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("hashKey", b642Av("AG4AAAABNw==")); - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("intSet", b642Av("AE4AAAAFAAAAATAAAAABMQAAAAIxMAAAAAIxNQAAAAMyMDA=")); - item.put("byteArrayValue", b642Av("AGIAAAAGAAECAwQF")); - item.put("stringSet", b642Av("AFMAAAAEAAAAAT8AAAAFQ3J1ZWwAAAAHR29vZGJ5ZQAAAAVXb3JsZA==")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("version", b642Av("AG4AAAABMQ==")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMQ==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFI3eGxEWmZCTTRoMWhaa0EreldTQ0VNV3ZCVnV2Vm03Z25wVnlmTVBRMW5hYi9KQWhiRUs3UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgRU3MCwYYxRFxZT7GmHBG7j+pgK14aMfEIsmrbgB8+Wk=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMg==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGkxcGFYZUtNRXlTTDFDOUdwaS9QWFVDMk15ZHdUeUxKTGQ3RXNIeWUrazJrRWlxTnBRdFZnZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAg5gNtdXLSncuZDK3EvpFos08QRhOsOnKDVNR9jogw/Bk=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMw==")); - item.put("hashKey", b642Av("AG4AAAABMA==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGxCdUFkQ0pYSk9yVS9JelM4TEV1RlFoWDhnVVVCMG5jZDNxZ0FUQ0xjMjVrYTE0RFRTVjNKQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAg6zpNDAHNoQUzrP6YE6g47Y7CDom04EWXUTGuhPU7Wd8=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABMg==")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFdsRU5LNlNmY096R3owYTRwL2RyRHF5REo4LzJ0REJ0WTRRL0wxdUpRc1lYeldRQ2pUcExkQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgtvX4UthmBwymnAZ7CuTpJdLTASr1lRj1MvRwAesjtMM=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("rangeKey", b642Av("AG4AAAABOA==")); - item.put("stringValue", b642Av("AHMAAAAMSGVsbG8gd29ybGQh")); - item.put("hashKey", b642Av("AG4AAAABNg==")); - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAADjAAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGpyLzI2c1V1NW5udlQwcmVzY0NPWEhXTHZwZzlySjNkeURSVHQxRFFMcnAvTG9STkRyNk5EQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("doubleSet", b642Av("AE4AAAAFAAAAAi0zAAAABS0zNC4yAAAAATAAAAACMTUAAAADNy42")); - item.put("intSet", b642Av("AGIAAABAUBGZEIoWzYKTFCsFoZYXzRUJsNuy3xr64nCwsL14lZNk62Aff5n3+ETtWm8U9E3PMOp9LozkDwZcnzs0rnYIeA==")); - item.put("byteArrayValue", b642Av("AGIAAAAgl9wQf/r6vivuTCvIz0Jeqd80xPII30sf317fED7Xrrs=")); - item.put("intValue", b642Av("AG4AAAADMTIz")); - item.put("stringSet", b642Av("AGIAAABAAijuavOYfNvcle2WbG8I2a4W1af+UPxhKguG3YMW5E6MoXsdO5ddSAifAPbVLmv92VyJnx/o817m1IOSs+LccA==")); - item.put("doubleValue", b642Av("AG4AAAACMTU=")); - item.put("version", b642Av("AG4AAAABMQ==")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgpzB3S616mcP6HQrkeaUYdV5Qo2UYWF6p04GZhSzcpV8=")); - ddb.putItem(new PutItemRequest("TableName", item)); - item.clear(); - - item.put("*amzn-ddb-map-desc*", b642Av("AGIAAAAyAAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=")); - item.put("t", b642Av("AGIAAAAgeJcKzY3SHwBIhXdfxeYWd9UE5yX+RxaPJQ7L2TdgDxs=")); - item.put("V", b642Av("AG4AAAABMA==")); - item.put("encAlg", b642Av("AGIAAAAgXJilRkdsIP0bqzvqutJc8AC8YhY1YApJCgTLXgAqtwU=")); - item.put("enc", b642Av("AGIAAABADvDUW2Ao1YWp7uxxEL+mv5uqHCrSNIDR18CgBD8XHCuNlBPC6GXxk9YnFmv3kgVDlMdEo0wE79zRoETB7GmjcA==")); - item.put("intAlg", b642Av("AGIAAAAwI//7G2LUrAQ2EwQGQr7ZIKyXl1AlGeB+kfvZGmCj6wShZpMKPXjyBF/9RvIz3clQ")); - item.put("N", b642Av("AHMAAAAMbWF0ZXJpYWxOYW1l")); - item.put("int", b642Av("AGIAAABAzFha4J4gPaiwhjiQs47L0bTf4WSNemVAxKJJnBnujl7OajvO7ZW3zehGJlaai4tCLxTwoLPI+Ig/a+zCdau4iw==")); - item.put("*amzn-ddb-map-sig*", b642Av("AGIAAAAgaklO+h7kSUjXEt6pBA03G4wiIU20XKT/sP+rKSeNAKc=")); - ddb.putItem(new PutItemRequest("metastore", item)); - item.clear(); - } - - private static AttributeValue b642Av(String b64) { - return AttributeValueMarshaller.unmarshall(ByteBuffer.wrap(Base64 - .decode(b64))); - } -} diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProviderTest.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProviderTest.java index eb11aa65..7d90f904 100644 --- a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProviderTest.java +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProviderTest.java @@ -64,7 +64,7 @@ public void setUp() { } @Test - public void simpleMac() throws GeneralSecurityException { + public void constructWithMac() throws GeneralSecurityException { AsymmetricStaticProvider prov = new AsymmetricStaticProvider(encryptionPair, macKey, Collections.emptyMap()); EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); @@ -78,7 +78,7 @@ public void simpleMac() throws GeneralSecurityException { } @Test - public void simpleSig() throws GeneralSecurityException { + public void constructWithSigPair() throws GeneralSecurityException { AsymmetricStaticProvider prov = new AsymmetricStaticProvider(encryptionPair, sigPair, Collections.emptyMap()); EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); @@ -114,99 +114,6 @@ public void testRefresh() { prov.refresh(); } - // Following tests should be moved the WrappedRawMaterialsTests when that is created - @Test - public void explicitWrappingAlgorithmPkcs1() throws GeneralSecurityException { - Map desc = new HashMap(); - desc.put(WrappedRawMaterials.KEY_WRAPPING_ALGORITHM, "RSA/ECB/PKCS1Padding"); - - AsymmetricStaticProvider prov = new AsymmetricStaticProvider(encryptionPair, sigPair, desc); - - EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); - SecretKey encryptionKey = eMat.getEncryptionKey(); - assertNotNull(encryptionKey); - assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); - - DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); - assertEquals("RSA/ECB/PKCS1Padding", eMat.getMaterialDescription().get(WrappedRawMaterials.KEY_WRAPPING_ALGORITHM)); - assertEquals(encryptionKey, dMat.getDecryptionKey()); - assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); - } - - @Test - public void explicitWrappingAlgorithmPkcs2() throws GeneralSecurityException { - Map desc = new HashMap(); - desc.put(WrappedRawMaterials.KEY_WRAPPING_ALGORITHM, "RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); - - AsymmetricStaticProvider prov = new AsymmetricStaticProvider(encryptionPair, sigPair, desc); - - EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); - SecretKey encryptionKey = eMat.getEncryptionKey(); - assertNotNull(encryptionKey); - assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); - - DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); - assertEquals("RSA/ECB/OAEPWithSHA-256AndMGF1Padding", eMat.getMaterialDescription().get(WrappedRawMaterials.KEY_WRAPPING_ALGORITHM)); - assertEquals(encryptionKey, dMat.getDecryptionKey()); - assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); - } - - @Test - public void explicitContentKeyAlgorithm() throws GeneralSecurityException { - Map desc = new HashMap(); - desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES"); - - AsymmetricStaticProvider prov = new AsymmetricStaticProvider(encryptionPair, sigPair, desc); - - EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); - SecretKey encryptionKey = eMat.getEncryptionKey(); - assertNotNull(encryptionKey); - assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); - - DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); - assertEquals("AES", eMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); - assertEquals(encryptionKey, dMat.getDecryptionKey()); - assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); - } - - @Test - public void explicitContentKeyLength128() throws GeneralSecurityException { - Map desc = new HashMap(); - desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/128"); - - AsymmetricStaticProvider prov = new AsymmetricStaticProvider(encryptionPair, sigPair, desc); - - EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); - SecretKey encryptionKey = eMat.getEncryptionKey(); - assertNotNull(encryptionKey); - assertEquals(16, encryptionKey.getEncoded().length); // 128 Bits - assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); - - DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); - assertEquals("AES", eMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); - assertEquals(encryptionKey, dMat.getDecryptionKey()); - assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); - } - - @Test - public void explicitContentKeyLength256() throws GeneralSecurityException { - Map desc = new HashMap(); - desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/256"); - - AsymmetricStaticProvider prov = new AsymmetricStaticProvider(encryptionPair, sigPair, desc); - - EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); - SecretKey encryptionKey = eMat.getEncryptionKey(); - assertNotNull(encryptionKey); - assertEquals(32, encryptionKey.getEncoded().length); // 256 Bits - assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); - - DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); - assertEquals("AES", eMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); - assertEquals(encryptionKey, dMat.getDecryptionKey()); - assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); - } - private static EncryptionContext ctx(EncryptionMaterials mat) { return new EncryptionContext.Builder() .withMaterialDescription(mat.getMaterialDescription()).build(); diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/CachingMostRecentProviderTests.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/CachingMostRecentProviderTests.java new file mode 100644 index 00000000..048a72ca --- /dev/null +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/CachingMostRecentProviderTests.java @@ -0,0 +1,585 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.DynamoDBEncryptor; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.DecryptionMaterials; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.EncryptionMaterials; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.store.MetaStore; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers.store.ProviderStore; +import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded; +import com.amazonaws.services.dynamodbv2.model.AttributeValue; +import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNull; +import static org.testng.AssertJUnit.assertTrue; + +public class CachingMostRecentProviderTests { + private static final String TABLE_NAME = "keystoreTable"; + private static final String MATERIAL_NAME = "material"; + private static final String MATERIAL_PARAM = "materialName"; + private static final SecretKey AES_KEY = new SecretKeySpec(new byte[]{0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, "AES"); + private static final SecretKey HMAC_KEY = new SecretKeySpec(new byte[]{0, + 1, 2, 3, 4, 5, 6, 7}, "HmacSHA256"); + private static final EncryptionMaterialsProvider BASE_PROVIDER = new SymmetricStaticProvider(AES_KEY, HMAC_KEY); + private static final DynamoDBEncryptor ENCRYPTOR = DynamoDBEncryptor.getInstance(BASE_PROVIDER); + + private AmazonDynamoDB client; + private Map methodCalls; + private ProviderStore store; + private EncryptionContext ctx; + + @BeforeMethod + public void setup() { + methodCalls = new HashMap(); + client = instrument(DynamoDBEmbedded.create(), AmazonDynamoDB.class, methodCalls); + MetaStore.createTable(client, TABLE_NAME, new ProvisionedThroughput(1L, 1L)); + store = new MetaStore(client, TABLE_NAME, ENCRYPTOR); + ctx = new EncryptionContext.Builder().build(); + methodCalls.clear(); + } + + @Test + public void testConstructors() { + final CachingMostRecentProvider prov = new CachingMostRecentProvider(store, MATERIAL_NAME, 100, 1000); + assertEquals(MATERIAL_NAME, prov.getMaterialName()); + assertEquals(100, prov.getTtlInMills()); + assertEquals(-1, prov.getCurrentVersion()); + assertEquals(0, prov.getLastUpdated()); + + final CachingMostRecentProvider prov2 = new CachingMostRecentProvider(store, MATERIAL_NAME, 500); + assertEquals(MATERIAL_NAME, prov2.getMaterialName()); + assertEquals(500, prov2.getTtlInMills()); + assertEquals(-1, prov2.getCurrentVersion()); + assertEquals(0, prov2.getLastUpdated()); + } + + @Test + public void testSmallMaxCacheSize() { + final Map attr1 = Collections.singletonMap(MATERIAL_PARAM, new AttributeValue("material1")); + final EncryptionContext ctx1 = ctx(attr1); + final Map attr2 = Collections.singletonMap(MATERIAL_PARAM, new AttributeValue("material2")); + final EncryptionContext ctx2 = ctx(attr2); + + final CachingMostRecentProvider prov = new ExtendedProvider(store, 500, 1); + assertNull(methodCalls.get("putItem")); + final EncryptionMaterials eMat1_1 = prov.getEncryptionMaterials(ctx1); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + final EncryptionMaterials eMat1_2 = prov.getEncryptionMaterials(ctx2); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + // Ensure the two materials are, in fact, different + assertFalse(eMat1_1.getSigningKey().equals(eMat1_2.getSigningKey())); + + // Ensure the second set of materials are cached + final EncryptionMaterials eMat2_2 = prov.getEncryptionMaterials(ctx2); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + + // Ensure the first set of materials are no longer cached, due to being the LRU + final EncryptionMaterials eMat2_1 = prov.getEncryptionMaterials(ctx1); + assertEquals(1, (int) methodCalls.getOrDefault("query", 0)); // To find current version + assertEquals(1, (int) methodCalls.getOrDefault("getItem", 0)); + + assertEquals(0, store.getVersionFromMaterialDescription(eMat1_2.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2_2.getMaterialDescription())); + } + + @Test + public void testSingleVersion() throws InterruptedException { + final CachingMostRecentProvider prov = new CachingMostRecentProvider(store, MATERIAL_NAME, 500); + assertNull(methodCalls.get("putItem")); + final EncryptionMaterials eMat1 = prov.getEncryptionMaterials(ctx); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + // Ensure the cache is working + final EncryptionMaterials eMat2 = prov.getEncryptionMaterials(ctx); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + assertEquals(0, store.getVersionFromMaterialDescription(eMat1.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2.getMaterialDescription())); + // Let the TTL be exceeded + Thread.sleep(500); + final EncryptionMaterials eMat3 = prov.getEncryptionMaterials(ctx); + assertEquals(2, methodCalls.size()); + assertEquals(1, (int) methodCalls.getOrDefault("query", 0)); // To find current version + assertEquals(1, (int) methodCalls.getOrDefault("getItem", 0)); // To get provider + assertEquals(0, store.getVersionFromMaterialDescription(eMat3.getMaterialDescription())); + + assertEquals(eMat1.getSigningKey(), eMat2.getSigningKey()); + assertEquals(eMat1.getSigningKey(), eMat3.getSigningKey()); + // Check algorithms. Right now we only support AES and HmacSHA256 + assertEquals("AES", eMat1.getEncryptionKey().getAlgorithm()); + assertEquals("HmacSHA256", eMat1.getSigningKey().getAlgorithm()); + + // Ensure we can decrypt all of them without hitting ddb more than the minimum + final CachingMostRecentProvider prov2 = new CachingMostRecentProvider(store, MATERIAL_NAME, 500); + final DecryptionMaterials dMat1 = prov2.getDecryptionMaterials(ctx(eMat1)); + methodCalls.clear(); + assertEquals(eMat1.getEncryptionKey(), dMat1.getDecryptionKey()); + assertEquals(eMat1.getSigningKey(), dMat1.getVerificationKey()); + final DecryptionMaterials dMat2 = prov2.getDecryptionMaterials(ctx(eMat2)); + assertEquals(eMat2.getEncryptionKey(), dMat2.getDecryptionKey()); + assertEquals(eMat2.getSigningKey(), dMat2.getVerificationKey()); + final DecryptionMaterials dMat3 = prov2.getDecryptionMaterials(ctx(eMat3)); + assertEquals(eMat3.getEncryptionKey(), dMat3.getDecryptionKey()); + assertEquals(eMat3.getSigningKey(), dMat3.getVerificationKey()); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + } + + @Test + public void testSingleVersionWithRefresh() throws InterruptedException { + final CachingMostRecentProvider prov = new CachingMostRecentProvider(store, MATERIAL_NAME, 500); + assertNull(methodCalls.get("putItem")); + final EncryptionMaterials eMat1 = prov.getEncryptionMaterials(ctx); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + // Ensure the cache is working + final EncryptionMaterials eMat2 = prov.getEncryptionMaterials(ctx); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + assertEquals(0, store.getVersionFromMaterialDescription(eMat1.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2.getMaterialDescription())); + prov.refresh(); + final EncryptionMaterials eMat3 = prov.getEncryptionMaterials(ctx); + assertEquals(1, (int) methodCalls.getOrDefault("query", 0)); // To find current version + assertEquals(1, (int) methodCalls.getOrDefault("getItem", 0)); + assertEquals(0, store.getVersionFromMaterialDescription(eMat3.getMaterialDescription())); + prov.refresh(); + + assertEquals(eMat1.getSigningKey(), eMat2.getSigningKey()); + assertEquals(eMat1.getSigningKey(), eMat3.getSigningKey()); + + // Ensure that after cache refresh we only get one more hit as opposed to multiple + prov.getEncryptionMaterials(ctx); + Thread.sleep(700); + // Force refresh + prov.getEncryptionMaterials(ctx); + methodCalls.clear(); + // Check to ensure no more hits + assertEquals(eMat1.getSigningKey(), prov.getEncryptionMaterials(ctx).getSigningKey()); + assertEquals(eMat1.getSigningKey(), prov.getEncryptionMaterials(ctx).getSigningKey()); + assertEquals(eMat1.getSigningKey(), prov.getEncryptionMaterials(ctx).getSigningKey()); + assertEquals(eMat1.getSigningKey(), prov.getEncryptionMaterials(ctx).getSigningKey()); + assertEquals(eMat1.getSigningKey(), prov.getEncryptionMaterials(ctx).getSigningKey()); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + + // Ensure we can decrypt all of them without hitting ddb more than the minimum + final CachingMostRecentProvider prov2 = new CachingMostRecentProvider(store, MATERIAL_NAME, 500); + final DecryptionMaterials dMat1 = prov2.getDecryptionMaterials(ctx(eMat1)); + methodCalls.clear(); + assertEquals(eMat1.getEncryptionKey(), dMat1.getDecryptionKey()); + assertEquals(eMat1.getSigningKey(), dMat1.getVerificationKey()); + final DecryptionMaterials dMat2 = prov2.getDecryptionMaterials(ctx(eMat2)); + assertEquals(eMat2.getEncryptionKey(), dMat2.getDecryptionKey()); + assertEquals(eMat2.getSigningKey(), dMat2.getVerificationKey()); + final DecryptionMaterials dMat3 = prov2.getDecryptionMaterials(ctx(eMat3)); + assertEquals(eMat3.getEncryptionKey(), dMat3.getDecryptionKey()); + assertEquals(eMat3.getSigningKey(), dMat3.getVerificationKey()); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + } + + @Test + public void testTwoVersions() throws InterruptedException { + final CachingMostRecentProvider prov = new CachingMostRecentProvider(store, MATERIAL_NAME, 500); + assertNull(methodCalls.get("putItem")); + final EncryptionMaterials eMat1 = prov.getEncryptionMaterials(ctx); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + // Create the new material + store.newProvider(MATERIAL_NAME); + methodCalls.clear(); + + // Ensure the cache is working + final EncryptionMaterials eMat2 = prov.getEncryptionMaterials(ctx); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + assertEquals(0, store.getVersionFromMaterialDescription(eMat1.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2.getMaterialDescription())); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + // Let the TTL be exceeded + Thread.sleep(500); + final EncryptionMaterials eMat3 = prov.getEncryptionMaterials(ctx); + + assertEquals(1, (int) methodCalls.getOrDefault("query", 0)); // To find current version + assertEquals(1, (int) methodCalls.getOrDefault("getItem", 0)); // To retrieve current version + assertNull(methodCalls.get("putItem")); // No attempt to create a new item + assertEquals(1, store.getVersionFromMaterialDescription(eMat3.getMaterialDescription())); + + assertEquals(eMat1.getSigningKey(), eMat2.getSigningKey()); + assertFalse(eMat1.getSigningKey().equals(eMat3.getSigningKey())); + + // Ensure we can decrypt all of them without hitting ddb more than the minimum + final CachingMostRecentProvider prov2 = new CachingMostRecentProvider(store, MATERIAL_NAME, 500); + final DecryptionMaterials dMat1 = prov2.getDecryptionMaterials(ctx(eMat1)); + methodCalls.clear(); + assertEquals(eMat1.getEncryptionKey(), dMat1.getDecryptionKey()); + assertEquals(eMat1.getSigningKey(), dMat1.getVerificationKey()); + final DecryptionMaterials dMat2 = prov2.getDecryptionMaterials(ctx(eMat2)); + assertEquals(eMat2.getEncryptionKey(), dMat2.getDecryptionKey()); + assertEquals(eMat2.getSigningKey(), dMat2.getVerificationKey()); + final DecryptionMaterials dMat3 = prov2.getDecryptionMaterials(ctx(eMat3)); + assertEquals(eMat3.getEncryptionKey(), dMat3.getDecryptionKey()); + assertEquals(eMat3.getSigningKey(), dMat3.getVerificationKey()); + // Get item will be hit once for the one old key + assertEquals(1, methodCalls.size()); + assertEquals(1, (int) methodCalls.getOrDefault("getItem", 0)); + } + + @Test + public void testTwoVersionsWithRefresh() throws InterruptedException { + final CachingMostRecentProvider prov = new CachingMostRecentProvider(store, MATERIAL_NAME, 100); + assertNull(methodCalls.get("putItem")); + final EncryptionMaterials eMat1 = prov.getEncryptionMaterials(ctx); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + // Create the new material + store.newProvider(MATERIAL_NAME); + methodCalls.clear(); + // Ensure the cache is working + final EncryptionMaterials eMat2 = prov.getEncryptionMaterials(ctx); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + assertEquals(0, store.getVersionFromMaterialDescription(eMat1.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2.getMaterialDescription())); + prov.refresh(); + final EncryptionMaterials eMat3 = prov.getEncryptionMaterials(ctx); + assertEquals(1, (int) methodCalls.getOrDefault("query", 0)); // To find current version + assertEquals(1, (int) methodCalls.getOrDefault("getItem", 0)); + assertEquals(1, store.getVersionFromMaterialDescription(eMat3.getMaterialDescription())); + + assertEquals(eMat1.getSigningKey(), eMat2.getSigningKey()); + assertFalse(eMat1.getSigningKey().equals(eMat3.getSigningKey())); + + // Ensure we can decrypt all of them without hitting ddb more than the minimum + final CachingMostRecentProvider prov2 = new CachingMostRecentProvider(store, MATERIAL_NAME, 500); + final DecryptionMaterials dMat1 = prov2.getDecryptionMaterials(ctx(eMat1)); + methodCalls.clear(); + assertEquals(eMat1.getEncryptionKey(), dMat1.getDecryptionKey()); + assertEquals(eMat1.getSigningKey(), dMat1.getVerificationKey()); + final DecryptionMaterials dMat2 = prov2.getDecryptionMaterials(ctx(eMat2)); + assertEquals(eMat2.getEncryptionKey(), dMat2.getDecryptionKey()); + assertEquals(eMat2.getSigningKey(), dMat2.getVerificationKey()); + final DecryptionMaterials dMat3 = prov2.getDecryptionMaterials(ctx(eMat3)); + assertEquals(eMat3.getEncryptionKey(), dMat3.getDecryptionKey()); + assertEquals(eMat3.getSigningKey(), dMat3.getVerificationKey()); + // Get item will be hit once for the one old key + assertEquals(1, methodCalls.size()); + assertEquals(1, (int) methodCalls.getOrDefault("getItem", 0)); + } + + @Test + public void testSingleVersionTwoMaterials() throws InterruptedException { + final Map attr1 = Collections.singletonMap(MATERIAL_PARAM, new AttributeValue("material1")); + final EncryptionContext ctx1 = ctx(attr1); + final Map attr2 = Collections.singletonMap(MATERIAL_PARAM, new AttributeValue("material2")); + final EncryptionContext ctx2 = ctx(attr2); + + final CachingMostRecentProvider prov = new ExtendedProvider(store, 500, 100); + assertNull(methodCalls.get("putItem")); + final EncryptionMaterials eMat1_1 = prov.getEncryptionMaterials(ctx1); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + final EncryptionMaterials eMat1_2 = prov.getEncryptionMaterials(ctx2); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + // Ensure the two materials are, in fact, different + assertFalse(eMat1_1.getSigningKey().equals(eMat1_2.getSigningKey())); + + // Ensure the cache is working + final EncryptionMaterials eMat2_1 = prov.getEncryptionMaterials(ctx1); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + assertEquals(0, store.getVersionFromMaterialDescription(eMat1_1.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2_1.getMaterialDescription())); + final EncryptionMaterials eMat2_2 = prov.getEncryptionMaterials(ctx2); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + assertEquals(0, store.getVersionFromMaterialDescription(eMat1_2.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2_2.getMaterialDescription())); + + // Let the TTL be exceeded + Thread.sleep(500); + final EncryptionMaterials eMat3_1 = prov.getEncryptionMaterials(ctx1); + assertEquals(2, methodCalls.size()); + assertEquals(1, (int) methodCalls.get("query")); // To find current version + assertEquals(1, (int) methodCalls.get("getItem")); // To get the provider + assertEquals(0, store.getVersionFromMaterialDescription(eMat3_1.getMaterialDescription())); + methodCalls.clear(); + final EncryptionMaterials eMat3_2 = prov.getEncryptionMaterials(ctx2); + assertEquals(2, methodCalls.size()); + assertEquals(1, (int) methodCalls.get("query")); // To find current version + assertEquals(1, (int) methodCalls.get("getItem")); // To get the provider + assertEquals(0, store.getVersionFromMaterialDescription(eMat3_2.getMaterialDescription())); + + assertEquals(eMat1_1.getSigningKey(), eMat2_1.getSigningKey()); + assertEquals(eMat1_2.getSigningKey(), eMat2_2.getSigningKey()); + assertEquals(eMat1_1.getSigningKey(), eMat3_1.getSigningKey()); + assertEquals(eMat1_2.getSigningKey(), eMat3_2.getSigningKey()); + // Check algorithms. Right now we only support AES and HmacSHA256 + assertEquals("AES", eMat1_1.getEncryptionKey().getAlgorithm()); + assertEquals("AES", eMat1_2.getEncryptionKey().getAlgorithm()); + assertEquals("HmacSHA256", eMat1_1.getSigningKey().getAlgorithm()); + assertEquals("HmacSHA256", eMat1_2.getSigningKey().getAlgorithm()); + + // Ensure we can decrypt all of them without hitting ddb more than the minimum + final CachingMostRecentProvider prov2 = new ExtendedProvider(store, 500, 100); + final DecryptionMaterials dMat1_1 = prov2.getDecryptionMaterials(ctx(eMat1_1, attr1)); + final DecryptionMaterials dMat1_2 = prov2.getDecryptionMaterials(ctx(eMat1_2, attr2)); + methodCalls.clear(); + assertEquals(eMat1_1.getEncryptionKey(), dMat1_1.getDecryptionKey()); + assertEquals(eMat1_2.getEncryptionKey(), dMat1_2.getDecryptionKey()); + assertEquals(eMat1_1.getSigningKey(), dMat1_1.getVerificationKey()); + assertEquals(eMat1_2.getSigningKey(), dMat1_2.getVerificationKey()); + final DecryptionMaterials dMat2_1 = prov2.getDecryptionMaterials(ctx(eMat2_1, attr1)); + final DecryptionMaterials dMat2_2 = prov2.getDecryptionMaterials(ctx(eMat2_2, attr2)); + assertEquals(eMat2_1.getEncryptionKey(), dMat2_1.getDecryptionKey()); + assertEquals(eMat2_2.getEncryptionKey(), dMat2_2.getDecryptionKey()); + assertEquals(eMat2_1.getSigningKey(), dMat2_1.getVerificationKey()); + assertEquals(eMat2_2.getSigningKey(), dMat2_2.getVerificationKey()); + final DecryptionMaterials dMat3_1 = prov2.getDecryptionMaterials(ctx(eMat3_1, attr1)); + final DecryptionMaterials dMat3_2 = prov2.getDecryptionMaterials(ctx(eMat3_2, attr2)); + assertEquals(eMat3_1.getEncryptionKey(), dMat3_1.getDecryptionKey()); + assertEquals(eMat3_2.getEncryptionKey(), dMat3_2.getDecryptionKey()); + assertEquals(eMat3_1.getSigningKey(), dMat3_1.getVerificationKey()); + assertEquals(eMat3_2.getSigningKey(), dMat3_2.getVerificationKey()); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + } + + @Test + public void testSingleVersionWithTwoMaterialsWithRefresh() throws InterruptedException { + final Map attr1 = Collections.singletonMap(MATERIAL_PARAM, new AttributeValue("material1")); + final EncryptionContext ctx1 = ctx(attr1); + final Map attr2 = Collections.singletonMap(MATERIAL_PARAM, new AttributeValue("material2")); + final EncryptionContext ctx2 = ctx(attr2); + + final CachingMostRecentProvider prov = new ExtendedProvider(store, 500, 100); + assertNull(methodCalls.get("putItem")); + final EncryptionMaterials eMat1_1 = prov.getEncryptionMaterials(ctx1); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + final EncryptionMaterials eMat1_2 = prov.getEncryptionMaterials(ctx2); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + // Ensure the two materials are, in fact, different + assertFalse(eMat1_1.getSigningKey().equals(eMat1_2.getSigningKey())); + + // Ensure the cache is working + final EncryptionMaterials eMat2_1 = prov.getEncryptionMaterials(ctx1); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + assertEquals(0, store.getVersionFromMaterialDescription(eMat1_1.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2_1.getMaterialDescription())); + final EncryptionMaterials eMat2_2 = prov.getEncryptionMaterials(ctx2); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + assertEquals(0, store.getVersionFromMaterialDescription(eMat1_2.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2_2.getMaterialDescription())); + + prov.refresh(); + final EncryptionMaterials eMat3_1 = prov.getEncryptionMaterials(ctx1); + assertEquals(1, (int) methodCalls.getOrDefault("query", 0)); // To find current version + assertEquals(1, (int) methodCalls.getOrDefault("getItem", 0)); + final EncryptionMaterials eMat3_2 = prov.getEncryptionMaterials(ctx2); + assertEquals(2, (int) methodCalls.getOrDefault("query", 0)); // To find current version + assertEquals(2, (int) methodCalls.getOrDefault("getItem", 0)); + assertEquals(0, store.getVersionFromMaterialDescription(eMat3_1.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat3_2.getMaterialDescription())); + prov.refresh(); + + assertEquals(eMat1_1.getSigningKey(), eMat2_1.getSigningKey()); + assertEquals(eMat1_1.getSigningKey(), eMat3_1.getSigningKey()); + assertEquals(eMat1_2.getSigningKey(), eMat2_2.getSigningKey()); + assertEquals(eMat1_2.getSigningKey(), eMat3_2.getSigningKey()); + + // Ensure that after cache refresh we only get one more hit as opposed to multiple + prov.getEncryptionMaterials(ctx1); + prov.getEncryptionMaterials(ctx2); + Thread.sleep(700); + // Force refresh + prov.getEncryptionMaterials(ctx1); + prov.getEncryptionMaterials(ctx2); + methodCalls.clear(); + // Check to ensure no more hits + assertEquals(eMat1_1.getSigningKey(), prov.getEncryptionMaterials(ctx1).getSigningKey()); + assertEquals(eMat1_1.getSigningKey(), prov.getEncryptionMaterials(ctx1).getSigningKey()); + assertEquals(eMat1_1.getSigningKey(), prov.getEncryptionMaterials(ctx1).getSigningKey()); + assertEquals(eMat1_1.getSigningKey(), prov.getEncryptionMaterials(ctx1).getSigningKey()); + assertEquals(eMat1_1.getSigningKey(), prov.getEncryptionMaterials(ctx1).getSigningKey()); + + assertEquals(eMat1_2.getSigningKey(), prov.getEncryptionMaterials(ctx2).getSigningKey()); + assertEquals(eMat1_2.getSigningKey(), prov.getEncryptionMaterials(ctx2).getSigningKey()); + assertEquals(eMat1_2.getSigningKey(), prov.getEncryptionMaterials(ctx2).getSigningKey()); + assertEquals(eMat1_2.getSigningKey(), prov.getEncryptionMaterials(ctx2).getSigningKey()); + assertEquals(eMat1_2.getSigningKey(), prov.getEncryptionMaterials(ctx2).getSigningKey()); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + + // Ensure we can decrypt all of them without hitting ddb more than the minimum + final CachingMostRecentProvider prov2 = new ExtendedProvider(store, 500, 100); + final DecryptionMaterials dMat1_1 = prov2.getDecryptionMaterials(ctx(eMat1_1, attr1)); + final DecryptionMaterials dMat1_2 = prov2.getDecryptionMaterials(ctx(eMat1_2, attr2)); + methodCalls.clear(); + assertEquals(eMat1_1.getEncryptionKey(), dMat1_1.getDecryptionKey()); + assertEquals(eMat1_2.getEncryptionKey(), dMat1_2.getDecryptionKey()); + assertEquals(eMat1_1.getSigningKey(), dMat1_1.getVerificationKey()); + assertEquals(eMat1_2.getSigningKey(), dMat1_2.getVerificationKey()); + final DecryptionMaterials dMat2_1 = prov2.getDecryptionMaterials(ctx(eMat2_1, attr1)); + final DecryptionMaterials dMat2_2 = prov2.getDecryptionMaterials(ctx(eMat2_2, attr2)); + assertEquals(eMat2_1.getEncryptionKey(), dMat2_1.getDecryptionKey()); + assertEquals(eMat2_2.getEncryptionKey(), dMat2_2.getDecryptionKey()); + assertEquals(eMat2_1.getSigningKey(), dMat2_1.getVerificationKey()); + assertEquals(eMat2_2.getSigningKey(), dMat2_2.getVerificationKey()); + final DecryptionMaterials dMat3_1 = prov2.getDecryptionMaterials(ctx(eMat3_1, attr1)); + final DecryptionMaterials dMat3_2 = prov2.getDecryptionMaterials(ctx(eMat3_2, attr2)); + assertEquals(eMat3_1.getEncryptionKey(), dMat3_1.getDecryptionKey()); + assertEquals(eMat3_2.getEncryptionKey(), dMat3_2.getDecryptionKey()); + assertEquals(eMat3_1.getSigningKey(), dMat3_1.getVerificationKey()); + assertEquals(eMat3_2.getSigningKey(), dMat3_2.getVerificationKey()); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + } + + @Test + public void testTwoVersionsWithTwoMaterialsWithRefresh() throws InterruptedException { + final Map attr1 = Collections.singletonMap(MATERIAL_PARAM, new AttributeValue("material1")); + final EncryptionContext ctx1 = ctx(attr1); + final Map attr2 = Collections.singletonMap(MATERIAL_PARAM, new AttributeValue("material2")); + final EncryptionContext ctx2 = ctx(attr2); + + final CachingMostRecentProvider prov = new ExtendedProvider(store, 500, 100); + assertNull(methodCalls.get("putItem")); + final EncryptionMaterials eMat1_1 = prov.getEncryptionMaterials(ctx1); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + final EncryptionMaterials eMat1_2 = prov.getEncryptionMaterials(ctx2); + // It's a new provider, so we see a single putItem + assertEquals(1, (int) methodCalls.getOrDefault("putItem", 0)); + methodCalls.clear(); + // Create the new material + store.newProvider("material1"); + store.newProvider("material2"); + methodCalls.clear(); + // Ensure the cache is working + final EncryptionMaterials eMat2_1 = prov.getEncryptionMaterials(ctx1); + final EncryptionMaterials eMat2_2 = prov.getEncryptionMaterials(ctx2); + assertTrue("Expected no calls but was " + methodCalls.toString(), methodCalls.isEmpty()); + assertEquals(0, store.getVersionFromMaterialDescription(eMat1_1.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2_1.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat1_2.getMaterialDescription())); + assertEquals(0, store.getVersionFromMaterialDescription(eMat2_2.getMaterialDescription())); + prov.refresh(); + final EncryptionMaterials eMat3_1 = prov.getEncryptionMaterials(ctx1); + final EncryptionMaterials eMat3_2 = prov.getEncryptionMaterials(ctx2); + assertEquals(2, (int) methodCalls.getOrDefault("query", 0)); // To find current version + assertEquals(2, (int) methodCalls.getOrDefault("getItem", 0)); + assertEquals(1, store.getVersionFromMaterialDescription(eMat3_1.getMaterialDescription())); + assertEquals(1, store.getVersionFromMaterialDescription(eMat3_2.getMaterialDescription())); + + assertEquals(eMat1_1.getSigningKey(), eMat2_1.getSigningKey()); + assertFalse(eMat1_1.getSigningKey().equals(eMat3_1.getSigningKey())); + assertEquals(eMat1_2.getSigningKey(), eMat2_2.getSigningKey()); + assertFalse(eMat1_2.getSigningKey().equals(eMat3_2.getSigningKey())); + + // Ensure we can decrypt all of them without hitting ddb more than the minimum + final CachingMostRecentProvider prov2 = new ExtendedProvider(store, 500, 100); + final DecryptionMaterials dMat1_1 = prov2.getDecryptionMaterials(ctx(eMat1_1, attr1)); + final DecryptionMaterials dMat1_2 = prov2.getDecryptionMaterials(ctx(eMat1_2, attr2)); + methodCalls.clear(); + assertEquals(eMat1_1.getEncryptionKey(), dMat1_1.getDecryptionKey()); + assertEquals(eMat1_2.getEncryptionKey(), dMat1_2.getDecryptionKey()); + assertEquals(eMat1_1.getSigningKey(), dMat1_1.getVerificationKey()); + assertEquals(eMat1_2.getSigningKey(), dMat1_2.getVerificationKey()); + final DecryptionMaterials dMat2_1 = prov2.getDecryptionMaterials(ctx(eMat2_1, attr1)); + final DecryptionMaterials dMat2_2 = prov2.getDecryptionMaterials(ctx(eMat2_2, attr2)); + assertEquals(eMat2_1.getEncryptionKey(), dMat2_1.getDecryptionKey()); + assertEquals(eMat2_2.getEncryptionKey(), dMat2_2.getDecryptionKey()); + assertEquals(eMat2_1.getSigningKey(), dMat2_1.getVerificationKey()); + assertEquals(eMat2_2.getSigningKey(), dMat2_2.getVerificationKey()); + final DecryptionMaterials dMat3_1 = prov2.getDecryptionMaterials(ctx(eMat3_1, attr1)); + final DecryptionMaterials dMat3_2 = prov2.getDecryptionMaterials(ctx(eMat3_2, attr2)); + assertEquals(eMat3_1.getEncryptionKey(), dMat3_1.getDecryptionKey()); + assertEquals(eMat3_2.getEncryptionKey(), dMat3_2.getDecryptionKey()); + assertEquals(eMat3_1.getSigningKey(), dMat3_1.getVerificationKey()); + assertEquals(eMat3_2.getSigningKey(), dMat3_2.getVerificationKey()); + // Get item will be hit twice, once for each old key + assertEquals(1, methodCalls.size()); + assertEquals(2, (int) methodCalls.getOrDefault("getItem", 0)); + } + + private static EncryptionContext ctx(final Map attr) { + return new EncryptionContext.Builder() + .withAttributeValues(attr).build(); + } + + private static EncryptionContext ctx(final EncryptionMaterials mat, Map attr) { + return new EncryptionContext.Builder() + .withAttributeValues(attr) + .withMaterialDescription(mat.getMaterialDescription()).build(); + } + + private static EncryptionContext ctx(final EncryptionMaterials mat) { + return new EncryptionContext.Builder() + .withMaterialDescription(mat.getMaterialDescription()).build(); + } + + private static class ExtendedProvider extends CachingMostRecentProvider { + public ExtendedProvider(ProviderStore keystore, long ttlInMillis, int maxCacheSize) { + super(keystore, null, ttlInMillis, maxCacheSize); + } + + @Override + public long getCurrentVersion() { + throw new UnsupportedOperationException(); + } + + @Override + protected String getMaterialName(final EncryptionContext context) { + return context.getAttributeValues().get(MATERIAL_PARAM).getS(); + } + } + + @SuppressWarnings("unchecked") + private static T instrument(final T obj, final Class clazz, final Map map) { + return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, + new InvocationHandler() { + private final Object lock = new Object(); + + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + synchronized (lock) { + try { + final Integer oldCount = map.get(method.getName()); + if (oldCount != null) { + map.put(method.getName(), oldCount + 1); + } else { + map.put(method.getName(), 1); + } + return method.invoke(obj, args); + } catch (final InvocationTargetException ex) { + throw ex.getCause(); + } + } + } + } + ); + } +} diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/MostRecentProviderTests.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/MostRecentProviderTests.java index 1eaaa565..ac5dda84 100644 --- a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/MostRecentProviderTests.java +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/MostRecentProviderTests.java @@ -1,15 +1,5 @@ -/* - * Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except - * in compliance with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; @@ -40,6 +30,7 @@ import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; +@SuppressWarnings("deprecation") public class MostRecentProviderTests { private static final String TABLE_NAME = "keystoreTable"; private static final String MATERIAL_NAME = "material"; @@ -488,7 +479,7 @@ public void twoVersionsWithTwoMaterialsWithRefresh() throws InterruptedException assertEquals(eMat3_2.getEncryptionKey(), dMat3_2.getDecryptionKey()); assertEquals(eMat3_1.getSigningKey(), dMat3_1.getVerificationKey()); assertEquals(eMat3_2.getSigningKey(), dMat3_2.getVerificationKey()); - // Get item will be hit once for the one old key + // Get item will be hit twice, once for each old key assertEquals(1, methodCalls.size()); assertEquals(2, (int) methodCalls.getOrDefault("getItem", 0)); } diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/WrappedMaterialsProviderTest.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/WrappedMaterialsProviderTest.java new file mode 100644 index 00000000..7589e394 --- /dev/null +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/WrappedMaterialsProviderTest.java @@ -0,0 +1,364 @@ +package com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers; + +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.DecryptionMaterials; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.EncryptionMaterials; +import com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.WrappedRawMaterials; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.security.GeneralSecurityException; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNotNull; + +public class WrappedMaterialsProviderTest { + private static SecretKey symEncryptionKey; + private static SecretKey macKey; + private static KeyPair sigPair; + private static KeyPair encryptionPair; + private static SecureRandom rnd; + private Map description; + private EncryptionContext ctx; + + @BeforeClass + public static void setUpClass() throws NoSuchAlgorithmException { + rnd = new SecureRandom(); + KeyPairGenerator rsaGen = KeyPairGenerator.getInstance("RSA"); + rsaGen.initialize(2048, rnd); + sigPair = rsaGen.generateKeyPair(); + encryptionPair = rsaGen.generateKeyPair(); + + KeyGenerator aesGen = KeyGenerator.getInstance("AES"); + aesGen.init(128, rnd); + symEncryptionKey = aesGen.generateKey(); + + KeyGenerator macGen = KeyGenerator.getInstance("HmacSHA256"); + macGen.init(256, rnd); + macKey = macGen.generateKey(); + } + + @BeforeMethod + public void setUp() { + description = new HashMap(); + description.put("TestKey", "test value"); + ctx = new EncryptionContext.Builder().build(); + } + + @Test + public void simpleMac() throws GeneralSecurityException { + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(symEncryptionKey, symEncryptionKey, macKey, Collections.emptyMap()); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals(macKey, eMat.getSigningKey()); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); + assertEquals(contentEncryptionKey, dMat.getDecryptionKey()); + assertEquals(macKey, dMat.getVerificationKey()); + } + + @Test + public void simpleSigPair() throws GeneralSecurityException { + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(symEncryptionKey, symEncryptionKey, sigPair, Collections.emptyMap()); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); + assertEquals(contentEncryptionKey, dMat.getDecryptionKey()); + assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); + } + + @Test + public void randomEnvelopeKeys() throws GeneralSecurityException { + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(symEncryptionKey, symEncryptionKey, macKey, Collections.emptyMap()); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals(macKey, eMat.getSigningKey()); + + EncryptionMaterials eMat2 = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey2 = eMat2.getEncryptionKey(); + assertEquals(macKey, eMat.getSigningKey()); + + assertFalse("Envelope keys must be different", contentEncryptionKey.equals(contentEncryptionKey2)); + } + + @Test + public void testRefresh() { + // This does nothing, make sure we don't throw an exception. + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(symEncryptionKey, symEncryptionKey, macKey, Collections.emptyMap()); + prov.refresh(); + } + + @Test + public void wrapUnwrapAsymMatExplicitWrappingAlgorithmPkcs1() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.KEY_WRAPPING_ALGORITHM, "RSA/ECB/PKCS1Padding"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(encryptionPair.getPublic(), encryptionPair.getPrivate(), sigPair, desc); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); + assertEquals("RSA/ECB/PKCS1Padding", eMat.getMaterialDescription().get(WrappedRawMaterials.KEY_WRAPPING_ALGORITHM)); + assertEquals(contentEncryptionKey, dMat.getDecryptionKey()); + assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); + } + + @Test + public void wrapUnwrapAsymMatExplicitWrappingAlgorithmPkcs2() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.KEY_WRAPPING_ALGORITHM, "RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(encryptionPair.getPublic(), encryptionPair.getPrivate(), sigPair, desc); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); + assertEquals("RSA/ECB/OAEPWithSHA-256AndMGF1Padding", eMat.getMaterialDescription().get(WrappedRawMaterials.KEY_WRAPPING_ALGORITHM)); + assertEquals(contentEncryptionKey, dMat.getDecryptionKey()); + assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); + } + + @Test + public void wrapUnwrapAsymMatExplicitContentKeyAlgorithm() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(encryptionPair.getPublic(), encryptionPair.getPrivate(), sigPair, Collections.emptyMap()); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals("AES", contentEncryptionKey.getAlgorithm()); + assertEquals("AES", eMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); + assertEquals("AES", dMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(contentEncryptionKey, dMat.getDecryptionKey()); + assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); + } + + @Test + public void wrapUnwrapAsymMatExplicitContentKeyLength128() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/128"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(encryptionPair.getPublic(), encryptionPair.getPrivate(), sigPair, desc); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals("AES", contentEncryptionKey.getAlgorithm()); + assertEquals("AES", eMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(16, contentEncryptionKey.getEncoded().length); // 128 Bits + assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); + assertEquals("AES", dMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(contentEncryptionKey, dMat.getDecryptionKey()); + assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); + } + + @Test + public void wrapUnwrapAsymMatExplicitContentKeyLength256() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/256"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(encryptionPair.getPublic(), encryptionPair.getPrivate(), sigPair, desc); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals("AES", contentEncryptionKey.getAlgorithm()); + assertEquals("AES", eMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(32, contentEncryptionKey.getEncoded().length); // 256 Bits + assertEquals(sigPair.getPrivate(), eMat.getSigningKey()); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); + assertEquals("AES", dMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(contentEncryptionKey, dMat.getDecryptionKey()); + assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); + } + + @Test + public void unwrapAsymMatExplicitEncAlgAes128() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/128"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(encryptionPair.getPublic(), encryptionPair.getPrivate(), sigPair, desc); + + // Get materials we can test unwrapping on + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + + // Ensure "AES/128" on the created materials creates the expected key + Map aes128Desc = eMat.getMaterialDescription(); + aes128Desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/128"); + EncryptionContext aes128Ctx = new EncryptionContext.Builder() + .withMaterialDescription(aes128Desc).build(); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(aes128Ctx); + assertEquals("AES/128", dMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals("AES", dMat.getDecryptionKey().getAlgorithm()); + assertEquals(eMat.getEncryptionKey(), dMat.getDecryptionKey()); + assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); + } + + @Test + public void unwrapAsymMatExplicitEncAlgAes256() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/256"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(encryptionPair.getPublic(), encryptionPair.getPrivate(), sigPair, desc); + + // Get materials we can test unwrapping on + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + + // Ensure "AES/256" on the created materials creates the expected key + Map aes256Desc = eMat.getMaterialDescription(); + aes256Desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/256"); + EncryptionContext aes256Ctx = new EncryptionContext.Builder() + .withMaterialDescription(aes256Desc).build(); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(aes256Ctx); + assertEquals("AES/256", dMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals("AES", dMat.getDecryptionKey().getAlgorithm()); + assertEquals(eMat.getEncryptionKey(), dMat.getDecryptionKey()); + assertEquals(sigPair.getPublic(), dMat.getVerificationKey()); + } + + @Test + public void wrapUnwrapSymMatExplicitContentKeyAlgorithm() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(symEncryptionKey, symEncryptionKey, macKey, desc); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals("AES", contentEncryptionKey.getAlgorithm()); + assertEquals("AES", eMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(macKey, eMat.getSigningKey()); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); + assertEquals("AES", dMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(contentEncryptionKey, dMat.getDecryptionKey()); + assertEquals(macKey, dMat.getVerificationKey()); + } + + @Test + public void wrapUnwrapSymMatExplicitContentKeyLength128() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/128"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(symEncryptionKey, symEncryptionKey, macKey, desc); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals("AES", contentEncryptionKey.getAlgorithm()); + assertEquals("AES", eMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(16, contentEncryptionKey.getEncoded().length); // 128 Bits + assertEquals(macKey, eMat.getSigningKey()); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); + assertEquals("AES", dMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(contentEncryptionKey, dMat.getDecryptionKey()); + assertEquals(macKey, dMat.getVerificationKey()); + } + + @Test + public void wrapUnwrapSymMatExplicitContentKeyLength256() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/256"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(symEncryptionKey, symEncryptionKey, macKey, desc); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + SecretKey contentEncryptionKey = eMat.getEncryptionKey(); + assertNotNull(contentEncryptionKey); + assertEquals("AES", contentEncryptionKey.getAlgorithm()); + assertEquals("AES", eMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(32, contentEncryptionKey.getEncoded().length); // 256 Bits + assertEquals(macKey, eMat.getSigningKey()); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(ctx(eMat)); + assertEquals("AES", dMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals(contentEncryptionKey, dMat.getDecryptionKey()); + assertEquals(macKey, dMat.getVerificationKey()); + } + + @Test + public void unwrapSymMatExplicitEncAlgAes128() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/128"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(symEncryptionKey, symEncryptionKey, macKey, desc); + + // Get materials we can test unwrapping on + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + + // Ensure "AES/128" on the created materials creates the expected key + Map aes128Desc = eMat.getMaterialDescription(); + aes128Desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/128"); + EncryptionContext aes128Ctx = new EncryptionContext.Builder() + .withMaterialDescription(aes128Desc).build(); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(aes128Ctx); + assertEquals("AES/128", dMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals("AES", dMat.getDecryptionKey().getAlgorithm()); + assertEquals(eMat.getEncryptionKey(), dMat.getDecryptionKey()); + assertEquals(macKey, dMat.getVerificationKey()); + } + + @Test + public void unwrapSymMatExplicitEncAlgAes256() throws GeneralSecurityException { + Map desc = new HashMap(); + desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/256"); + + WrappedMaterialsProvider prov = new WrappedMaterialsProvider(symEncryptionKey, symEncryptionKey, macKey, desc); + + EncryptionMaterials eMat = prov.getEncryptionMaterials(ctx); + + Map aes256Desc = eMat.getMaterialDescription(); + aes256Desc.put(WrappedRawMaterials.CONTENT_KEY_ALGORITHM, "AES/256"); + EncryptionContext aes256Ctx = new EncryptionContext.Builder() + .withMaterialDescription(aes256Desc).build(); + + DecryptionMaterials dMat = prov.getDecryptionMaterials(aes256Ctx); + assertEquals("AES/256", dMat.getMaterialDescription().get(WrappedRawMaterials.CONTENT_KEY_ALGORITHM)); + assertEquals("AES", dMat.getDecryptionKey().getAlgorithm()); + assertEquals(eMat.getEncryptionKey(), dMat.getDecryptionKey()); + assertEquals(macKey, dMat.getVerificationKey()); + } + + private static EncryptionContext ctx(EncryptionMaterials mat) { + return new EncryptionContext.Builder() + .withMaterialDescription(mat.getMaterialDescription()).build(); + } +} diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/ConcurrentTTLCacheTest.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/ConcurrentTTLCacheTest.java new file mode 100644 index 00000000..ee27364e --- /dev/null +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/ConcurrentTTLCacheTest.java @@ -0,0 +1,235 @@ +package com.amazonaws.services.dynamodbv2.datamodeling.internal; + +import edu.umd.cs.mtc.MultithreadedTestCase; +import edu.umd.cs.mtc.TestFramework; +import org.testng.annotations.Test; + +import java.util.concurrent.TimeUnit; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/* Test specific thread interleavings with behaviors we care about in the + * TTLCache. + */ +public class ConcurrentTTLCacheTest { + + private static final long TTL_GRACE_IN_NANO = TimeUnit.MILLISECONDS.toNanos(500); + private static final long ttlInMillis = 1000; + + @Test + public void testGracePeriodCase() throws Throwable { + TestFramework.runOnce(new GracePeriodCase()); + } + + @Test + public void testExpiredCase() throws Throwable { + TestFramework.runOnce(new ExpiredCase()); + } + + @Test + public void testNewEntryCase() throws Throwable { + TestFramework.runOnce(new NewEntryCase()); + } + + @Test + public void testPutLoadCase() throws Throwable { + TestFramework.runOnce(new PutLoadCase()); + } + + // Ensure the loader is only called once if two threads attempt to load during the grace period + class GracePeriodCase extends MultithreadedTestCase { + TTLCache cache; + TTLCache.EntryLoader loader; + MsClock clock = mock(MsClock.class); + + @Override + public void initialize() { + loader = spy(new TTLCache.EntryLoader() { + @Override + public String load(String entryKey) { + // Wait until thread2 finishes to complete load + waitForTick(2); + return "loadedValue"; + } + }); + when(clock.timestampNano()).thenReturn((long) 0); + cache = new TTLCache<>(3, ttlInMillis, loader); + cache.clock = clock; + + // Put an initial value into the cache at time 0 + cache.put("k1", "v1"); + } + + // The thread that first calls load in the grace period and acquires the lock + public void thread1() { + when(clock.timestampNano()).thenReturn(TimeUnit.MILLISECONDS.toNanos(ttlInMillis) + 1); + String loadedValue = cache.load("k1"); + assertTick(2); + // Expect to get back the value calculated from load + assertEquals("loadedValue", loadedValue); + } + + // The thread that calls load in the grace period after the lock has been acquired + public void thread2() { + // Wait until the first thread acquires the lock and starts load + waitForTick(1); + when(clock.timestampNano()).thenReturn(TimeUnit.MILLISECONDS.toNanos(ttlInMillis) + 1); + String loadedValue = cache.load("k1"); + // Expect to get back the original value in the cache + assertEquals("v1", loadedValue); + } + + @Override + public void finish() { + // Ensure the loader was only called once + verify(loader, times(1)).load("k1"); + } + } + + // Ensure the loader is only called once if two threads attempt to load an expired entry. + class ExpiredCase extends MultithreadedTestCase { + TTLCache cache; + TTLCache.EntryLoader loader; + MsClock clock = mock(MsClock.class); + + @Override + public void initialize() { + loader = spy(new TTLCache.EntryLoader() { + @Override + public String load(String entryKey) { + // Wait until thread2 is waiting for the lock to complete load + waitForTick(2); + return "loadedValue"; + } + }); + when(clock.timestampNano()).thenReturn((long) 0); + cache = new TTLCache<>(3, ttlInMillis, loader); + cache.clock = clock; + + // Put an initial value into the cache at time 0 + cache.put("k1", "v1"); + } + + // The thread that first calls load after expiration + public void thread1() { + when(clock.timestampNano()).thenReturn(TimeUnit.MILLISECONDS.toNanos(ttlInMillis) + TTL_GRACE_IN_NANO + 1); + String loadedValue = cache.load("k1"); + assertTick(2); + // Expect to get back the value calculated from load + assertEquals("loadedValue", loadedValue); + } + + // The thread that calls load after expiration, + // after the first thread calls load, but before + // the new value is put into the cache. + public void thread2() { + // Wait until the first thread acquires the lock and starts load + waitForTick(1); + when(clock.timestampNano()).thenReturn(TimeUnit.MILLISECONDS.toNanos(ttlInMillis) + TTL_GRACE_IN_NANO + 1); + String loadedValue = cache.load("k1"); + // Expect to get back the newly loaded value + assertEquals("loadedValue", loadedValue); + // assert that this thread only finishes once the first thread's load does + assertTick(2); + } + + @Override + public void finish() { + // Ensure the loader was only called once + verify(loader, times(1)).load("k1"); + } + } + + // Ensure the loader is only called once if two threads attempt to load the same new entry. + class NewEntryCase extends MultithreadedTestCase { + TTLCache cache; + TTLCache.EntryLoader loader; + MsClock clock = mock(MsClock.class); + + @Override + public void initialize() { + loader = spy(new TTLCache.EntryLoader() { + @Override + public String load(String entryKey) { + // Wait until thread2 is blocked to complete load + waitForTick(2); + return "loadedValue"; + } + }); + when(clock.timestampNano()).thenReturn((long) 0); + cache = new TTLCache<>(3, ttlInMillis, loader); + cache.clock = clock; + } + + // The thread that first calls load + public void thread1() { + String loadedValue = cache.load("k1"); + assertTick(2); + // Expect to get back the value calculated from load + assertEquals("loadedValue", loadedValue); + } + + // The thread that calls load after the first thread calls load, + // but before the new value is put into the cache. + public void thread2() { + // Wait until the first thread acquires the lock and starts load + waitForTick(1); + String loadedValue = cache.load("k1"); + // Expect to get back the newly loaded value + assertEquals("loadedValue", loadedValue); + // assert that this thread only finishes once the first thread's load does + assertTick(2); + } + + @Override + public void finish() { + // Ensure the loader was only called once + verify(loader, times(1)).load("k1"); + } + } + + // Ensure the loader blocks put on load/put of the same new entry + class PutLoadCase extends MultithreadedTestCase { + TTLCache cache; + TTLCache.EntryLoader loader; + MsClock clock = mock(MsClock.class); + + @Override + public void initialize() { + loader = spy(new TTLCache.EntryLoader() { + @Override + public String load(String entryKey) { + // Wait until the put blocks to complete load + waitForTick(2); + return "loadedValue"; + } + }); + when(clock.timestampNano()).thenReturn((long) 0); + cache = new TTLCache<>(3, ttlInMillis, loader); + cache.clock = clock; + } + + // The thread that first calls load + public void thread1() { + String loadedValue = cache.load("k1"); + // Expect to get back the value calculated from load + assertEquals("loadedValue", loadedValue); + verify(loader, times(1)).load("k1"); + } + + // The thread that calls put during the first thread's load + public void thread2() { + // Wait until the first thread is loading + waitForTick(1); + String previousValue = cache.put("k1", "v1"); + // Expect to get back the value loaded into the cache by thread1 + assertEquals("loadedValue", previousValue); + // assert that this thread was blocked by the first thread + assertTick(2); + } + } +} diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/LRUCacheTest.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/LRUCacheTest.java index 4752f6f9..397ccbd7 100644 --- a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/LRUCacheTest.java +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/LRUCacheTest.java @@ -1,23 +1,9 @@ -/* - * Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except - * in compliance with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 package com.amazonaws.services.dynamodbv2.datamodeling.internal; import org.testng.annotations.Test; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; @@ -56,52 +42,39 @@ public void test() { } @Test - public void testListener() { - final Map removed = new HashMap(); - final LRUCache cache = new LRUCache(3, - new LRUCache.RemovalListener() { - @Override - public void onRemoval(final Entry entry) { - removed.put(entry.getKey(), entry.getValue()); - } - }); - assertTrue(cache.size() == 0); + public void testRemove() { + final LRUCache cache = new LRUCache(3); + assertEquals(0, cache.size()); + assertEquals(3, cache.getMaxSize()); cache.add("k1", "v1"); assertTrue(cache.size() == 1); - cache.add("k1", "v11"); - assertTrue(cache.size() == 1); + final String oldValue = cache.remove("k1"); + assertTrue(cache.size() == 0); + assertEquals("v1", oldValue); + assertNull(cache.get("k1")); + + final String emptyValue = cache.remove("k1"); + assertTrue(cache.size() == 0); + assertNull(emptyValue); + assertNull(cache.get("k1")); + } + + @Test + public void testClear() { + final LRUCache cache = new LRUCache(3); + assertEquals(0, cache.size()); + cache.clear(); + assertEquals(0, cache.size()); + + cache.add("k1", "v1"); cache.add("k2", "v2"); - assertTrue(cache.size() == 2); cache.add("k3", "v3"); assertTrue(cache.size() == 3); - assertEquals("v11", cache.get("k1")); - assertEquals("v2", cache.get("k2")); - assertEquals("v3", cache.get("k3")); - assertTrue(removed.isEmpty()); - cache.add("k4", "v4"); - assertTrue(cache.size() == 3); - assertNull(cache.get("k1")); - assertEquals(1, removed.size()); - assertEquals("v11", removed.get("k1")); - removed.clear(); - assertEquals("v4", cache.get("k4")); - assertEquals("v2", cache.get("k2")); - assertEquals("v3", cache.get("k3")); - assertTrue(cache.size() == 3); - cache.add("k5", "v5"); - assertEquals(1, removed.size()); - assertEquals("v4", removed.get("k4")); - removed.clear(); - assertNull(cache.get("k4")); - assertEquals("v5", cache.get("k5")); - assertEquals("v2", cache.get("k2")); - assertEquals("v3", cache.get("k3")); cache.clear(); - assertEquals(0, cache.size()); - assertEquals(3, removed.size()); - assertEquals("v5", removed.get("k5")); - assertEquals("v2", removed.get("k2")); - assertEquals("v3", removed.get("k3")); + assertTrue(cache.size() == 0); + assertNull(cache.get("k1")); + assertNull(cache.get("k2")); + assertNull(cache.get("k3")); } @Test(expectedExceptions = IllegalArgumentException.class) diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/TTLCacheTest.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/TTLCacheTest.java new file mode 100644 index 00000000..d0867498 --- /dev/null +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/TTLCacheTest.java @@ -0,0 +1,364 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +package com.amazonaws.services.dynamodbv2.datamodeling.internal; + +import org.testng.annotations.Test; + +import java.util.concurrent.TimeUnit; +import java.util.function.Function; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; +import static org.testng.Assert.assertThrows; +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertNull; +import static org.testng.AssertJUnit.assertTrue; + +public class TTLCacheTest { + + private static final long TTL_GRACE_IN_NANO = TimeUnit.MILLISECONDS.toNanos(500); + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testInvalidSize() { + final TTLCache cache = new TTLCache(0, 1000, mock(TTLCache.EntryLoader.class)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testInvalidTTL() { + final TTLCache cache = new TTLCache(3, 0, mock(TTLCache.EntryLoader.class)); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testNullLoader() { + final TTLCache cache = new TTLCache(3, 1000, null); + } + + @Test + public void testConstructor() { + final TTLCache cache = new TTLCache(1000, 1000, mock(TTLCache.EntryLoader.class)); + assertEquals(0, cache.size()); + assertEquals(1000, cache.getMaxSize()); + } + + @Test + public void testLoadPastMaxSize() { + final String loadedValue = "loaded value"; + final long ttlInMillis = 1000; + final int maxSize = 1; + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + when(loader.load(any())).thenReturn(loadedValue); + MsClock clock = mock(MsClock.class); + when(clock.timestampNano()).thenReturn((long) 0); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + cache.clock = clock; + + assertEquals(0, cache.size()); + assertEquals(maxSize, cache.getMaxSize()); + + cache.load("k1"); + verify(loader, times(1)).load("k1"); + assertTrue(cache.size() == 1); + + String result = cache.load("k2"); + verify(loader, times(1)).load("k2"); + assertTrue(cache.size() == 1); + assertEquals(loadedValue, result); + + // to verify result is in the cache, load one more time + // and expect the loader to not be called + String cachedValue = cache.load("k2"); + verifyNoMoreInteractions(loader); + assertTrue(cache.size() == 1); + assertEquals(loadedValue, cachedValue); + } + + @Test + public void testLoadNoExistingEntry() { + final String loadedValue = "loaded value"; + final long ttlInMillis = 1000; + final int maxSize = 3; + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + when(loader.load(any())).thenReturn(loadedValue); + MsClock clock = mock(MsClock.class); + when(clock.timestampNano()).thenReturn((long) 0); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + cache.clock = clock; + + assertEquals(0, cache.size()); + assertEquals(maxSize, cache.getMaxSize()); + + String result = cache.load("k1"); + verify(loader, times(1)).load("k1"); + assertTrue(cache.size() == 1); + assertEquals(loadedValue, result); + + // to verify result is in the cache, load one more time + // and expect the loader to not be called + String cachedValue = cache.load("k1"); + verifyNoMoreInteractions(loader); + assertTrue(cache.size() == 1); + assertEquals(loadedValue, cachedValue); + } + + @Test + public void testLoadNotExpired() { + final String loadedValue = "loaded value"; + final long ttlInMillis = 1000; + final int maxSize = 3; + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + when(loader.load(any())).thenReturn(loadedValue); + MsClock clock = mock(MsClock.class); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + cache.clock = clock; + + assertEquals(0, cache.size()); + assertEquals(maxSize, cache.getMaxSize()); + + // when first creating the entry, time is 0 + when(clock.timestampNano()).thenReturn((long) 0); + cache.load("k1"); + assertTrue(cache.size() == 1); + verify(loader, times(1)).load("k1"); + + // on load, time is within TTL + when(clock.timestampNano()).thenReturn(TimeUnit.MILLISECONDS.toNanos(ttlInMillis)); + String result = cache.load("k1"); + + verifyNoMoreInteractions(loader); + assertTrue(cache.size() == 1); + assertEquals(loadedValue, result); + } + + @Test + public void testLoadInGrace() { + final String loadedValue = "loaded value"; + final long ttlInMillis = 1000; + final int maxSize = 3; + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + when(loader.load(any())).thenReturn(loadedValue); + MsClock clock = mock(MsClock.class); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + cache.clock = clock; + + assertEquals(0, cache.size()); + assertEquals(maxSize, cache.getMaxSize()); + + // when first creating the entry, time is zero + when(clock.timestampNano()).thenReturn((long) 0); + cache.load("k1"); + assertTrue(cache.size() == 1); + verify(loader, times(1)).load("k1"); + + // on load, time is past TTL but within the grace period + when(clock.timestampNano()).thenReturn(TimeUnit.MILLISECONDS.toNanos(ttlInMillis) + 1); + String result = cache.load("k1"); + + // Because this is tested in a single thread, + // this is expected to obtain the lock and load the new value + verify(loader, times(2)).load("k1"); + verifyNoMoreInteractions(loader); + assertTrue(cache.size() == 1); + assertEquals(loadedValue, result); + } + + @Test + public void testLoadExpired() { + final String loadedValue = "loaded value"; + final long ttlInMillis = 1000; + final int maxSize = 3; + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + when(loader.load(any())).thenReturn(loadedValue); + MsClock clock = mock(MsClock.class); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + cache.clock = clock; + + assertEquals(0, cache.size()); + assertEquals(maxSize, cache.getMaxSize()); + + // when first creating the entry, time is zero + when(clock.timestampNano()).thenReturn((long) 0); + cache.load("k1"); + assertTrue(cache.size() == 1); + verify(loader, times(1)).load("k1"); + + // on load, time is past TTL and grace period + when(clock.timestampNano()).thenReturn(TimeUnit.MILLISECONDS.toNanos(ttlInMillis) + TTL_GRACE_IN_NANO + 1); + String result = cache.load("k1"); + + verify(loader, times(2)).load("k1"); + verifyNoMoreInteractions(loader); + assertTrue(cache.size() == 1); + assertEquals(loadedValue, result); + } + + @Test + public void testLoadExpiredEviction() { + final String loadedValue = "loaded value"; + final long ttlInMillis = 1000; + final int maxSize = 3; + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + when(loader.load(any())).thenReturn(loadedValue).thenThrow(new IllegalStateException("This loader is mocked to throw a failure.")); + MsClock clock = mock(MsClock.class); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + cache.clock = clock; + + assertEquals(0, cache.size()); + assertEquals(maxSize, cache.getMaxSize()); + + // when first creating the entry, time is zero + when(clock.timestampNano()).thenReturn((long) 0); + cache.load("k1"); + verify(loader, times(1)).load("k1"); + assertTrue(cache.size() == 1); + + // on load, time is past TTL and grace period + when(clock.timestampNano()).thenReturn(TimeUnit.MILLISECONDS.toNanos(ttlInMillis) + TTL_GRACE_IN_NANO + 1); + assertThrows(IllegalStateException.class, () -> cache.load("k1")); + + verify(loader, times(2)).load("k1"); + verifyNoMoreInteractions(loader); + assertTrue(cache.size() == 0); + } + + @Test + public void testLoadWithFunction() { + final String loadedValue = "loaded value"; + final String functionValue = "function value"; + final long ttlInMillis = 1000; + final int maxSize = 3; + final Function function = spy(Function.class); + when(function.apply(any())).thenReturn(functionValue); + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + when(loader.load(any())).thenReturn(loadedValue).thenThrow(new IllegalStateException("This loader is mocked to throw a failure.")); + MsClock clock = mock(MsClock.class); + when(clock.timestampNano()).thenReturn((long) 0); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + cache.clock = clock; + + assertEquals(0, cache.size()); + assertEquals(maxSize, cache.getMaxSize()); + + String result = cache.load("k1", function); + verify(function, times(1)).apply("k1"); + assertTrue(cache.size() == 1); + assertEquals(functionValue, result); + + // to verify result is in the cache, load one more time + // and expect the loader to not be called + String cachedValue = cache.load("k1"); + verifyNoMoreInteractions(function); + verifyNoMoreInteractions(loader); + assertTrue(cache.size() == 1); + assertEquals(functionValue, cachedValue); + } + + @Test + public void testClear() { + final String loadedValue = "loaded value"; + final long ttlInMillis = 1000; + final int maxSize = 3; + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + when(loader.load(any())).thenReturn(loadedValue); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + + assertTrue(cache.size() == 0); + cache.load("k1"); + cache.load("k2"); + assertTrue(cache.size() == 2); + + cache.clear(); + assertTrue(cache.size() == 0); + } + + @Test + public void testPut() { + final long ttlInMillis = 1000; + final int maxSize = 3; + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + MsClock clock = mock(MsClock.class); + when(clock.timestampNano()).thenReturn((long) 0); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + cache.clock = clock; + + assertEquals(0, cache.size()); + assertEquals(maxSize, cache.getMaxSize()); + + String oldValue = cache.put("k1", "v1"); + assertNull(oldValue); + assertTrue(cache.size() == 1); + + String oldValue2 = cache.put("k1", "v11"); + assertEquals("v1", oldValue2); + assertTrue(cache.size() == 1); + } + + @Test + public void testExpiredPut() { + final long ttlInMillis = 1000; + final int maxSize = 3; + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + MsClock clock = mock(MsClock.class); + when(clock.timestampNano()).thenReturn((long) 0); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + cache.clock = clock; + + assertEquals(0, cache.size()); + assertEquals(maxSize, cache.getMaxSize()); + + // First put is at time 0 + String oldValue = cache.put("k1", "v1"); + assertNull(oldValue); + assertTrue(cache.size() == 1); + + // Second put is at time past TTL and grace period + when(clock.timestampNano()).thenReturn(TimeUnit.MILLISECONDS.toNanos(ttlInMillis) + TTL_GRACE_IN_NANO + 1); + String oldValue2 = cache.put("k1", "v11"); + assertNull(oldValue2); + assertTrue(cache.size() == 1); + } + + @Test + public void testPutPastMaxSize() { + final String loadedValue = "loaded value"; + final long ttlInMillis = 1000; + final int maxSize = 1; + TTLCache.EntryLoader loader = spy(TTLCache.EntryLoader.class); + when(loader.load(any())).thenReturn(loadedValue); + MsClock clock = mock(MsClock.class); + when(clock.timestampNano()).thenReturn((long) 0); + + final TTLCache cache = new TTLCache(maxSize, ttlInMillis, loader); + cache.clock = clock; + + assertEquals(0, cache.size()); + assertEquals(maxSize, cache.getMaxSize()); + + cache.put("k1", "v1"); + assertTrue(cache.size() == 1); + + cache.put("k2", "v2"); + assertTrue(cache.size() == 1); + + // to verify put value is in the cache, load + // and expect the loader to not be called + String cachedValue = cache.load("k2"); + verifyNoMoreInteractions(loader); + assertTrue(cache.size() == 1); + assertEquals(cachedValue, "v2"); + } +} diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/MapperLoadingStrategyConfigITCase.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/MapperLoadingStrategyConfigITCase.java index cf75427e..3a8dae57 100644 --- a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/MapperLoadingStrategyConfigITCase.java +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/MapperLoadingStrategyConfigITCase.java @@ -1,11 +1,11 @@ /* * Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * + * * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except * in compliance with the License. A copy of the License is located at - * + * * http://aws.amazon.com/apache2.0 - * + * * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. @@ -47,7 +47,7 @@ public class MapperLoadingStrategyConfigITCase extends DynamoDBMapperCryptoInteg private static int PARALLEL_SEGMENT = 3; private static int OBJECTS_NUM = 50; private static int RESULTS_NUM = OBJECTS_NUM - 2; // condition: rangeKey > 1.0 - + @BeforeClass public static void setUp() throws Exception { setUpTableWithRangeAttribute(); @@ -60,69 +60,69 @@ public void testLazyLoading() { PaginatedList queryList = getTestPaginatedQueryList(PaginationLoadingStrategy.LAZY_LOADING); PaginatedList scanList = getTestPaginatedScanList(PaginationLoadingStrategy.LAZY_LOADING); PaginatedList parallelScanList = getTestPaginatedParallelScanList(PaginationLoadingStrategy.LAZY_LOADING); - + // check that only at most one page of results are loaded up to this point assertTrue(getLoadedResultsNumber(queryList) <= PAGE_SIZE); assertTrue(getLoadedResultsNumber(scanList) <= PAGE_SIZE); assertTrue(getLoadedResultsNumber(parallelScanList) <= PAGE_SIZE * PARALLEL_SEGMENT); - + testAllPaginatedListOperations(queryList); testAllPaginatedListOperations(scanList); testAllPaginatedListOperations(parallelScanList); - + // Re-construct the paginated lists and test the iterator behavior queryList = getTestPaginatedQueryList(PaginationLoadingStrategy.LAZY_LOADING); scanList = getTestPaginatedScanList(PaginationLoadingStrategy.LAZY_LOADING); parallelScanList = getTestPaginatedParallelScanList(PaginationLoadingStrategy.LAZY_LOADING); - + testPaginatedListIterator(queryList); testPaginatedListIterator(scanList); testPaginatedListIterator(parallelScanList); - + } - + @Test public void testEagerLoading() { // Get all the paginated lists using the tested loading strategy PaginatedList queryList = getTestPaginatedQueryList(PaginationLoadingStrategy.EAGER_LOADING); PaginatedList scanList = getTestPaginatedScanList(PaginationLoadingStrategy.EAGER_LOADING); PaginatedList parallelScanList = getTestPaginatedParallelScanList(PaginationLoadingStrategy.EAGER_LOADING); - + // check that all results have been loaded assertTrue(RESULTS_NUM == getLoadedResultsNumber(queryList)); assertTrue(RESULTS_NUM == getLoadedResultsNumber(scanList)); assertTrue(RESULTS_NUM == getLoadedResultsNumber(parallelScanList)); - + testAllPaginatedListOperations(queryList); testAllPaginatedListOperations(scanList); testAllPaginatedListOperations(parallelScanList); - + // Re-construct the paginated lists and test the iterator behavior queryList = getTestPaginatedQueryList(PaginationLoadingStrategy.LAZY_LOADING); scanList = getTestPaginatedScanList(PaginationLoadingStrategy.LAZY_LOADING); parallelScanList = getTestPaginatedParallelScanList(PaginationLoadingStrategy.LAZY_LOADING); - + testPaginatedListIterator(queryList); testPaginatedListIterator(scanList); testPaginatedListIterator(parallelScanList); } -// -// @Test -// public void testIterationOnly() { -// // Get all the paginated lists using the tested loading strategy -// PaginatedList queryList = getTestPaginatedQueryList(PaginationLoadingStrategy.ITERATION_ONLY); -// PaginatedList scanList = getTestPaginatedScanList(PaginationLoadingStrategy.ITERATION_ONLY); -// PaginatedList parallelScanList = getTestPaginatedParallelScanList(PaginationLoadingStrategy.ITERATION_ONLY); -// -// // check that only at most one page of results are loaded up to this point -// assertTrue(getLoadedResultsNumber(queryList) <= PAGE_SIZE); -// assertTrue(getLoadedResultsNumber(scanList) <= PAGE_SIZE); -// assertTrue(getLoadedResultsNumber(parallelScanList) <= PAGE_SIZE * PARALLEL_SEGMENT); -// -// testIterationOnlyPaginatedListOperations(queryList); -// testIterationOnlyPaginatedListOperations(scanList); -// testIterationOnlyPaginatedListOperations(parallelScanList); -// } + + @Test + public void testIterationOnly() { + // Get all the paginated lists using the tested loading strategy + PaginatedList queryList = getTestPaginatedQueryList(PaginationLoadingStrategy.ITERATION_ONLY); + PaginatedList scanList = getTestPaginatedScanList(PaginationLoadingStrategy.ITERATION_ONLY); + PaginatedList parallelScanList = getTestPaginatedParallelScanList(PaginationLoadingStrategy.ITERATION_ONLY); + + // check that only at most one page of results are loaded up to this point + assertTrue(getLoadedResultsNumber(queryList) <= PAGE_SIZE); + assertTrue(getLoadedResultsNumber(scanList) <= PAGE_SIZE); + assertTrue(getLoadedResultsNumber(parallelScanList) <= PAGE_SIZE * PARALLEL_SEGMENT); + + testIterationOnlyPaginatedListOperations(queryList); + testIterationOnlyPaginatedListOperations(scanList); + testIterationOnlyPaginatedListOperations(parallelScanList); + } private static void createTestData() { DynamoDBMapper mapper = TestDynamoDBMapperFactory.createDynamoDBMapper(dynamo); @@ -134,14 +134,14 @@ private static void createTestData() { obj.setRangeKey(i); objs.add(obj); } - + mapper.batchSave(objs); } - + private static PaginatedList getTestPaginatedQueryList(PaginationLoadingStrategy paginationLoadingStrategy) { DynamoDBMapperConfig mapperConfig = new DynamoDBMapperConfig(ConsistentReads.CONSISTENT); DynamoDBMapper mapper = new DynamoDBMapper(dynamo, mapperConfig); - + // Construct the query expression for the tested hash-key value and any range-key value greater that 1.0 RangeKeyTestClass keyObject = new RangeKeyTestClass(); keyObject.setKey(hashKey); @@ -149,52 +149,52 @@ private static PaginatedList getTestPaginatedQueryList(Pagina queryExpression.withRangeKeyCondition("rangeKey", new Condition().withComparisonOperator(ComparisonOperator.GT.toString()).withAttributeValueList( new AttributeValue().withN("1.0"))).withLimit(PAGE_SIZE); - + return mapper.query(RangeKeyTestClass.class, queryExpression, new DynamoDBMapperConfig(paginationLoadingStrategy)); } - + private static PaginatedList getTestPaginatedScanList(PaginationLoadingStrategy paginationLoadingStrategy) { DynamoDBMapperConfig mapperConfig = new DynamoDBMapperConfig(ConsistentReads.CONSISTENT); DynamoDBMapper mapper = new DynamoDBMapper(dynamo, mapperConfig); - + // Construct the scan expression with the exact same conditions DynamoDBScanExpression scanExpression = new DynamoDBScanExpression(); - scanExpression.addFilterCondition("key", + scanExpression.addFilterCondition("key", new Condition().withComparisonOperator(ComparisonOperator.EQ).withAttributeValueList( new AttributeValue().withN(Long.toString(hashKey)))); - scanExpression.addFilterCondition("rangeKey", + scanExpression.addFilterCondition("rangeKey", new Condition().withComparisonOperator(ComparisonOperator.GT).withAttributeValueList( new AttributeValue().withN("1.0"))); scanExpression.setLimit(PAGE_SIZE); - + return mapper.scan(RangeKeyTestClass.class, scanExpression, new DynamoDBMapperConfig(paginationLoadingStrategy)); } - + private static PaginatedList getTestPaginatedParallelScanList(PaginationLoadingStrategy paginationLoadingStrategy) { DynamoDBMapperConfig mapperConfig = new DynamoDBMapperConfig(ConsistentReads.CONSISTENT); DynamoDBMapper mapper = new DynamoDBMapper(dynamo, mapperConfig); - + // Construct the scan expression with the exact same conditions DynamoDBScanExpression scanExpression = new DynamoDBScanExpression(); - scanExpression.addFilterCondition("key", + scanExpression.addFilterCondition("key", new Condition().withComparisonOperator(ComparisonOperator.EQ).withAttributeValueList( new AttributeValue().withN(Long.toString(hashKey)))); - scanExpression.addFilterCondition("rangeKey", + scanExpression.addFilterCondition("rangeKey", new Condition().withComparisonOperator(ComparisonOperator.GT).withAttributeValueList( new AttributeValue().withN("1.0"))); scanExpression.setLimit(PAGE_SIZE); - + return mapper.parallelScan(RangeKeyTestClass.class, scanExpression, PARALLEL_SEGMENT, new DynamoDBMapperConfig(paginationLoadingStrategy)); } - + private static void testAllPaginatedListOperations(PaginatedList list) { - + // (1) isEmpty() assertFalse(list.isEmpty()); - + // (2) get(int n) assertNotNull(list.get(RESULTS_NUM / 2)); - + // (3) contains(Object org0) RangeKeyTestClass obj = new RangeKeyTestClass(); obj.setKey(hashKey); @@ -202,7 +202,7 @@ private static void testAllPaginatedListOperations(PaginatedList subList = list.subList(0, RESULTS_NUM); assertTrue(RESULTS_NUM == subList.size()); @@ -210,77 +210,77 @@ private static void testAllPaginatedListOperations(PaginatedList list) { for (RangeKeyTestClass item : list) { assertTrue(hashKey == item.getKey()); assertTrue(item.getRangeKey() < OBJECTS_NUM); } - + // make sure the list could be iterated again for (RangeKeyTestClass item : list) { assertTrue(hashKey == item.getKey()); assertTrue(item.getRangeKey() < OBJECTS_NUM); } } - + private static void testIterationOnlyPaginatedListOperations(PaginatedList list) { - + // Unsupported operations - + // (1) isEmpty() try { list.isEmpty(); fail("UnsupportedOperationException expected but is not thrown"); } catch (UnsupportedOperationException e) {} - + // (2) get(int n) try { list.get(RESULTS_NUM / 2); fail("UnsupportedOperationException expected but is not thrown"); } catch (UnsupportedOperationException e) {} - + // (3) contains(Object org0) try { list.contains(new RangeKeyTestClass()); fail("UnsupportedOperationException expected but is not thrown"); } catch (UnsupportedOperationException e) {} - + // (4) subList(int org0, int arg1) try { list.subList(0, RESULTS_NUM); fail("UnsupportedOperationException expected but is not thrown"); } catch (UnsupportedOperationException e) {} - + // (5) indexOf(Object org0) try { list.indexOf(new RangeKeyTestClass()); fail("UnsupportedOperationException expected but is not thrown"); } catch (UnsupportedOperationException e) {} - + // (6) loadAllResults() try { list.loadAllResults(); fail("UnsupportedOperationException expected but is not thrown"); } catch (UnsupportedOperationException e) {} - + // (7) size() try { list.size(); fail("UnsupportedOperationException expected but is not thrown"); } catch (UnsupportedOperationException e) {}; - + // Could be iterated once for (RangeKeyTestClass item : list) { assertTrue(hashKey == item.getKey()); @@ -288,16 +288,16 @@ private static void testIterationOnlyPaginatedListOperations(PaginatedList list) { diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/MapperSaveConfigCryptoIntegrationTestBase.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/MapperSaveConfigCryptoIntegrationTestBase.java index 61a90fa2..a7ebeb1c 100644 --- a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/MapperSaveConfigCryptoIntegrationTestBase.java +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/MapperSaveConfigCryptoIntegrationTestBase.java @@ -73,6 +73,7 @@ public class MapperSaveConfigCryptoIntegrationTestBase extends DynamoDBCryptoInt @BeforeClass public static void setUp() throws Exception { + System.setProperty("sqlite4java.library.path", "target/test-lib"); DynamoDBCryptoIntegrationTestBase.setUp(); dynamoMapper = TestDynamoDBMapperFactory.createDynamoDBMapper(dynamo); diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/ScanITCase.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/ScanITCase.java index 9d462459..9a2af0ad 100644 --- a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/ScanITCase.java +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/mapper/integration/ScanITCase.java @@ -172,37 +172,16 @@ public void testParallelScan() throws Exception { } - // TODO: This is disabled because it has problems on DDBLocal, but works fine on DDB - @Test(enabled = false) - public void testParallelScanPerformance() throws Exception{ - DynamoDBMapper util = TestDynamoDBMapperFactory.createDynamoDBMapper(dynamo); - - DynamoDBScanExpression scanExpression = new DynamoDBScanExpression().withLimit(SCAN_LIMIT); - scanExpression.addFilterCondition("value", new Condition().withComparisonOperator(ComparisonOperator.NOT_NULL.toString())); - scanExpression.addFilterCondition("extraData", new Condition().withComparisonOperator(ComparisonOperator.NOT_NULL.toString())); - - long startTime = System.currentTimeMillis(); - PaginatedScanList scanList = util.scan(SimpleClass.class, scanExpression); - scanList.loadAllResults(); - long fullTableScanTime = System.currentTimeMillis() - startTime; - startTime = System.currentTimeMillis(); - PaginatedParallelScanList parallelScanList = util.parallelScan(SimpleClass.class, scanExpression, PARALLEL_SCAN_SEGMENTS); - parallelScanList.loadAllResults(); - long parallelScanTime = System.currentTimeMillis() - startTime; - assertTrue(scanList.size() == parallelScanList.size()); - assertTrue(fullTableScanTime > parallelScanTime); - System.out.println("fullTableScanTime : " + fullTableScanTime + "(ms), parallelScanTime : " + parallelScanTime + "(ms)."); - } - - // TODO: This is disabled because it has problems on DDBLocal, but works fine on DDB - @Test(enabled = false) + @Test public void testParallelScanExceptionHandling() { DynamoDBMapper util = TestDynamoDBMapperFactory.createDynamoDBMapper(dynamo); int INVALID_LIMIT = 0; DynamoDBScanExpression scanExpression = new DynamoDBScanExpression().withLimit(INVALID_LIMIT); try { - PaginatedParallelScanList parallelScanList = util.parallelScan(SimpleClass.class, scanExpression, PARALLEL_SCAN_SEGMENTS); - fail("Should have seen the AmazonServiceException"); + // Using 2 segments to reduce the chance of a RejectedExecutionException occurring when too many threads are spun up + // An alternative would be to maintain a higher segment count, but re-test when a RejectedExecutionException occurs + PaginatedParallelScanList parallelScanList = util.parallelScan(SimpleClass.class, scanExpression, 2); + fail("Test succeeded when it should have failed"); } catch (AmazonServiceException ase) { assertNotNull(ase.getErrorCode()); assertNotNull(ase.getErrorType()); @@ -210,7 +189,6 @@ public void testParallelScanExceptionHandling() { } catch (Exception e) { fail("Should have seen the AmazonServiceException"); } - } @Test diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/testing/AttributeValueDeserializer.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/testing/AttributeValueDeserializer.java new file mode 100644 index 00000000..6ab968d5 --- /dev/null +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/testing/AttributeValueDeserializer.java @@ -0,0 +1,57 @@ +package com.amazonaws.services.dynamodbv2.testing; + +import com.amazonaws.services.dynamodbv2.model.AttributeValue; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +public class AttributeValueDeserializer extends JsonDeserializer { + @Override + public AttributeValue deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode attribute = jp.getCodec().readTree(jp); + for (Iterator> iter = attribute.fields(); iter.hasNext(); ) { + Map.Entry rawAttribute = iter.next(); + // If there is more than one entry in this map, there is an error with our test data + if (iter.hasNext()) { + throw new IllegalStateException("Attribute value JSON has more than one value mapped."); + } + String typeString = rawAttribute.getKey(); + JsonNode value = rawAttribute.getValue(); + switch (typeString) { + case "S": + return new AttributeValue().withS(value.asText()); + case "B": + ByteBuffer b = ByteBuffer.wrap(java.util.Base64.getDecoder().decode(value.asText())); + return new AttributeValue().withB(b); + case "N": + return new AttributeValue().withN(value.asText()); + case "SS": + final Set stringSet = objectMapper.readValue( + objectMapper.treeAsTokens(value), + new TypeReference>() {} + ); + return new AttributeValue().withSS(stringSet); + case "NS": + final Set numSet = objectMapper.readValue( + objectMapper.treeAsTokens(value), + new TypeReference>() {} + ); + return new AttributeValue().withNS(numSet); + default: + throw new IllegalStateException("DDB JSON type " + typeString + " not implemented for test attribute value deserialization."); + } + } + return null; + } +} diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/testing/AttributeValueSerializer.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/testing/AttributeValueSerializer.java new file mode 100644 index 00000000..b89c08d6 --- /dev/null +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/testing/AttributeValueSerializer.java @@ -0,0 +1,47 @@ +package com.amazonaws.services.dynamodbv2.testing; + +import com.amazonaws.services.dynamodbv2.model.AttributeValue; +import com.amazonaws.util.Base64; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.nio.ByteBuffer; + +public class AttributeValueSerializer extends JsonSerializer { + @Override + public void serialize(AttributeValue value, JsonGenerator jgen, + SerializerProvider provider) throws IOException { + if (value != null) { + jgen.writeStartObject(); + if (value.getS() != null) { + jgen.writeStringField("S", value.getS()); + } else if (value.getB() != null) { + ByteBuffer valueBytes = value.getB(); + byte[] arr = new byte[valueBytes.remaining()]; + valueBytes.get(arr); + jgen.writeStringField("B", Base64.encodeAsString(arr)); + } else if (value.getN() != null) { + jgen.writeStringField("N", value.getN()); + } else if (value.getSS() != null) { + jgen.writeFieldName("SS"); + jgen.writeStartArray(); + for (String s : value.getSS()) { + jgen.writeString(s); + } + jgen.writeEndArray(); + } else if (value.getNS() != null) { + jgen.writeFieldName("NS"); + jgen.writeStartArray(); + for (String num : value.getNS()) { + jgen.writeString(num); + } + jgen.writeEndArray(); + } else { + throw new IllegalStateException("AttributeValue has no value or type not implemented for serialization."); + } + jgen.writeEndObject(); + } + } +} diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/testing/ScenarioManifest.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/testing/ScenarioManifest.java new file mode 100644 index 00000000..fb3f1127 --- /dev/null +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/testing/ScenarioManifest.java @@ -0,0 +1,67 @@ +package com.amazonaws.services.dynamodbv2.testing; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ScenarioManifest { + + public static final String MOST_RECENT_PROVIDER_NAME = "most_recent"; + public static final String WRAPPED_PROVIDER_NAME = "wrapped"; + public static final String STATIC_PROVIDER_NAME = "static"; + public static final String AWS_KMS_PROVIDER_NAME = "awskms"; + public static final String SYMMETRIC_KEY_TYPE = "symmetric"; + + public List scenarios; + @JsonProperty("keys") + public String keyDataPath; + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Scenario { + @JsonProperty("ciphertext") + public String ciphertextPath; + @JsonProperty("provider") + public String providerName; + public String version; + @JsonProperty("material_name") + public String materialName; + + public Metastore metastore; + public Keys keys; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Metastore { + @JsonProperty("ciphertext") + public String path; + @JsonProperty("table_name") + public String tableName; + @JsonProperty("provider") + public String providerName; + + public Keys keys; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Keys { + @JsonProperty("encrypt") + public String encryptName; + @JsonProperty("sign") + public String signName; + @JsonProperty("decrypt") + public String decryptName; + @JsonProperty("verify") + public String verifyName; + } + + public static class KeyData { + public String material; + public String algorithm; + public String encoding; + @JsonProperty("type") + public String keyType; + public String keyId; + } +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-direct-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-direct-1.json new file mode 100644 index 00000000..aee91ff6 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/aws-kms-direct-1.json @@ -0,0 +1,293 @@ +{ + "HashKeyOnly" : [ { + "hashKey" : { + "S" : "Bar" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREdDdyTC9OQlo1NmRRaVc5d0lCRUlBN2tOZjhSeXYyaCtocWxyajd1TlpGODhqSjg2cUxWNVRpUSt3YnZhWmF4bkpFVnZ4Wk9jN1JWc2ZYWG80bUprTlJUT0Q0bk9aQ2dOVVZ5ZEk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "sH/10NsdpXx1S+Z4Na+LrDxWmz6Hj34W8EFxFubqOuU=" + } + }, { + "hashKey" : { + "S" : "Baz" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUROYkRSV3JEcUM4MFZDVnlJQUlCRUlBN2JwaGJlSGMrb015dmV3SXZCOUQ3RzJzeElMcVhQWnpjVXgrRmF2RnlQSm9iSFhkaUNGeEpERExabjZ5Q2VSZWFQS2d4ek5VZGhvbTZpcVE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "617qtNrUQ10FJUr/Ch5tjNzyGq0gHnPSzp99snLMcE0=" + } + }, { + "hashKey" : { + "S" : "Foo" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURJKytONSt3bTFhR3QydVphQUlCRUlBN2NXUVhybFU0ZUJCRkVYbWFISUlsZ3Y0bnFiaWg4Q3dHeGZzVmhGdmFLNTd6M1RQcyswV3BjOS9MS1dHRDEvUUcrcmZ3RU4xbkFyNGFrbHc9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "Q20MTiTpQoCBap4/wqyQQ7OzcsQugQiz+BKzrZeixgU=" + } + } ], + "TableName" : [ { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURER21maEJMMU1zRnRGYk1CUUlCRUlBN0Z2YjNRT3I4LzE2Vnk2Qkpob0crWDFlNGE3QTBjNmZTODZrWHdlNlc1UkRpM1dkQnl5QklNN2VMazlqdTNBeWxZNXhBY0tiMHRLZlJsMkU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "j3b3Z3sXlOaq9Dr4moQfnVjrNprhpEnDUfo6TwyHV+g=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURPTWRZb213VUVha3d4aXZSZ0lCRUlBNy9LUGZvT0NCWVNwSG1wcFQwRDVqUHRDZmEzQWZHTCtQY002eUNJTVoyanpJN3FJdTdxSUpJcDNwMmExbWlwM0RsOGZKbjQ0ZEovaGlac0k9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "3Zn+yyTZbQBi1g5SWH+mO9y7Q5I382zr48P/Oz5+4DA=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKcy90R1dMeU1uWHVUMjc3UUlCRUlBN3BQRTJLZTVaYnNqMkZjOUlyQnNRSm9YcmY4M3hLSDBKSG16Z04vblFvT0NseWhIcCtwb1RmdCs4ZGsxNHlaRnRxSXdsRUFkRVNpNzZMYVk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "cS2p266IlrNAHx5Qvo3XmCVwc7pldUkHOKu7cEtvbiY=" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIaXJ1MStGK0ptTVNBdjRlZ0lCRUlBN1VSdTdrcXBna2FDbER1T0hyKzdzeVRNcExydUNETmZSejVWaC9mRlRhQ0dCZVpkOEdEUDAvLzZQdGFMd0tWbG9BWGlCOW1YbXZIWnJacTg9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "isuJKRRFFXA2j2pEtew3JYU90c/i4kgdHRdnxM1Wim0=" + } + }, { + "rangeKey" : { + "N" : "7" + }, + "stringValue" : { + "B" : "mwxOw4wVsUa1RveIg+xF0Wo6tiyIoG4qUm9TZNONdC4hu+hjzKcAjwSMLPEkZrf4" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFdUNLWVlHUER2SVJMUzBId0lCRUlBN2daWU1YdFVjRVFxeHE1MjN2NWxEK3lmUkd0TUErZ0RVTjRTRmxzbFhVYU1ORkpNeVFjeE5pWkJndzQ2K2RBMFR3MzFSZktzd3NpMVRBUms9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "doubleSet" : { + "B" : "44DS6MEnJWU4Gia10esbqnItKz+fKwhX/eCfEQgfKYpcKYE380vkGm/OhhmG3QlVn+9+FZdOzald5LpQoDRUhA==" + }, + "intSet" : { + "B" : "P46NUUwIA2rQu20SnEKucxBuSs56+TUVS/ii6YbxXyTAAXtWil30VWspPXRtNjhkZgyEhozWKuLIAY4FBvITVQ==" + }, + "byteArrayValue" : { + "B" : "TiQEtu5TRDG3Y6JC8fgugGCMcYkpxFigfTD8Ebeu+Hw=" + }, + "stringSet" : { + "B" : "MVMGdQwTQmPEP2i5PzMy+OwaSFnqFe9rKtfS57Xvv19p5XRPGI8LITIeYwSL7eC2ErnPObGp+SG3tAIA+XR0lw==" + }, + "intValue" : { + "B" : "ZcpXLOHcxPKnmFyCkIAVAqP/nk+FIoEwPXJjMV/gLQM=" + }, + "doubleValue" : { + "B" : "PbRKtldjYQZVvZYn0A6Qr/XSpp1b5gxvV/oBMWEdcGk=" + }, + "version" : { + "N" : "1" + }, + "*amzn-ddb-map-sig*" : { + "B" : "UdA4+4/9vxfq/ZJA3ma4gdVCKdeRhRpkamuK2tKcFEI=" + } + }, { + "rangeKey" : { + "N" : "10" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "hashKey" : { + "N" : "8" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURLLytkT1ZZckVBc0NXQm5IQUlCRUlBN1NKUG1jeW5OMHVaTmNkaGJkRU1ic0J6TE9wRmtqMk1KL2E5NTQweWlpZE9RY29KcFlyVFpsV2ZtZFY2aUpFMWJqSVVaREdEaEp4NmVyOE09AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "intValue" : { + "N" : "123" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "1" + }, + "*amzn-ddb-map-sig*" : { + "B" : "8YmfQo1EfOdvRCZATDCKkbiwVBWCypzfdHtcYDAyKG8=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "7" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURPZ3c0WDhFdzdKTnlFaUhuQUlCRUlBN2MyMXZSajg2MSt0dXcvVDZqUEoxMEhiQ1UyN1hlMUdqMUFlVnpmRDBuTjZmUWpQdFV4YlpnbGphMFRlVGIxak9aTFRjdmJIay9zL2xvNTQ9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "VaJakf5wnQRHwWJ3HfkfqOXQCYqgNVyum4c/8ejJlCs=" + } + }, { + "rangeKey" : { + "N" : "9" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "hashKey" : { + "N" : "7" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "intValue" : { + "N" : "123" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "1" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURMVnlYbDI4a1FYVTcwMnNXUUlCRUlBN3JuWlduS1kvbXo1eGFFS1hUa21tRklIN3JIT0R4RzZoNkdDM3NINzE4MGZack5Ha2NFMjIzT0M5ZGpvZG8rVkFBYUxmaE5aUjFnamkvUlU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "WDqNYCIhCz6AARYIPQ/w73DEWzBH0DrwR1m1ieN1U/k=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURJVHVEVGNxR0oySFZmbUdPQUlCRUlBNzRPamtLaFNFaTRkZUpnYWpEMWs0VjZ1Q0t6eVFaUlluVEIzWElTK1VLS1AyUDFrSmJWSDVYcmlVVW9ib1RCOFlNdDdGWXJoWGpuSC85cUU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "4xm1ItRYgftOnwFbcY9WyKJdhHjLNrkxNRjE3HRqijo=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURGcEU0VjZId3NVN2hYWUhTUUlCRUlBN2ZyaFdMZ3NqcFNOcVVIN054RTlEbW9NeUhnZk1ocU9hSnpza2FHaGcxcnlxaXBrbk13QWdEb3AxN2Z5OUlJdXBNVGIyODBTOTVRSzBlSVU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "UhfCS5eOVD9dWkcfsxpUemn/5AI7oNvQ0GWi+hSAx9I=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURNa3ZkL0JzN2lzVysrZ0grd0lCRUlBNzIvZWkxaTgxVHVMT0N2aHJQL1lJWnJnVUJLYXRRcDNpR0VDTS9RNzNGYnVnRGdJemFmUWRyc0hwRFZ1dkRhRjRTRUZzNTd3d0pnKzNxUGs9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "tmvJ1Bh2eP8Qnv+iruVQTtXOnBzG08YimHNcrm+NsFc=" + } + }, { + "rangeKey" : { + "N" : "8" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIdGNETUV1WDBNblhFNjFMUUlCRUlBN0FFOHlCSTFiNnQxcFBRY3pJc0RkYjN1V1dLVmZNV3EzbE10S2JUd2YxR3p1ZWRjbk1kTUNwVnViOFRKbE1vd3V2K3pIeE00Vk9qV3hseGM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "intSet" : { + "B" : "cQ8YT1ZJQ48qbcyfMXtDCiJCTzJ9D72mqK3/Op4lsHp1hb5hYC5CVXvMhlpwOEdMiAEiZhF84UMqezG+pjQzfQ==" + }, + "byteArrayValue" : { + "B" : "4Jz6XYpYIUBQAHuUUmNSRlCIPD8cTMKw+Uw9DA2UyG0=" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "B" : "1ceHoxEcZEOy1CPW8XuvFh3coqU/20Tmq8zYQ+NTG00DMfBVEQCevp7vK9pcepxA0AASh7VGuky9yWXjpjVbfg==" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "1" + }, + "*amzn-ddb-map-sig*" : { + "B" : "UNdS9x22T/sQZLMausI7MIKafx8ob02CdQ28zX1y/Xk=" + } + } ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-aes-hmac-2.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-aes-hmac-2.json new file mode 100644 index 00000000..3fc9f118 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-aes-hmac-2.json @@ -0,0 +1,33 @@ +{ + "metastore": [ + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "t": { + "B": "eJcKzY3SHwBIhXdfxeYWd9UE5yX+RxaPJQ7L2TdgDxs=" + }, + "V": { + "N": "0" + }, + "encAlg": { + "B": "XJilRkdsIP0bqzvqutJc8AC8YhY1YApJCgTLXgAqtwU=" + }, + "enc": { + "B": "DvDUW2Ao1YWp7uxxEL+mv5uqHCrSNIDR18CgBD8XHCuNlBPC6GXxk9YnFmv3kgVDlMdEo0wE79zRoETB7GmjcA==" + }, + "intAlg": { + "B": "I//7G2LUrAQ2EwQGQr7ZIKyXl1AlGeB+kfvZGmCj6wShZpMKPXjyBF/9RvIz3clQ" + }, + "N": { + "S": "materialName" + }, + "int": { + "B": "zFha4J4gPaiwhjiQs47L0bTf4WSNemVAxKJJnBnujl7OajvO7ZW3zehGJlaai4tCLxTwoLPI+Ig/a+zCdau4iw==" + }, + "*amzn-ddb-map-sig*": { + "B": "aklO+h7kSUjXEt6pBA03G4wiIU20XKT/sP+rKSeNAKc=" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-data-tables-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-data-tables-1.json new file mode 100644 index 00000000..d14b0e9d --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-data-tables-1.json @@ -0,0 +1,293 @@ +{ + "HashKeyOnly" : [ { + "hashKey" : { + "S" : "Bar" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOC95VFN5VWlOMkdDQjdqZVNrdytadzVOR2tUdmtPbEdPWVlab1h6T0dheHVOMUFUbXcwU01pUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "Ob1jIGa9/Vdwml33viwEj65VGg1Eth7dU2r3uo1Y5KQ=" + } + }, { + "hashKey" : { + "S" : "Baz" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFdQVmxqV3NiSHdwdDFLWVhTNzVhc0ZpQkRDRm9LcEdtTk8xN3FVS09qbDUwU2Eyemo4SmI2UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "kDt0VSQcPXJHgjdsfbnERnYCoUr4vWt+bKs43vIeDN4=" + } + }, { + "hashKey" : { + "S" : "Foo" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODhha3o1Ky9kVlpabEpiejVJUEQzSFVYbnhNUGE3UEhxajU1YzlORDhTTXFvbDBCQTFzdjFLZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "Yi5ehYhqusw9883LyCfC0xGHEc1jdEjrnoRZzVHvVmg=" + } + } ], + "TableName" : [ { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOCtkcUlQaHRKSk9DNDVNcGQ0V1lyQXdmZm95NGh1WU1rUEJseS9sakZkZlhXTmp0UFloak0zQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "1DHOXveVH+FH+U7dlzfwayanSlw3O2LYwFOan6zcvHY=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGl6RTU5U2xjYk9udGIrcHRWdjRmQVRPQlcwSVpUZjRCcVVGY1Q3WHJURklOUFRJRFdNaDN0dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "SLfkdbBJ98VLk/jaslcng/iEv5zF4gYTuuEkjCkjY8o=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGxjYTB1dWJSdzRZYWVIVDFNQjkxQUEwV3hwTWdXV1MyOFF3bXJDSE16U1gwVElFb0ZJMkU2UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "sHuUZSjWeFbCbEF7gEtzglg7NhJUBukAsWFEsWoicD8=" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODVkM0lMclU0YTU5TktTQ3FxQ0doc1JuK3VjVlFrL0FYUHZDVTAyNEIvR2djK2tGK3RPUDJPUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "typ8WzksBy5pF53vrxjxNpevVaWJ9KvCtZvJdM3W5io=" + } + }, { + "rangeKey" : { + "N" : "7" + }, + "stringValue" : { + "B" : "wGtoV0fjUQ4pk89KT2YylJqO0FdR4gOGtQUjLGhny8a4eysus0yIZkpD/JteaW4M" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOCtxTUsrZk9mbEJlM2NDTVN5SUhicW82QzhyMU9TYUM0aGMzNHRLc1U1UldvR2IrVXhUZEFHUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "doubleSet" : { + "B" : "qSotc6hOHwRTvR5gKUiT+/fAyXqbQ+zccfzS19mda9bmbEM76199gZOimw5vzcmigTdKe8JEBvm4j/1+8z2PcQ==" + }, + "intSet" : { + "B" : "+WARID1d4M100IDGhhEPv+Eym6DS92MHwsqtUGWTtG+52Ts34VO+PBF25ZdcSm0CVkjWp1jOOetKL2bZt/KJag==" + }, + "byteArrayValue" : { + "B" : "G6mGB9sqDniuIekuYfpL46vSO0Mq2/6+oPawL/ObfK8=" + }, + "stringSet" : { + "B" : "DrpjiU+LIDDQbEhDEiNdObnFLt/bvnjPq3zQv06uEQPVVks6IxLMJbUlFcwzthhC/QgfqPdEzIMgRcaQLZUzcw==" + }, + "intValue" : { + "B" : "Gr35E6Vfc68jgU9T4o6PqD/4tLwKFkxAUgWiO8ylv4w=" + }, + "doubleValue" : { + "B" : "wCVW4eSudPlnME8wpeDWUdel4TPWnpEEm0eIDInYjEE=" + }, + "version" : { + "N" : "1" + }, + "*amzn-ddb-map-sig*" : { + "B" : "Yok0RIP8Dvvuy/TIWzJfAceJjYKhGSf3Q3/htZ17+oQ=" + } + }, { + "rangeKey" : { + "N" : "10" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "hashKey" : { + "N" : "8" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODdQaysyeWR2ZU5qOVZZa1Jqa2RrelJNOG9UZG50RFZHcnVFaDJOVFdKWDJWdGEwZ21pS2VGdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "intValue" : { + "N" : "123" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "1" + }, + "*amzn-ddb-map-sig*" : { + "B" : "5wlbiZeKTpeDKqFxyq/iWEFX5OyFF5fWePByeqfIgl4=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "7" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODdNYXlUUVUyZlczVVZnSzhFaTBCNlArQ3BwR2ZVQ2owdmxlQm1XVWU4aHlBNTl1ZU1yUW5GZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "YFkq/8p34nwqzQ1yKOh4xoRL/QJWG105UIbuGobPJxA=" + } + }, { + "rangeKey" : { + "N" : "9" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "hashKey" : { + "N" : "7" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "intValue" : { + "N" : "123" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "1" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFVEY1RGQTJra2FkaEVsM0c3NmJVeTZLUVkyRFlnN2VPakR6WmZkWjVhSUJ2TWlDWHIvQ3l3dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "rbqa8jQVjxojBoV0GdI8Pq6HuwFiU6HZZHiHmZ3zjYc=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGhac3dOT3c0cUdyZ0NRN3B6ZE9OM0V4RzVnbEJPaWdiV3pYYWxyeGc5a250WXRyZFk1cFNiZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "8WBAU/umXWVbLQg3N9/jmNpojTUzpOdcp6kvSwoDylY=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODNMbnhJTkdZcW42K01Vd2kzdkxhY2V4RkcrNUI5VjMrcyt2d3F6b0FNNkxJaStqdXJHN1JLdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "xZO/S7j6thtRkT2eai4B3yHlcINGLUc5aTTaW9Xe0uA=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODlHSEdhcEhRdkQrQXQ0QmlZaXArOTZVK0cvdTIxNmhjMGp4blkvK3IrVkVOR0c4YWpFcGQrQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "weM+f47SgT3sHmjhD6Amtx7QUKxps9224zs92RL1Zpk=" + } + }, { + "rangeKey" : { + "N" : "8" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEpFamlxZGt2QmpXWE55YjRkUW5OaEtOaXBqd25qUUlqc0ZZellvVDJpYUQvcDBVQzg4Nk9oQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1yc2EtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "intSet" : { + "B" : "NZKVqCy5JBkZUYveyqf1YkWS0G5zEXLoVM4MAmDbwSwLjQjKQI6KKnd/u6sqgGc9lR1Z/XVbVKM+3rqgjyrJ8Q==" + }, + "byteArrayValue" : { + "B" : "aUbLKisjCMdjSeREYLRM8o82EdYz8UUrzrR4i7CNiDM=" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "B" : "Bs4y6ArvBaC4H5el2n4+H13C7fymOGGLXLC/NzYFuBHpwNIiqwrzZN5VsNRx2Y8sQFYK8FROY25LCT0riRgxog==" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "1" + }, + "*amzn-ddb-map-sig*" : { + "B" : "PCPYHI0Yk3XqWRBgMh85UEPlIZ0IdOLsWg0uJQHn9To=" + } + } ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-data-tables-2.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-data-tables-2.json new file mode 100644 index 00000000..8a83d860 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-data-tables-2.json @@ -0,0 +1,351 @@ +{ + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGR5Y1YrQW42bUVFVzJLK3RjVE1EQWw2MUNRSzNPZ2hpQ2Z2YTBYeGFVaU9odWJnRDhMelFwdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "iBDp77rZmalAcIlg0htWCjJ0BcYgMdPgzJj8fie5Ai0=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODlPZG50TUIwbHpoMUtKNHlYZXhrNXZsWVF4RUlWRDJZRWVybHlQNThXWkg1OUtxelM2MUIvdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "No2a+yFlcr1phtcCGNXKfcUrfyMtPdihhh7UPWQNLog=" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGtUMFY2bklwSHh2WTZ6bjMycHJHd0NJVFJRb1NyR3BsWGtoTlcxdUJZWnA2QVFUSURiT3dVUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "fy9BE3X7MyBJCQLvCN8TNUTf/zJvKEQQOdf9VhJbWdU=" + } + } + ], + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODJLUkJKQlBxbEFEM0ZYL2RiSjhlRHFoL2NvdVZhUnJUZmpISE0rWFRtbS9xYThybHZ3Rkw1UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "Qv9omCLGhrq2cxeP+elq4UgbloK03bV+knv8uE9P7Mw=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHZyckFUOHhzOTJJNlpMdVFtcGs2SDR2RTJ6WlljMVRjZkNXb2VUVXdPcVN3K29Gb0JTWFlQUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "tgkdLHwtDS/NzFDFLQR8GQLsw4LURQMB/8yBoD4kKSI=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOENTT0dQcXZZM0d5QUJSZTB1MXVTLzR4ZGtQRlRSQlh0M3dkSGJ2bXoveUNCcEk3bGY3Qit1dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "UPLAdN9KAJNJRZzAtfpaloOYNa+gCVXg1diT6CGSqrU=" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG1WcldlSy9CYkxsSDlnY0Zvb1Fjb0I4V082anlSa0hRT2NqN0NaZjFzMUk0RWRuV0NGai9CQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "DY8cXYd+66/OeHT+dOOh4FnJgwD4mMj/0EOZZdlrDGU=" + } + }, + { + "rangeKey": { + "N": "7" + }, + "stringValue": { + "B": "jmiBDtOhOzwPbKbPx15zZ+HeW0ElgRnRiGykEvmvpFux0U/LJQFRQ9KncAWd4nJM" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGNaYlhrb0ZDLzZjVzlpNWNBanViTHdZaW1vNE9SdlUxQjZOSWRpRHovc1BsMUQwU1F2ajhWQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "doubleSet": { + "B": "S4kDtlVOu6tLMGoBhqD8oDGY8WnnUnZ6gN2E0TLmTn6+rJeFBQ3R0NfJtsXtx8pKKOZRG7z5nkJqVCXWA0YEtg==" + }, + "intSet": { + "B": "uU3x6fQO9kF37qXb+KdB50EvDsAQSr7JEkKFo76XSF3q1jRNuXTvNL1MmCagMicOn8hGXWf3uXr3l/jeMXXTxw==" + }, + "byteArrayValue": { + "B": "1v7mQNUIJrvRrBqSBP8Ges17M8ylNfERqjAhpBtmtEg=" + }, + "stringSet": { + "B": "MSooPgKThBmQfGl+MZ0PcPhwCWpykLn5VIYK8y17sa7S9HPC+ZZaXSZWAeEIe9tCsazs/GhYPNAk+J9+Ehr83A==" + }, + "intValue": { + "B": "FLAPKKtgQS0xyDmVtg8TM8NsK5Zt7HSPorfyxIzw920=" + }, + "doubleValue": { + "B": "IKFrRJV/QQ6bN880QRBKXR/K84kwc5O8cAFduodO5dU=" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "zZEKidI2XCh5bvadadW99btbRcOVSuavthxLMEIN86c=" + } + }, + { + "rangeKey": { + "N": "10" + }, + "stringValue": { + "S": "Hello world!" + }, + "hashKey": { + "N": "8" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODlqNDlhRG51M1hBNVE0M0xxMDMvaTF3eUIzbHdSbng4eDNEK29JamM3Qlpxbno5VmhoRHc2Zz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "10", + "15", + "200" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "intValue": { + "N": "123" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "TUBX7q3xvSd+K/nMBdipsX+6nTyt+htT/qJUK5sPos0=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHA3N1pGSEh5Wk5qZXErWDdHdHhsRkNzZDVqemhTSFVQVFc1V3YzU0xPaHFFdzQzUmJEdUVOUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "c4AE+L/ysYL+maoJmXJkaMeJ3Chh1Ed8KQA148yZK6M=" + } + }, + { + "rangeKey": { + "N": "9" + }, + "stringValue": { + "S": "Hello world!" + }, + "hashKey": { + "N": "7" + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "10", + "15", + "200" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "intValue": { + "N": "123" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFI3eGxEWmZCTTRoMWhaa0EreldTQ0VNV3ZCVnV2Vm03Z25wVnlmTVBRMW5hYi9KQWhiRUs3UT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "RU3MCwYYxRFxZT7GmHBG7j+pgK14aMfEIsmrbgB8+Wk=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGkxcGFYZUtNRXlTTDFDOUdwaS9QWFVDMk15ZHdUeUxKTGQ3RXNIeWUrazJrRWlxTnBRdFZnZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "5gNtdXLSncuZDK3EvpFos08QRhOsOnKDVNR9jogw/Bk=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGxCdUFkQ0pYSk9yVS9JelM4TEV1RlFoWDhnVVVCMG5jZDNxZ0FUQ0xjMjVrYTE0RFRTVjNKQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "6zpNDAHNoQUzrP6YE6g47Y7CDom04EWXUTGuhPU7Wd8=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOFdsRU5LNlNmY096R3owYTRwL2RyRHF5REo4LzJ0REJ0WTRRL0wxdUpRc1lYeldRQ2pUcExkQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "*amzn-ddb-map-sig*": { + "B": "tvX4UthmBwymnAZ7CuTpJdLTASr1lRj1MvRwAesjtMM=" + } + }, + { + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGpyLzI2c1V1NW5udlQwcmVzY0NPWEhXTHZwZzlySjNkeURSVHQxRFFMcnAvTG9STkRyNk5EQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAObWF0ZXJpYWxOYW1lIzAAAAARYW16bi1kZGItd3JhcC1hbGcAAAAHQUVTV3JhcAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "intSet": { + "B": "UBGZEIoWzYKTFCsFoZYXzRUJsNuy3xr64nCwsL14lZNk62Aff5n3+ETtWm8U9E3PMOp9LozkDwZcnzs0rnYIeA==" + }, + "byteArrayValue": { + "B": "l9wQf/r6vivuTCvIz0Jeqd80xPII30sf317fED7Xrrs=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "AijuavOYfNvcle2WbG8I2a4W1af+UPxhKguG3YMW5E6MoXsdO5ddSAifAPbVLmv92VyJnx/o817m1IOSs+LccA==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "pzB3S616mcP6HQrkeaUYdV5Qo2UYWF6p04GZhSzcpV8=" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-data-tables-3.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-data-tables-3.json new file mode 100644 index 00000000..d3bca88e --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-data-tables-3.json @@ -0,0 +1,293 @@ +{ + "HashKeyOnly" : [ { + "hashKey" : { + "S" : "Bar" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGVFOXdqYTFRWE5mMHhpbEpjVVpHWS8rUFh3M0NFazcyZDd6MVlQa2QwRWNHZzB2bmNFRSsvQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "auCxSUZZKyHdjfYj82ASEKmknbN4Fr/kmtz9cgEFdsM=" + } + }, { + "hashKey" : { + "S" : "Baz" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOElwVVJKVEFHZjUxQWRXQy9Oem1VSlNIMEV1N2ZCMHo4RlVqZFZHWXkvUUM1NndqaCtoSmRhZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "/I+E/myEjFiqIuy5Xpa7/z7rn+tHGgk3dYnv8mdHat8=" + } + }, { + "hashKey" : { + "S" : "Foo" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG5WWEhraStGNXcyT0RHUFlhOVVRZkd1Y2tUMVZiNG1NQ2dUTTI1QkZIZnVzRG1qUXdqS2gydz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "Ix35UzB3dDDkY88b1WQ2IVodLBeTgMv4BeQ1g+kMePU=" + } + } ], + "TableName" : [ { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOE5TTk5vakNqNHJOd29oUktlK1JNL3Y5ZVFmTzEzREYxS0pXY2VqWkEvREdDU1lENE5Wd2MrZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "LbWgpICr2sabKlqUV/hDmHk6QCzseYxkndyGwK1Z5mk=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHE4d1dxQ2tQS1Qwc2dEbHFaSGVCMDFOOU4rV25lMWhYTnpEMUc2VGk0T2FQRjRYRS9FQzZuZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "F+Wb2Dx0Yoc8qKOyoBZirSGd1UTmX3T87wlWnpNHwQ8=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "1" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEJjREZlWmJIeTdJMUswVExaWVhJZTRKUndBQjI5eUk3S0E2VG91RXpSb0NFZmI0VXBQMFRrUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "WcbXsEk4cQ8dR1pvoyEHxkvf5xcJ9fCHWpqrxJnBEjM=" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHZnZWhhNUtybXQra2Y4L3ZIQWsrdWE3L1N4QU1hYXcvTlIzMFlFQzg4UFdoSys2ZkRSRTMyZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "DHqNWbvi+wXhiOAcUOXNFqrIIjM49hteEelyzGVgn5o=" + } + }, { + "rangeKey" : { + "N" : "7" + }, + "stringValue" : { + "B" : "etubfQ8jHpQH6Y/aiHzpZ7TB1QIZgyUJcbKVjrs3xRRMdLakLAK9IGzcshtj4+Lf" + }, + "hashKey" : { + "N" : "5" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEtQVWpSTGI5ZTZ4MkthR1V2Q0NCb2lYY3ZzTzhOcFZRejg0MW01MjZkNEF3dDJwa3RwWHNEdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "doubleSet" : { + "B" : "EYsQDfnS2OyGCQunGRtnzbkyH2Jr32u5+gCtSwKgbkR0ndwLGEenaRTtSoQOjYI/16DOPDw+wxkVkeFrw0Htdw==" + }, + "intSet" : { + "B" : "RTbZxtmK1u6gDv2rdYXnLesuHzGrWixH+575PmQrurxFKNQXTDzL0AKbR7njzDodAH+RJuxOmRMbR2Nasg1itA==" + }, + "byteArrayValue" : { + "B" : "89OlC5cjn+AZXJw9XFKmu+y3dq19xt1KPeidBL6yEyg=" + }, + "stringSet" : { + "B" : "vf+jOCHkdeT+IswrFg4KhhI5Gtl4avZMnci642y6B+zPSYJPFZsuXrJ2D1kHMe5MgmE5WOBlhOLFWnqKVCU+ZA==" + }, + "intValue" : { + "B" : "QRaf6boFIpz12IYs+7OqV61wHwMi97MOoZJUlcdBR5E=" + }, + "doubleValue" : { + "B" : "xR4D/nl3EmbV3tAqYRRHVLcU11/hAnUxkf+Lhl1IIQU=" + }, + "version" : { + "N" : "1" + }, + "*amzn-ddb-map-sig*" : { + "B" : "xk2A5e72jyksD2ml67wq4xCt6Mr+sLH9buxcUvLS5eU=" + } + }, { + "rangeKey" : { + "N" : "10" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "hashKey" : { + "N" : "8" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHp6RlNqRzVHUWhLeXlRSjkyRmN1VjF3TnFDR0ZEZ2p1c0JlVFNlSTVYUS9JUHBTUzhzOGVqdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "intValue" : { + "N" : "123" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "1" + }, + "*amzn-ddb-map-sig*" : { + "B" : "5xAT0be4hHqE5kfGLpONGvQ2b6KKaRLGkX/CR5Pkh0U=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "7" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGQ0VVVIeTM4YWZ0b0liUGVlNEI3cUxvdC9hSmE3dkw4SW5TaUJsV2w2ck44bEpsWkpHL0l1dz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "J2BVujmkQwPYLwl1nTCs/iiYYzpwymojHvo11knCpHE=" + } + }, { + "rangeKey" : { + "N" : "9" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "hashKey" : { + "N" : "7" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "intSet" : { + "NS" : [ "0", "1", "10", "15", "200" ] + }, + "byteArrayValue" : { + "B" : "AAECAwQF" + }, + "stringSet" : { + "SS" : [ "?", "Cruel", "Goodbye", "World" ] + }, + "intValue" : { + "N" : "123" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "1" + } + }, { + "rangeKey" : { + "N" : "1" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEI0Uzd4SW01dTBWak16Y2E3TTdZL0JDWEU0WTdvYlRabHFGVk1JY2VQVDFNZ1pMK0h4b2tBZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "on6ZcCUml+nskvEEANjLMr2oH92oy9GBv9jFmR779X4=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGw2T2o3bXl0U0JFcXR2YjJvTGVkdXZFUTdqcDNzV2JzUW4zNmVUZUx1WWNiTVJWMzlWK2tVdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "3UruLxkgG7LSZ6PAEF/phylzWDTg0R1NC4UADhoUL5s=" + } + }, { + "rangeKey" : { + "N" : "3" + }, + "hashKey" : { + "N" : "0" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGZjVHloaUM1Vm1kbE81YjBlczY4cm4vSklrdERZZkViUDEvVzF5aVFla0liL3p6alU2RlZzdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "YkUA5vMQU+vm0hZBZdb7/k8wf7YCD0nE7VacAXGo4so=" + } + }, { + "rangeKey" : { + "N" : "2" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGVYbnVNbWVsOVJWSEJoNThGQkZFRTJGYkE2bmlYUTlld3dhaTZsYU5GcmJjeHplZXRIZnpWZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*" : { + "B" : "TO/gevRn5KydyUv+ZS7aydPg8Dxp+aNl69mBSzX3SRM=" + } + }, { + "rangeKey" : { + "N" : "8" + }, + "stringValue" : { + "S" : "Hello world!" + }, + "hashKey" : { + "N" : "6" + }, + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEtpMDRqVUdwTnVMei9Rei9SZ01PYmJwRXhsbHdnNTNJS01NbW1pOXJMUlBKYWFUOUYwT09RZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEGFtem4tZGRiLW1ldGEtaWQAAAAYamF2YS1rbXMtbWF0ZXJpYWwtbmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "doubleSet" : { + "NS" : [ "-34.2", "-3", "0", "7.6", "15" ] + }, + "intSet" : { + "B" : "ISjsVOZSp7EKB1oNwBBcEpaR5sb+Y8qv7am9ILEJCC9oEdPTaBbvCjtX8HrlLSWp1R/3uZ5U1v+ZwqDKnx+V8w==" + }, + "byteArrayValue" : { + "B" : "Wlt5gNvLXMtESxawqnL8ngJtLCIwbyg5do2q47STFBo=" + }, + "intValue" : { + "N" : "123" + }, + "stringSet" : { + "B" : "fKezjhhw++x6TQAPWvARyURqi7uJdZeHCrtmqyS+ednvpfEWzEL7S/PSSARNxDnbadH3n2f3+41LqLkauxeaxA==" + }, + "doubleValue" : { + "N" : "15" + }, + "version" : { + "N" : "1" + }, + "*amzn-ddb-map-sig*" : { + "B" : "1HYmU2MInZU4QBBJgeqtCg+yiS9vwwcQpcOHCIUd3LE=" + } + } ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-kms-3.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-kms-3.json new file mode 100644 index 00000000..4d8e7f4b --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-kms-3.json @@ -0,0 +1,31 @@ +{ + "java-kms-metatable" : [ { + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUROeWZYRXBrdnRNOFJ4SjdpZ0lCRUlBN3RoNk9DemtMOGlWU2lLdFFucmJWZVZuRjdkTzdPemd2Y2NnMnJHNExDUlZUVzREYmtFelovaysyZU9hWDhRbWd1d3BKNmdmKytxQ21qYmM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "t" : { + "B" : "umnxJZ3TTBpM8+hy+2v7yz6SllE/FemGyyzPuqD5YI0=" + }, + "V" : { + "N" : "0" + }, + "encAlg" : { + "B" : "XiZ0+sYasuStPkGN7Z2KgiNr7/1uCQHVV6RTML1JeKk=" + }, + "enc" : { + "B" : "FFo+FzNGNhOpk1YdLR8tZhPxCGjUru324LwTfWoyVaUBipRwlgHo75fJiHmgV9Yt3gfOKhLw+VWnnF9blrG5ag==" + }, + "intAlg" : { + "B" : "hrie6pasAp0wKS8dlab/VaxS8xnpfwcvnbt6XSUSHmyRrozUtIf2LBBdoLTPASIi" + }, + "N" : { + "S" : "java-kms-material-name" + }, + "int" : { + "B" : "ii6lOKwLziK98SReZ8qLUJUaip0fKE2Mm4Knjb4F6qZfM49e4VcTtpnT9S/PFLqe1ZdU502UVxXR56PL9PqenA==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "w6DYQSzqyHzl7pHlv+oW4/H9+uCiJXwwQk1djzB0g1Q=" + } + } ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-rsa-rsa-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-rsa-rsa-1.json new file mode 100644 index 00000000..0343844d --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/metastore-rsa-rsa-1.json @@ -0,0 +1,31 @@ +{ + "java-rsa-metatable" : [ { + "*amzn-ddb-map-desc*" : { + "B" : "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAABWG5kYjJ3T2l6UjR2QmdYWUdkWURLVGdDSzlXeG8wYUx3TGhuUWcrcHYxUkhQRVlvdWhWYktHeklaUDh6azlhK0UzSFRabkNNNU5QRUthdFRUbHlkUFVMbzkvdXAyYlZxMk5SajkwaS9xVmF6aWZWT1B3bEVwVEdiblpFZDFvN1F1d1JmZFZ6eTJRclk0RkJaR1lYUkUvd1g1dTdITWpDNHlaSmVDa1R6NXV5TEYvZnF4Y21IbzZwSnQ2eWNaRjIzNUE5WTdNb29UazdWeFp1aFdWakVNMTVnOGhqZ0VaamZwUExYQlp0cEl4LzVXYnVQcnl2MWp3V2lEeW1xTGRoZ1ROdkpUWHJjUUxEUHFXcnNwTlJWbDIxNEU2dWNkQTBaT25MUEowdUZGTW4yanRUVDJleUVGUXdtbytaSmQwd29rMmlTbm9oMzdJLzYyblZlcWM2eW1Ldz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmcAAAAXYW16bi1kZGItbWFwLXNpZ25pbmdBbGcAAAANU0hBMjU2d2l0aFJTQQAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "t" : { + "B" : "o5TWCbCjL3OvibBHwMFeUD5FoK7LOyRhaC/Qs28I71U=" + }, + "V" : { + "N" : "0" + }, + "encAlg" : { + "B" : "2qLiArFMS7ALoSgRyRymjCaMZ+Ep2qarlgBtJEAokAw=" + }, + "enc" : { + "B" : "1SPFwKyp0mL+e7dQFdSIPpydQ/8T1KsUZMZRePuwq1tBeQhLzux1oCb8akQR4STmkt3fHz3Y9kzD//alEiksbA==" + }, + "intAlg" : { + "B" : "CXMK6Ejt5OcLGK5744lgaDsZxsXYEQKfG6MEQYHQIIQOPfVVIa6Vau4BbVxDlaHr" + }, + "N" : { + "S" : "java-rsa-material-name" + }, + "int" : { + "B" : "rBbUkNVARki54hU4RXx6L6W4UaWabSTWlh6PKPA/DRWS9s93hnGE0AEqNVz6dGFRPNa9t7TgvrrDhIbi1ZIwBg==" + }, + "*amzn-ddb-map-sig*" : { + "B" : "Cx9gASd4Sj+/7eGQUNquJi0tfDSRVCfK2KCfGw84sp60xGN0Ctwj9mM1v8ptPMevRT+VAT03ztX96hb58W/2l7FoHe+Twsz/lXCVKzuCA+0sYEqNd5Wh52qNr06eVgHUJTQ1SrwvNCETG3IxEt9pq5EemDSG9TJBd0yerEg1T8xkZ6DoGDqethE2YkQrHzqfW+DVZb0gVp96psQW3utBULIhI7fCMh2Prg7D87/G3lzp+4eB+ZfbM9tORV2EClCwnicjo9NCvbUhB9UlflUb2z6sIqE4YaBHOhDL/5m4I22QCeZj++5xcCnaymIHsZHFviUnQx2mWE09/rCtijCqbQ==" + } + } ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-1.json new file mode 100644 index 00000000..0266beee --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-1.json @@ -0,0 +1,309 @@ +{ + "TableName": [ + { + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "SAl9L6mP5YRNF8II0NsFXI9boH3t3lIKiF79HRTI/S4=" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "iev8e8T8ah3qIYPZ1n1KIxfRSzYIQuSnQt3bCSyuDHMf0iWGuHCe+n78jHZfaYwp5I1gB/6hZxtvN9eX64C+8A==" + }, + "stringValue": { + "B": "4kfr8MUHJOhcnCX8KwlBWMXckr09wIg+o4DsYPZCdAL5HIQDaeVpd+RFmWdM3eDa" + }, + "stringSet": { + "B": "72pIpNYQv5fnqNV7hcxwtFM13JtmisBIRfW29VZVVgb7HQSV9ypTaDMwjqV0TyQOnEN/tDsHTfj0v4TvKYXYtw==" + }, + "rangeKey": { + "N": "7" + }, + "byteArrayValue": { + "B": "5ZYktI5VjhPx0mN97APhxdi8u6vzDB/8O4XIDHVeJ2A=" + }, + "intValue": { + "B": "rfALMD+0hs7L1YzVVqLOraA4IOWnaOOTad7r7VErGm8=" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "+rzZO2IBAmjcybCXzbPtI3sF+u8f9GzLMGJGEPXofAI=" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "NLdRexuTujebNfVSeiYZ5RD6IZcmE1UDcvJ4PbiLP3Dng+MjwXWUt2+Eolw0HDm1Gd2rfITxs4Oor0ImZGlJBw==" + }, + "stringValue": { + "S": "Hello world!" + }, + "stringSet": { + "B": "CZrDLG0nOoo9SDT0ib0zz7d0x5rN9UK8q7vhthuJxNJxo/3Qs+rjhYQYLI8DcLom35aTzsgyIIjyzFagyqtnBA==" + }, + "rangeKey": { + "N": "8" + }, + "byteArrayValue": { + "B": "VVFzWfSD4PO/bD9g8RQOgCpZ+KlRH5+vdN2i1Wn9bDA=" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "iWWvGpcrzkUu241+NNtykoiWoeaSR3QHQMhHTmf0XAU=" + }, + "hashKey": { + "N": "8" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "rangeKey": { + "N": "10" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "hashKey": { + "N": "7" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "rangeKey": { + "N": "9" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + } + ], + "HashKeyOnly": [ + { + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + }, + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + }, + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + }, + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-2.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-2.json new file mode 100644 index 00000000..a92089cb --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-2.json @@ -0,0 +1,309 @@ +{ + "HashKeyOnly": [ + { + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + }, + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + }, + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + }, + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + } + } + ], + "TableName": [ + { + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "OVOhmBYFqn8JmCr3U53n0gUHm9sOFlCzfslQTndM2d4=" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "OZ4q47AhicK3RzfypoCMvUy3qZNXNejFTSYygP00tL8ox0Zcr6xxxyAHNEf+L/gXv/D2/0fZ1ZXRkUx6I4Q/ag==" + }, + "stringValue": { + "B": "Wr8LK3dNif8LCWIEVTk4LsShW/T0/KZqxRFOADzHbI0ou1IFHF+Oy3BwqIP+/zK3" + }, + "stringSet": { + "B": "Wyqt6ciL7p3eIoT5dnONVBoFLK6nUxnIcC6NylJfdrUWh7/ckBnGMl7c4CCq1ifPD601xrh4+TO99kMSHSaLNw==" + }, + "rangeKey": { + "N": "7" + }, + "byteArrayValue": { + "B": "j47NBhEawqzHQb6prTGB6RvYyDuh+A4TIrTSwgZoxDA=" + }, + "intValue": { + "B": "rwlX4rD1gcqVpnTT4DfX79JPLAtOsw2CYssZ4VS7fnA=" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "xZvHJ377MCQ4hf1BZJGRgTF+l7YiaydAkILG+7CaQ8M=" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "optMhPYvzeL68/ubOiJu32JBETi7ss0o9nqCSDAN22RaR17CGXge0r6OgJlfWfVFBhUebM/uN42OJpyB3VvuwQ==" + }, + "stringValue": { + "S": "Hello world!" + }, + "stringSet": { + "B": "p3shcn0B9/lVCp9UjP2mRcARZQ8PQC4hR5L0fAsC154j+2kUPu6iRhazVKxkJ8Fr25jtc61X2M9Q32kPwyRmwg==" + }, + "rangeKey": { + "N": "8" + }, + "byteArrayValue": { + "B": "E1p3OH249idr68bawV56P5lo+nvBvJwbqVPTHMM40/c=" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "hashKey": { + "N": "7" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "rangeKey": { + "N": "9" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "iWWvGpcrzkUu241+NNtykoiWoeaSR3QHQMhHTmf0XAU=" + }, + "hashKey": { + "N": "8" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "rangeKey": { + "N": "10" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-3.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-3.json new file mode 100644 index 00000000..7e88fc9f --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/static-aes-hmac-3.json @@ -0,0 +1,427 @@ +{ + "TableName": [ + { + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "m1KU7lGZlO6bNSxx1ZMr6pVmY1PuYw8uDIcFDisFjSw=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "vTohJVr6lrUAhSuZT7nPaxgL6iW+IC0TZA1/ht30GWig2OO7JQFIS4O6Kk2ANI6w" + }, + "stringValue": { + "S": "Blargh!" + }, + "doubleValue": { + "N": "15" + }, + "rangeKey": { + "N": "15" + }, + "intValue": { + "N": "0" + }, + "version": { + "N": "1" + } + }, + { + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "m1KU7lGZlO6bNSxx1ZMr6pVmY1PuYw8uDIcFDisFjSw=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "vTohJVr6lrUAhSuZT7nPaxgL6iW+IC0TZA1/ht30GWig2OO7JQFIS4O6Kk2ANI6w" + }, + "stringValue": { + "S": "Blargh!" + }, + "doubleValue": { + "N": "15" + }, + "rangeKey": { + "N": "15" + }, + "intValue": { + "N": "0" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "doubleSet": { + "B": "bu/qi2UnCw6Saur96Xjc+1sQQzo6ZUdeu9W0/uX958B9utw+rDlclexaDcf6VGnz7OYM18eeEXrpjIgLtH4iaQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "fqIf7vj1G3qbcEv1nbyTqNoKSAFfj9fLMb3S8YEFjfM=" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "j0vcD4vvFrL/7JHHgnyBCIHb5u/WvT/Uc/kk4lBMFKV2NXshqqEmBu8UK96OLbYAK3+vW4mwm4rIZ7MqgV95LQ==" + }, + "stringValue": { + "B": "yV633bs6t+yjSw6vHtUgrpDNB5YyMgXue0prPMXVm6SmGiUxS5l93cJx4vPWF/bi" + }, + "doubleValue": { + "B": "BhZIjFx+b3DExrUfnOkJjYNw0/Bw+KoDxG4LUyzQoRA=" + }, + "stringSet": { + "B": "WsWFF2IDOEl0f4PlW73arTFdMCyS6lMbvnrH9sPnCCMCQzEaSmdZmz1Kcb3ZDxRiaeLLWV2om/J9b260y2igRg==" + }, + "rangeKey": { + "N": "7" + }, + "byteArrayValue": { + "B": "LB7p2Ewobv+WsSeh1KxHx0Gkw0e1sKTbZBfjkvoEZBs=" + }, + "intValue": { + "B": "O8EY3/1vRX0odEkXQejXrUP24ToyD+4EHJ6TmKZVPkk=" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "QWOgS/Ba8ZZa9Y2l8DolewfyZosDKcLysahlumr0MVk=" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "AtJqJj1aokidlC6qr8L3xZQNo7Yl2z8DsEXgJLRKnK73Oyg7jRDF0zjgp02qNae7mYNDkK2QeafeAexk8s7qdw==" + }, + "stringValue": { + "S": "Hello world!" + }, + "doubleValue": { + "N": "15" + }, + "stringSet": { + "B": "nJNYeqOA5x3J3k3zO7CWUcbD1gU2xifPxQ4sraRhsnKyd+mE+ouhX2LpMwQ45nRXxV1nSeaN7MW+4vYn/sA/oQ==" + }, + "rangeKey": { + "N": "8" + }, + "byteArrayValue": { + "B": "/icc0cvbG45rqCNdeMFJaklPx69nXo3/8XTE+vQafmI=" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "hashKey": { + "N": "7" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "doubleValue": { + "N": "15" + }, + "rangeKey": { + "N": "9" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "5NHNzCBtZcVAUlz1ymLB7Ta+1n3VjffLj5WniFA9afo=" + }, + "hashKey": { + "N": "8" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "doubleValue": { + "N": "15" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "rangeKey": { + "N": "10" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + } + ], + "HashKeyOnly": [ + { + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + }, + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + }, + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + }, + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-hmac-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-hmac-1.json new file mode 100644 index 00000000..87728175 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-aes-hmac-1.json @@ -0,0 +1,351 @@ +{ + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODNvNHkzTTB3UUFCRXl1UXN0SFVQUGF1NkpPMUhiNk1OWGxXQW5aWDhYdmFYTlUwNUluTFUxZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODlZdEVSWXVDT3A4MHlKVnJOYytYREFoaVN6UHdlRnNJQk1YRXMxSEQ2eGdvdmYveldabmMrQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEw2YkExbWszYTZxek1YNUkyMkYyYzRvU0FmZ2VZdCtjQmtFYndDTzhYUzlkL0ZqV20wekpZUT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + } + } + ], + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEpKNDk2UGRpcDViOHlldTVxbEE0STNOUjFTVHdtZEd2REJwQWowNXprUmN0OFh6T3E1TmRJZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHNVQzNEekp5Tk1tZ3ZUSE1EVnh2Sng1OCtDT1h0UStwRzR4ZlVQL0pJTkRHOGI1M00wOFRBZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEZGdjVQNjAxZzF0eXhoaDhxQmlCdDB1d2JoODlRaDdyeTcxL2lJdWxvSWNvQzFBV3JHczhtdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHJ3OU5qdU53dkhENTZPTmlqWC9nbUlGZ051ZDk3OS94QXhlaTVjbmdJbmxhajdpSVg0RDdadz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "MyVrAzOuKFS+hAiVq0jlmIJcwMP2w62LdWChncBN0q0HMB3WpADYK2BF1q+oQP83" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHlUK09JWlpaWkE5VmU0dTdwRE1zNG9TUVZTNlFYZEFmQjZkVjlMMUg4QzBrRXliQ0Nad0JRQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "intSet": { + "B": "0iLxGtvyDaUNXY1iYwcDlZX3zIs+QOMsBQ+RbX6YlAgFdMK/k57OXPH3jMIptzkNAKNWFea+NAz+AXFd2jPC8w==" + }, + "doubleSet": { + "B": "0nazy+tnY85GZpSANJzBLXZHPKzCvN4ggpopjujfAOO37wDi6zrSwhurLpjFIJGR27pn5azaroZWYA8GLfiGIw==" + }, + "byteArrayValue": { + "B": "w9sfXioZCE9luCt4qiOixyRJVlJ6zbTwFoFg0wQNJbA=" + }, + "stringSet": { + "B": "8057NGIAJADqX/KzkjZl7XzFMI/6j7vAbp5F83tZjOQhguhp8hheXAzcsrCmM6sME1oGEmJEran4Svs1qT5ChA==" + }, + "intValue": { + "B": "LFHv7oLor2SoKypi/gubI0IsipoLd/I20qPr2wHOgOs=" + }, + "doubleValue": { + "B": "uq8MBbPKDskxhyJ6VCmd9EC6+tD3EuiqhgFUpxckzdk=" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "FhpaX3jXqz+Pg4QETqcNBULC+OBOTkux2BFGCdnr5PY=" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAODRhOGRFc01ybDR6ODlVM1RkOWh4L0J2cms4cVZEODlOaklkMnU0d2NGSnBxbUVkc1lka2ZXZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "intValue": { + "N": "123" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "5NHNzCBtZcVAUlz1ymLB7Ta+1n3VjffLj5WniFA9afo=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOE55eTdqK3FkNEJMNzV2MTlnRHdHVHdtTGgrbmlMaER0cjdaL3ZZMVFmQTFEQmE5Y0JGdzIxdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "intValue": { + "N": "123" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGcrY1NpV2I3eWZYZ2pQS2gzOVM0anBZZWFNeEhHRG90c2JCOG5sQkp3ei9vclBRQzhOZFNxdz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHlKa2M4OW9HNEpoajhyazlEQnpVeEQ1cForN1Q4Z2pQUEU1TE9uVDhvd2tJWDJ6bGFpdUJKQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG9kQ2hPVmtiYkN3S3V3VHYrVjYvelNwcnZIUWVhWlpqaDZvU3JzMHV4T255bFQzSUZ0TjVVZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEJLV0Z2T0hRVUxCMTcxTW56dkQrVVYyMVpmTUxhSXl4QjB3ekdZbStzY2VFd2pNekgxTFhVQT09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + } + }, + { + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEdncWp2Q3JaYzhZL2RrMGxmQlk5K09tbWNXUWIvbjVYMW01YTNBcElZb3JLVzU0RVhRYTgrZz09AAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXAAAAAVYW16bi1kZGItbWFwLXN5bS1tb2RlAAAAES9DQkMvUEtDUzVQYWRkaW5n" + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "intSet": { + "B": "eBhcgBr8TocxVsTw8tJtcAK2VKFOkoZlWBUusFNtKbTulghzdpT3iTMqIJB86ViXXguO43XqMZWs1U3G/IaF+g==" + }, + "byteArrayValue": { + "B": "Y3ciZfN54gf86a4mxRfon9CgzQkNIxrtWV8s6tg/6G0=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "RhykbS8bqGEd2LEGtLV0S6Pj+4KjuVc15ExkUmlCKlClAgNpukA5Tp0FjU/XL0Qli4v6apZaraKgBC1l4YlRDg==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "mC10Qiw1c/P8Bab4SaP3kmsPMBVfOZKjZ3SgvXyd3Vg=" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-rsa-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-rsa-1.json new file mode 100644 index 00000000..55decbce --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-rsa-1.json @@ -0,0 +1,309 @@ +{ + "TableName": [ + { + "*amzn-ddb-map-sig*": { + "B": "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYkRuNjVvVFdnenJYQmV5bGVwb2x4bm93TTBxa1AzYTRHdjFBS0pHUkhOK2hSMW8wL3ZBM1pEVUowRTczWk1HTGZ0UUtQSjQrbkRqd3kNCkQyTmkwekNlTjVaMnJIOW54cU1TeGI4VUlDNGNWMjRJYVhCa3hUU0IrRUN5b3VYVzBINnhBbFlGdzhZNTZvTEhYYjNqYkdWRFZyUmoNCjBoby9ZZ3FDTjRVZmhFUmxKN2hhTnZMTmVWNXBMa0FLRWlPa2cyMWZEZFBXUWZaYllMMGhYL0RtaVpLWVlSU0N1aS9KcWFudFhkREUNCmppMkZqUVlCRnp6cmxkTkFYckRKcnBFSk9STkRhRDJ3UXpJYVpFY2ZBY1RlR3oyUzM5a1Q2azN2MlBIWndaRFdKUVdKMWcxc2pvdWcNClNVUnZHVkZ3UThpUW5XdmNPRDBRQkF0aFhqZVhEOEd6eGZxSFZnPT0NCg==" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYmovWUFVaTV5N0tRUWQrVFl3a296ZURERXFuY2RpTWFWc3dKYmI2dERuM0VTeHVaRXpZempOMlN3dEJxSENia1NrZmpGMGZBMVNvdUQNCi9Yc21iRTJGaXlOSWRTZE5uSFQzak5xN0FHOTMrVG9rUCtrREx3Y1Y5VFJYMUNwK1FIbk5TVzN1ZmxqbGlKTDFPQTZCS294bHNmNEoNCng0elNvck8yUHhac1ZDY2g2LzFSNU8zNHJqcU1QZUxlTHBrYmpUcS9xK1RkNDNxODJoeUVQejFTdHo2NU9xUVkrellTcjlZOHp5WTANCmkxNWlwcGVyRzQ3aUIxc002aXV3YWhxNFBVVEdkdTZiQkRiQmRxb04wTFpwUldVMTdueDRHNDRhTUJlZFNHODk0NXpiVkUrRE1hNEINCitORUpYeDBzdkxmZXM1aEJIMUNBQzFyZml2ckFCaDRXQndLYTZ3PT0NCg==" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYlEzNXRBaXlVYWc2VjZpTGFPS3kxS2pJZ1AyekdydEI3QVpvS1UxNmVpbHF3WnN0emJIK3hwYkRYZTQxRVlIRjIwL1VrdVAxeWdwVG0NCmJTOEM2VjVVMHl3dnRaOE5CSmV3ZGFIeXNMemVZTEhiMmNaL3VrTWg4dUFXRjhIRjJ1NGF5eXVKZkZtcldIbGRMTGVRdENUUVA4eEUNCnFpMEtrcU5lcURGTitEeDVNeFpxaVhUd0MycmptT2N5MVBiOTBCQWJLRFNLVERsLzRNRzhWcVBCUjFhMENFalExL3dwOWRSdS9FRUoNCmN1eUhQdjFHVmp6YmFNUWRpem0yWmhOTnZvRWpCUlJkRFgyRGVDU1hNcjFIVXFnbVRuSVoza3l6SWtIVG5NNjl4MGErSDltNGZadEgNCnM1ckxmQjd2R3ZlQjgrQTRLdURTVDBueksrWHA3Q2o5YzIrZ1hnPT0NCg==" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYlZ5OTRVdHkweHVxUlFtNWl5S3ZkM2NNZHhPalBWSlBsWWZHdDVJaStseFNwb2pnKy9XRjQyNmkyWmVZb1Y4a1BBN284cnRXMlk2UHUNCnRJZzFtc2gzdDROYzZGTnJPOFNkR2JxZFE4TVdmYWVHSWdiaElmWmM3NVFQaE9UWWdSNytEOG4rbnpwZ2FqUDNiTWMyYkRDK1lac1INCnFmbnhTVDhYa2tGRGZqWFVlZGlld2VrcXloU2NUc0QrTkJZSUxEWU1vWCtoNUZZYTgyQWRMSWZNTHlmS3Y0Y2FIeTE4YklzcFM2TVMNCmJjcFJkcnBUNGI0M2c1Q295UTdLZTNwZHhQT3IyNEpKbHlEeWhDeFpLY1FUNi9GWjNMeDl3blBONW9IRXZaMEVqc0R5VUREeEdwOTUNCkF1TmVCbmN5UTRUTEhQTW9RSE9kSklnS3VvTUsvZ0xwUzQvamJ3PT0NCg==" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYkl0Qkp1TnJxeFdTVWk0OGVWR2RFUS9RdVpzL0JSWnlpTVYreVBkaFdIemNpZk9QbVROWndFckdybGhuS1ovZ1BWT2NzSlRGWHMyelcNCmJ1Rm12cVdZdlVYN1lnaDdacjJSQm0zbGRHQ25WRTFjZEluak4yU042clh3S1dzbzF2Z0RpUmJRcUF5TVpMS2dwbTZZTnlFZnhjSzYNCkVpZGNpKzhWRVlHdkYzYm5mVGtoMWVmK0RXbHYxTWxYSnYwcGRSaXFmU3dnZThjNmxGTUs2M2t5Y2JFWTFpNXV1NWZubEIydURJTTgNCnRrNUhDV2gzQlVoZ1B2Z01zQWM4SHN3QVNyazcxWFZlQzNXWVR1dTlTQVVOUS9Va25IdzNvcitvT09POW5YTXVEWFFWbjF3WGhpUUQNCkFxNWgzN0hULy8vYmZDUDlWQ3cxQXRwY0ZKRXNHNzViNjg3N0JRPT0NCg==" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYmdvZVVuaFU5YTBoR3hiWVl4MXZnckE0MFcvYmRLTjEraHBvUi9wazZsOVpXM05kNlV6cmhlR3VWN3NCSG1sSUVqcXVCemIyd3FnTncNCnFCRy9hZ3FvZ2lsdGQ3ZUZpNmdVdXQ4N3MvMm5kMjZFL1JiRERPd1QvUUxCYzRGZWtxSlEzTmZzaitPL25VeDVWeVJKTU82ZStHOVENCjRYWWRXcG5OWmlmMTRVTWMzZlR3YlBmY3BzYWFUQm1VTzJ6WS84d0lhbzlNb1hPYXd3ZVlydWZJSXdZZEp5bWhTTnIyZFBqTUVVWUQNCnJjOW1oOXZZQklTRWIyZnNOTFBObWFRL2FKK25NK0VBVGN2SDJVWTBCMjU3a2dVOENqOEhhbG82VGswVEZ3ckIxVXhoVkRvZ0dUZHUNCmdiTHpFMHFjbDZNbHkwNS9wT1lLeU1rcGV4MzM5M1Rzc2xRR0pnPT0NCg==" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYnBSTWdtTmwvdjl0QUtOUXdhVjNCTVRaU2pVSjIxd3d4UHVWcU9wLzBtRzl1c2ZXeHU1WEJMQ1hqOFNtM2RaalBEbzJwdldYeEFhNVANCkxBZnBxZG1sVUlOVFJzVG9PaWdrTWFVaEx3bEwyTEZtTVpDUXJPZElPdWV1aFhqN1NvblUvaXRvRlZTYTBxU2hNZjVsbld3OHVGWlkNCnNmUjhXM3B2NDNuRjc3ZHF4SU1KWnkwR1kvdENjeFNtcUZBSkl3YW5PQVVZVXVPQWo4Qmpld3Y4U2lkTVFTWkExY3krV0NkdHkrVFQNClg1cUJubDFvNHI1c1NhSENjNHU0OFBkcGpmczF3ZDY5SVRQMnFCZVZBM3hxVFMyejN4bkJ2Z0VEZWtlWEJlNzE1Q0JvM1ZsM0RVSW0NCndkbVppejdKTEVUYVQvVXpmVGZ1NlVGYUZzR2Q2ODN4dzgvS0hBPT0NCg==" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "m2vH2mT8PqjrYI2ljgT6HlMeXhNylQvKZQmz8JkoLr50ks+SZ7WAQ/u+l6OMowXQ9pIWadzSsDiwX47UJTcE2gibTVfbBj8XTnvxOerQeYKm1wJ6rSpFDCt1I75xmbxr3GVbD+eCFS/kPPLR8U0uOVW1RY3vhg2qlrOFVYeOEEWQK1Ds7UF12EQm51ClL+UwH1RoPo/SCABqkiU998a4hvWV57TIefrOtrQBs//ZOGm2BswAtnVjmOd9OZmmnwyVQC6/i50YJOcaON1qiW5+Yl9o8gfE7kRXJ+iCuoOzT4iR2i7Z0xOsMuKme1M1ZNBirBNSpHKvJnTpRJ7K2fzXQA==" + }, + "hashKey": { + "N": "5" + }, + "intSet": { + "B": "w1+zjeZeeNkjUAgxg6HrlPi++MwbD8DSvM0jSvQQ+lQyzmVEB5IT5/6CoEtPVMasQUVTE/iODio0Yjkdek6vcA==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYnJ5ZGJGRzVFbWkxVURXS1htTEdQZ05zaXh0SURPYXd4Ty9yVXlsWVFTTFduYjB1NTlyM0xWdzVlcmx1Rk5YdC9mS1RYQWdOVFhNeDANClhiSm9Oa3BvcFRDWFlQRnFPSkVINWwxNnBDWXpyU1N3ZXJWdWlRMk5ZcHJ0KytwNlRZOWFKTzZvOVhEUW4wVzNEQmgrSWVUMDEzcDYNCmVCSnhyTjNHRzM0ejc3RHhUZnJRWENpVFp1c2E4WFp5akptVkh2eTdNMmxUdzlMUG00SjBNZ1lHNjBKMUFvd2N3ajdnSGpmaXRuNnkNCnhjL3RqUUg4VVBjcnBvME9HSFpjU0htZGhadlNtSzJnRlh4WkFuVFpLZ2hUL2VxRHFCODhISWJJbzl1QTBzQWdMN0tscjY0c3RvbEUNCmc3TkVhNzdqMGFpd0RKVmhzMk5ZTkdWcjg4UWgzVVNrZmk4akpnPT0NCg==" + }, + "stringValue": { + "B": "Wm3eBDw275auRay6J0l2m3KEn9sDTPC75ESTTKaE0mJXasDHiYEWWMt2ubWIMrYv" + }, + "rangeKey": { + "N": "7" + }, + "stringSet": { + "B": "U6yqvtM7vMRXHD9uugPaJp68Ro9jNhoUyKwoItVSvkZDPNypGFXX1L42AuBQbeq4km4kXBwPbnLRfqoPVUG/tw==" + }, + "byteArrayValue": { + "B": "5d/ldqZexHMg6B/GfymHSqxoSFNG3hJKVsof8P6fIgg=" + }, + "intValue": { + "B": "4YeimDgZV76L9rTz+0Me0rXVvSvlPt3W0+1ah1roEqE=" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYm5TZFVpMlQzWjRNRjJQUjJVUHRweWZIK25CZU1wUEdKbzg0TUJneFVWek4rOXFvNStvaGRXSEp2NEsrTDRwRUJJVGVZTEllV3lGVmsNCkdEZ3dNTk5ZanNmYjgxVy9iekdpM3pzclFjUGFRTi9JZ2RaWTFEdFFKbkFvRUZSbmJ0SGkxaG5pSkdiUlljc3BOanY0NXpaOWd3K2cNCitMN2dnM1Q0WEY1dUg1QUsxY1lLUkVWZUJKb2RFdU43ZGVGZkRWZ3A1NjR6cDA0QXVaTldqcENmYmNOb0dsenJaSGtIZkhtTTVtQ0cNCmFPaUpzc2crZmM0Nm5tLy9BdUc1eUs2MnV5cyt1QWJ1d2RYZlNhUDZSbjY3ZXkrL1BBUVA3SUpYRWVKYndEb1U3djVTcngrWWEyaDYNCmtYbUZFLzhMbVMzM3Vad0lqeW1nNDRWTjE5cERYZUd4NWRLU3Z3PT0NCg==" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "hALCfRcpQ0FpzL1HJQQk5WbSRKN7pD9C1vkkzVlA74pYCsBmHm9GAKTrO7Thyw58BpZtFX8wiRO1aTkPpL5L1oh9rQ9+TlvMv7+MbBB/WwMnx57FbV9I4Cu5mMFiDXpTt7k8I+QEFRJwMdzs5HSv0bjz3FyOBbmXFqkMQaak61nz2KoM3kwUd38jb7sU+calk2Chlh5Rh6Y2JFgJ3L38h6DPrbsB6Hxqx1q8+vod80XWw2IyYmqZ2EKQte6Ot21AcDv3ECm2+XQZsFHAQTHJUSlFAilkhGv1FEtt0NwEUCsgR7Z6YE4gi0JCQ0bdQuVY7XrlY0A6ywT2+wkHBtYI/Q==" + }, + "hashKey": { + "N": "6" + }, + "intSet": { + "B": "mMIiJONTWUfeTaBy+FgY9TkJadGmsLe4X3qaJ8H1pnebXSz+GiZKhz9P9UfTgkpmYdxEyIqK9Pyq3zMtPDoOXw==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYk8ycmIwcEZMWlV5cUQyT1JDM0xYMkdDZWxjNWtiTjJPaU1wYWxTSVNzVUhnV2ZuVjJ0ZmVoUlo3VGZPZEhrYXpDUVBzNDlQWDN6b1MNCldlV25NS0NjQ1YzS0g3NFN4V3VQTkVhZlVBRVl2RTMvRUtBdmhWc0t2K01tUWdYd2pJckJNUGN0THBKcUtOVU9hUWxkR3EzVnZ0eXYNCkFqam5CUktzTU13RVFJY2VMbUxWbTRkSjJhSTd3STBDL0pZZmtJU090MWdqY2gycTI2c3hiYzYzYXhwOEtnUWg3dms5WTQzQVpMeTkNCnhVL3NJNHVkck1DN2hOLzc0WEZkemdWbU1vbHk4S3lUUklCK2JTN2ZwV1F4RE9ESk0xK1RhNEZPd1Z2VHQrTVUrdUtCQnJ4aVkrT2QNCnkxYVVRSlVXakVHM3VSNW1raFdtVHVtemNYZm8yakNUNlJIYWdBPT0NCg==" + }, + "stringValue": { + "S": "Hello world!" + }, + "rangeKey": { + "N": "8" + }, + "stringSet": { + "B": "AbnuuD5NoWcpbMV05yWaeXoq/UDb6VcAxqC6JMaFFktVEYp3BWjmqtyFRrt6Gc0t03nzLvPOWs6Uj6k33J87bQ==" + }, + "byteArrayValue": { + "B": "VkfWaVfJ9aQxJWHKPpPFyrAvQ3Eogu4H04hNNcG+bno=" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYkRjTHUzdlByS0xiN0g4eVZOTkJQMFZ3dXpGWU1ONkpDb2hCT3NscUpYN09wSGdORFgwNUhEZlRMNGFBRGFmamVvMUMrQ2pxZ0JLZVgNCkU1UTE0aTYxN0JyMDQwOHczRlNhdnRObkI4eTZEVXY3cmhSSElBMThGbTJqWVhvMkFZRUlXbzZFRkR6TGh4RUtIV0pmVnppYzZXSzcNCkc2L24xUFUwc2pEUFRtNC9DdE1STWRnbkk1SnA3c1BBSVFOZ0M1M3JPY0FaS0p0ZEU1UmJ1TllCTzJZaTE4eGVPMUNNUVVnOFlWWmkNCllDM25NQlVjZitSTGk0NE1IZHUzMnNCMHFtMGZoZnZ3WjlMaE8xL1VaWlRmK1ptejRFT3h0cDMyaTI5K09LQmxnUlFmNzZRaExGaEYNClVlZVhsRjdZRytKSG9iUTV4dlBzbmxXQUY0T3FaOXJwWGVIQUxnPT0NCg==" + }, + "rangeKey": { + "N": "3" + } + }, + { + "hashKey": { + "N": "7" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "rangeKey": { + "N": "9" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "fuTnJmdj2YTv+7PSKT/hVA/HaYJZCuXquvdCFafntAtjNqcQI371menVgbKHLKYZsqaTrCEHskNESd8qzXjJup2uOYdJOl01OKc0qasI+a0XwQspILlhIBo+TJ91/XyUTbqvRExXv+yJ3S1AY7vQmqIIumzy6kcVk0IR0pJjyqCKLbWumJdR+NgITuaowVMGi4BrjE8W3/ucJnB1yh1MZ5kQlINCgW+80MdEmCtxkZ9Lq40CMlhtXoXXXKNtZ5vh/TK0IDEoDMBQKMv3/MoSDxmRjkwCVRjJaD4ofpbmOaubInuVhMMQ2gPkQ8oxNRaNxoqhMv44rgry/sThLLOt7A==" + }, + "hashKey": { + "N": "8" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYlZnejZZeFFlNEFBQTNEVzRZZUN5K1Z1OWJPWGs2NzNYbVREV1VRcnZZb00xRTUwTm1KRkNQNlhrWktnMDVNRmFKODRicVBkOHZwelQNCnlxS2pKOWdOQnJ6Sk02MVhvZitPeGErRm02MkIrSzRlVHlOa0U2aFV1Z2U2Q2pqa1pkaW54bHBIZlVBbVJXTXhxcW9JanluR3FWTUsNCm5qS0RYRWkzWHJFSDY3VkhIQnZrcFFVbGg5QVJLNlg1bXFFTHFRb2twamw0b1Z4d1RqakZ6L0c1b2VVSnFkR0R6eXdTSW12NjNESGkNCmhZeWRkSlEvQ1d4VUsxVG5UcVByWnVKMkNneVhQb1pkcEVrMHV5TllGb3dMWm9iNi9kb2VTWjJBdmdHaXBhQS9yZGFlbXZxdVdBbDMNClAxOHRZQ2FOaVhieHM3enRRMExSanp1U3R3Ung0OXRuL09vQUlnPT0NCg==" + }, + "stringValue": { + "S": "Hello world!" + }, + "rangeKey": { + "N": "10" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + } + ], + "HashKeyOnly": [ + { + "*amzn-ddb-map-sig*": { + "B": "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" + }, + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYnJQOXA1YnN4eitlbW41dHdWY2dCSHZ0MHJBVW9xa2tzaktTeHJYdTZZTElsSkR3dWJ0MzdrbG90M2IxZGJvRU9mZVFBQkRtcHJFb28NCnVnbTk5Q2paQTBJN0ZRNzJIMElzTEkySUZwV3JzZzRHUTJOM0x4S084Zk5TYW41SGRIWUkwUVlIMjcvMExaQWprbGltckpVeGh2ZUoNCjJYYlFidzhlNWRWTmdLdG1sNkxsTEVWOGlXSG13Z0gwQmtoYzJBUFpIMzlLMHUzTzNBNjd2Yk9pTGlsUWxRaVBJRGhGdlRsWlhtSlgNCmtYYjUyU2R1UXhIMjJubWhFOUc0U0pRMG5BYVhOWkh6S2NZZFJSalBNZmV0VzExZlR2LzhucHRKeGs5YXpQOGl6YnhZR1R5cEh2K2gNCjd6T1NZc2hDUzdWZ0l0MGtsUmJtcDFFV0RtdW5vT2xNZStZaXRRPT0NCg==" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" + }, + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYkhQZ3dZSWZzcjlhaVJ6bUIwdVg3WWxkbklUeVRkU3lHTnJIdHVqbytmd1RVUjJabFY3RmxpbjdPS0k3SzNaNE55bFM3RWY1cXk2ZHgNCjRhNkpOT0NCbzIwTTBjbnhEbWFsSG5iZ2p1aUs2ZUhvUzhqbFVvMFl3RDhFcnM1NFFaWExFZVNCQWxucDNUYk55dTlRNkNkTExoRXcNCmtxNkJ0akZNeGtmRk9SaUk3TmdwL21mVmVMSHhqajNleXFCbkpJSmM5RXZVSTVVWlZRK0wvRnAwa1pKdDFuMHdVMFU1UVNqVUVBeGgNCnNQUm5PWHpiZXhGSWdHc05jVE9wdy8vbGoySkZoWGJyWXowNFVqQkpLUEJibTErbllicmZPWi9yU0w2bDRCR3VUTUkwU0pta3ZxbmUNCjkyRmhpUlhJNjJZN0xIZWRzbFAwVnBQMWxXSEhaM1dkbTlVR2hRPT0NCg==" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + }, + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABYmI1L0Y2NE5MRlk5eTdVZ05EeUxiYTEwTnpBck1hV2dIZ0hjNndGZncvK0RESVppRUUyRTZSY3NvYnM0U3F3QVROc0JlSHptZjQ4UWQNCjBIWXdyYlVsc3ZOWnl6WHZOMkNqdFVqa1dDdHJOTTJQRlRuVWZHUldPaFU5WDdaR1BPM3FHdzZ1cTVxc1d5eGU5SVhRZTUvbkUvNlUNCnZ1eHlZUG8yR1dwM3BxOS9GSEpIMG1oTCtIL3ROZzBIazRtQi9MV1BxZGphc0F3Zk5ldzQ1Wjh2T3V1aDFGc3hZaExFMmR6Y2VpcVUNCnI0M0dMZGNPVTlsWnpxajF0eW1HTjBubUY0cTBYeVBnVU5pdkJ6anlla1hRTEJBc1RYY0lqNVRrc1lKNHRPR0ZtN3pHdVlVanUrZ04NCm90SGRROThuaGlLMzhnbHFkdDRoOW4zc2FxdGVhMDQwcFA1SVFnPT0NCg==" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-rsa-2.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-rsa-2.json new file mode 100644 index 00000000..4a678f0f --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-rsa-2.json @@ -0,0 +1,427 @@ +{ + "TableName": [ + { + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "ABNOeG5nexpOr+MWQa4B48/NZFBV/UTkeSCMbe5j8oM=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "U2/wlRLHVZxqV4/1FiC8CWSdn7f+wZco9kdFttMyLrhkYBeS7d0dROTlsFK8BY9J" + }, + "stringValue": { + "S": "Blargh!" + }, + "doubleValue": { + "N": "15" + }, + "rangeKey": { + "N": "15" + }, + "intValue": { + "N": "0" + }, + "version": { + "N": "1" + } + }, + { + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "ABNOeG5nexpOr+MWQa4B48/NZFBV/UTkeSCMbe5j8oM=" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABVhbXpuLWRkYi1tYXAtc3ltLW1vZGUAAAARL0NCQy9QS0NTNVBhZGRpbmc=" + }, + "intSet": { + "B": "U2/wlRLHVZxqV4/1FiC8CWSdn7f+wZco9kdFttMyLrhkYBeS7d0dROTlsFK8BY9J" + }, + "stringValue": { + "S": "Blargh!" + }, + "doubleValue": { + "N": "15" + }, + "rangeKey": { + "N": "15" + }, + "intValue": { + "N": "0" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWE5ZbFNGc3FDcDg3Q09ia0FhcnllaUhCNkxEVGROMzZ2NUJBNnc4MEFnOTc0Um9IRkNibE1qcDJLZm80MW1NWjBhUFpXTllRL0RaWVNQRUtnelBsN3FvTktKS1ZweXIweU0rQXZpOXVoNUo2RGpxZTlka2pJMDE2WlFMbkFuQkdGK2ZRdm4wNUV6MWQ5TU82Q2hoQkcyckVxVUJvUWY5RUtjRG84VkJHU1FKaE1RVDROVGZKRmFHN254Z2p4Zjd6VnE0K3QzejNMMDlISHhjQ1A4VUZiUGlFUUpFNWVIOENJeFk0emljVHpIZ05mcTl0OFFXcjNEY3ptck9RSGVDQmNwcThVR3d1ejJ6WTFJd1g0ZkJrdlltTHA5ZnVPSEF2OVEzUXF5dWxpVXNpNlJUREFCMy9GeEtFbXpmQmZQMmlGVU9ycFdKTGRUNWJ1akxpa21mMjlWUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFpRSGxBa3NnNVRLeU1NMW1pUENnSFVnc2NoR2VwSWEyMVBsRVJPYk44N0dYWFN1SVJwK1QvZG9qVkxzaGlKdnQrWGZQT0ZGNE5uZTBZNWp5cEVYNXZCSTk0OVFwaEorSnM4U2FQMWNWTlNqV1pKdVUya0k0V0NCZGsxNXN1Z2hGdVFEN254eEVGa1lSQXNsZWl1d2x3TnlpN3FCOTVSMG44eUVWdmFHNmgxc0RXc0c5QlpxVUVCUXZrb0NKTDhFeWU4RmxUMkRZbkN4UDVmL05FYlJkTGZKYTFZbzI5Q0VWMDF3YlZ0ZFpYemhxZXRBc2ZkYmRnTW1KNXFySTRlSkxBeERwQm5jeVY5Z0dKT0xvV21BZTN5YWdveU9MalRaYkVWUkV3dDN2QnhHaGR3K0M5QXVqVitsblNYWjM2czR0Tm12dWxDeVlaTEYxWHByUEtGNlJYZz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGZpVVJXYnJtWXMrNllPUnYvUlk5NXM0RjhOaXBtS0V2MFVBV2FBVUhvQTlJSlJ1WnhGakNkUk1PWE50S0k5RW8rUjc5SXNVTXF4dm1wVjJLK2M1SzBKUjJDclZ5Vmw0ZVd3STRJekM0d3I0d0xPV0k0djU2S0tGeTN5TXIzSkpvTE9BMVdUUVBaRGl4Z0x5SlNoYlJsbjNaODJIOVFYT0hYUFdXR3VaN3ZDTm5HbVhnZVhSSVZlTkYrREFnZ2sxdDFydEU5ajJ3ZDdxZDdOeDRCb2pjM1JKa29STXJkRHFycXpMWjBsWUNPZFdvbVl6YXh5dGZnNzhkVlh1bVFCMHRvM3pnaHRDNUhTb3BRRzgwNk5vWG1rdXgyNTdHU0dWNGhERkMweGgrczB4SVYyTTZhWURYS2VnQWVJbjY0R0ZJYi84NFBvcWxoeEhQOWRKcUQ4NVBFQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFJNM1NvSmRpdUp0ZkpsUUNFeWtRUy9NS3MvbFZmTlFYK3U1OXhMVkRZTC9PcmFBeFR2em1HS3hCcjFLc2ZCZU4wQW82YlNEb21MSDdsRHdNSGpRZjVCZnQyRlliRUc4bm5rSnBhaVpHYnBCQlBUVHh6SURGbkZJZ3JMRnpTT21UanRTK2ZBTVpjYXJuNGVvTFJvbEd6OE5FbnNrQVBUNWV0QkFIMXg2UUJjQ3h3WUxtOENWeDZ2T3JyZDJUUThONTZ5WEpMOWpZZzFNczdoN3dYSitDV1lVRTI4ME40a3lId1ZCSk56aHVNNkFFdVkxcDdNNEtqSFpycHBXWm9QM0FCYmk0RW9GaCszdjdXYnNCbzFpSFltLzVSQnBqTFZyRW9RNkpuMDlHSllVMDNvM0dRcjIyaVozK3YrUVVnLzNmUWZGUy96UGsxS3NVQlpPOHRWNnhyQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWG1CWUs5Z05nRTBMYU9jL2NvaTZjdkJCbzlLVW45ZVpzbmdyZVE4UnR4R25OTVQvbkN6R3REcWlXajEreVd1REpHU1dlb1RBQysrYTR3KzJpNUx5WkV2bFg2K01uVzE2L0NyZ1VaWjBlcnp2eFVseVFDYU9ZbmJhcHM0UFR0NjdZYWxBaTRXaEE3Mjc1a29LQVltYzVBSFg1cFlnUWh3eFVzcys4ZDlJRkg1bGlhUldWY3hVTVQrMzBZcWhERkQ3bnE4TXVyZDNPY3h3eUljd1EwZDZacDdvRCtHMDRNeG5tWjM0cjUvRTRHYU5JYlpNVGE5VDBWUW1qYmJEM2piallKMWlrQkduRnlwemd5czJJVU9lREJ1SjRxVTJBek1nM3NqbkpIcmNWcGRzU2NQcnpISnJkZEtNblE5V2Y2NVkxSTFWNUpOOU9RbUtyQ1pxZ1VuVUtuUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWEt3NUpWUEZBVitPUkdYWmJBSFQ1eVhFMFhGdGo2NzZkOUVtaEo5dDJJVmF5VjIyZG9PN3JJUlZ6d2ZJOFdtbWxGeUZ5aHpwNlpaNk8wT1dhejhybUc1Vmdwc0o0cHRLVWU1Y2Q4d0VxeDQ3eEJEeXgraTNrUCs5bFhQQTdnc2VORk83OU9URkJCbG1qUjJnYU1OaTNjOXp0U3VVZjNpaGY5cTZ4TzhLcDRYL3F4dHVpNnhwaXBCK05xQVFjNlpYSHR0TVNDVXIvNTIvTjFBc0p4Nm1TcGsxTjFXQjdlY2VKVk1KUDYvSUh2Vm8wSUF2aWxicUVPVHY1OURYM2JzVEpTZmRUSlkrUHF3dzVRVXFLTXYxSEgxb2xMQnpPejVTZ3lsSlBlSzlFeGM1L1hnZnpXTWd1VzNlbzVpYlREUXdrM0FzSXk1R1ZZZnRQZmc2Yjg4NTArQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWG9SMjRkU1FWK0lNTXZIY0c0emlxWmpNLzgxQ0Y3VENJQk5HMFJEdjJlRDlLaU93MGNRdEJ2ZVgxamlPS0J4eGR5cThVeGQ4WnRXYnZUTzNWNXkwRno1aUY3TTBMK25TeHluei8yZ1NRdGg2UGZKZ1MyYzVGQTZBeFBRNkFTNmNsT3FmQTlGa1d4ZkdNVHkrRExSVm9DaDBFbGlyY0JIcGNZQUNqc3lWMkd3am1nZEpaVCtKeDAzZWZNV0RpdlNmWlI3cW01dkwzemhhTUZJU1gyK2dBdFZKaXpmQ2wxbllBYklnMjZzbHoxMkdjcjY4Z1VGaGM2ZlhvWVRMZTlNQ1dzRHF0UTh1eVJDMFBQNUZwWERqdVFEdzR2ZzJGZ3NFQy9scjRKY3FhYUJHTldMNTlHNWRpc091NXNTS0FFZkUyY0NIV2Y1TFpEU2xWamVPSnBSdzF2UT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "doubleSet": { + "B": "R/EUfopsFa4thzJjPi5wDKrD0xkQTxsqNBPQThG+FzXVtVojpI8hd82BLjWYjjTH6t20+rvutk9tXnfkywoygQ==" + }, + "*amzn-ddb-map-sig*": { + "B": "p8q1hUKl9fSZWKI8tvL2kxU8rPnTRACedH4snUgOB5u6ZQ/sTOI9fbRdbStCWnybYiAfGAcxrpDKED/t3tWGcWqUVWzinfDOi3qPrGi51JKE02j9Gl0wzgrVe65wvCDfrvaTGggWPkqOKyqgdzT8HPFVoGXGYdAFSo+v5XCXs8/PxWxWkYxJvFXprzQ56FKV0IFG+HZmpoltqI4cv+46NdcIerEd6W8J1LhjZU4PKID/6QwPLa0iY8LVC9pWyqR9GVZDQ/bRko52KrUp1BYwXyrmu7CyN/jWT+nacxMMHJuIkCsXBGFV3+CEbbxYXvjTg89d/rD++OBWoM6Celm3iQ==" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGlzOUlLakQ0dEZWcWxvVVc2QW5ESUhxbVRNa3djNnQvVkhoUnQrbVk3SGpTUU5UZ0hIbkJKOGZsWDF2QlpGbmJYN1FsMVBjMEViN0ZWSGJKbXV3SWp6L2xnVzF4K0FZT1RVYStvRzRNZEJJK2ZVUVkrMU1VNFh5RG9EVmN2TW8rUDFkL2hGNGxPcng0T2xOV3ovVm8zUzY0M1VVNitrWU43SVVCOC85RGp6Z1NTZkRIS3E3bEFsMEVCZm1MY3NtRkpmUFFLbVJ0WjIrbXRRNUhsV1Fubi9DVnQ3bmZGTGhEV1NEbEtYMm5uSVlCVmdrMEJHQWFOaGJFbVNqREFaaEJ6V1M4N2pOVTJnMGJkaHlyOHRNY2c1TmlCM1F5TDdPWERiS0orTXlrUmJvNlA0Vm9NY1lkTHk2OUdCYWM4WjZFQjFkNGdmTUtxNklnazRhelp0aDhVdz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "intSet": { + "B": "0Sj/sNRaozw9XKYKDVNLW4vFoEB0e76L6awEUvtOCBA8pL77j2CUtHIiBDB1HIf2pBb/i+oNF85lwptguFE6rA==" + }, + "stringValue": { + "B": "w9aZNvR3yzxbGhub/qkSk+AK8+ltsl15eH9e37CudODt8OjztQo0YVwrP0o+JS3y" + }, + "doubleValue": { + "B": "isjjsah8rGZ78Af2gnP2yhWZ8Wq6PDLb5aP312l5zl0=" + }, + "stringSet": { + "B": "gW/RgnOMZM9nZk7PRQ4qQwakhReiS2oaQC3OFTQkigx8nO+KAGlpdqSKZGV6vtVyDcgEtmA8zcphXizTCZGQiQ==" + }, + "rangeKey": { + "N": "7" + }, + "byteArrayValue": { + "B": "GjoUlvWLhyxuSzUKtatZd4r/rUudD7hsajyQ0oOzjZ8=" + }, + "intValue": { + "B": "165MtGUmgndEpx90SVAKf7dSTkmwS0wrVmubkpMBxl8=" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWEJxTHVkd2Y1bFhPWUNTN3hJUnkyclJBMzBVZUk4WGYvd01yTFNMNG9zNHFvNjgyY29tNGx6M3IvOTE4bFFiMDhmazRZMktqUk1EdFpydkZsRVhrN3lDam85QmQ5OTNWMm1zeXBTUGIzYkt2R2d3NXFzeExJbWdDOUtrL1kvNkJRd0NUM3FxVWZ4aWlLZmdqNEs3ZHBsTXZJVFlPZzRlY29nMXVKQkl3cENhWE5YYTlWZkI5ZDlWRHg3bUhHSnpROG5vekdJUDdzU1dUaWRzakI0NW1NVXU3dTkwLzRoYTR2VGZ6czQ4QmhVZnZMczNvKzlIRmZxVks2cW1va3JlRWFvVjhPVFdIYThxMGxSekYwZ3J0M2hDamUrREdvNVpFcnUyclFmdmgvK1prTlpZbkw1V2p3Y2VhcEJnT1h3UDBPYjA0TWsrWldzZkdLRG5uYlF6V25iUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "RJpKAoXXSPxKUlYA3zxTAMIbaXJoIjo6Mq+Sy4CbGHQzsf4UkWEz157mdT+OCwMNGBUXUnvJhX+9GhTB/dU0pCkGrC9p7BwazNaAhGO4fcDPEsVP5LTSAAs5ZEw1CdopWQsK+mVMAw12XwO9NeOW/cUG7wDZ/u4Y01ejnO3nLaMIi24riIQRiMduk8AJTg41lU4rcSxDKWUn1pBweolLTX6W8zo50BcmAn/qeThVVQBoqDgJYPyUZ6UIDDl3OSg1Ujsn2c0JgzlAtxddWQ22uHSRKUbv7tURIO5N7WmK3RhUnumACekG4acXt9kAn8PBWj2Yvwr4Z3+w908RET7+vQ==" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFdZOCswY2ZZaFkyT1Fjek1Ya25YZDQ3UXZxZUxsQk82dTJvTS9Id1phZVVFb3FjNlhtNVd1VjJ5V1pZNW5qREorS3BrdGhaQ1RsTnU2QXdNcmpBbm5WVVZZdHkxWmtlRUVMWU9UZmhzN2ZGTkdqQ0d0a1FRWEpQb2lLOVB4OEt3N1VRdDAvTXJTY2k4Ylk5VHgwVmFVQ0I1MDV5ZG1IN21WeDN4bkZlVXRZekMzNWNlMEt3cDdqaG1iRTFTZVlocWxPTVRCRE1sQmZvcTJRSG83bmJUNHo0V0Z1RlhZbHdSMVJnRDNsK2cydjl4dkFIekF6SDZmeW5qTFM5c2RXYUc1Q0FESElqYXRJMmlqeGh4NXFmeEtIRmFBN1JraC92UEdFdkdLdEhsdkhBMmlwOGtRTTRmcVpVaC9lU2RhT3EzZ2RSR1NRUTE2aFZMT2JlZkNJZHlmdz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "intSet": { + "B": "1y82dQGX/4gbSZ9okCbwkWYt35CHvGRlHSwKR1K/NV/+AQ04tEWx3+HNze/t78qIa5ttNWw6gzFl6lop6iaVmQ==" + }, + "stringValue": { + "S": "Hello world!" + }, + "doubleValue": { + "N": "15" + }, + "stringSet": { + "B": "CNJWkRL3Rjm5akaVNBUizbKtQ13INgSUwMNQR+KYYKJPJQJpAQIrk1u8PALl7V7JvDEOAdwcv+gNjFT+WQGniw==" + }, + "rangeKey": { + "N": "8" + }, + "byteArrayValue": { + "B": "fqCji3Cm6TKPeE6Huejc22X/1746VPMPVwrkqvNtGHw=" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGxjNFJBeDhFbllhaEk2ZFVaOUpQeDR4TVhpcEVpUzVxK25jMS9EQ2gxQXhwMXJIdjdPTUREWVV0cnQ0Z2djTjRwS2wvZi82WlU3aUE0VFZRZnFFMnNaTVJWSEVrUmR3ODFSKzNRMHJPVGthK09kN3BKSWNVOUprOTczM1orK2t2ZlhXNXlKYlZwQ2diRmV2WjhGS2NDdXZEMFE4WGltR1NTa1JXRXgwY2lHbG1mRm03MEs2aEd0ZW5RU3prZ3NBSnBCc2pMVCtYbXUwWjBiOU43b0hrWFRJZHVmd3pJa1lKSitBMW5ORG1nbEVhM2U3Mm1tMFBCRHJpVVlMUFhSaHdXQVo5TnRaSUF3ZkwzeFlMNGI1WUFqaGdJMk5KYm03YnRYb3F4WkdlWmdONkRyWkZSNGEyTVBBMm56OXpYNXFsQWYycVdMc3Q2SUlHbUlDeTVEWk12dz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "hashKey": { + "N": "7" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "doubleValue": { + "N": "15" + }, + "rangeKey": { + "N": "9" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "POVybkDUXTky3BszXwOiehdzQnXrOoFsVz9l6o9hxXSBQ30LzwwNSNe2UxGZsZGfnHW1BWhg+T4ycxdcXwImovTRRUNUAn1RFU1nJLZaVvAw9FSvDbRWbk4oTiyv3kr7NiCgCQfKOM0H1eUi6tDUYdnR5kPwP2aAyPVtJE0oLR5g2s+09IoOs5FSipYcPOtlN0rT5fOtMCEe2goCIMyluerqISBYmCnLrpg4fhWpQQTvCFuSCccJC4zoQjFrSQAd4hBHlS+xsCmXi1KS3ECwK2bRutntUzZJaeFjFpEn5y7CV0Y/9SuK5fc4QO/XBkubGhiHU74199/etB11rnETDw==" + }, + "hashKey": { + "N": "8" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFltNUt5NEFSaTZIZ3ZxQXVwMkcvM2puWFBXOHdoRGRpTTE5RG9OVlVTenYvU0F2Q1pScnNnMS9IM25jWVRYY2Fvc2wrU2xJc2NQSVlDTXBVYmhmd2F1aFM3ZE1TUEFqa3FaZnFpb0FLbmMwOWFGR015RHA2Qi8zU25VRm04TGs2Mit3S050R0pyclA5cTh6TFBsYWtJSzE1OGZwM1p6aFk2L0xtVjFrYVBoUms0azkyZGdFOHBMRVZzckVZZXVrYUdleXBFKzFaRnJCc2kraldoWVdIeHRNSS9kUzNqTnJYSFhXblVhV3pwNkQ5YmlONDk0YnhiRlR2b2s5bnk2R1o5ZVVIYXFPdDgxcDdSR1ovUHkwT2hLdThYQVp0TlJWRG1VZTc0T0prMkkzNjcyQzdheVVXeGRZOVB5ZThZcnRaUHY2em5RYlVvVFRybHRPNG8wbDFkdz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "doubleValue": { + "N": "15" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "rangeKey": { + "N": "10" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + } + ], + "HashKeyOnly": [ + { + "*amzn-ddb-map-sig*": { + "B": "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" + }, + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWEFWclNqZ2RNQTZkcEV0ajhkZU5oVEtXdVhGMlBCclFSeXBKRzRkdTRYWFZlTjRWYVBOT3NwY0dRNFcwVjQ4dVQzeWVzSXlad1JyamwwL2pIby9oOFlxb2Jya0hNOWNUMXQvN0h0VjNRamRzbWZHb0xGL1Q1QXBxaEttY2dYOTZ5V0hWZTYyMlFLRk5Sd3lHaHNTWE9MYnBLOTR4Yk1iWVh5Wkk2d1JwYVl4TTRaaStrTkJQZkpqekxycHdrTXNjN2Y4b3hxV1BZdUdxMzVzSFk4WStXRmc0bUNoMmpQZCtCUWRFeThEaFF3enFHRUtkcW1ObmY4UDFMMzZKbE9NUDVyU1RwUDUzVlVYM0ZVbmVxbG9zT1lGMStwdkdTQ3lScDlJcUZmdGE1N1BEbTkrVkRySnZXd2dXUDh0TVAzdkhDZzB2UnMyV01BN05MSkJRdStYTUdDQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" + }, + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWG1sTElwc2ZrSWlLdFJjUWg1anpSY0hIelU2emIyRjB0dTJPNTVESWI0OHlGaVNrTENkUTJYNHZEL0Z6OWYwR1lkYSs1eVdwd2VrNkFCRmxFRHRuVUwwU2MxU2h3c1FOMCt0eE9PaHVYTTlnZjhEbjVmaWpLUVlxaE00N1JMRVlyNzZvak12eGtiR3JIUlIrd24vQjNwb3RKZlhBM3pGYVVRb0xybkJ6VnorR2lNeE04QnJNNnRxN1U5U2k1VDczUVJlRmdUdlluc1F0SVhsWEtMZFhzTG4zaHFlTmk4bzBsMVdxY1ZCSU4rcUNwMWpkZzF1Zmo3K3Q5aFJFbCtWQjd5dktDZ21Ld2J0MTgyVFZteGFZV0RRMGtyS1F4WWdOK0N2MXBlSENmYjZmWjllRW9SdjJ2VXgwZEg4RlpTV3h6K014Q09UVFkwU21jVHJiR1dEOUZRdz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + }, + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWEg2Skp6ZUR1RW5zZ2V5K1k4OE1ZZHNLeUx1c09NLzRuT25qRTdxNGVVYTZrRUFXcFpIQjhSMjVFckl3VW1TSXVCbk5rOHd4bmo0cjY2Kzg2VFd2SklHcWlSSTJ3QS9xL0x4U1FxUDY5YWE4YnBiMUhhWHlBZFZpVWhnT3I4MHAvSGpCTm90bFh6VjMvU1h4WXU1cTVxUVEwU3VrR3RkU2tIN1dZeU02YmpyaTE3aUZPQ3F4UzZNNGR6NWRtSU9SbEE1U1NSc0dUcjBmNXUvNWw3dXR0YVFvdG04UzFid3RIZVA2U1R5dWVUYjhLRU5mSm13OFc4K25TVXdhNGtHb3lTUDZ6L0E2NTlrVEc4SkVES2JuWTkxY2tycSswUUozU01OZmtuWG5BRGYreVYrTE1YTDNWMGprQ0hab3VBWktZNWxxelRoK1lTcjE0WGNGWkFlUG5zUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-rsa-3.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-rsa-3.json new file mode 100644 index 00000000..e6d0ec13 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/java/wrapped-rsa-rsa-3.json @@ -0,0 +1,309 @@ +{ + "HashKeyOnly": [ + { + "*amzn-ddb-map-sig*": { + "B": "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" + }, + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWHFremNPOXl3MlpwUlh5U1pRQ2Jra1BxKzkyakJIZ2hpUmh2Q3hQTS8yNGVjdW83SFdvL2FDRHl1NTZ6eFJ5UkhiVkNnTUw5V2tua1dBTWhOL1UxMFJjOUhKQzlmd0pYM0h0cUVxVXl0T3NqZjRzUlhRWElKZmNoTjRKNFlYNHROQ3pZT3EzWE1BcUxCUng2L3ZkbFp3QUVCSURLVnJQWkZVcHEyZlVVYkNNeCtxSWV3NGJwWVRsVmhteC93MlZ1d2JldHRTT3huckxiOGZINCs4VGpGZ29MMlgrSnk5MERUV3EwNTdoVStDbUx3RjVxazJKaVRuenpSOFY4S1lVOUJTNXJydlBDcmd2N1g1S2QxYlc3akd4dlE5dk05cFI1TysrQ3dQUCtKVE9YbGNFMXluRXpRSFd3d3EvSG9RalJBaXRjaDFINDd0WUJPU3pPSHNYUUZGUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" + }, + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFQ1WlltM0doNGZ3UnBmUE9MMWduSTdaekNSbWtXa1kzZjVqV2h0NGZ4a2QvMnF4NWNxNm5aa1IydFhoL09ZQjVvZVE3VDRBUVZBNE95TUsvVDJ6QUNSallhNlhSdE92Y05EdnVRalVGUHVBbThKRUlOZWd0cER4RjZreklYZG8zanhQenZscWNFakZxdnpBdDRBWGxCa2hZOFZGeFBCc2lRV2owUTdwYUJxak5DWGNjZ2lLdG83U0ZTaklCNmZNRFFtWkNaNUpFRHVLcXkrY1h4UytyOGJLODVaMTBwMlB0YzZUVVZZdEExVTdXUmxwOThIZExUL1lJZmhoQlVDT2hLN3ZXN3c3WWp0T3g0UTRUT2dnbndBQndxclEvUXlrZXZCaG9SVHRoQ2NkR1JqUVdrTXhSaW0yQkNaeWgwS0NtZStTUFhKcXAvbTZybVlxbEFxUUtyUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + }, + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWHJFbldWQmRWVHdpOERuOG9qTHQ5R20zV3dCTm9nYWZmbFBXdmRCODYzL1Buemtsc3N1QzVlaThUVGlOY09NVzlqZGZvTEtLTWRrVm5OQ3BpaDc5QWRTU0ZpalVERXNnODNZdHFlS1JYRzdsd1B5KytnYTBkOXhFWmMwZHlPN0FSS1ozekcwU25NcVBhTEFIdURaYUQvSzVIVDRPeDZpaGpmS21PQ1Y1QytFQlNRaFVRUTk0QjVOeG1EOUZObEl2MHp6QXpXUVo0R0htTTI4ZS9tMWJGZ1hITExLT0s3cVFhZjM1TWNqNHFoVUNJVzV0TjVFSW9hK0tTYWxtZkMvRE5ub29oU0JWejN4cDdpbU9wUkMwdUZXdW1HaHRpR2krYVl0czJwOUdodUpobHFvQi9RSk93TDVDKzNNelZRaHJWUG5aMWRYemhtTHBGblUrTTYrRDl5QT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + } + } + ], + "TableName": [ + { + "*amzn-ddb-map-sig*": { + "B": "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWENNRDA0MG0reDd6am94YkZNb2FzRDJ5cU1MRGVzWnpwZlRGMXNNcDVHUDM0NXljTWlIbnhONDRLUEJQUlE5clh5bjE0T01wVko2bkNBVFMvMUdnRVRLdTYrQmdmeEtFZ3NYZ29wRWtVOE52QnJ5S1creHlyeFN1bHFvUG1JR2pnM0hpMEd2YnRvcnRkeGt0NTVEbXVyZkYyTjVKbnZtUmIvZmRscGRkdEJsTVNycTR2UFZtS0UrbTl2b0hwNVE3VzdoZ2RDODVxZGE5MVBkd1hsb1RRZU4xS0NhWmVlTUtnMlF2a1BSa2hWbHNZOFJwekVrZEFSRWxDLzBwT3VTQS82ZURhbU1hNTEzK3VqKzNlRmZ4ZzNPS2MzL1VSSHpGY2NGb1p2VjZJcmtkODN5TWwxVkpIaGVKbGxTU01UeGFwWitOSXp1THRJNGhUeHh6bElEYk1pUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWEhTY2swR0lJQXBPT1hvenpudVlpRjJNOUZQZG1FNUpsejBLTlBsaFJPcHVzaDliNzhseGxBK01QYkMySngveEQ5NnZVTmtqTW5Dc1BkbFZDcHQ5QmV4ZkdGNkYzbC92QWVOeVRMMEFvTkdYRCttMWVCL2tIbm5ZalVyWUJ0U2ZseWxlOHF1UEZZRzVxbkppZm12SGRzRXk3R2VnREZKM3M3NktqaU5RNDZGWW9KTXVUblN5OXlRekhtbm9uUDVrcXliYVB4b0E2TTE1Z0JQYjNiWlNTUHpTYmQ2M2M5cVU4UW1DMWVtY05TWUxYTFYyZGUrUmhaRFM2YnlnNTBuTkQrZXRPUEpnUmNCVjhVd3J0d0RFSGo3SUcvbXdqWWcwM0hxdUxjcUhUcG5BVFVOeVJVMHVYTGtlZmpRRStxSTZiS2xSTHdac1gvYndwOXFLdGJOOW1sQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGZLWHJVY0NjZjdSOGpTbERSVEkyOVRDMEFMbXlVQjBCQzE3WmZBLzlQTjNkYldNamhTb2FCNjhzUFU5ZkFCQld4YzliZDZRZFFndkxHM1cwWmgzZzFuWWpVYTVkbklUdU1TU0Rxdm81MENZbkI4QXp5dmU0NmVXNitJYWh5MlZJR3pWMVRkWHA5MnoycXhSUHNMOFlkVmswZ01MTUh3cERadXljZE9RYTAyQllJWVNZSHQ4NlNDSllxWjVoejBrc3hCaTFBTHM2ZzFBTGNiNHMwRU5nbWoyZ09wV2xQeGNXOCtVUVFjWVpHWEFGUDEyWkpzNk9rM0ZoM2tiMlhzR29uWFBweGZtaUpCU0paMjJ6UWNiekJ1S2VHOWxVdG5nSExLb3dqU0t1NTNKR3pjTXl4MHdCQmF2SGI2aFNicVh0YkRKcXRCaHMyRXRzMkdlZzlKZzRzdz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGJ2OTlUVTVNbUozRVJ1Und0ODdZNE0wVnptZXdnNXhRUFg3R0FSR2hkYXhDNGZQNFphMUlWOTQ5V3pQcjJvRXJsaVhLTjc2STY2bWJHd0piZ1Q2UzJtdmlFRWYwZXl2bDlKTTNSUmNzbFpsVmpMSzFFcDc2aGthNGpoclhVaURuaUNTZndPYXlYbm9GMDhIMml4S1YxazdPZFBvazRDcms3UHNFZlh3UmN0eGU5SmoyaTZ1Vzk5a3VielY1R215Q0FPRDNweTgzZEJtME4wVG9RMDJaMmlJYUlYb2I3cW5nTlBDZEtDakpyQ21xbE9KTUswOWJsRkFucUhvc3E4K2wyNXIrOVhtSnErajByZjZJQ09MMDlteGpFZkZnOHFYaVAxSGUrWUt6YStIbTU4MWZ4dnY1QUtpUngwaFlDc1p6VkZLODlVN0FJT1NISnlxaVUreTJuZz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFdpcEVnbm5uTm9adGZKZ1JibktFbWlJZlh1dDluNEorR3N4YTZ3NTZJVkFZQk5Oakg0Q1RXaGZKcXlEZjc3UVlNQTNhNVdQeG5SeDUzTk9JNStraWgxcmlrS3lqaFpXTDh1ZlQxOUwwWTZsd1FjTUFaekRGckVFSS9UZW5EWFJQZUR5UnBXR01NQWZCbnlaMzl0aGUrRXNzYk5aZ1poWndtaVRYNlYyUlVmQ0tuRUFlVk40eXB2NVdzUEJIcnFmdXBtVXNBVjF4MFdVNUVSSnhNNUl4SURhL24zOFlqOEVsa09mY3pYbzlNbTBmOE8xVmJKZGhQbVVmZEYzQkxIcWdMY1o3aDhNWDUwVjdlYm83ZWY2SkdWR293MFVVVGRwUC93K3l6RFUvK1dQQnpwR0wwSmgzaFhQK010M2dxZXBLQXBXOWtGRXBKTzhQOVMrMFN3VEhVZz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGljaldDWmg5dlNDTXhQZE1mNlVKdkpDME9jMGR5cFUycUJ3ZlZmOG9zRWxjb05ZdkVaeGtPQlFrcnpIVmtZaVI1dHBRelplOUZ6QzFnelZOSUNYSDVuWVNZN29sNTJISlN3azhtbDZaaGw5T0F5bHA1SVhISEkydnhyUFhRa3BsSzJjcDZLQjAxQWltQ3VwZTI4dCtQR3JUOGdka2Q3UG5TMlBTVmMzTnJpUXZVU1Q2Q0VpMnNaSUVnMDA1Ui84MDJUc252eGtGdnNyTVU4SVlhN2NodFEydHdEK1I3QXpzeE9OdnBjU25ud0t2NEtKd3RobjVnNlVNdVJHcXhKZHB4cUxKSGxqQXhNQTZiajFEWEVNNXgrUkF1NWExNEppbmRFSjJ4dUN3Yk1zSWVwR3BXTHFGeFA0SlZuL2F2bmUwcWVURGUxNXlMRnpWcmJPdkNFbEk3dz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWGRMN05wNXRiTDQ2SEVhcDBlNCtGek5KditIMmo2WkZIdTdHQmZYZUdNTWlUaE1Ibklkb0hrVmQ3WUg1OEVaZVU5dElNVEh2cHVTT1NlV2V4NFVMbUZNYXVHM2o0aEFOZ0ZOOEtKR296STE3dlJQaWhmcmZ1VW1QQlVtVzZwTi8xYVpXejhtQlJBSUVyamRRMFFuWHFxaWoyNGl2QlNwVHB6SVY2MExTYndCeFJMYU9OYVhIVXNtTUF5U1k3NjJJZWtrbWMwWDd5MEJmRDRnQXVZbTdlU013SHdyR2l4QjZJbFJjQVp4dElPSVVoRGhIWWwxa1FWVExoZ1k0Q0N6eW1TbHo3bVlBNHBGVHhYeE5KRGZsYVg0TmE4eFBmVy9yL1hJZkZOdUZuajUxSzhKTHhueHNUM0VKV25FNXN0bktFcldHVEhHMFlhUXN0MmYvZ05QbEhKUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "cXwsjmUgMBWevJTnvjoJHkcpr4Lq9EynnWDVpHTuVT+981Dwfz9Tb77Ct9PrlpH2tmLAPa7Men6fweM96FHixKZprq4fpDtdS8/uYpwR/R1A3YJ2PV/7Z5tpnbcsK7vzWv5FFfu7ExiDhiyo3BO0tUfzmgIj+n6AC4t+Av1H+ezftU5RFvrZRLyXqznb4BgGMFw2hrp492AmgRmkyn7tH0gSH2ov5511xXTLDxb+4FN1pcFMXunegJ/mrTZbAEpA5cwSmFrAG5HF9+1HMaW4xkKngG/RDM1uAqW39cFwullfdwQrfGdWcjP8S3gwZjRBYBuVmmT4I9+iReWtKyffwQ==" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFNMbk1xMlcyM1lMbFZnUG16dUIwSGcySGlrRTE0VUowZlU4cG45SlVVSG0yUmZkNFR4aTd1MkpkWmRUcXB6NVNvOG9XNHBPQkw0ZlJKN09EUXpLN1U4dWZzTDJaa2gwL0U4STZoSVVHa3dlYnhXdll4eEtuUWYzRzd6ZG1BTWVVU0JDWGx5amgyTzFrMXVSZVAvREkzdDBhcThkVFpZVDhGZ1UvaWpPb0tNRzlTdk9SQjJJK0NlL2RPb21KTEhLSTloT2RvSHNsZ3BEUGlFR2JRemtrR2Z5SmJVQWdMN01UQnNnM1NreUFiQWNHa2NKM1lVTk5STDJaczBYdnR0cXdYWWpqRGZjUFFURlY2UXJHNWEzK3l5TzJKUkQ4UlZGcStTcUQrVjBHdGNHZlB3OE5aV1RyNnlnNHh4ejVMSnJuWStZbmo3ZUQ2SmtXMnp1SjZlSUp6Zz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "intSet": { + "B": "8ZtcMSFyLVWShX6ppvvQSieBh7o22ZgvG2W9YnfvAl0Skl8MSs5ARJBSFjfwu1ZUkkAu4TkSVDzYHQ6OyVqY3Q==" + }, + "stringValue": { + "B": "Oai1ObEsra4j02oNBT/sjPPbs90yHVhv1sj/+JWeLADZb0BcIgjI/YZpJf16khFf" + }, + "stringSet": { + "B": "vzb/AuXZQzfsY6g9eCX1bfnIaNrP4AmLmsEsG9c2vhV0DsRUBuJ7A5eRJCUkS6M3V41+kL1wl0kPQ2KE2ldVMg==" + }, + "rangeKey": { + "N": "7" + }, + "byteArrayValue": { + "B": "KAywNi4WcQfbA327kGuM/gvIezcA4/jBlnZDXhl8M+U=" + }, + "intValue": { + "B": "ZmWF+am2vPEV2IkuCb/6ULBiGYSvjR6OwCcQxfQ4uS8=" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFEzcXNQenFUZ1hJUStDYTVTakxJaXNuWXZEbEx0cHRId2Y5WFpNV1AyVzhFVEk3WG9tOGlaN3o2eE1KSjBrM1JYVFJ4ZEZWcHByVXlRc1owTnBYdElYTTdSSUtxZHkra0U2UUtqVk1FampHKzhxa0pHUmZTY0NraUZrQW1VRmRIWHFoVWRtTFFiUDVSYTc0RjBzSU9GU1JJd1Qrcy92cS9kNG5ialpkUEg0OGp1TE1lS2ovUEtrUkx0QzA4Qzl3bTdBMmxDTXc1SndMK1paY2JZc0RnY1c0UmFPcE1QeUtTWTZmc05QMHBlc1NuUDZjTkY1ODZ4Q0lYYkhpQ2dqbjN6dC9GbGxIbWR6UDhocUVwWlRibWFyOThWM0ZOOWczWXpaVm4rSXJTUWZ0V0VxYlpDWUxoZDBWRjdXaGNNZU85YXNIenJhVU5tUS92cmVLelI3QWJNUT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "jyMvaawr9SVz2o2aZu9DTapsym/AbELIdz8JPKoWFbxmEQqmUmf1jaMDC91xLfBw5b9qjeCEgb0FmsSXtnT8QhrGrzsCYGwiAq8DVg4rxnSRGdILKzWeYpxJO1Laf1vzow5DIz2FWxMSaRzVYh8nGPoPdO8XiPWb9tp7uLF+s0vjt6UuGcwR+4aOw2Dr+1xL2jO18uKrCxGPtXUP5D0ThZctwiQaamP2Nz1RSHGGatKU2zPcMzp6zoIPIjdnMqX1g28La2IR2mxR0Miq7Mit5EkqYk+s7XdYlTPNhVXifJu9iHvFmsLtc/hJryvLG7hrzI3Bzg2b6mkdL7oVuH2wGQ==" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWFVMWk1LekJhWnV4WHgxSDIvSUtiSHFMMnIwU3lJc1NTTnBWSkxuTlpXM2s0VzYvZkZ1SW5CaHdJdkxLUXFmY2tzcWtTSUFNbzdnd29KUVpneXZzUTZpeFRpS0ZuT1VFMS9aM3E0YnVjSGhKa3VOdmhFcExrZlYxNzg0QW93WFQzYVNEcGtuNUllc2p0ODRZVGdOVEEzUFBGSGZYMktaclBOT0tJWFdTUWtaQk8rK0Zvb0laQW5xQjkxZGs2NFZCMFRyTnRVbXYxcTlkbHgyWklqcFlIUU96aWZha1QzcWV4WVNLRStHSUs2cGdGSzd6dTBMTHRTREpVdnZUcHArSy9xNzMyVjdGY0dhK3VEY2NsUEM4SFdEaWEwN0RNa0hQN3o4WGkwdHcrM3VWU0NmVlA4R2YvUTIrODhyM0x0djRWRms1YUM4OUtlcEVNditZTlBhZXBXZz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "intSet": { + "B": "S+mU+2GCOyieXTCnXN6EW0aJ2q1u0lzYR+0Klp3ie7JKzT50zgGIfTTF7mL4UglTVEBsUGuTDB1InROrNkpU+A==" + }, + "stringValue": { + "S": "Hello world!" + }, + "stringSet": { + "B": "ROVxXPL8ZIBOjE+SqmxNuWymmlubdUnMnlVzVAcZvWYQFtkQf7Fw7tgHYILDcn9x1MEsqq60wupRhyRLCJD7hQ==" + }, + "rangeKey": { + "N": "8" + }, + "byteArrayValue": { + "B": "cEXPxkOed6M21vOTq5vi0KArgXdhtumzZkTxLH39N3w=" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWHRoUXFMR29QbkJydUNBa3FpeEROY3g5VEYycEIzZnRobmdZZ21NT3RUQ3pHSmtodVZxbzR6bnRoYzEyZkdjR05DY3UyRit1WC9NRTZ4bFY4UU8zblRjQVlXLzlScWw0UXo1OXB3dXBFV1NhR05aTDhVSlQ2UHhaa2w3WElTMzJvbnhuRVd4ZEJsR2U1a3RadFdSaUN6b0t5S3FZMXRCaHJKcVdWU2xsL0tYY3l0ci9FMk14WjRGT2NZRjlTVmdEeDIvSGtJL2VXaEpkbWFMWU16d3J3RWR0S295aXNwVVZLbUN3T2QxNFYvRGNSQkczM0VpK3hQbWtGOE8xTXJIMG5zeFBCQW0wYXQ3azJnQ0ZBMTBTUmJ3ejhFZFpMeTVlcS9HVTUzaFNuaHlnUmUvT2toWHdWMG5qMlU2YTYyd0lzVWhQdllVR2JIU0VzTkMzNVJmbDkyQT09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "rangeKey": { + "N": "3" + } + }, + { + "hashKey": { + "N": "7" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "rangeKey": { + "N": "9" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + }, + { + "*amzn-ddb-map-sig*": { + "B": "fuTnJmdj2YTv+7PSKT/hVA/HaYJZCuXquvdCFafntAtjNqcQI371menVgbKHLKYZsqaTrCEHskNESd8qzXjJup2uOYdJOl01OKc0qasI+a0XwQspILlhIBo+TJ91/XyUTbqvRExXv+yJ3S1AY7vQmqIIumzy6kcVk0IR0pJjyqCKLbWumJdR+NgITuaowVMGi4BrjE8W3/ucJnB1yh1MZ5kQlINCgW+80MdEmCtxkZ9Lq40CMlhtXoXXXKNtZ5vh/TK0IDEoDMBQKMv3/MoSDxmRjkwCVRjJaD4ofpbmOaubInuVhMMQ2gPkQ8oxNRaNxoqhMv44rgry/sThLLOt7A==" + }, + "hashKey": { + "N": "8" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAEGFtem4tZGRiLWVudi1hbGcAAAADQUVTAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1lbnYta2V5AAABWG0xKzA3d2o4dUJZYTJyeEs4TkVBUUdnRmVDcWtqYlp5bndMdk92K1ZkdmVsWjZ2bkVqMHI0cnNFbG9SeVdocU5YZWJuMDBReXI0QVhsQW9aektFQWRPTkhxL3A3RWwxdnZ3VHB5NnpmYzF3dkhvc1RVdlRTLy9wRlRvaHptclNsTkFtNFVCb0JLNjJsbUZKTWlYUy9EakNoVzgxQmRvbFZHOHZUb25tTUhJS2Q5RFlJVmtxYUJBTUdYaENuc1NIQWpCUmxQWk5XU3pTZnQyRGc4dGx0b3poY3FwTitsZHNYdTVJSjZoUk44RjlXcW9hUUJLYVY1QXRDdG92dm1BWjU4c0l1SDZnVjVWSllSL0ZzUmZBUlo2UzNJWlErQ2ZsNzRXRXpueElJa2IwWElDMmc1enhTYlhFL0NTYW1pVTIrNm92NjQrSFlvR2tkWEw2ZmpDTUtoZz09AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAJVJTQS9FQ0IvT0FFUFdpdGhTSEEtMjU2QW5kTUdGMVBhZGRpbmc=" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "stringValue": { + "S": "Hello world!" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "rangeKey": { + "N": "10" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "version": { + "N": "1" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/aws-kms-direct-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/aws-kms-direct-1.json new file mode 100644 index 00000000..7b611306 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/aws-kms-direct-1.json @@ -0,0 +1,351 @@ +{ + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURJMGMzcU5iZnlEYmRid0Z2UUlCRUlBN3hua1VpeVFwUXJRdXVqSXoxNE5OV0R5b0IxbzJ1V1AzUitVeGxsZ1V3NEFKdmlFWmRoRHdxa0dxYkFxc0gyY1Y4c25sS1NqV0ZZRWVQanc9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "4KWMhWdLB1IIEkiFiVzsTaCq9GfcR9cBhES2SD/cHUs=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURHYXVhbmUwajBwRnRQUWR0d0lCRUlBN2x5dnhYdElETDhOVm1ReVFWNGNXb3dZMkF0eE52UlFjU0NPT083UDdzZkpibFFBQjVjUEE4bXhaTmp1cU5CSDVzbUNENVZMZWZjMG54eVU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "EcV3233Pj6RJYZu+gLvnxMrnyuH6/6ST+taydye+nL0=" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURNSHhMZjIxSkZLV2pjTVlxd0lCRUlBN2h2VmdyZEVBMTM3eUR3Q085VG1UZ004dXBGOCsybElNN1VCN0hiS01vamdoT0dtd0N5QkNRWlozNXhYbEJMMmRydExSMno2WHg5M0ZoQk09AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "NZ1LSE6c+yyiO2fEnK8Q4IKEO2HdN0WbdOqDbn1bwqc=" + } + } + ], + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUREbDdLcTVlNXVWait6Uk1qZ0lCRUlBNzdndlR0SnJsRHZoRHUyNEFsVGdqVFVtM2dldjJYdXFUbTkySytpeFhObmRzRk8zYXN1WXhNVUlXa25hNVVyTG1FR0lKVStSMlQrdjhEWFk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "2iR8uzVwsAG0gLmqqss8Fv+VzUjuRkuu1bKlVo8LzzE=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURBOXVxSWhDeVdLTTY1emZjd0lCRUlBN08vVUtDYXN2aTFESG1YbXpzOUJyeG1qOXhpWVg1djJwZmY1OXZMUHpPaU5tRXhrSUJWRXM3UkUxM0lZWGJ6Q3dFdy91WWhrbTJGa0xaaUE9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "rE1g6e/1KgcISWNQibGJSWqY39fIlLW0wG6PaY8tPj0=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURKY0lVSVRaanFYbmlGcGYxUUlCRUlBN1hXa1VFa1VzM0RkRDBUNldoQ2twMmRDN25SRE9ucEZYS3E0RDVWMzd1UzZ6UWtld3piaVBRbU02b21ubmt1V0lwWXdyQXljaUk4akl6UjA9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "Ii2EFI5uNLWBEHyTda9+KMd6FJe5WoiGPosBdtFPABI=" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURENXc1blJwWjl1MU80Z1NId0lCRUlBN1l5Y1JFK0tJQ1R1Q1lSRXpUSFk4NExFdUJYZmR5T0F6SjVOa1hvaHZzbzc2WU1BQjArTkVvNm1CQkxOMWFPZHdyRkVXUWJtWUJteWt4Mm89AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "ymzwGBr64Ssl0voq4HWgne6kQUXrACTwS0ZyoZebsPM=" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "HUDWgAqIhfBwAaFjZabfDAeWAtI3A8ezikmik8R5NjsMDe1YqaRo+iZ/GHrhX8PO" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRUROTjBJRS80Y1F2ZFVET0VJUUlCRUlBN3lwTGdYVlJGS3pMbktQbW9vWWhuaTZCTGpwTmhEanMwY2xHZ0dhcXhscE5tZUpDMGVWT0hwbms4N1RTRmt5bllNNnZFSUh0aUQwcU1JbGM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "B": "RckR1Xxwyye6qKeyqJibwop/Vl9igtdY1HVFy7aKSg1cQDz/dZ2ja2vqaauEC3vGJ0PDh/QuKT50M/VmNpt0Dg==" + }, + "doubleSet": { + "B": "HRYNY8rrnf1bG78poir81vw5Ysf7zFN6GpVSeYrlaiXKEEutlGTv9XFjJNUBJwx6mdUJ7Mohq1zL0lDxcugSKw==" + }, + "byteArrayValue": { + "B": "wek+Pe9GW5sxIP8necYRjb7RJ+gPDcxzsokrZfCX1G8=" + }, + "intValue": { + "B": "TTDppst6s6EY1iam9uuce2DngA963n7OJ8mA7sqJS4E=" + }, + "stringSet": { + "B": "JT5jP4Lz+23ofyavj0hilbhi65W5uEh9F1A2N0Xo80JCZMbJb6rM53w5FOwXkUxPwfVPPJhN3qyT3jgR+JuUXw==" + }, + "doubleValue": { + "B": "kEJrOuSP5caPu/4c7WufpmZ8oZpoPdPjsOb2M7RCHd4=" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "QeN4uscVc+4qbZUiAks9JMbAudHwA0r7GQSCfmofOOU=" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURNbk9wQTJ2UVRLcmtLS3Uzd0lCRUlBN3NKaEFGNnU5MmZ1ejJSN2F4V1VmYXNRQjhxTzUrbEJoTGZoQk5NZkVvRld2VVNrK1ZhTS9lOTJrNlRubEh3SXhRNFpSNnlhRXZtWFV5Ykk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "HxDRQ38quspO149EFkFZWCiPAE3mUyuM2t5IFNs3xwY=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURNcUhpQlRzc1I5aldCWkFYZ0lCRUlBN3pkblF4SVQzQlFjVjAyVlRicWJEN1VyaGJkYWVMdjdoYTRoK1A2TW9ocjNjcXNpaVJ4OURmQ2k5M1FwZG9yZUlXVUJoR09OMm84NjQzc3M9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "VtM0QSOzR5Es/TPTa3AjMmYHXy6dk1noQYyiMQ/xbiw=" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIcmVWblF3MVdBRC9Ga1Z5d0lCRUlBN3N3a0o4dXRuNXNKOEdXRnNrL0N1dzJ6ci83eHpyL2pKcEt5K2tTZWg1cUVRSmJ6WTVrQ25RSXpLQXpuNW9QbW0zR09WSDUwRHh1ZE5wMk09AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "Pmgj931I+SMdqZ0L51QFo7KtyJoXEMuvQJFqNWJYSqU=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURDTGtFbENIOHRUSXRWNnM0Z0lCRUlBN2ZtaHRzY0lydUNSc1ArN2xGcFYxZlZ3WDAzUSt4V2pzUXd4L0N4Zi9Wd01pTnZkNlR2a3JxWFpXNHNwOXN6YzRkQ0FaYkF3ZC90WFY5enM9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "KXJCn95HwKvrtVS83pGmo4Ar0e8soJmhapq6F+JnR7o=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURDam0wSUNIbW5lOG1TdEp6UUlCRUlBN0gwblpmRmtVTWtpWjdqL1JtZUJiZTdDTGpBMk50cWhXSGhIYmcwSVpjcC9wMWhxMVArMVNQZjk1TVExQ0xrQ29nWmZFYlA0M1poOGhQb009AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "70IJrf42tAvfTTmRcVy8EMMZLtzfs/FFJXDeUSPHOqs=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURFd1duekd5N25qSDJ1WWM0Z0lCRUlBN20ya2NSYUlWTFFkblo4WlRNYjlNOEI5OStpbVNIYTRJY3ZUYVJqTUc4bmZxY0EySXZ0RHlLc1NNQThhemV6clpEcEN1dUcyOG4xVS9CdUk9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "*amzn-ddb-map-sig*": { + "B": "DrDiH4WP0beWbUUqTKuHAOq9lifGJPcyO1K45chJkLE=" + } + }, + { + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYta2V5AAAA4EFRRUJBSGhBODR3blhqRUpkQmJCQnlsUlVGY1paSzJqN3h3aDZVeUxvTDI4blErMEZBQUFBSDR3ZkFZSktvWklodmNOQVFjR29HOHdiUUlCQURCb0Jna3Foa2lHOXcwQkJ3RXdIZ1lKWUlaSUFXVURCQUV1TUJFRURIbi9JbTRzTUJ2OUtrcnJoZ0lCRUlBN3FTK2YzMkFlZnRWYTEzOWpOZzJtV1ZhY3VqMHduYWtGNnZOZnEydHAyMjBpN1RVSzZhYnpnWGNXbFRTQnQ2RUNGWUtWTGU1L1JKalg5eFU9AAAAD2F3cy1rbXMtZWMtYXR0cgAAAAYqa2V5cyoAAAAQYW16bi1kZGItZW52LWFsZwAAAAdBRVMvMjU2AAAAEGFtem4tZGRiLXNpZy1hbGcAAAAOSG1hY1NIQTI1Ni8yNTYAAAARYW16bi1kZGItd3JhcC1hbGcAAAADa21zAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "intSet": { + "B": "xg5UKrtqhXgskeHlZfOHZ/i6brTno1EVtOkrp41mYgHHE5l5thbRv54se4idk6LAS7NQFPVeo8BxK1LHGC+pRQ==" + }, + "byteArrayValue": { + "B": "qjBTlgKf30lw90GQgndc5rTsqXeohitptYJMlNSdl9c=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "Lf+u/7I/4dNMj7hQQLwwe3FfRetLh83vKkKjJDoxv+vci7DuePL/s7Q9y0sJpt+rjmKt5grqtxk2NFz2kAZI5Q==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "dUOYJLyGg6+0iwHFzu8gr5hIRIPbQJavvxPLwhAM6iw=" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-aes-hmac-2.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-aes-hmac-2.json new file mode 100644 index 00000000..4cd8b30f --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-aes-hmac-2.json @@ -0,0 +1,33 @@ +{ + "metastore": [ + { + "N": { + "S": "materialName" + }, + "V": { + "N": "0" + }, + "t": { + "B": "u/m1JEvU36YBaRyqjUi/9XF6iaxBrmTW/Ta2vTCQD9c=" + }, + "encAlg": { + "B": "CzmDPsshipn9Uj+D9w4gDYDE0TF175l+TEu5VmH8zk8=" + }, + "enc": { + "B": "mnKFr2Ec4oJRSJdBOZfEd8lLVrC5KhkTgGiVT2hk+UDswPi5HV0l205l2lHialmvwpmFNKaUYEYo4Ceeg08W0A==" + }, + "intAlg": { + "B": "V4kF2DsNjy4/1wbCo16sksDie5botukvkzJMqlJ3iO4ULeSBc9KjtC3xPBGZEzF/" + }, + "int": { + "B": "qGNnZkEjDmMtQuu4fqnJ+GD+1+v53vzW4GCcS3lpbhWuOMGyKoqZ63pSSKX3u3C7FwvCqh279G43kY6lKRQivw==" + }, + "*amzn-ddb-map-sig*": { + "B": "tXbeYVfF9NnJnenfnYzTOUd58LIBLY/kqmZt9Ra5xLk=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-aws-kms-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-aws-kms-1.json new file mode 100644 index 00000000..e6ec4cbb --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-aws-kms-1.json @@ -0,0 +1,33 @@ +{ + "metastore": [ + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAOBBUUVCQUhoQTg0d25YakVKZEJiQkJ5bFJVRmNaWksyajd4d2g2VXlMb0wyOG5RKzBGQUFBQUg0d2ZBWUpLb1pJaHZjTkFRY0dvRzh3YlFJQkFEQm9CZ2txaGtpRzl3MEJCd0V3SGdZSllJWklBV1VEQkFFdU1CRUVERnVzbFhTSEdSalYvZ0tVUkFJQkVJQTdqQmFFS3ZwUFg0R3JiMGZtREkxYkpHVXNtV2lwQVJVcGhNcjJhb2JtajhkcFF4cFpwcTh2S1FWaWFVVEovN0s3YlRkejIyeHpvOG16Y3lnPQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1zaWctYWxnAAAADkhtYWNTSEEyNTYvMjU2AAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAA2ttcwAAAA9hd3Mta21zLWVjLWF0dHIAAAAGKmtleXMq" + }, + "t": { + "B": "xckQnYGs0m/hcMa8NXZm8b6ALjFwHnXUGW2MmSYUFgw=" + }, + "V": { + "N": "0" + }, + "encAlg": { + "B": "6gOxsW9IdpzvoDmqE9Q0HUbjJjVcNw+rwXZ0ewvw2Ac=" + }, + "enc": { + "B": "EV+qvAvB3HlXRSmkLmrLkDtXysFPRjaSBneRWB68pjlzjlaTQgZcXT6ocro9xkcj5q/uByiy5+UZk1lfkLD5hQ==" + }, + "intAlg": { + "B": "r7F5AKlagMQ1CxdTxtz3ACde3LO+JpzRDcYbS2aNEfoGXCU4XDwCADXmXx6i07sI" + }, + "*amzn-ddb-map-sig*": { + "B": "LPOagzisLozwyUORpEmeyTjVHFCbyoiTftrq1UqTfcs=" + }, + "int": { + "B": "0DmuUIf/X/zxawA3VrHtbK7FLh/4f63SOW/O/EGDqh8KSE51jLdggHuc3i9FWquxeTPEL5BVov8QF0vVRgVkaA==" + }, + "N": { + "S": "materialName" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-data-tables-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-data-tables-1.json new file mode 100644 index 00000000..19923ca0 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-data-tables-1.json @@ -0,0 +1,351 @@ +{ + "HashKeyOnly": [ + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAODNvNHkzTTB3UUFCRXl1UXN0SFVQUGF1NkpPMUhiNk1OWGxXQW5aWDhYdmFYTlUwNUluTFUxZz09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAODlZdEVSWXVDT3A4MHlKVnJOYytYREFoaVN6UHdlRnNJQk1YRXMxSEQ2eGdvdmYveldabmMrQT09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + } + }, + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEw2YkExbWszYTZxek1YNUkyMkYyYzRvU0FmZ2VZdCtjQmtFYndDTzhYUzlkL0ZqV20wekpZUT09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + } + } + ], + "TableName": [ + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEpKNDk2UGRpcDViOHlldTVxbEE0STNOUjFTVHdtZEd2REJwQWowNXprUmN0OFh6T3E1TmRJZz09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHNVQzNEekp5Tk1tZ3ZUSE1EVnh2Sng1OCtDT1h0UStwRzR4ZlVQL0pJTkRHOGI1M00wOFRBZz09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "1" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEZGdjVQNjAxZzF0eXhoaDhxQmlCdDB1d2JoODlRaDdyeTcxL2lJdWxvSWNvQzFBV3JHczhtdz09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "5" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHJ3OU5qdU53dkhENTZPTmlqWC9nbUlGZ051ZDk3OS94QXhlaTVjbmdJbmxhajdpSVg0RDdadz09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + } + }, + { + "rangeKey": { + "N": "7" + }, + "hashKey": { + "N": "5" + }, + "stringValue": { + "B": "MyVrAzOuKFS+hAiVq0jlmIJcwMP2w62LdWChncBN0q0HMB3WpADYK2BF1q+oQP83" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHlUK09JWlpaWkE5VmU0dTdwRE1zNG9TUVZTNlFYZEFmQjZkVjlMMUg4QzBrRXliQ0Nad0JRQT09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "intSet": { + "B": "0iLxGtvyDaUNXY1iYwcDlZX3zIs+QOMsBQ+RbX6YlAgFdMK/k57OXPH3jMIptzkNAKNWFea+NAz+AXFd2jPC8w==" + }, + "doubleSet": { + "B": "0nazy+tnY85GZpSANJzBLXZHPKzCvN4ggpopjujfAOO37wDi6zrSwhurLpjFIJGR27pn5azaroZWYA8GLfiGIw==" + }, + "byteArrayValue": { + "B": "w9sfXioZCE9luCt4qiOixyRJVlJ6zbTwFoFg0wQNJbA=" + }, + "stringSet": { + "B": "8057NGIAJADqX/KzkjZl7XzFMI/6j7vAbp5F83tZjOQhguhp8hheXAzcsrCmM6sME1oGEmJEran4Svs1qT5ChA==" + }, + "intValue": { + "B": "LFHv7oLor2SoKypi/gubI0IsipoLd/I20qPr2wHOgOs=" + }, + "doubleValue": { + "B": "uq8MBbPKDskxhyJ6VCmd9EC6+tD3EuiqhgFUpxckzdk=" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "FhpaX3jXqz+Pg4QETqcNBULC+OBOTkux2BFGCdnr5PY=" + } + }, + { + "rangeKey": { + "N": "10" + }, + "hashKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAODRhOGRFc01ybDR6ODlVM1RkOWh4L0J2cms4cVZEODlOaklkMnU0d2NGSnBxbUVkc1lka2ZXZz09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "intValue": { + "N": "123" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "5NHNzCBtZcVAUlz1ymLB7Ta+1n3VjffLj5WniFA9afo=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "7" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOE55eTdqK3FkNEJMNzV2MTlnRHdHVHdtTGgrbmlMaER0cjdaL3ZZMVFmQTFEQmE5Y0JGdzIxdz09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + } + }, + { + "rangeKey": { + "N": "9" + }, + "hashKey": { + "N": "7" + }, + "stringValue": { + "S": "Hello world!" + }, + "intSet": { + "NS": [ + "0", + "1", + "15", + "10", + "200" + ] + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "?", + "Cruel", + "Goodbye", + "World" + ] + }, + "intValue": { + "N": "123" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + } + }, + { + "rangeKey": { + "N": "1" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOGcrY1NpV2I3eWZYZ2pQS2gzOVM0anBZZWFNeEhHRG90c2JCOG5sQkp3ei9vclBRQzhOZFNxdz09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOHlKa2M4OW9HNEpoajhyazlEQnpVeEQ1cForN1Q4Z2pQUEU1TE9uVDhvd2tJWDJ6bGFpdUJKQT09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + } + }, + { + "rangeKey": { + "N": "3" + }, + "hashKey": { + "N": "0" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOG9kQ2hPVmtiYkN3S3V3VHYrVjYvelNwcnZIUWVhWlpqaDZvU3JzMHV4T255bFQzSUZ0TjVVZz09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + } + }, + { + "rangeKey": { + "N": "2" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEJLV0Z2T0hRVUxCMTcxTW56dkQrVVYyMVpmTUxhSXl4QjB3ekdZbStzY2VFd2pNekgxTFhVQT09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + } + }, + { + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "hashKey": { + "N": "6" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAA0FFUwAAABBhbXpuLWRkYi1lbnYta2V5AAAAOEdncWp2Q3JaYzhZL2RrMGxmQlk5K09tbWNXUWIvbjVYMW01YTNBcElZb3JLVzU0RVhRYTgrZz09AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAAEm15IG1hdGVyaWFsIG5hbWUjNQAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + }, + "doubleSet": { + "NS": [ + "-3", + "-34.2", + "0", + "15", + "7.6" + ] + }, + "intSet": { + "B": "eBhcgBr8TocxVsTw8tJtcAK2VKFOkoZlWBUusFNtKbTulghzdpT3iTMqIJB86ViXXguO43XqMZWs1U3G/IaF+g==" + }, + "byteArrayValue": { + "B": "Y3ciZfN54gf86a4mxRfon9CgzQkNIxrtWV8s6tg/6G0=" + }, + "intValue": { + "N": "123" + }, + "stringSet": { + "B": "RhykbS8bqGEd2LEGtLV0S6Pj+4KjuVc15ExkUmlCKlClAgNpukA5Tp0FjU/XL0Qli4v6apZaraKgBC1l4YlRDg==" + }, + "doubleValue": { + "N": "15" + }, + "version": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "mC10Qiw1c/P8Bab4SaP3kmsPMBVfOZKjZ3SgvXyd3Vg=" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-data-tables-2.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-data-tables-2.json new file mode 100644 index 00000000..e4232034 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-data-tables-2.json @@ -0,0 +1,351 @@ +{ + "TableName": [ + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "yr8UquqQkmBuLAB1qCkuar3ub2QLP0KArLhbR9DXSoQ=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhXRWdXUXU3d0ZQWmFQRjZXQWlsaDJlVFN1N3hDSlNudklQanA1aGY1dEgwQWhLdUs2a1JRUmc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "Y1NL9VJS7iCDkXArCaxvmtSndPep5/lAWF2mGmnvGV0=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhPVlo3b3lhMXdWOCs4aWk0UXFZbEJNUDVjVkFEcENxd1htYWpBR2JheHJBeWNEN3FtbW5Ta0E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "padm4+8N5MA3ep0jujTh8UZJEPKAwU+nfquAE96B2cU=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhhSDZIWjBNdWdGVzVjSk1KV0tzaktCNXZMaTNVWWlZMDFBTXltajVIR2MzVGMzR2p0QVI2d1E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "WlwmwOeVWgau5xvY7v9IOjYMzZUfKBHomDBZ4oSe1X4=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhMa2tXUzUvelc5UlNxZmYvSGRtVzMxWHJtbnNHK05zZXptWEU2QzBVVW1EN2s4cTZHMVc2R0E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "LFvhzi8GUpnnrS6LK7hhWc+L83qqupmXlc1EyGghdxM=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADh2Qzc0TG91R3g4MWtBQlNacWdjdFdCVWppTmNGbkRLYnlSYmhsNXpNajBkQjhUS0xpalgzOVE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "aYKMBSlTe10uetV1TZwB6MX0DJysKQKaozQDjKd0X7Y=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADgwQmQ5NVFndHV5V1pTVE9rSUtqNVZqeGRhdkRGbmdPRkluR1dBMkoyWmh4NnozKzZXcmtERnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "XMF6XUi9eA9VfHrZJ+o3c55GbMMOcky7tK9o1AUHDqo=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhnbk01SXc0YlU5YldOUExKYVN6MVVEWWprcTNaRzNNSTBQdi8wdzBQalIxZ0Q5YzFjbk9KR3c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "zWUNLDBAyKToF1MWvDwenFgTwbElzdmzofyLIv7fUCA=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhwS25sUjl3V3FKd2Y3eG9NTE5uek1JbXBSUE0xVW1ROTF5SU41S2xYdWRVL3VxMXhaSlpBVWc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "BW7L9FIASuOJh+ArRUgm5JqjeausxEM1VptvCCJaYK4=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhwbFA4TzY2Tko1VmRkeWFoTFQ5Nld5cTdpczgvSWhNNE9XWXVQK1UzSGxQK1hJMUJ2Ty93T2c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "7" + }, + "stringValue": { + "B": "2m/PtRBHZld5bOijBufU9Yhtz6kPnQgLiwMldYDlL/+UQy55ze21ECF124W+3VG/" + }, + "intValue": { + "B": "S7CGq2V848mj9t6vLJtHqkVlgbvD/gv0ue1NedcVGFk=" + }, + "byteArrayValue": { + "B": "R2cAqYzoWsD4F1PLjn5XxjGpzPYWqZ45Gyg1Ts54lkI=" + }, + "stringSet": { + "B": "HVCflAfoXVz2bDf6DiZrCNB5JPqA54OUj8YMIpKl/foJiVvAFIc7KI8SiWiO/VQNi8r3uuhuVBTeAxGfyIpQrQ==" + }, + "intSet": { + "B": "WVYj9ixjkPmzd/+Hk40YFvNHTqjj763FhfKTkgBKBhKxLSkgQ3GXV7J7txQa1hQdocsmp5mSgooOVFrf5FxGbA==" + }, + "version": { + "N": "0" + }, + "doubleValue": { + "B": "693iav14xFlrQtJpWL939R9wDb3gLOOytYkrlzXqWJ4=" + }, + "doubleSet": { + "B": "2funQxKXrAeeMbM42tYH9arEuG68jO3xdPJUBnSVg7V1vckHv0ORxwePPjIlm98HisKu/Xg9hcdXiYXcEG3U+A==" + }, + "*amzn-ddb-map-sig*": { + "B": "6DyzuQrhK3S6hZqCBeut3vBvkvDoRTEn6VMHkgCtShM=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhWS0s4dkgzdlMwSXE2WFZkQk5SamtaY1lXc0tPMUh0bFNIaStqbWw3TmhLM1JaRGxGK0pmdnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "NJ5uM5YwKKsAI0cCeOLuGhvCsju1rVEH7b9w2okKUXk=" + }, + "stringSet": { + "B": "HntaizOyp5h8P9/C1W2BRUEwxVcU3J4oAPjIcewqHLSHClPZFHhEIrwBtInZZCs5i+8/NT+OwCcmLoN8MClEsQ==" + }, + "intSet": { + "B": "2YtyyxWhN0MfUYlv3a8Jd/iByoO1I0ZVvVfwNH90I/CG9lM8Nt36DK8NnlbudzuZUJrwLHGaf3fB3nlXL9nEbA==" + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "0Fzg0v7LspwKtUgYFO2OWsAtvtAAqpqL8kQYDucOxVk=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhmWlkzd2syZTBSUUdRV1FFSkFiOHFlNk50azhpQVVZNVlUWEtlbWR4VFZ4MnozRDVXUHkySVE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "8" + }, + "rangeKey": { + "N": "10" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "XHMY3nODBgrVRI4zojT+wD+AIEHAT5S4SAcipAaq/1I=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADg0VG91R2pyRkZDK2VqdHFiQkhMWUljQ0tLVkN2SjZ1cXFzRWtjK05LRlNFd1BUMjZuZitxanc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "9" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-sig*": { + "B": "64ZrwNUQOv1IQQr9XmJpK3fY9trDOCN0+XamLDrkQF4=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADh1cmdzenBCWE45eEZMS2VFdkU4Tnl3MktUMFgyZzZrdG15MUd3RmdYZnBtOThEZksyczFNN1E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-sig*": { + "B": "wK5O5F3ZC5HJsO9CZlVRb+0ACmf5/pII2H0T22l0TkQ=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhRU01HSDFxVEg3aU81WTJpbmNxcW9IY2xTczlTY05reUNZQW5sdGk0WGFqVWE2TW1aanA2Z3c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-sig*": { + "B": "sKvYUs4hBWiUDiB/AqeX5MLEInfBOvhewYVNsY21Ibc=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhCTXREd0cxUURnZW5PdEUxWFpnYlZ2aUNUQkxPYjF6NE05Zm1ndXV5SVlXUmFqRUkrWWJUZUE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-data-tables-3.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-data-tables-3.json new file mode 100644 index 00000000..4570201b --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-data-tables-3.json @@ -0,0 +1,351 @@ +{ + "TableName": [ + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhBWCtFc2Z0Sk5EcmVobVpXY2hjM0Z4dCtnTU9qY0wvQ3JuSlpmM2dxQjNTRXhuL2YyUG1uTHc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "patQSf8408/nh7iovY8fNTwsXOi1gojeguDwboKtrg0=" + }, + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhnNE9ONmt2cnBTc3ZHQzlqSDAzdC93cEk4TXY3WXF1SVVBR285U2xJVzFNaENXNDAvZUlnbFE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "RjaY42qSHv3YPgAPoARvWPMgVHtbifjJoy4PJKjm6Ww=" + }, + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhWT1E1KzJuc3EwVjVZM3h2NUJkL2p3NXhBdTZIODE1NUMyU1BRdGFIc0Z6Y1ZrajUxYW5teFE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "7ocWJlBMnPxxVpQWs69k/ksJhLKdbReGBBlXS9DnXHE=" + }, + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhncmF5L1pTOHlYZnRoOHBSN2Q1RlNwSVFyMU82ZUpPTTlrQlRNeTY0SGJJeFJHL0JWcjA5Mnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "TgbERvBi/sndYK1bJNMbOJAH/kbsqK1Fwf03uAVP9gs=" + }, + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhTQU1BYkpjbXlsMVhVKzYrR1hjNEVBYkRHKzMvTzZITXltSXZwUnM1ZGZkcS82TUZwaVNwVnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "nVMtcoWexGe1u4jH1BLiPaa44VFc7bwX3IuHUOdwSnQ=" + }, + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhHQndPbzdBS1ZPWnc3cVgzSEs4R2lpZGlOMUJreGQ2Q3FwbXA1ZUo4aldua2VyS29QY2JZWXc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "P7v/55iUiZ2oF0pbG3knvFuqbI881HJUGF4MTcNmSa8=" + }, + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "3" + } + }, + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhWa2Q5bVFoNEJSVHBZZ3BmSC9vWU91alV3azJ6QWJENVpJSnNuZUpFV2MySkVyTmIwb1ZsMGc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "KHYUCvUSUUbgmmIj1n85EW6RDo3tG/X/ST0c+/k+1oA=" + }, + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "1" + } + }, + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADg5OUtMd2dPa3liOWpJZnhoSW9JUHJQQ2tMbVFMb0ZHS2Y5Rm9SR3R0Ynh5Q09kaEVGQVpQdUE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "SjFw4v2xD+v3nFS+XiGrlHPeUXOGnFoCvyexxZTbOpM=" + }, + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "2" + } + }, + { + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADgyYkl1ZFM3ZURhSGhOZjBWeWZvUWVISllWTFhtZEZlMG1wMWVmSjU3clYzZlRHdThEc1ltN1E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "X7+Fh3VPkc+SahdC0x546frixpWPRwpq2UHVJUBXSYQ=" + }, + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "3" + } + }, + { + "stringSet": { + "B": "cCEXagNzpI2ksM6PM+65shrf1v1JUHJ6c7+2sGeFdq+pIvJpLqTzRnu8WjEznfBqv3xhJEbxprOyi+SYkJFeWA==" + }, + "version": { + "N": "0" + }, + "doubleValue": { + "B": "g2FDP9M6izhD67LaDU81u1jAnu9ooJ1yfLtdO5tB+rE=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhzSGlVY3A2UG9mMTRKQysrNkREQjJNenJxZStzbnQwQ0ZxZVh4K05YMlNoVURaYm9pUW5HNFE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "intSet": { + "B": "sUqnJtUrvXbcvz55lB5ehtTSTRiI91BSFeqSDBdCRsIh/t++fWF1WKDkzH8cSp8PlVv0hDjVDxOCOLzvFL+/wQ==" + }, + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "7" + }, + "intValue": { + "B": "s435n+BqtYFaT+LBV8JlEu94tw+vZCNw0r0PFg832Es=" + }, + "stringValue": { + "B": "FMSMbSa1U4THjjdoQbmf/ejRFC5SwjZh5ne8ISTLvbMA2gv3t/ocPdSmRJx+ZgTA" + }, + "*amzn-ddb-map-sig*": { + "B": "Wwid7rjDBN/OEdwJXdYQggrWsWgny4rj3sotITy1gO8=" + }, + "doubleSet": { + "B": "89OVKDKvVmC/9FuqAoV9sH7n2XavO7caLhFDGyATLS82HvBN/yqnG5a4Z9HC2LLnWIHZ/EEHXbuFpLwSQyEVYQ==" + }, + "byteArrayValue": { + "B": "/QnK3Uf0dqqy/k0XvbN2r+bwleQ72LaRlFbCRLfqdXI=" + } + }, + { + "stringSet": { + "B": "LmalJH2qTi49KVAAaqx47bew+JY+MfwKNhmgVHEKbio0dBlIPIZwpKeGhfv5I09qVcxTCjlx5laAnyEheB+zVw==" + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhyVjBWSnJWbElrdzQ3aWlVTmVxaVp3NVdQRitJTDVUWU9qNGszS1hrOUdpS2FWcGJZYXBGaEE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "intSet": { + "B": "oOk8Za+uN/XCXTfPYBUJKUPMib+pwCY1GufVQCHwhMnKlQoA79rYcnnqtrgCzfoW+QVndCMVTXbbCFVDsmJ2yQ==" + }, + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "8" + }, + "intValue": { + "N": "123" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-sig*": { + "B": "+kL7eYSJOUHBglrdWdt3sAwF1Mfi6lHgeF31EOUKVLU=" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "byteArrayValue": { + "B": "fPWeB4Mo0BVxcX8XyeO1/lrnhdekP5tRNtgQDqqUsuI=" + } + }, + { + "stringSet": { + "SS": [ + "Cruel", + "?", + "Goodbye", + "World" + ] + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhGZnlDczZYOVhSQzBZWHVEcldkYnVlSXpzTk9DbFQyQVlKRExoQU9OZ2hWSzVPTS8xSC9RSlE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "hashKey": { + "N": "8" + }, + "rangeKey": { + "N": "10" + }, + "intValue": { + "N": "123" + }, + "stringValue": { + "S": "Hello world!" + }, + "*amzn-ddb-map-sig*": { + "B": "iwoTHsgrNMTghGfzBdrApVGeWw/sRDdDguonPCB7ZJs=" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + } + }, + { + "stringSet": { + "SS": [ + "Cruel", + "?", + "Goodbye", + "World" + ] + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "9" + }, + "intValue": { + "N": "123" + }, + "stringValue": { + "S": "Hello world!" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "byteArrayValue": { + "B": "AAECAwQF" + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhNYmo2ZUJxeCs3NzVLK1VLYkZxelJYZlBFU1NBREpvWmp0OWRlaW94VFBJZWlHT1FxWEZidFE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "7DxP2MLNG0IYzARd2kvDXSvmQLLIljcIyW9r4bz1FKE=" + } + }, + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhGR3ZkZWlrcG5TUmJCMDlldkNyR2xmQmJZb2VyVGpkbDVRUHdjMkxxQjVIVXAyRkU2dTB6eGc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "ZIUqKUBgkfbnUgIh+igoVbL3bIFqHdhmW+h/FeKxz7s=" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhKV09GU0RoTFdUUHVueUcrM1VjOHVweEZwYXRWdGVpMkJTcW9EUnorUXZDcThFSlRCMXpEQmc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABBhbXpuLWRkYi1tZXRhLWlkAAAADm1hdGVyaWFsTmFtZSMwAAAAEWFtem4tZGRiLXdyYXAtYWxnAAAAB0FFU1dyYXA=" + }, + "*amzn-ddb-map-sig*": { + "B": "MRhy6QmKZej76A04XJ553rHdAGFxalYQ0RNUD8mZEug=" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-rsa-rsa-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-rsa-rsa-1.json new file mode 100644 index 00000000..f2a84c34 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/metastore-rsa-rsa-1.json @@ -0,0 +1,33 @@ +{ + "MetaTable": [ + { + "N": { + "S": "my material name" + }, + "V": { + "N": "5" + }, + "t": { + "B": "WWJ3Vz3c9h3jh9mgm2SeCG50AKNjck17jOqh+Ck3YYk=" + }, + "encAlg": { + "B": "+IzZN4S+D8IWe5owaeFdcIdg5/OLjcSlVXdMpPzKwKc=" + }, + "intAlg": { + "B": "NN6CBzgosLeAualiFggqd1XMzwI9jBMFaLP/b/tytooUeTL3M0eHELRp57mQazDe" + }, + "enc": { + "B": "MRP1Q6ptICi0stBWyjTpM5stvMw14it5ohM/zPgx9XbeDYVRoPgmTDkBVVA1dQDZ" + }, + "int": { + "B": "q/PhRAvCb/0XXC7Z4XYy72fYrLIWdEjqtAQm6dZK0fg=" + }, + "*amzn-ddb-map-sig*": { + "B": "oRo6E5S0vTY1ZjSPHBqB6JowBIjDKt7BTJt6xEjxgYykbpx+oq87YfDVy4P8sV/n09t8MqMHpKSxxJ8AhzKbkAe7QVLx7nGYrsBKPC3Q9y6MdWz2kpvTAFC2Q+fxj6PGyZFDeq2cip1bWmiP5Q+JkkgiS5lG6WpWgmuQTie1lklubcPGJqrnCsaG7SSPNMUc4KrhA54sv3TZXvJdPjgrjhMIiqDfYzRMle1IZcAJNyvSmJ03T9iSxFTPeqhtmFldn4DhWC3qwdlqaQQofiowiCpgcknNGBqlKwoL2ZDP6MuUKiW+Tll9nGzB2W00cmPyN/ZoX69fHLXxG2Gd/h3hgQ==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhEN2h3R1F3ckwxV1NVNmtTZTlvdXA3MEM3Sk0zNFZPaTlmMnlWVTJ4VE9kYWdrQ3Avczk2VFdxSmEvOWtVejEwRGcxdWxpVGtnY0llTEJNQ1JuK1hHRTg4SFovVVRCMzVMWkx5YklwY1JrL0hhelQ1U1ZQV1JaK2hWSjlhUWxUaHBocThoYWxPOTJ2WkN2RXA5YVcwRzRncXZObVhUenJoZm9MYU1LdCtPYXNCb0o1aWpaLzFYRDdGaVlMLzBCZ2hDdDlyL2pzU2NpdysweXdYNjZXZ3pVZDVGZmNIaVpYYUtENmVQd1pxOFlrc1lOS3V4NU1MNUZPcWxDd2ZjMUZiQUE0dXFZNDdrTWJzYjZ5SkVoMThzU3lTY3ZGOE9nZjNDQURGbzFRY1g2WjFxQ2Q0REl0SEhRRzZDcExiU0liSkFGaDJyOEJ4NVRKRklJR2ZXMmNxN1E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + } + ] +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/static-aes-hmac-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/static-aes-hmac-1.json new file mode 100644 index 00000000..08c55255 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/static-aes-hmac-1.json @@ -0,0 +1,309 @@ +{ + "TableName": [ + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "7" + }, + "stringValue": { + "B": "e5lctO/PbxWTduoSqTWAWOMaM24lSVvNWQzvOfFAh6VSNNdqIY+XxsY/WbL9IfbF" + }, + "intValue": { + "B": "GTbk11b6YbU7K4yi2cVE+cR34K0/eqoPuypT97+rFCw=" + }, + "byteArrayValue": { + "B": "/9yXPEyorQQ5M/VBK3BZ/W+uwKBCvMD/dxmyMdr21Hc=" + }, + "stringSet": { + "B": "6RVIQd0/RXNdo97+PlTL20uRyyakNiwCBdcKEmHUp5TGGI9kS4aqvtMuiRpB7x28HcCTbT39r7qzloF1BzKiYw==" + }, + "intSet": { + "B": "pQ9DlasQ8nkmlA//FQDkVamA03WSKAMmzJl0oOJgI2z3HwZPfCF0heCHhVEccXPL076IzHQWJ5HEJwPU21OPEg==" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "8l75kPvGZoh5sClJhCxo6uNZnunpkV/786ST0nZSy8o=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "Ict1/SQo6BCsToU2U2Qb+xAP9fVPhq6gJtGh2MGydoU=" + }, + "stringSet": { + "B": "Vo4Jx5ld0sGpY2vynd0wmcrMVYVVvM2sagS98RK28qeR0sYAfBDFxGjwpq9PJ5rFMkOdvuXC0DwsOdI7XVjVgw==" + }, + "intSet": { + "B": "DgbhQJugigIydrJ7WMP3VsQ50LrPXrQxNwXFxADNdvQwpxwRiOBnEkpj6HUyBO1xL6o7UcgS+uzeKirnhnVNZQ==" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "r59WKapakjODC9+mvv2K4QNA2SekUzHiyvjF3L4fCgg=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "8" + }, + "rangeKey": { + "N": "10" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "iJB/ywgExEv5yRYoBC0NDvSMYfm3S/BSDiANtCC55WI=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "9" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/static-aes-hmac-2.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/static-aes-hmac-2.json new file mode 100644 index 00000000..f421c194 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/static-aes-hmac-2.json @@ -0,0 +1,309 @@ +{ + "TableName": [ + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "7" + }, + "stringValue": { + "B": "Xjt8fOZMxccqpGzv7D3CmS6J466jp2SVBreKsqRCoTFiD0jLFVn7HQKbD++yqDv2" + }, + "intValue": { + "B": "IS8aMzQcRWp70/nMNKAEoEoc7ss8aQQXOCbrSyYEZU4=" + }, + "byteArrayValue": { + "B": "hHZrOO/Opyscj8JtC9WeUjJbmrn+N4O+8Paou67wG5M=" + }, + "stringSet": { + "B": "MRCoEiKgcpeCzbVrSlW2zLrS5yU1YC/4FfcTHGX0PJCsDHF6deicQ450COPO3kx67r/wQWukTp4cUqlwQBMZmw==" + }, + "intSet": { + "B": "ZIviQMZTGdZK/7nzL/+57LDy1G9u8e0aicv0LW80PfCNEHmzNMfHGZDRAT8Hc2my+57w4rWkL/7IavgYScTy5A==" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "95tZx4dgKMzsvwT791n4PbanPT/GqjqXa5eSiKvyrfA=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAgf8l9TZN4TcHEE3pY68bUojodSSqpwW5ipY95KsRM=" + }, + "stringSet": { + "B": "LO0pk2J1K+0i2wGG2De8rAAf7i8Z6fxrHhcTF7Lz6AMaGg2v2nLG2bBXorsdLvtlNd4ADN3a2CQzDsclJhdjVg==" + }, + "intSet": { + "B": "84Y1tCekbZrBDZ3BpCDDTVYGjVbhO0f1IwjiVVPmk3vboICU/0kN6IIZWqWepuM2rHWua5Nj0m425cEp8ghGCA==" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "TBDWKljjkEn2EXlFoxSv5TXcfvJiKhTkh7JGKLEUq3g=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "8" + }, + "rangeKey": { + "N": "10" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "iJB/ywgExEv5yRYoBC0NDvSMYfm3S/BSDiANtCC55WI=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "9" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/static-aes-hmac-3.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/static-aes-hmac-3.json new file mode 100644 index 00000000..6f0cce2f --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/static-aes-hmac-3.json @@ -0,0 +1,351 @@ +{ + "TableName": [ + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "7" + }, + "stringValue": { + "B": "RoJtSaOHUdKzoIV4irnALX1JdP7CUdxbprtN07WSKV2JQlKxPBHkb0Z9Vr9W/b3+" + }, + "intValue": { + "B": "M1JVoRauLI33Pmb2Gxo/pcob88xQ8DY5g0n4120E0qY=" + }, + "byteArrayValue": { + "B": "VaM8X8e40SC5zbgF5XSgLVBOqLG+DITvmekCO9pcQP0=" + }, + "stringSet": { + "B": "KXkPYrl3hVpg9kpCj8eCxJ3l0YXr6hYTjlDBfS25AgGnHVqyifncXhiazwXbjBv58qbyG1Hww6oB0vXnDoMS1g==" + }, + "intSet": { + "B": "GWbC3jYBDwEUnZcCedHem8KHACP7Ksx97C0llMNdoknWLgEkffKpK+lNco5u1VJM+R08Bo93UGClVi6UJKl92Q==" + }, + "version": { + "N": "0" + }, + "doubleValue": { + "B": "M0U8mNSticpMtAl8JjkiIQykVRMn4imACrTywM8dVBo=" + }, + "doubleSet": { + "B": "lNtt0irLSa3P3Qj+LfyXglICLf/X3A4X/b1fCz8FvTJxGeZ7rNRAPEQhxIZ2AZr/u86wyBzrE9KiGz9XzWl3Pg==" + }, + "*amzn-ddb-map-sig*": { + "B": "qo2yPygNqjrueDrd5tPYk3TTvq52yBeN/hSp90+o+pA=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "pZNNn/wTbb4bqbssc11RCGzkm+osenSjXtkLN9nNbao=" + }, + "stringSet": { + "B": "ONVKDXcs/8LHxcSynOf5TQGApkUnAfCJYI8MReA4mkYKgUpTvtNIFl2VqJDEGQPQMXPjiAMavQq4TK3mEeK9Sg==" + }, + "intSet": { + "B": "ZHuTJNu0tLqGkjc+1I1Uuumk+qh2nFuC93R1kWnrmBD1/hv0OpMIypMfiKP/vFgwhuZlP+IApuIJ05M9M2Lr7Q==" + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "fXnLByVr4FODcO2Ui1qUfSKbUZcT8IHIRBCS5xPUjqw=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "8" + }, + "rangeKey": { + "N": "10" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "RBAsheB0kh7XA4EPlHGJFTaq5p08xJg+8YX/O6iC+7Y=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "9" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZw==" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-aes-hmac-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-aes-hmac-1.json new file mode 100644 index 00000000..24653e71 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-aes-hmac-1.json @@ -0,0 +1,351 @@ +{ + "TableName": [ + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "lBLoUXuc8TgsJJlItgBh6PJ1YVk52nvQE9aErEB8jK8=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhESGl3ZURoVE5oRWhSeXN4ZFpRcVlVVTRRQVFqYjRTMFA5ZW5mY0MycGphbTZYSDJUbURsSnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "cjd91WBBFWPnrJxIJ2p2hnXFVCemgYw0HqRWcnoQcq4=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhIQVBKQ3NOTWIwMXFQd3A2NEQrbVM0TjhNREFkZ1V6aGpJeCtmMmxsc1RHek15T1hmSGtVVWc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "uXZKvYmUgZEOunUJctXpkvqhrgUoK1eLi8JpvlRozTI=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhFcyszanVJSXYxc1d5c1Z1WUl6MDZ1OE9tTis1UXh3UkV3Q1hMazZuMVZmalFYODBaUTYxMWc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "yT2ehLcx/a609Ez6laLkTAqCtp0IYzzKV8Amv8jdQMw=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhVd29HM2RrR0JCV1IvYnFBTDBZalJ5VTRuUE0rVk9oam9wQlZ0cDFXa2lnVjFVTzFiV2VqTkE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "YAai32/7MVrGjSzgcVxkFDqU+G9HcmuiNSWZHcnvfjg=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhyRkZiUDJNQWRsZ0RxRGRDN2VuSmtIOTFpQVRhc3ZXT3kxVEExMTZJR3hXSHlwZ21rYW51elE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "0iwjbBLCdtSosmDTDYzKxu3Q5qda0Ok9q3VbIJczBV0=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADh1Mm9xMUNnUjJZMllkY0x1MG5LbnF6dC8xOXBPckxEVWYvcCtPTGVtKzdPcGxUb3p1VkljTVE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "Gl1jMNLZl/B70Hz2B4K4K46kir+hE6AeX8azZfFi8GA=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhJcWZBUW8vZmhmdmFkRFowbjcwSlp5TDV0MjRBR01yMDNXd1djVXFrWFpRM3V6VTYxVmtFN1E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "66Vz0G8nOQzlvIpImXSkl+nmCpTYeRy8mAF4qgGgMw0=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADh4aUM5QTFtMStXNE9yVzJXeTMvR3dubHRNdTVDMmxQanc4MytWM2s5RWpGRm9Yd0g2NE1taFE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "cSTe0npOBBtsxSN4F9mLF2WTyCN1+1owsVoGkYumiZQ=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhGVmU5N2o4TVJaQk9ITlp6MW5KNkQwNUIrKzdIc0V2MTY0emV2OG90Q0FDZkx1RVNZbDc0V0E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "7" + }, + "stringValue": { + "B": "pllhYWWptJtHqkBl091K5RXINE5xUJTIvEwx4d8o9lOaqnAaML9tix4FJXP8RW3b" + }, + "intValue": { + "B": "dL7Az3vqEaKbV3mANhAUxWdf1gyiokaTZ8Suw0ghBgk=" + }, + "byteArrayValue": { + "B": "wMEB/FjtBG/pHGIugYUQk04mNwiy/jphGVy15kdHTIY=" + }, + "stringSet": { + "B": "vJwbL4lUIbJbF6pjFd7mpxZpBxlm21k09jxYdGXcqcKDmHRo0WixwtDswPt6lD7hJSNOKyne5hH28JbU/UZilA==" + }, + "intSet": { + "B": "i2x5THF24XK88UegWhdg8sZK3jlkFlFC4RXrlGgtnSgOFVFEp24gNnsd8WX3gJESu6upfa0s2tz3PDSB21yBJw==" + }, + "version": { + "N": "0" + }, + "doubleValue": { + "B": "2pemBcZjUL1Jm98KXCokXBhFDg3jInLZMKHMKDfJ+b8=" + }, + "doubleSet": { + "B": "0kykeK4CidNAsnB5SYd/YKcidSW4lI1Q88U6p9FQtKfj6kBcq1v4V8zkyQulHrEwvs3ThYY7I0VGAK3w11qfVA==" + }, + "*amzn-ddb-map-sig*": { + "B": "YIsvtLKrQqNZOrl4P9v8/le/aZwJPLOADy2NRHGrmr8=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhZYUROMTNoeDN2MjhDRVNVc3Jva2ZrOFpZcUtxblBVY0pNYjEyYVoxVnF0MW9WNjlzMTkwYUE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "lXIWrmYWKlprz90bpP+TbUIeFEl+9k2aRrQIa5l/vMg=" + }, + "stringSet": { + "B": "Eez1zMaDXk0YUDR4/wniDo0v06wNU4FgOE809LqPl4SNrj96Ztxn3ZdmR/Zdeeywlf/yOBxOyk0WmvV2QMgMyw==" + }, + "intSet": { + "B": "1YcFUBmzBSztaClvd32OHJ68ev2oTezC6iwLripbjsb5sjCiIxzbNPpn5fNR4O6tv2sC9e5hTUniFkVuHraMTA==" + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "NVY1Z0/sf5dqfb7PbMi9HkpVK9BQkzgYahWSyFds0YY=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhiVUhkbEY0WG5QZ1hMcHQvZnE0WElvcThjd20zU2FMblJDL1hwQVA5eEZpRUhia0hxN01uL2c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "8" + }, + "rangeKey": { + "N": "10" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "RBAsheB0kh7XA4EPlHGJFTaq5p08xJg+8YX/O6iC+7Y=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhBYm11YVhzSGhINGIzaWJUWHlJQXpvYkNzSjBJZE9XNVJtTUZlYnNhZFZ6UFNpcEhoUkRLZHc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "9" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-sig*": { + "B": "HR5P6kozMSqqs+rnDMaCiymH8++OwEVzx2Y13ZMp5P8=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhFNDFDNFkzc1NIM1M0R2M1REJ3djFIazh0dVV6c0ozNEphbHFYNEFKS0ZFWTBzRDc2bTFsVnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-sig*": { + "B": "iZXCp3s7VEMYdf01YEWqMlXOBHv3+e8gKbECrPUW47I=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhGWFZvR0EyWXExRFJ3R3MxT0tINFhuc0ZqR3NWN3BXMjdNNTNBcHBlRWZ4L2NmNG5mRTl1WWc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-sig*": { + "B": "zh74eH/yJQFzkm5mq52iFAlSDpXAFe3ZP2nv7X/xY1w=" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAADhrekJuTUo3VmMxS1hyQlFsVk0wRWdubkRsd1ZBL0lCdXppbThyTEdLdCtLWUUxN2R3T1RTK1E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAApIbWFjU0hBMjU2AAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAAAdBRVNXcmFw" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-rsa-rsa-1.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-rsa-rsa-1.json new file mode 100644 index 00000000..416642d1 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-rsa-rsa-1.json @@ -0,0 +1,309 @@ +{ + "TableName": [ + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhhbWwwVXRoK1RLaXl6bFlBRDFqenpuTEZleEdUYTM5UEovaGc4Z1RQakg4cGlMREZvZFVNN0hlZWtJZFhxK05pdlE2ZVdMWSttbkxMZjZSUmpGMmVvSVZBSGYvc2RxT1ZYb2F2WlJkYkdNMGlNd2dGaXJOeUY4eEQzR24wY29hbkNKbEQyeXUvTGM5Y2VRcU13ODZXdUUwRFBTbjNyQnhYQTZpL0k3M2tmSE45M0NETmZBMVBlK05aTEFVZjdwZGFiWEFyd05lU2ZId1RQYVZ1OUwxMW5vNEhZaG1JQ3dXVG0xNnFWNFpkam15UTRMeTFyeTA3Z1JNVVZ4aVpwQ0NQVmFoSFFMcjlRR1Y5UE1CRDFyU0R2MGs4MVhLbUlJWmRZUERoMHpkNGJGVjVmVGJMSXpUaTE0bXp3QlN5TkRYanRRRmNISjVzTmVUZEZ1Sml5ZVMxanc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhmRldsQS9KeDhzdVJvU3hOTmVmcU1mYnFEM3pkUXlQTW9CdENtUytlQndyZUpuWTFlVXNLaXZCZzV3VG5TY3d4bUd6Ylp0NHZyTlZjZjF6ZkdvbnFQRVg5L3dyKytaNVVCR3VpNHFEVGFPcEtsTHR1RTYxUG96ZDNwZWN4OTlPNnRHMmQvUXBzQ0QrL29SejFudm41dWxPdHpvNUd4NUdaRlZoMGFOUlpsbHQycVdwb05YVkJyNDlGNVluZXJLc2h6c2lIazRRRGx2OFV5bjJFVUVibVRxZ2p4QXd0dUdTQUJ6TFYzdWFIeTh5OGF4U0JsaVNVbG41V2pUKzZGdHkzaSs0Rko5WXFsRFYwaDI5QXJ0ZHovVjY0dXV3dVk5eXJiMXRadGN2WHEwRGo1RmJIaXYrMFNkbzRPN2x5cWswL0pxTi9kN1pLVW1UMlhweUhIaENMOVE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhvMWxSZlFib3p2WW5SUUtwdXBOTkF2MFlOcDBPaStzblowTmVZYS9Qc3pxZGxrUENBdXExS2ZwY0IyQS9TVmc5aytHaFBwRDZJRjhES3hHalArcVJMbXc3OS9iRXQwL1UwVGY0aVQ1ZkdKbnRLUFU4Um5rcVg4dzhrcStNMHZ3OW5OZkJ2Y05YRFZ6cFFOV3MzZWJ1V2swWEg1TlgyM1JKYlpRdGtDNWdXQTFVOXBNcE56eUlDeVM2V3ZzRXJ3bEhESjRZeU92WWRBSzJieWJ3bnRzakNzeDRZMEcwM2NBY3dLSTJXczFIMEhKWUJ4WS9MNjFSODBQdVBPNkFPTDYvU2xOakZ1ZUhCQnNCK0N5SXBmSk1idC8wdHVwd2JYczF1SnA2NFhjcGtneUQ2aFFuSjdtRDArcEpqMkpvUzI1aFNycEQ2Z1pjS1AyYitFZ2xraTZkUHc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhodmI2VnhXdFFNdUdUSUZmVndqQmRNeXZrOXRwYjRMVnRlMFJKc2ZSM2RoUlpiOHg0VzMwM0JlUEw1YkorcVY0VDdmdFd1NFhycURxZ0ZkNmlFeHZJK1V4QUE3ZHRIeUltQ1dmQjNxS1ZGZUFsY0Z6SXlBcDJ2QmJqbDREWm5KK1ZHNzZvSVNUM1ZHa29sQVJIZzBwaUdYL3RqUms2QlBrM2g3aUxVYjVjOXZZTEFST29zd2c2V3lBTHpheGdiUVp2NTRML0JRWmVwQ25IYk9xN2hxWkxOWEdXMkZ2MG1FVnBCTUlJRTFDTTZTRHdlVXp1dUgzVEZPK3J0dStuRi9SR2RZZHJHcEhueXFtRVlDSFV5eEpZV2NqM2pHMHBhVmdCQzh4cHR0ZmF4MDJiUHhEeUluUkI3Zk8vbEE4bUxobXBKVnZhbmdQcjJNMWQ3Y0lkK2pFdHc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhsTUdwWTZsdzNlQ1ZUMm84cnFTNHpvV1p1dHRPZk9nN05Yb1NmcjNjM1UwSDFkOHgrdUxadCtTdVAreTYvK3lFWnRCYlZaRU4xdXFUUUNSbmUxc3hXUFowUFNnL1paQUdVWDNWN2dCYm9aL2oxdHlDSXRQVnRrUmJPejZXZTBtSm1LbGYycG8yUkFCdHIraUVvVEpISzJCNVEyb3E1aEU3K2NIQVF1QjB3YURDcENNSzVqRHltcnJNZzVGSXE4Y1pUMEE3WkNUVE9ZY1dHclFTWUxzbnhjYlMyOGRUcFBETXJPaGxpUmJCMWZLZ014UDJFd0ZGWm1HTmxEd3k1YnB4TDZUY2RpdUJCZWplRTZPcXZoOCt0RGtURW4xQ3BZZGdTYmZlTm5iVzFZdkI0dGZwd3NFS0JiM1crekZzV05SY0pIcXpGNEtBeENpNGhGK2NtcWFjMkE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhoNVBadGJYTFNVSWZBd3R5ekFLT2F0b1YzMXowZFVEN1N1OGRWNUx5QWRJSjNaZHlqNjJYK0hjVTRjamNBbUh1enFFcEs1U1MvMHM1MDRUSVJnREo3cmRTSWZEUmU5Qmw1V3VCSnQ2dHN4bjh3eVRrdTV2cFdPWkpHRXZPU09LVklWZjdIWURzR3NsQ0V1Q2NwY3dKVTlweTdTaDZvVlE3MnI2cEs1MWtZRHFZZXpnT3RVd0RHYk1hMzVydHdmczRDZ01GajFTMmhsV24xRHZ3SFVYUlEyUW1lOUo1cVVkLzZVNU9PaUR5ZXJFYXVZcXF3N2psbVo5bzAwV1B2U0VpTHVWUWZUd09HWDI5THJaSTdjWlNXbG93UDJabDQzVDdidDFLOUpicXNML2RQdlpPNDRqaDF1TTNRUFkzN09YSGZIdFpPL3AwVDIrU1B0OHIvQi96R2c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhmZTMvTlN4Y0xTUTNEQlhUSnQ1dkIwdWs4d0o1Z3UxRlVNdlh3OWJQQnJKM0ptclhzTmRRblcyS3pZL3krY1Rwayt3V1NnWmNEUjdmMUJ6a1VuOWs2TC9yalJqc0NxSU9hTktVb2VQZXBteTd2U3dUZG5kTzBFVnJzbytldE5HOGdPQlVwTVk0d3JiOHBzc2tLQXVxdFZUZFZVcjhRZnE5SCtOM3gyWDBqTENsY1NKbFM1YnBLdlBJNUQ2R3JLNFhyUVlaR1crV2tqUTYrRjdvUW9NVDluWTRieFU0UnVQVnphUi9HVHkwWEtQUHJmTDN1eXlqRHArL2x6Q2Q0ZEF3QWtrUkIzV3VoVFlSTktwRUFtZ0NRZUFlU2VSbU9rN0hmZE1FNllub3poRksyeURTZUpqSHhGWTJ3c2ZER05IazdLK2pTZng5Y3cyT09Yek0ycFdGQmc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhISk5JT3FhajFWUUxGYy9tajU5SzVCK3BaYld5dFpDM0drNjBhQUpLZExqNVdWRExZNlJwdkxiTk4zbXZpSXowNXJ4SUJMWldzK1o4K1FUZU1UcUlPY0oyYUgzSWsvTCtjeVFCV0xQYWdQVlIxYXA2Wm5xMHlFMEpmZXJLdzdTdTRZOWxRcXdJTUpNTVJNVGtpQ2lDN01XaVZibDNvNFlTRWthRlJEVEhvQ2VOZzI5Y2lSQVg0ZW1NdXoveTI4bmQwazRzRHowdXN2dGh3ODBnREJlNTVWZ1k1Vk15MUp0VzZkV3UySWx1MmRaaUJRdkgwWTlDY3hVanhIRDQ2Y00xR2Ntb0xUODJaZHJ4RjNhY0J2enVRL1BCYUlmRmlybll1TjVYbE1Ha3BLZkVhM0JNb2N2RGE4UTRxaDFNdE1scXN5ZWdpd1IyQ3VjYitHRXJZbXZMakE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhNTzlPbzdOdTllMFA4RzNSQ3poZWdhaUtNMkR5V0VxZkNUNU10V0Z1dVhQNXByMkEzUU84d3RnY1p5N3diRHpreVBLRjhGMzVIejVkOHB2elNOVnRrSTk1azNQM2VVVUk1WUgvWEsxVkxrVEMrVXV6dWJxcWRjbVQ5aTZXdmEyOUhNMEt1by9JL1E3TzZTUWdOVkx5RkJkWUJVNHVHUmdIK2V0SWV6OUFjS3ZxeTM1d0JWTk9LakV0M0FIckMyZk56Z0F2NVZ2aFdwdVRRc0RtRG1kb2lxdHZRZEMwb1Q1aVZSSnY2eEx5U295cHpEcjRqdWIwNHE4NzJuWXNDOWVkNkVDVkRqVDFJbGZ2NW85ZmF0U215TGNDTHVJWHdhNHRORkx2UnBKU3FGL1gwTUFGREpvcHhCSjZBckpQTTdnVFRUbEVOb1dCb056cXhQN0ZnSG82aWc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "7" + }, + "stringValue": { + "B": "kzZxLlRxokZZnEoU/H+mk/RwAN1RweOqmv5Wv7mbHyd+sMHnqU59C8RNNL050aaz" + }, + "intValue": { + "B": "2wP6kovCibfFIoNVJNlc1ujmzza2qvmjPp1UewXBbLo=" + }, + "byteArrayValue": { + "B": "G/wvZaVcGoEMrGRiVQXHzXMpRGZyd4NI6qLvizQSbJo=" + }, + "stringSet": { + "B": "22FswkewXpomH4oHkydLyHY2gdMG+f7X/3edMztywYijMQ4Z5LWOLujrZF/e/0vVNj34lmtpuIfm68DQ5lvthQ==" + }, + "intSet": { + "B": "Xh6FFld7TPnUDbW5QucsHRW9zN4hu0iYq1h6iIOHGPVAXteNR3myFqZCuiUm3rhuFRet1hJgoiF2wvEka15/3Q==" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "RFY1WeJ1iXFTlIdB9jcKJzD23oY6ckBkupE6VPth4/kf1gTupM2AeFgenw54Ij8POxn3XhAhY/IaP/tzfxwnAwgsoQ4IHyqrAKAGpLteVOG4UQFiKMUvNhtjL3uZOrSdI9ub9vrNtLnpiFh3pbiSQ69GNbFYj1IIQ2QZU8QhlOZGZlHj0XzIe7dGLrQpN2dIIBPwQ2it628TQCXsOPmCJYX6YNg0kOruvlIgUV/czwQpXFXrmjb+9APMepXCt5NLvmrICgm7IZsba8pDHztvhYGslnLM8nQcLu1knrfiLWQ/lv/u0XUWnAtJNw9sPNhn7SE7Y2zN01386z/06BDVEA==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhoTkhUOXltVHJsdDdhTUZZMmVNNmFoRTg4M0FFNHJBeW9kWWYzdlNDWWo4dUs0UWM4TEV5UnVHemR6NUhhYzRWb1hobTBTaDdsYXNYTnYyajdyMFhRL2VJUUtjbnQ0WTFuVVVXc2NFN1VXN0loQlJsWXJZYnpaN1Z3NkU5SXhOaTVnb0RxWGVNYithbWIyZVNWNjNLSFM1SUJqbThRY2E2TytWRXhlT0JGZmJqbjZzVkZDcTlDQU5sankwU2o0N2JLenJ1NkhQMWVVWCsrendNS2k2NlVMQXgvbkV0Y3YyRnNVUmVGaFlWdy8yVXNHS0VpUS95ZFI2UlFDZ2F2UFBITkRvV3htcnZQdy8vS2EzRlluNGN4V3BvNzJ0UVMxWm5haCsvMG9IREhBNHU0d1l5TTFZRHBkME0xV2ZpYThVS3JGVlNRYXh0NWxvR3FuSDlUaGxuc2c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "KAuojODXfKdkNiFL1Z0JxUKDs7ZsoOo46M5zl/pvRSI=" + }, + "stringSet": { + "B": "mrcFKA5MJlOtC7aZrZtzROPYKqt0CCGpFiy/g4HzcoZvwdJgbi2zJyKtie2rIEjDv2TPLGvrGDazqVG0hhVvYw==" + }, + "intSet": { + "B": "7IRHzWvnbIlBggob6vSg709zjVleyIZEVg7b0ORdA9qrE8gRhPgCnNEK/C57/NfxH22aRC8tUb/p76Rqtn/thg==" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "NFAP/hEUk+QpXuPtSsNrTEJv5keplOezqRWb0Hr/s+GdpS5ZQuNBk3gtOz43z6bkrthbiulD5XRPP//0yGEYOPFHSgcsB1FtaSIo0gK6qs+gLujIq+JyWWga7KOZsVUIXyhM4x4eZrx397lrhwXEiFx8mt6wSeMIudbBr9y3yIF9cjCOjbT6BZ49HrSmdOrBf6AgKwCTFLMDZ0rUs5SZvrM+EEh7Fln8ymO8rAdN06a9o7OFyzCbiTPdWoR3csYNnUWMWoRTd4SsdL/7Tap7SfwcyZ9ddFh30XtZzgQoCV5lFUH63U4gWufln3aESA60N7IfEIDYG0acaDaM/aO37g==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhWRENSZFpxZGlxeEZ5SmU1NWxML01HVDFLekN5U09Mbk5SNjNxTHFWbmNhdTU3b0NoSkI4RWM0aFVONDNGZUF2NGZUMWhWbytuMkxubnR3UlFSTjNoSWhDanVQMDZ2ZEpvd3E5WGhUaWtaMFN6U1dGRFhMaTJBejFENm1wTWpJRVRyQWJMOUtXa0ZnREZLUWUxY0UxSU04dERaZ2tFdkNLNm5aMG9IQkEvM3N6S3NMajlqOTV1VFFyTWJlQlRBZmpCbTN5WWp3cHovNXA1OXc0SWpXN3dKV0M3NkQyNlVvYXpjaVNnTXE2NVlreEQ5dUJSSTM4R3VQdzRBLzM1NDJoeGtvU3d3VjZQSGFZN3BwWkVpb0VyeU9SeUhHQmIrMXl0NUp5ekJFTHZBaTh6RHVEWjZ0dTlrOGN3aWlkZzM1azYwd3cxYmVqcDlmQWovWmZIVW50VEE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "8" + }, + "rangeKey": { + "N": "10" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "MlpbDmwlvBf01DxHEijpGEsJd1lycgTZugmb2mF7ENQMPRoNFrRFZiwo6Z2qPINm4AXolWmDRSzJHB+xPp82CUklwlAFEkiFqcy1PP4h5QccyAR13xJw8bcI9ulW6HkB7eouzHTo+6fhXGbmTwJlv3ISzX9kQWbL6JOgENeiVCKE2qVCrik52ioIQ3lQr80ozPfePLXXTvBpib04qX/lDH5QnYyJWV+/MxgD1Qt/YT+r6e0/IqunRFdnq//KetZ8J3hrRfCKTsckn5fjHMF0PSQzQGzmCRNzGA8eYb3a3nE907cA7hehFYvvmqupbnksO7UBRViQEJdkei5u54pbww==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhYZE8vemVqYTBNR09tRkppcjZ2TDR5MVJybEhTN1RnbHNMOHBFV2x6L2VzSkQ0MW8xeCtCcXovYnlsUW9qbVgxbnRwV3UrT2ZvdERmTlprT2l2WkhoWGxyd1NSb0h5ZW1RR0sxdmdEQXhSMUFPbzEvYllWOStXVVdKZWpKTWxaUFJ1S1ZUSVEyNUxjWVdnckxpZm5KTnEwQnpXd2ZuMHA0bEZmVzYzc1dxSklpRG9FWkdXWG1NNm4xZnR2djQxdkMxOURZRFFEUERQSk5VVmwwVDc1aFNYdE5rY0tjK0t2WFZoc0NEN0Via1I5Z1RrUXNCbVk3d2dRMmNjbFhnMG1SUnhxdHVUcGUyTlFTb1Y2SW4wdGtDTzBXbXEyYnh5aW1tTlZieFRCVVlmSUZPeUdLNXg0OFF1ZFNJMVR3Ym5YdUFlK0NZaU5JNVJvUTVQV1p2ZFRIK2c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "9" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-sig*": { + "B": "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhHSVdJb1YyVitmS1paQktXTlZobXpEL2ZweW1xaUhPUGV5TFNBZjMxVnVCZUxKaG5mZ1piSXMyWjhlS2phY0dzWE8zZDR0amU1elVQZ0RWWHBIS1Z6K1E3M2RwdGxlTHN5em8yWWx1aVRNaTU2UmJLem4rOUcya0lrcWJER1lNMlBXNmFyNm0xUk01ZnZEQ3M1Y3VTczJ3U1JxOUlZM1ZKVUkvc1pHMEZjUHRkcUVPVzZJV0cwRk5VRDNWNzhrNjkySXFPckYxOWowclV3TC9ZaWY0bWE1d3NMNW13NVhFSjRvYzVac1NoamFRT1NNc2xZaVlqTXBFTjF5Mi8zVzE3NlkxUUlXZk1Na2lMQlZxbkJqajVQcW1seEEyOTI1b2VxN3ZnYWRwaGJ4aU1FbHhPeHViZ3l5Uk9MYkY4RlM0QmZ1dFJ6dXlURUVueDNQNjd5UmhXUnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-sig*": { + "B": "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhKSTZUaFFqVks5NVFGajZzN0NCS0lEUm5NRlEzeWx5SVUvZ0JEVTM3Y3VXNlVZbHpudlZleDFCb20vMjVIQ0pmL1VWSGxXN0lIY3d4dmhCTDZNMEFndFVJdmIvK2V5bFJtd3BySG0wNDl5aksvMC8rQ0RhdkdpaS9QV0t2NVFmUFpOdndFRGNLQjVrdG9NREZuQmpybXRxZlhKaThSL0ZUQm1WVEh4eWpUR3lsYVVLem5hOE1hZTA5ZG9IRmQ5WkcrZzJWTmlRTUNuYWhGaEhhQmFsd0VLSDNBTFpQZzg0dHhiUTFpTmVUNFFweGx6NnRUaCtNVDd6Z2xWWmlMNExUT0paakRuLzFkcncwclVKR1BqVjE4T1EvaFVtT1c1V1FtdjZ4VzRJNml5TzRwTjlOUVBtN0pNWmJUUXYyV2RrWHB5ZkY4b20zeHFNNmFpa3VBcGwrZnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-sig*": { + "B": "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhOS0dXZmtBbWx4dVRrSVlkYnp1VW9kTGpEbmpkMW1JbGxINlZJdUpPYmppa3BpNEh3N2Z5VkFhdWRkUEp6V0NXOXM1VWNiWS9NaGdPbm9VZ3YyQzB1S3l4UFUzNGdhSUdIRmN0Tm9jTHp3U010Mk9na3U4MVlLbVJ5NFV1OWozTjlJb3J0VWNtaGNHUzVFbThDSTYybTA3T2hINHdqb05jcWdiSG5sZGx3Mmh6eXdlTk16RzI4a2RyYXJuMGRQVkh5YjhSNGlQcnR4dTc5eVBVd0RxS2dhV3N0aWpoNHFNbnJBeTBBbHZSTXorYk9RSTZnc2FobkhGY290dWFlNFFnUUNzQkkrUEdZblV4OFduQ2ExcUZRQkNkcDE2d3RsN2xxNlI3M0x6M3o4ZFdNT0UxeEc1OHBidWhGdnZuOFpFTGl5YUdBQ3dkdTZQZTNHN0FwR1VlYUE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-rsa-rsa-2.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-rsa-rsa-2.json new file mode 100644 index 00000000..379a44de --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-rsa-rsa-2.json @@ -0,0 +1,351 @@ +{ + "TableName": [ + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhDMjZHRGg0a3ppWFlzcGZFNzZicUtwVk4xL25kb0dPMFZ2ZDJkYVNsOHFVbkRjL280ckQ4d2d0aGR4RGVKeENtOU82OWREcDRCbnozSURzQ0ZtU2d3dE02b0hGTW4zUTNlb05BemFWcjRKUVRIc25KdGhzUWl0WS9BVGFaemZFU2MrWC9lWkRTaWU2NGN6NWl4b3REd3JDNjBMaExEZnVhQ1ozdS9DcGZBN2tSN2pnSEFhTG1Gcll4VDdmOGhFNWNUQmQxSTNQbmdqelFyU1JkWGd5Z0JGVXFUNko5ZGNOV3hVRVJENDBTU0I0L0ZQQVZXdk1hZkZncHkyam92dndpMGFFMXl1ZzlCZG9naWJObjRwbCtLRFlXTnhBbWt2V214VC85ZjVEUHdXY2J1eW12ayszM2kwVkNpcTZycnBhdVB6VitqOVl6MnJncm1GdHN3ZXBkeGc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhZbmdsZEdrWDl3TjJvZFM5M0tlbUovUndQNzRlSnRoQkt1QkFxTzVJdXBEaXJYaFo0M1ljU2Jid3lzNXlnR2ZZWFV1YnZKNXZ2UGgvUjRabXVQSE1nSThyaUgxZFh6eExyMThLSlNXSlVaMXBLSVdyZTVxc3M2N1o4MjN1S2hCVnNVcWlaektFQU4vQzhMUXdncTYxektBa1UxSW9ZNUdzT055OVgySU94T2h6cDVieEpQUnR5Tko0aEhoTEpLa1FCcWZKVTJuenJWUXZrS1lHRytJaUdtR3d6Z0cwQTA2Smo0Sjg3YmJ3WjJOaXlLNDNWMGs0UGZ2UVFva3U3TCtkcXBuWC9NbHhuMXNOVzJoU3VHT2MzcmRsa3didDRHNlZ0K0I4QkdDY0oyTEp3OFI2bmF6SGRWWUZCL1VVY3ZRVW55TjM1ZmZhblNNY1VORlBHZnRyV3c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVh0WHI2a21FMmdnTjFkQWxDNHN3VnBIZ3ZzbnJZa0xmWUVxNXdTQktwU2x1NFltVmEyT2htRnR1NWswZzdrbHZHc2I4WGVYRTgwb1J2Q0VMNUltajYrME9QTmVZU0c4UUdyMDQvQWxteU14Y0MwenhJZ0x2Q2s5RVdXZHRlcmZPTVBMaEgvQ05LcnlaM0Mxb1FnczJGY0NPaTJXWGhwam5FbHJKRVlPaU9YRnJWYVJWZ1lhcjh4bFBWUWswTU5KaXNmc1ZEN2w4RGlJK2t2L21mUFhHaDJ1L2FEUUxibUF3d1l1RGxqWnBwSEp1N3p1dmtBMlFJSkloSkpqT1dENGd2NkttRW5nZkhxUkE4WlJkdjVXYmJ6d1V5QU1pYWk2cG90elUyclRkb3FGT0dVTFJETHJNZXpUL2Z3aTZQOUdZTFRjT3FYbG1hWUFyZzM4MTVwdFV2Vnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhsbitJTGgzUXlabGQ5M1h2UGM3WWlqa3I5V3Mwb0pQTGhUTlB3Zlh5eTVvUStoOVVIQ3dEUExzOGxyYnNkNkR5RzJmaGR2emcrMENIM280TEo5WXpGTnRzcGRncmw3UUxpMXdLd2R6Mmd3QTRDRVRLVHhIK3V2bG13RGJpT1dZSHlpclZqY293WUhRN3lVcWRYaDF6dnZVMXkzU3dmMHhPMFhoME9xTVhjSUwzNVI3aklhTEt0MTRZV3lTWVZOQ01GWUkrSHcwQk5HMWpoQStORUpJOVQxUG53VE1Genk3Wkc4Q2dnWTJ6WTlKeUE4S1VaWXNiaDlnQ3RTazdnZ0lMT1BxQ0JPWXphTngvck5pNk14RmhvRWhRQWdTVTVaLy9pTy9IcXh0MmUrMkVHVEhVWGJFZWk0K3d3WXFYQ0tZcnpYTWJGaUpGanhnTWpUN2pTTCswVlE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhQeE10MzZWTndMY0M3Z1BRcmZGcXRBZFI5MEh4Y3gvem51R2s3VGJBaGROL2pCb2tlNTRxd1p3dGxZVHRwSlJsV25uQytGZFJzNU1GeUZ2U3FGcWpwbWZVS1VNNWdDSXczSjVBdXhYME5QMk9MYW0ycjExNU02cGI1b3grZDNzYWxMc3lFanl3MVJ1djZRaTE0aEpYSWpxYkZFTkU5QUpncFVPQnoxSHc4b0dYZ2lXWkJHUEplWTVRRUtUdjR2azl3V09UNWpETlNtUWQ0YnRmSmM3RXRRTXRUanh6UXhMQ2NmdjVsWlQ1eHJNWW1zWEp6VVJaUE56M0YwYzllYUJRdHFLVGl3YTNxRGV0dWw2b3pqb0w5QWxJQlVpZ0ZQWEV1RzFFbFhrV25hN3Y1eWEwMyt5TW1SZklHTFJ3aDlXajNKYVBaUjVoYnRPNVU2Q3VWOGgwcVE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhJYXNwYjBveVVXdzBBaEhhdUR1WWZsZkFScUxzclhwYmVFaS9qWUlnalg2UDZnVk85bGpzVXNubUU5K3MxZ0lXT2l4dm5Sck9yR3U4T2ZZL1RCbjUvMmpZOExIUTVmM09YQ0lhY0l2ZmI3WjlBMXIwaE1vZGoxWDlvVHZZSWJvSFUrNEJscjhPRklpeEdDaGxtVW9xZ2E3MlRPVU15ZllxQzVMQkwyaU9wVHU3ajNFWkR1V2tERUs5TzBQeWorUjA2aXY3bFZyVUx6TExJSWxqQ1pycGdTTC9VWEhHMUxzUzRyaEVSSGZIUGQ4ZU54UytTa1dwcERBODdHYXlESzVtUFJqQ1RjQnRtZU5zaU9HQURHMjhETkZnMk9ta0Zlb1h3L0t2V2ZFY21iV1podzh0eGhONmVlQ3l4cUJnQ21pWFVFem1vdGZuMHR4NUZ3aHJQdHVaNWc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhQcXJ3TnQzUDM4M2g2c2tsUEVSVmkzTWMvdHRaSG9rdjNXNjVaQVNja0hEajVHWGdJN2YrT3ZYK283eGp2TEFxd0Z1aFNTeWFMM1JrNU5yMURGTmNqMG1vakF4OVEyNnB5YUV6ZzM5d2dPbW9WejNVdkQzcTNlZkk4Q01vUUVwMlRPZDZxRjVJR1h3U1ROUll0bXY3d2M5Vnhrcm4xUTlQaU5TWW1FbDAyanlycVR2Y1RiWW8xU09ZaVpzWVBabExxTFFrcmQ0NlR0Y3NzR2YrQWhWUDZJb1k3aUZxbjFoQ3J3TzhkN2kyNlJId3VQU3BtNDJBc1QvcUpQZFQ2VGZaKzR5d1hNOXpybUYxWFdxbStURWlUaEMvWmd4LzBMWFV6cC94ajhLMTd1WTlkRHl5UTBsandMK2orTlgxR3ZHVnh3T0llYWhkbDlUaHpJUys2VFVUb3c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhvS1B5QnE4anlaMzRSWW5vSFZWQWx6eTlVMjFUNXFhbTAvV1ZhcitLWXJCMWhycnZ3b0xrdU9palkwdWh5bG5WdmNWa3JGZWZHckwvUTgwWUt4Y2JaUWR3b1NUa1NNK3g5WENMaENrdUM1R1V5SWw0bGJvSytjSlNScDlET2JSak9ISVNTZ3h6VjJmVVFrU2NPenR5Y2pZYjR1Z1dsTUFCTzhxZnlUb1BqQVJ3bmE4d0RFL1dGL3J0L0l3aVFNdDE2b0RVaU10eS9WalBLNWs3R25JMVNBanl3cyt4Q1hKLy9MNkJ5M0pBd0owYXpPNUFUMkxaQy82NU1idlNlWHdMNXZjQ0wxTXdEZzUrKzdzN3U0VnZqTTFMREd2TENRZms1OEE5dlowbWtMWllBMm1rQ3lqSUpoOWFYcy9sKzM1U2I0bEgyN29hU1NoOGV6cmkraWZSNnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhJamdOMzNhc0J2dEJaeEJCOXpOSTM2TDIzci9aWEcyNTBoSk5ISGx2bGxncUYyUFZYQk1ZK1FMVnV1QTNmKzNIMjBWTW9lWmFIcXlBRXZBWS92SXRlcVVyV1FYZFI3ZkNoSVZwNlY5d2J1enBuVnRKZTBzby9weWplOTBNS01NSlRzUzh2RlhhSENHZ1ZCdVJNVHdaMEZhby9ZQVQ0SHZ5UDdBNzJlVFc0SDFhVDR5M256eU9PNFJEbDdFaTBySDNFVVFlZC9aZmIrWTBwbGhVckU5QWhDVG9GL2NHRTF5dzRZbGxTNnpxcGFlT0pHalNBUzVOQmtqTnJ2RmVoZ25XZ3BiOWJlcmpvazhoMFJzMm56VlBwT1pNZDRyY0FMa3ZHU2NuajlrSDlRemNqWjZTUlJDS3FqUjZRT1lZb0V6YUtiWm5TVDJtM0dUNmZDU3ZPRzZaSFE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "7" + }, + "stringValue": { + "B": "N25rHIrEPwLYcBHUkAEpan0ZJ/7GsP0iUVoAeIXU07mXK/4gv9j08S2Tjjlw6E1u" + }, + "intValue": { + "B": "+tAmYHMwDL7AHGzT1hgPVHq99MXZ2QRgoS0icrDSQKc=" + }, + "byteArrayValue": { + "B": "GLsHfrL7Shr7EzwnuPfAg4vGtqH4DPERnsRCS+0yssY=" + }, + "stringSet": { + "B": "vjDz5rLLdj87K8qtATBnzDEaCZbDyNgbtwbXHuAZdlH0nBGirw5xir8hu/uY61/l9gKOZsr6SZKOC/OUCVogdA==" + }, + "intSet": { + "B": "Xm55g+vN2tgYAjeoknitXzzo4G8EeK/zhlAAkEkI+VmEYJc9IqLkMnjsu43rAPVZixCM/P2Ce7TmgMZBVtXnow==" + }, + "version": { + "N": "0" + }, + "doubleValue": { + "B": "+kAgCvDzAJnVh+1ACCu+wYUp2rs//O7WUs9QXvvKgfk=" + }, + "doubleSet": { + "B": "1ZkDJ+yPOpYGurQDiBBA0ntCSMuNK2LIxEGGrWxv5slc2QNxUbzJHYU7RLEGJLc55aoPob9b7J7qrDp6WazCzw==" + }, + "*amzn-ddb-map-sig*": { + "B": "ftfCO95qrPPnC6cFif9A7oH5YxlooEHHq4c4Z8x3aF60jV4iVewUszzkgp/CBKFkIgkafbPTq9XSyltif0whqd1NfJndXg87FN8mu4quYhZC6GDhXx12gfngfAk+Mk8m8IBmh/uFujsIEflikyKitlKh33o9/N769UDqeUQ3SEtGvnzbXWTcEZ/eZeGPCGnTuLuaIEIXOELT2m5IrialW/rDgaWgr6Ms3q1IelYEhNucSJkBhRg1a+KBNReiec7FHaVhr7E/+LjB24yfvssxlmnTQwghvwQZZaL2b8+1pC+z9Sk4/KCWicejz7vuHazmQc2m6kBuDlQWeHCwSygVRg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhRSG9MQ0FyV3JQSmFjclhkTndRTlg2NThxNnBlVUFUcklCQmtnMnJFa3hnQWU2RFFqNW5PNi9MQkNiR2R4TnB1UW1VbWZMNk9sb1BGNTY5RUI5bldpNnoyOTFRNjcyOUE2Qzl6Wk51a2VSSGdRQ1YrbDB4b0F3OERKdkNPeGlEdzIwWlZXL1VZVG5ueWQrNHd1c0ExZFNHbkxuaU9jS0ZTU2NuUEdLRlNkMDdSWEpaUStuWTU3eHEvcy9SbVhJRVp6VU1BTG1ISUVERW55ZDM5MlVrMUhrOVNjZTVsallSMlJLRGFYRHJ5UndwdHdJUVY4QTN1N1FxNWFFY3NoQkRJVGczdHlUY2JUc0t6aEF2WkNha3I4ZUhvTEFzbGJucW1YRTF0eGJ5ZWtxUWc5SWJsZE9RLzVXWkxwVjFZYjZydlJORW1ZY2F3QlpLdHF5Y0JLR1VSdmc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "+ldcMl2IogPVaC47goHigrzypiCE+m48VqaReQeCJZc=" + }, + "stringSet": { + "B": "vuXHg2mUj/GVwkFhatsAXaG4l6OcChR6itXlTaL6OyJ7nG6jsnGvtEz0quDE2584ILtvsg5nudMae7JxoPmGPw==" + }, + "intSet": { + "B": "+GKiz0o86KRUh46vVS1KTnSmy3A8TZvPtUHgjKWnFGGrFHYlS8szsViYwv5zPY1wWNGwdA6efYhEyAzpVZdCKA==" + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "s68ZHYLo+CZNogaY6CbNp6iyCKbtkM4FM/CK6VFInDpEEmIB2w9ExHAF9uD2D3E/aKltuqEhvuru4/5r7IszgouFNPNcg83I/Qk2NXVCKQc+mp5vETLsW+HeJ0V6NPPj7eGOeqpmwF6nrFaASiHZjh0upKuihqqrPZEVb2VKrpPpgI0fIht0u5XmHG137SL5vfoEhrQIH2C7qyFnPDoQh9Vp+L0+a436JlgeITh/M6eXcrmyOz5H2adrEbcYWCnXg4X/zLyfxJvcg0LxjixyHyqoLuR+XJHUSTTSKU8gHBVcpkBFXXGCcTYhlJ2a7R4yldl1bVjxY6Ehb8caNTZWLw==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhISmtNU3pib2ErdGRqYk5KQ2lLZS9iY0MvUlFMTm5sSkQvNFA2NERtZ3REcXprODJkK2R6QVBidXAwY3ArRHRDWjFUUXF4OXBoVHoybVUvOEZ3OStPQ3BjR2RWZ2NWU1RIS3BWYllmK0sxekdoazNoa3VCQnB6d2ZjWW4zbFc3V0hxRGRtdmU3cEYwRnhzanhOR2FZdGtpRDJhSkRudGFOQVdiOHpXend4U1UvOWVqQ2t3L2VQZkhScjByVGR0ODQzYXdOUWFIazJxeWUwcjdZekpPZW93bHJzM3N1dGRQT3kvNU0zaGtaV0NCNTRBOXRmSFFYWjNnaDU5TW4vcHd2OVFpcE9hYUwrN2pMak93eWY2K2x6bFF2RVRxaExPUEx5Y0p5V2dyM3VFVlZhOHVjWWFsR2hYblBsaEhjRmtPeFVXY3UzRzIyM2FHc1JzSFhadEZDdWc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "8" + }, + "rangeKey": { + "N": "10" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + }, + "*amzn-ddb-map-sig*": { + "B": "ZGgH3th12g5smQYjM4V1ZJ6lQ90A32YHIQ+e1dkTix7jbg0F+EldPBQQ2VXZKO9LbQcSziWQuGL7HYuZ0Rm3QQgpuCF5fM5DtMBGwHxuF8SdW4iWaeoY9TKkmvaLSMdHLyRUuJi3mvh388saVwai1WKqiq1uebpNv6eJdrxE0UnmLEgtSfUmeh/KMUu97Llhhpi8I3HSjDhRaFNLpck39wuFUjmaMzwhSQ7Ml9gmSSj8fyVSurdM7aNW3whLRUKCaxHjB3S5obbu68fN1uoXKDl1qSE9/VPr654pPpSu/aC8ffCKLpdDMi6OWx5+mZaKihIgkOEVoehrbCSk5XjbjA==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhFQWZDOUJOdW5tS1hnbkIzUU1VQU8rK293Um1sa0JETlhhWlAwb0o1NDloTzRKWW1mcGNlVjg0MytMejYvMi9QMFdXMEt5MTR5R0RDZkxQK2J0Y3NtL1pzWFZuSlBPUEdHbGxLNjZ6dmM0NHN2NEppcFdhYzBwZmZqQ0ZlZUZkQ2FZOEtSNG42YlJZS09lUXEyd0kzUlF0dkhVRmEwYVZuaDNIb2IvbTN0d2FUUXEzaWZ3QkdDMFNjeWdURzloMW5hdTFtUW01ekFRclpQY0pjdDFCbmc4aUkyM0pwNFBaejA5SVZMeGZRTDVrQzBMMnRidGZtSHZRWTRTL2prK1Avc2I4ekdkNzJmR1QrZ0hzVGQ4c0xsTGVzb0pEWWpTeTEzS1NDYjRSWmVHSHI4bjJTb1dEUTllMXFZR1BZQmRTMnhXTlhEUm5HbmdlVEF6d0NFRVFkWHc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "9" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "doubleValue": { + "N": "15" + }, + "doubleSet": { + "NS": [ + "0", + "-34.2", + "15", + "7.6", + "-3" + ] + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-sig*": { + "B": "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhwbEh4b2xVaENEbmRYbVk4ZEQzdG1KK3Y2V0RkTWlGUkxsSEZSK1RBUFBPMW1mWW1Wa2NUbXkzbmxVaExoMmFuaVVjdjd3NnFKMVp5QWVLV1JRN2NwRk5QTWdIc3FCL2JmZjIwdEhnWWV6SE9mODBKS1ZRYURZU1h5Y0tyRUp1VDhRMUI5NC9WZDlWTG4wN1ZyUWdtMXBLTEo5SVNIWWMzb0J5RVF1RnArTjYwditjcnhQWWoyY3BoOU9qcXlZOEgrVWhyN0JsUUYwb0ZPdktBMzQzZnhQSDRFcHl0RHZoclJySjUrYTBEdWI4VGk2Nk1KTGhzUDZCY2ZFVHAyNjc0aUVibDhsZTV0ak5nUjhZUkJCVXVxa0tacUlCeFkxUnpQQ3NzQis2SXFJY2lpMWlONUt1amxDdXliRjgzTk0xblVUOUhEOXZ2ZzdhbUhUNTlIYktkK1E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-sig*": { + "B": "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhlQ3lRZEx2S21tU3FYcklvMDNZNHAvbWpmdjUvVDRtaENjLzFIWGpjK2N0ODVvMnAvemJlS1lqYnU0YUhZOVNVQmFZVmpJSy9JV1I1ODg3WHcreVI5SnVMSi9NS2Q2ZHlWcXR2anRlZVIrWnptMUZHVExjdXA0b01LTkxLUG5CUHdscVliMkVmdEdUQUd6L25Fa05WZERwUVBEZmFuSTI5Z2s2U21rMThpQ0R6emRSdnVVYVBJK01ucStBN0dFcVlqZU1sWjdrcTNWb0E1MTdObGpyMFY4NUQrdjh3eldleDdGUEdibHJMaTNvUjlrSzVlQTNvZVpmN2w3RG1zUHR1Q2ZxODVheGRnbWpJdXRJUWhaU1AxR2RURzA0WURMQmRhMDRDWXFWUklDd0h1R1YxWkFDZDNBVi83NHFRQ214aDRzdTdGaDdRc2tRRVYyR0R0Y3drUlE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-sig*": { + "B": "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhkYldOUTQxZys1bFJTcjg4cjBDdXBqR2NjUzNvbVpmZTBVUzhwK2E1QWQwcjJHWC9wNWRVQW1uOHkzbXlMWk52UWxPc1EvTHAzcmo5a2lZUVcweXkzTU5kQndTa2JVODRvcGdBMm50TG96akVLaDBZWEhZMS9mOGgxNTJkVUJoeHNBL09UVHZCMGV2akN4c09OTU5TQ3JyVXBYcFlEVmFhSFhsSFRMTWJUTEtyeWhtemtpcGQwKzhjb0docUM3UzZTTWZNdjBReEtEYTZmMzFrSVJId01RcXp0NFdKMzFkbFcwczZ1WFhTK0lmdjJiV1VuNkI5cGhnNzV6Um9ZaS82UzhnVFBIM0paZzlDZURvcVQ5SXhYMGpCMEpXUHVXdGl0WTMweWNJcWtHa2xraGVPbEczOWM0OGtTWGx3NndTK2RIQWxqQlZtQkQ2TUZVVFJUM3d2YXc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-rsa-rsa-3.json b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-rsa-rsa-3.json new file mode 100644 index 00000000..ac8d0a4e --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/ciphertext/python/wrapped-rsa-rsa-3.json @@ -0,0 +1,309 @@ +{ + "TableName": [ + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "VRRX8l/eqIeMo7TvQbHI+0Zfh6tbwT5rFJ2zTLYoloudkb8WcBjcHuHEGUhFia6lSKOXwU1cEi/dT4YbQUXf2vzVTxS7jDstYHwHxscVPYNKp7FKzrG/Rym2lF1D78cTn46Zu2/XPw/JgTUhL0Ar7nmmDjUONzzd41QZGr45PFtgBZzGSHyyIpWU2+TRA87quKL71YnrzfbfWoIutJLQ8lAuGlx/gm++09c8PCL60CwUGl6moaVzSYpu/zR+1lxFZ67sWnNrxlsezsQcWUbPJKgeaHfeKDxSevaALTS9dCAjSlE0Sv7XbsdjxW2huNPcPTQCOcqUtetDJ1W2GLa1mg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhReTh6Qk9vOUIxa3dCOFdxdzB5OFlCZDg5c3Y0YU8wSVQwc1kwaTJBSVdBSENBNUJ5eDBEWDlTUms3VTlOcEpKUWloWEV0Y25zTzBlaElEbGhGcDJURnA5TXg4M2h5eEY5a3pLMDJTd2dMYUQ5SDZ6dXNEZGd4eWhOVVdIVFV0QURTazhBK2hzN3lCU3hUeFp4eW9qcXB3VHZYdUlMd3ZBdmpRcVNkeDBHNFFIejN3RzdscWN3dVRtU1pBOWlYNjZEUUwySytTSUZhT2ZLekhmMDdOdWFqNlk4aTFQZzZEOWhmeEEwNHQrenNoK25NdUdVL2RPYVMvMlZITmJlYjk4VWlqZU5QNWlqTjZVMmZidDltbmp5ZFJYOHloQjBzMXRDdFVuNE1vWWROYkQrL05UZ0JUbU8rVVVxZHBNZmxkSTB2N0RqS1NMNWl5ZFlkbVFYSVhrUXc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "MG6vTV+uPAaPmZIGR4I4DbUwIUmivEZQ5sqpK83hue0SArv2a9TtlOTIighJa3b+u/LR/0kxm2Jbx5nqrI7oT0eKSjqJYk1S3w2W/JDPzyk4wwwSoOKH4TLq0KxwXE7QEM4aS5hs92ja6jKPIj7nEJKYOOwHdCdu3Qu2SBmY0VWyj+pUohZv5fzDD81nMeCWU7KmtFsXfKAFFHM2ufCWywXRBXKfYTDPYR87+bfNvbw5W/FmDeu9pdpCIbV66yR3pl4d9+FLoDqbS5yQjKzDI+X5Z90FBaW1xaPCKLcp2l9tRq8q8hfvyXZXrJVisu+/igjqpZ3Tszj9XBmmqLFo/A==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhRWXB3ejhpV0pXNGxRVkQ2dXJ3WFN5MmRHVUhaQ3ZScFZDYnZrbG5VNW1SODk3SUFKL2ljdWlmeE1QZy83NVVkVzliQU8wZ1dHVEtXL28rVVJKN3NrNWdKVktndURvZUN1YlB1TVhzSmh0eXp3T1FhZVRWZmZNZDhGa0hxV3EybEpsZ1I1VHlVQUVKdFNOeHVZRGVmcEZnS0pwZVE2OGl1RnN4cklaL3hNQzZreHU5Qmo1cDZNMDZZenZMTzVjVzNha1RMUjZiTlJOVDQzaXlVNlFURWM2aHg2VHJ2SlpjVXh0d3VnUWZ0TUQ0TitwZlBwUldqVlVTUThQSk1zYWgrV2ZJdFpHRXgrMUpCZ2FpRStUa3lLeE5zeG1QNWFxNlYzQmR3aU9QaEJ3Um9oWnN0RnVzTFVSd2N0cEFwbnVoK2pwQlpGeEt0YjVwMXQ1MURaWnRtbEE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "0" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "ed4gAI82hqUpvoUH/glIJXIbasq7CDMbcfm2u/fojO+3FsujnsCRCcIJZIe6ny3ExNC/o272WzUL+Tw1tFnM0VYcS1aAgpdJiTyX4LFPp4uJRlutcxDWCOBpAVh+Ma/oIQDAgxlm1EOcKiWyxhyXm3Bjm8c//rV/YyMkm7NpqK99zCfbgnwI/ezGvEaJe5L3N4eLZBAV9BG7B6if9uvSvCWh3NABr9XNeaXLCHC300ENCk8iUNJJASi1sGQnlTR186Ix8s4DPCfZJbNwWlHrbupgmBq+AZRffbU059QrLfvzdxpaRtHIlDxQwmvk8C7EU2kUuLGyEA8XSdiT5y2fRw==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhhZGdCZ1RzbGpTQnBIN2dQRzI4MHlPUjBjY2xOZWtqdTZtTUZCb25URzlyT090TU1WYy9NeGlqb2RTR2U2YkY5SnRIOSszS3d6Vi9KRUlHVjA0eTZONEtvZjZsajRQbERoZWtBZzB4N0JYajUrVTdFSk5YbndUUzJyUHBYYTM1Q3FtL3FJSEJmTk1sNTdEZWVOU1oxOVp1SGRlbVQ3TCtmb3NzTGRnSnllM0c5elFjcEk2M0JzTnNvWXlMT3pCR1B4Q1BQMzJMNlJrSjd4RHZOcmY0WXh4ZnEwTmR1U0pkWUtVRjlIb3NSd2tmNC9LRDNjb1NxMzU4RkgybmxsVUJuYlNWUlkrSHNiUkJmVVczNmszdFJ6Tk9EL3NHVXUvYzZlTG45THNlYmVuc2g3QU96YlRXS0h3V3VkR2VCWGlxbDl5WndsLzVxWmExV0tkR1JUR3lPakE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "MaO/4MFm20VFjw2ER/jpwi6iR2VBYKp+uwdJH+/CZv1NlwMDp+9t7MHu9DArLIzQlHjUQ905a8FV9LeNHcDD29CNDXz3u0I6u7Rznhoa78N6fO08aDdHn+MtLzoZaKi7dpJ1M2xNzAM/3x2dTkLiCGKuAOnpmk4SSG2vKu1OssM4e9VTwWgdWgUBHyMef38fEoT55XRy67phr4e77kVesV+X/lM+JudGuzxZgbrFsFVgy98DQ2SJF4gpNKkNOeWKFIomT8bEukxECfi0Vyk/m7PSMKgvF5JBBNQYEt7HXRUo1lVmUc7WvBHYU4dVkz2oQZn06F//IAZo+qsmqOM12Q==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhQVDlvYUg2MmtBVlNPYmYrOC8rVVpQaWU2UzVTcE9Ed0JmZFZ3ZUk0cGhObmVYdWp0Tm1Vemt2c2wrQXh6Z3hUbnlHMkxBZkVSdmtYYjZKMjRITkF6OUl5ajVtS0xLZFdoR2lqQUpVaHFiZnY0anVWdUU0MGRJZEJRdDJrNGV2UDlZa3NZMEk2UlJ4ZGdKektuUktEakZqM0NaSUZZQnNteUx0Q0ZCR1RDeHJGdTYwMXRWNDc0dGQraWE0S2RHaHorR3E2M25rdEFmaUZLRDBJNkJ1RVB1dmxSSVROakE5elp1N0RtVFduY2h2RWlML3VyaVdGK1ZjUDZpdTR3d2w3SE9SbHA0ZEdCdzZtVktONU1nSzFrOVlsS25ob1QzZjlrbWlCOFV4L25IUTk0ekFpVExSMm1rK3VDRFJlTWlJSzNySHZheXFFcklIakRqTlY0Y1NRZ3c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "fq5jMK7LBRwa63vh+Unxjxxuj8ugx/l0jqRalmWNql+k/RTz3lxsNCTFh1svGTP4QZTLL/GghdZGmGH2Pb82M45ExGsvZoVzkdQ6Gc/y8NNCMkD98pZyYeWchDazrqC1EnB+IoYbuG5vQF5vCwR2jEfd42bu+YnPMy3ackMEF9fDamQdHsAwfDDFsshmePA0Q4RMOaBUu48YhrDhSYPXH2DAv8lwPqh4lWGOrtalV5MFCvVzFO5ss47XDeI5zjafkwoJQPU5b44cvvLXeq56p0cWn9uFt2XMZ3HBHxDOOOAUkqNKShlaQ3m39SdU58fN50MLrc3G3mUjbttFBBE5AA==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhLSlRYeGt0RkRkK0JBalU1WW40TnpHTlNJMEZTSXVwc3BpUHRMRUZOMkJLTVE1NjNqVEp6ZC9WVXJ3Q0J4UVJiZFg0L0lmdmo3ekhjR21TbkgvNXlGdXFicFdRNzhwTk9UMGRRM3RjcUpITlk2Z29YcFoveGRweXN3RG1hV1hJa2pXRnpzbTRqdXFTeFdHajBobHh4TGplVVBvNTN1TFpoUlpJZ0ltU1JPR0p1Z3R2UkdlMVp6N01Yb2R0d2ZacUxmV3hXSFo3RVJORW9Ed21zaVlqTS9zNWc1MHhHd3hOeTlkbDB3NVpwZTFQVFBaaTdVVVpnSW9iYU5TeGhNdjhwS0NaaTlHWWJGa01oRXJ4cldHR1dMTUFZYlQyR1JNRnNlanVBa1o5R05tZlg1dnV0UXFyMGR0ZndNeVZwaFVjRW1jZmdldEZrSFU4OU9KVG5aSElMaGc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "1" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "raKHapJyc7wtw9Qzbr4c4AbRlLAT8p0rkrN+gm3JFSJwFLHtf6dHBQv9tveVRNo4VMeV+PJDbWDcPDEivK4Vq5N9BAlveRSx+d9Mj/ueK323VUIGynQwdI2PO0J4pncTvFIH/VMauMcCItOlmaOV/pKogUIYLqEGdgqPd5M6TuL0Gxki9i9lzZOg10yJZjTIg33I4L1C04xQVZ7c9gcyQB715y0TwF+0oXs1EG2KtUdF2oS2yqCb67v226gdj5aoFNUzfijy7v3s3cRMVA0fQKwpda+d9Rj5NzkvwBo43oKFFh58tl6FbRa3nN9Jj9cxWGtTSIlVd9RQ+vttzObdIg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhLQ3BiYnY3ZmlUd0ZQYi82bSt2Zm8rZHpabXhQSmJ1clI3bjBPSS9oUVVKajNIaDRXNzhuRjFIdXR3aGVyekNoVWR3dVhObHJLSW1zWjdxRnZHVzNtcVIvY05HT0RoTUFZRy9FTk9FWFZSTHlaa0s4WGk0bDdvMUl5ejBQWTZlVGd6emk3bEIxc1Qyc0diWTdBekZuTmRvTFZzM0xoZ292MTBtcVRJSElwMmJDMzN6cS92RE10SGZSaENhSlIvSUFidFRlaGFTYXBON3BTd200Ni92dm1nVmxrRWRaSUNWZDFvSFVXL3B3dTQzT1g5aTVOVkI1dW9YcmZrTVhJQkpQcEIyTzI5d256dm00M3pSaWh2dXNyUUw0ekg5WjhWVkpKYitydXVZamt0S2M0UEswM0FCRzlIVmQxZG1NeWR2OXZSV05EblZSVzVBYllOWDFkRDZER3c9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "1" + }, + "*amzn-ddb-map-sig*": { + "B": "MlADNyM2Rd+jSXzd/NgK53qnNIWrjOswmITkLKy6wmuP7tyYZZfdz/yN9rv/AeaDF0SKxQiTkIuWxtibyATiEFLc2DdulIx8Kl2ZydWSgvEI8ZCrKDNjhX8auceL2XZwqUQEWgNIoSRj+TpXZNwxygg0ZyT9d+PP8RT3yM64/9A2nW9WHMWK/ASwGJVHo1dlDzdspvcUCEtkO7U4ey9q25HX7YDx5p+yMxUH360fDuDYnXIdMyOSwPFO6LkcBpkxWSHsgB1jSZ9bVVceXi+mM3sUL+aLkUd/sP9Yl5/mOKASpJezNKcetAdSaC7VSKJ1PMbcEDSmK6XqblnNGF1L/Q==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhGNEF3ZmJVQU9Tam1zSW9xcFFzMDhDamYrZTlzL3cxYW8zTE1HcFBXTXFZQkp5S3d6Y3RPbWRUbldVeXNhOFM4eDVZcnc3cXhsOS9EbE5WdUdDWkVhY2dUaW00TW0vcjEwZXVmVDFuWWEzeDFTTy9hclpObjJaOS9mNU9JNDVFRWdpRnlkaDJQQ0l0OTdRVURiUDRDaERPRGI1YzNwSUJjT3ZCY21Lc0FmeVlrM3lCUU13KzVxUkVNOGtuK3RWQ1pZcS85OHh5cmJyS1Vmc3duazJHeUVUZXVBd0hhblpMTk5yemtlQ01pOFFhTTZnK0VXOWdlNFdPem1pL0dwVzVNVmYvZTVrbmtzdFNCazdIOHB3bi9uL3hOY1laUHZvbUxzV1B4bVlpdGNsa1phVW9mM2FpRU9hU0g3YU1ocUlqMXByOWhBQU5KWHlza2RtaWoyQnJzTUE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "2" + }, + "*amzn-ddb-map-sig*": { + "B": "jKVKU8uHbhAg8vlU8WqK3qIss6XKPJQXATVwFlkqw5N7RMj0yjQWQ5pJC81sdkXp3NmIgF9Wnavzl5TEVB6R4v/cwxT85ih/kMN7NDOXU5OEkQUlzCRCZ3U6wVvWgFbbI68r42LNPav+uuWBB2/cp9Uu/4VbsOQC7IjEdWIPkir+5BP7HBFg78cs9YgpkDuw2J8+4KLj4z5CsSW6dPjhmbPolKmhn8DinezJ6bHpRFmP0ry75HxMUTu2wInwHD0mCpK1TXWJ3t8V1+UJkNHHpD6j78UhNH9Ky2h9pgj+7Gml0pnZ9t0skUCXNcBLf0Pj3RsqvQuYrU6f2tV8DDxm8g==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhHemtxNXhqSVRaUG9Ra1dxa2xOMi9nRVBEL0pKTzdHZStOd2lpQVp3MFU0UEo0MnFzcWRpS3M1MmhRK29qemZsbTBsclJ1L2NwOVorUEtzeUFtcWcvT0ZRZ241OGZkRjJxN1B5cUdTaS9QRDJLTmdSQTh2SndzdWFSLzRsb3Z5bXBUaGdzN2lFZ2k3cjh3QnRNNWMyQTMyTm1XSWlLTlVoUFh1ZWFla1NEMlNEcmxZQXc5R1pWRm5iZklveGZucmVReU80MTR0Z09lUlp1UDh4bzhNWmM4cFNLd1BsME1uTk9FMTB4MmJyTCtoWlZmRDY0NmhsN0hveWg1ZUk2Vkt3NjY5ckV2dzFPUjVkRFVRREpkazJzaFl6dmJMVUkxcWVqZkthcUlBalRQRHo2cktEMFZDZVZCYzhXWm9JUXhsZlZnb1dmaEdjaXQ3U2dFclBCLzRJRkE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "3" + }, + "*amzn-ddb-map-sig*": { + "B": "UKESqnTKdCqAtM6aDkJGg068ssNWFv811njBVuRK7mzVtmIG5OxLQKr8ycBf/Zm3j2fDnkeLnZwc/Fya9XCTygte4yy1QZSywrSb83uhGFlmLsjGOKcE5ZTMPEMb75+I+8I8OQ3ggfM3EnyaTFQCIfeY+3antQ3augrWioBaoJ3VpoUU+RSA6FOrlVtd01qNO2ZOXCfcX5soh2r60FXZ3fdJZJKvO61xkf4nlZJQkc175bsV8KRHh+125a/KETb+3Gc8uL2aRFBO03fuSCHS97YN7nbevtzM/WdqfXh83N0sBIibHhY73xd5n1sDwKhn9D3madRlzlj6GgwiY6wOqQ==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhjM1R5eWo5eGlQQmx6N1lZbUtYRjdlUlJ2NWhqUTdjV0xCb1dYcHR3QlRHUUl3QmZvWXBSdTZIakxsQnhvSGJYOUY2MEV3UEVJcEk1eWRvWkVuZzNGKzUxZGl5WE1sYVJvaEwramRHZjhpWXRId0I0dHBQTjNoOStnTm1WWEF2T3dLM1lHVTlOSWdFc1FieHdabnY1QmhzUU1GSW11RE5Qais1OEhMbmVPWTBLZG1uVDcwWTBPeVFlcE9xZVpXRXBDRDU2ZWFYQ2lUbFN5UnQ0bnRSWUVXWHd0cjkrTjRycHptLzlSSGxuVkJvRUt4Ulg1MlBGcDJ5TzJaMFl5My9PSm5mWXdXeTZBMWNFSkYyNGpDUnFLREVEVHh2RFpYTG96WDMxdGtlbDNOVTF1VDhaL1BTTnpPVUw5dVJ0blhNRlNnam9ERVk0TXM4M3J2OHRvc3dpR0E9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "5" + }, + "rangeKey": { + "N": "7" + }, + "stringValue": { + "B": "MZGjzD+QnY36TiXOk4hHs2O3LfbIx1lnE2NmeLtXm9ZZjNKVGNvtAiyDc0VdrTe1" + }, + "intValue": { + "B": "Tj0dpZFZn9ZFj2ijCHGa3PST9cS1PQLlRUtNKef0RuM=" + }, + "byteArrayValue": { + "B": "tgWQ/iVUDGyYD60N1Wfvxeik1NA9o06taFBzHIzgh98=" + }, + "stringSet": { + "B": "HPquz1ur2M0BRqbqWrXL5K2gWUbW4Jsd9DJMAqL5Vew+quzvRK6pX3wfzLiQQLlM8eEoaQAf1pmOFkcD7sQzgw==" + }, + "intSet": { + "B": "ZHoM9x2HjQwhdah/gu1ZLXlD048vY8JXEuzzT0DWKUfp69f9uvxsRqqVJlKBq8CyV8uLHe104XVF13ksWuHRgw==" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "DEm4S5V8sylpAXcyMiA6MzUW/DmQ+OggwGvaAU8qEyGHYfkTv1qzolRWUY+jKOZ4q2hL9na4SpAKQpnFoMSSJgctfare1q6jWW2bVM1ojSqa2JTc13MlcPiQd9QZYsaYsAXHKjxFNR4UNqKBci9S5EOdnfAK696jIsxPKynuoNmXgbqMGDK9llovXrbCKp1hzieZLUVKQYhuaFZKBXa95xKTMNjGjAx3HvJT5YP8YiPeFL1p/mnqgnKW5QMmjwEhqAteNk+sk+qEtXmO3g+N05urfMzqc5RjXBB2FYD8syRn76jKNPBb9sPWTWbKxP/k7xrIneUa20Wv/qiIanzRZw==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhHa05iRTcvYUtQQVowWDd2UDdyTG9HaDJEZmw1RGJodS8zL1JJWldZenVmV0grWG1VQm9qcUFReVdSZjFkSStxdFdweGcyMkVFOU5IWDVDcGtDajd3Uk8xT0JBMGxaMEJ5dStFbjV1QlhjV1RlN0xldjhPT1pjeG9GYjF1MURQUVZFelJLUWR0TUxRNWYvejIwV2pnbE9Zb0Jwckkyd2tHRTFXZlM5T1dOSlovc3hXem1ORWdVK1dNQVhYNWJMTUN3MlIrK1RqK0NBbngxVk9qL1JZMkh5Rk9sR1BlOFdVMmlmR0dxTERJUFQxc001VkdqTzY2UzQ4UmtQeG84NFIxblJNOXJiYmpZN1g4NkdkMm9MNGhpUzNHd0FlRGttdlM4Vm5qWWgxcGRLT1RIV2xPUCtxQnp6YmJlSm44eFoxM0xCOG44dzZWeFhFdDJST1JHVUhFcVE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "6" + }, + "rangeKey": { + "N": "8" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "1qZf1YT7DB3p8/cThFMQV0zFAQfRsGk+1QVw1hQt9gg=" + }, + "stringSet": { + "B": "+SAHaxfhdKOnlXhdjfQkHoFJySBTqOJtGh8k/isglIDT5X7xswIRvsODsDSDVYnYY5IyxnE3tOHSWnfXU/fp0Q==" + }, + "intSet": { + "B": "XhwR1ZWZfzdD9UM6iRkjHMlrE/VMsefLSNFxIiq8+y4PtGMEDFQ3O4qGr0Ld2LM/3lc38bDHRKSh5mfsAFQ9kQ==" + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "HdkJTD56848oZ54G/m20kIB7mhHs5AiDIPdYcZby8cFXaRHMY5YiufNJBXOu3+F8sphGcQg5LfyFiB/kAJrfZPnUQQgiC3/34iMMcvdiycU0iKJBncDr0XVvwjkQuOY1B/YAuNWnufURE5Ubw9GCFOXxcY4xeNj+9yiWgdgsRRx+AntLY3dikomM8AFEoW4N8Gj/hKN7HhL6+Nd93wOp/ibEfg06QXS1aIXezx75XQ50TSTkCzImOoFxgWO4Ek7plS8kAfxkfmIYL0rFY6dRsR7Dzoga266wGNv4ucn09GiQJ+y6rpdQu4u2YPurqqaHn8giUeWs6WXvcpVDtObAUQ==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhFK0t0WUJLL1BvSWhZSmQrWkliOThKaFFKcjF5QU1sQVRnRllnaXRBRHAyVitMeGZyTjBpOUdqTTdoLysySlU5QTVjNHB2YVBWUGNJZDlXSVNJQlR3QlQ4OTQ0V1Jqb05hK3FHQ0x5YkxQejU5dTFGS2VJQkZwcUlMSVBqbWFWSnR4VGRlSVRiRC9MTGpQSXZ3dFZVZFM1TFVZNTRuVUlPOExlMUpseVZQS1VVb3VOSk9GVWl1NmRCUGtqcVlvWVZPNE8rcWpwMXB6dncvRlhob1lGY0plelNwRHlPWmZTdUlHS1VzTWRLQ3BMQ2swSjRlZTdYSFh3UzVqR3FZOGFZcVpZbDM4eFV6T0dPRUJFYVBVS01jNm44K3BuUlEzZ0F2TnVDTEJmK1JiRnpPNFpiMFlEa3l0VG8yNGRqbldkTDZ6ajY3blJBS0ZZdisxTEdaT0ZJSmc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "8" + }, + "rangeKey": { + "N": "10" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + }, + "*amzn-ddb-map-sig*": { + "B": "MlpbDmwlvBf01DxHEijpGEsJd1lycgTZugmb2mF7ENQMPRoNFrRFZiwo6Z2qPINm4AXolWmDRSzJHB+xPp82CUklwlAFEkiFqcy1PP4h5QccyAR13xJw8bcI9ulW6HkB7eouzHTo+6fhXGbmTwJlv3ISzX9kQWbL6JOgENeiVCKE2qVCrik52ioIQ3lQr80ozPfePLXXTvBpib04qX/lDH5QnYyJWV+/MxgD1Qt/YT+r6e0/IqunRFdnq//KetZ8J3hrRfCKTsckn5fjHMF0PSQzQGzmCRNzGA8eYb3a3nE907cA7hehFYvvmqupbnksO7UBRViQEJdkei5u54pbww==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhmOXhHRlhiY2pleWdvMVBSdUxxWjl1SjQ3M2tBMVdIeVlZSEM2QXNFS2xTYUhKaFlJbmMyc3FnVXA5Y3FJK0h2YmNiMXZLT0dxUkFkUmM3bjVzSmRhdXd6N2RscklqTU1DcGR0MThmUXZDMUsxdkxmOEs4REVuYlhqcks3QUVBTTh3eERMcGxzb2RCajl4M3Y5WVlCT0FSNDlnVkpSOVRlby94UEpVaW40Q0VVYmNkOERjNCt5SXhaZTZNUzNmTi9MK3BVdDU3RmdWZTNKaDI3Q2tqNURpOHp4UjZ2WUtoUkpVblp0aXdjUVhiSkh5d0FFUndkVXlYVFBINTRXQjdkeDNITm1uQlNDUE5tNitpZXVDRmhVWGpxWjI2R21tWk5FOUFXTlYzL1dwRmhIRnArNCtkRnZCMGFseTFpcEM1ZkRuV2lQdkdlOVpsOE1Nb3lKTDJzbnc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "N": "7" + }, + "rangeKey": { + "N": "9" + }, + "stringValue": { + "S": "Hello world!" + }, + "intValue": { + "N": "123" + }, + "byteArrayValue": { + "B": "AAECAwQF" + }, + "stringSet": { + "SS": [ + "Cruel", + "Goodbye", + "World", + "?" + ] + }, + "intSet": { + "NS": [ + "0", + "1", + "200", + "10", + "15" + ] + }, + "version": { + "N": "0" + } + } + ], + "HashKeyOnly": [ + { + "hashKey": { + "S": "Foo" + }, + "*amzn-ddb-map-sig*": { + "B": "QZii10yqicfBPRRi31KpeTnpe5Dp1oSJAqB7L3uyTWUXz+sXeTqsEFqaIebiTtTCixgK3ZCs9mlM4X1V2iEgFWYuCs8mNoO8oY30vXw17E9EpW79kMn8Tuqr6XQqt+lMorFxKjiYcIkhVbNF6greXbSZ1HQdUGIPLQkACQfzX5I6YWjOCcGm60hXb2dp2uZy9kFceKCTIb0OtryI+7bVXX5YH4Ks9IOKNULWNGbjXEr3J2QdkeLcWZgZQVHtaikXiOlaz+WWyU4h9LaL5DxrojDCu68GXDmOzHYUvHbGCfk3y3hhfkwt9vwucEnA+Y3uDGH3vxUerA8iQ6qUH3m8wg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhBSU03VmswU1dIazgwajNKeU40L1ZUUVBkVVJpRktqMkVwZUlieml4NUxPWXp0M3pFbzRvcUloT2oyVzZUd3NOK1E3U0JoZHdncjUzNDJhMlg2dVFtald5SUFrTERjVVJuTTYxaVhsY3ZGS2lBQTNmUWtIOGtQdG1UREpoMmptakRVWjY2RThlZ2crZHUwemFFcU00c0I4aTF4dWpsMkhsbWM0UWhYVXMvZ002VWFSN1ZZMGh6RHpYVkRiaDlaby9iYTRHMWVNdUZWTmpIbVhaSjZkWHpvOUVsMDRxOWRIOEpGZkt3cHV4RzhKTWpvZjVMN3hRaVBXcENoWHZjMFJJSFZPNW9rcnkya3RRdllCYmpPTUVGNkhjdzc3YjQreklRZ2swTkJERkwwRUNOaSsxUnNac2FqZkcrK1lzQXY3L0tsa01JNmlsY2VIeGlseFFHY1FOSFE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "S": "Bar" + }, + "*amzn-ddb-map-sig*": { + "B": "SNpX+4QUwYC+yMsNiQQcYTXiYWWqnkR02KLn1VRH0YLx1wEuFJiOhhqD4a4AhiorExenoP2HHkZdZMJpGGGU9NbupQIr2SeKvV/dkEXrCADvVaaB5O6xIhsN638f9ibknZLEhUt+XAgGDzhPedKwPBr4ZC0UnQCasedHqb9CGXYMCB8P8URbllcJRayM5mf/bv4vfBW7t9uUTd2p6wsiDNG542pw9unP5+/74mZewfgbbp6bp+8KECVLjwTny24LHdSS7XGRb1uJcZsapnhDDamjctjc1jsaaWk2WWUf2YSp/mGNWgk9+m/St/cRwwVr9wjcGpcMld7QDHEEJQmNxg==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhZTWVuY0NYTmpHZUdyTkJnZFpVS3B0SndyM2JmQVhvci8wMzZISTd1YkdOV2VRQ3gzSEJHUWNCT1dOazZHTUFIZHFiSzkxZElIaWJFbExaL2ltNitjYUxHcURqdHc5eHl4eUowUFFVMlBKNFpHT25jcHBLUHRFQXpmSnVuL1JJOThXU09EWE5HYTR3WElGMjRWVXZZbldFZFFncUdyZzhITGo2NTltT292NzMzcjYwUVlEb0t1Wm12eUhjRGN6OGYycHdiZEc1THIxVnVPM0dtcng4cFU3ZUoxV0ZIVGlpK01KVEJoZzduMTMrdXhyN3BhbmNneXRJNjkwUUlaZ3lsVG50MUZEYUVHNEtGbEdBbUR3NUNIS3h1dUJpOGIvNzB3dFIyYmxhengyNDJtUWYwN3piUFZpSy8ralpQMGJhZEthdk5TanBoUjJlZ3dBdUtYYkxNUXc9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + }, + { + "hashKey": { + "S": "Baz" + }, + "*amzn-ddb-map-sig*": { + "B": "V0k/mB2e8DSl4lIriyqbYBQbWZDKbiwcfc4ZQB2R3PA+S+hnjiYgwr4zgOXKNk2Dq72M1aIEXzbrej8jVoCSTSiC8pBXxekTqSnUsIYy7ilo8uvoSAN4a8zyfLXxvFPn+ZMwTs48uz7fVe+4MTTIkdd9+sJDTx/ZPEf88mAg3yiQ27cnnqG1N909cvljgjO1ADCcNqfvIMAys3xW5ML4GzdF/G/c/MlRRBMy1rq8HcRC0E09L9BAChfSV3OAwYyns90X5QuTcmpgr5PnY4NFm5WBWYhLwA/nyZDb+Y8e/XAd45i5gLpEpBBxFUiU3X949byFTr/naYFoatBoiWuyKw==" + }, + "*amzn-ddb-map-desc*": { + "B": "AAAAAAAAABBhbXpuLWRkYi1lbnYtYWxnAAAAB0FFUy8yNTYAAAAQYW16bi1kZGItZW52LWtleQAAAVhOKzN3Q2Q1Y3dsVWJhdTRXbWJML1k2alJ1clJ4OG1jMWxoWm0ybXVuUDAzQUtPd0tZKzM1a1ZaTSt3dFBXNDN3dVA4RTlRYzBsK05tc2plU0l6NkZyMnROKzFUOHc4c3VIRHhUdVNOOHhad3ZWSjlRV1JMdkRiaGR1VnZqM20xNURhUTZQL3AvLzRFQWhpM1R4c0JYaFN4SEYzb2k1RkdTN2wxTmIyQm5wNWNRcjUxZFZSK2RVRzExZi90TGRMUnNRbHBSYytMQnBPRGRzQXNEaFMzWUF5M1ZxN0t5WmZmcjVUWlQyRVVaZTBlRTlUWHBveXo0Uy80aVNQMEp0QmpBYUZwSFJkOXV4TVd6N3ZvclJaYndEZGVKcE1kQTBlVkZFZ1BQQXo5Q0dZODVOdElDUTdZTFJObHpNa3NQRE44eDdaZzR1aWVXSHdTVG10OHAwb2xPcUE9PQAAABdhbXpuLWRkYi1tYXAtc2lnbmluZ0FsZwAAAA1TSEEyNTZ3aXRoUlNBAAAAFWFtem4tZGRiLW1hcC1zeW0tbW9kZQAAABEvQ0JDL1BLQ1M1UGFkZGluZwAAABFhbXpuLWRkYi13cmFwLWFsZwAAACVSU0EvRUNCL09BRVBXaXRoU0hBLTI1NkFuZE1HRjFQYWRkaW5n" + } + } + ] +} \ No newline at end of file diff --git a/sdk1/src/test/resources/vectors/encrypted_item/keys.json b/sdk1/src/test/resources/vectors/encrypted_item/keys.json new file mode 100644 index 00000000..030ce9f8 --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/keys.json @@ -0,0 +1,41 @@ +{ + "aesKey": { + "material": "AAECAwQFBgcICQoLDA0ODw==", + "algorithm": "AES", + "encoding": "RAW", + "type": "symmetric" + }, + "hmacKey": { + "material": "AAECAwQFBgc=", + "algorithm": "HmacSHA256", + "encoding": "RAW", + "type": "symmetric" + }, + "rsaEncPub": { + "material": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtiNSLSvT9cExXOcD0dGZ9DFEMHw8895gAZcCdSppDrxbD7XgZiQYTlgt058i5fS+l11guAUJtKt5sZ2u8Fx0K9pxMdlczGtvQJdx/LQETEnLnfzAijvHisJ8h6dQOVczM7t01KIkS24QZElyO+kYqMWLytUV4RSHnrnIuUtPHCe6LieDWT2+1UBguxgtFt1xdXlquACLVv/Em3wp40XcbIwzhqLitb98rTY/wqSiGTz1uvvBX46n+f2j3geZKCEDGkWcXYw3dH4lRtDWTbqweRcaNDT/MJswQlBk/Up9KCyN7gjX67gttiCO6jMoTNDejGeJhG4Dd2o0vmn8WJlr5wIDAQAB", + "algorithm": "RSA", + "encoding": "DER", + "type": "public" + }, + "rsaEncPriv": { + "material": "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2I1ItK9P1wTFc5wPR0Zn0MUQwfDzz3mABlwJ1KmkOvFsPteBmJBhOWC3TnyLl9L6XXWC4BQm0q3mxna7wXHQr2nEx2VzMa29Al3H8tARMScud/MCKO8eKwnyHp1A5VzMzu3TUoiRLbhBkSXI76RioxYvK1RXhFIeeuci5S08cJ7ouJ4NZPb7VQGC7GC0W3XF1eWq4AItW/8SbfCnjRdxsjDOGouK1v3ytNj/CpKIZPPW6+8Ffjqf5/aPeB5koIQMaRZxdjDd0fiVG0NZNurB5Fxo0NP8wmzBCUGT9Sn0oLI3uCNfruC22II7qMyhM0N6MZ4mEbgN3ajS+afxYmWvnAgMBAAECggEBAIIU293zDWDZZ73oJ+w0fHXQsdjHAmlRitPX3CN99KZXk9m2ldudL9bUV3Zqk2wUzgIg6LDEuFfWmAVojsaP4VBopKtriEFfAYfqIbjPgLpTgh8FoyWW6D6MBJCFyGALjUAHQ7uRScathvt5ESMEqV3wKJTmdsfX97w/B8J+rLN33fT3ZJUck5duZ8XKD+UtX1Y3UE1hTWo3Ae2MFND964XyUqy+HaYXjH0x6dhZzqyJ/OJ/MPGeMJgxp+nUbMWerwxrLQceNFVgnQgHj8e8k4fd04rkowkkPua912gNtmz7DuIEvcMnY64z585cn+cnXUPJwtu3JbAmn/AyLsV9FLECgYEA798Ut/r+vORB16JDKFu38pQCgIbdCPkXeI0DC6u1cW8JFhgRqi+AqSrEy5SzY3IY7NVMSRsBI9Y026BlR9OQwTrOzLRAw26NPSDvbTkeYXlY9+hX7IovHjGkho/OxyTJ7bKRDYLoNCz56BC1khIWvECpcf/fZU0nqOFVFqF3H/UCgYEAwmJ4rjl5fksTNtNRL6ivkqkHIPKXzk5wC+L90HKNicic9bqyX8K4JRkGKSNYN3mkjrguAzUlEld390qNBw5Lu7PwATv0e2i+6hdwJsjTKNpj7Nh4Mieq6d7lWe1L8FLyHEhxgIeQ4BgqrVtPPOH8IBGpuzVZdWwIdgOvEvAi/usCgYBdfk3NB/+SEEW5jn0uldE0s4vmHKq6fJwxWIT/X4XxGJ4qBmecNbeoOAtMbkEdWbNtXBXHyMbA+RTRJctUG5ooNou0Le2wPr6+PMAVilXVGD8dIWpjv9htpFvENvkZlbU++IKhCY0ICR++3ARpUrOZ3Hou/NRN36y9nlZT48tSoQKBgES2Bi6fxmBsLUiN/f64xAc1lH2DA0I728N343xRYdK4hTMfYXoUHH+QjurvwXkqmI6ScEFWAdqv7IoPYjaCSSb6ffYRuWP+LK4WxuAO0QV53SSViDdCalntHmlhRhyXVVnGCckDIqT0JfHNev7savDzDWpNe2fUXlFJEBPDqrstAoGBAOpd5+QBHF/tP5oPILH4aD/zmqMH7VtB+b/fOPwtIM+B/WnU7hHLO5t2lJYu18Be3amPkfoQIB7bpkM3Cer2G7Jw+TcHrY+EtIziDB5vwau1fl4VcbA9SfWpBojJ5Ifo9ELVxGiK95WxeQNSmLUy7AJzhK1Gwey8a/v+xfqiu9sE", + "algorithm": "RSA", + "encoding": "DER", + "type": "private" + }, + "rsaSignPub": { + "material": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtiNSLSvT9cExXOcD0dGZ9DFEMHw8895gAZcCdSppDrxbD7XgZiQYTlgt058i5fS+l11guAUJtKt5sZ2u8Fx0K9pxMdlczGtvQJdx/LQETEnLnfzAijvHisJ8h6dQOVczM7t01KIkS24QZElyO+kYqMWLytUV4RSHnrnIuUtPHCe6LieDWT2+1UBguxgtFt1xdXlquACLVv/Em3wp40XcbIwzhqLitb98rTY/wqSiGTz1uvvBX46n+f2j3geZKCEDGkWcXYw3dH4lRtDWTbqweRcaNDT/MJswQlBk/Up9KCyN7gjX67gttiCO6jMoTNDejGeJhG4Dd2o0vmn8WJlr5wIDAQAB", + "algorithm": "SHA256withRSA", + "encoding": "DER", + "type": "public" + }, + "rsaSignPriv": { + "material": "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2I1ItK9P1wTFc5wPR0Zn0MUQwfDzz3mABlwJ1KmkOvFsPteBmJBhOWC3TnyLl9L6XXWC4BQm0q3mxna7wXHQr2nEx2VzMa29Al3H8tARMScud/MCKO8eKwnyHp1A5VzMzu3TUoiRLbhBkSXI76RioxYvK1RXhFIeeuci5S08cJ7ouJ4NZPb7VQGC7GC0W3XF1eWq4AItW/8SbfCnjRdxsjDOGouK1v3ytNj/CpKIZPPW6+8Ffjqf5/aPeB5koIQMaRZxdjDd0fiVG0NZNurB5Fxo0NP8wmzBCUGT9Sn0oLI3uCNfruC22II7qMyhM0N6MZ4mEbgN3ajS+afxYmWvnAgMBAAECggEBAIIU293zDWDZZ73oJ+w0fHXQsdjHAmlRitPX3CN99KZXk9m2ldudL9bUV3Zqk2wUzgIg6LDEuFfWmAVojsaP4VBopKtriEFfAYfqIbjPgLpTgh8FoyWW6D6MBJCFyGALjUAHQ7uRScathvt5ESMEqV3wKJTmdsfX97w/B8J+rLN33fT3ZJUck5duZ8XKD+UtX1Y3UE1hTWo3Ae2MFND964XyUqy+HaYXjH0x6dhZzqyJ/OJ/MPGeMJgxp+nUbMWerwxrLQceNFVgnQgHj8e8k4fd04rkowkkPua912gNtmz7DuIEvcMnY64z585cn+cnXUPJwtu3JbAmn/AyLsV9FLECgYEA798Ut/r+vORB16JDKFu38pQCgIbdCPkXeI0DC6u1cW8JFhgRqi+AqSrEy5SzY3IY7NVMSRsBI9Y026BlR9OQwTrOzLRAw26NPSDvbTkeYXlY9+hX7IovHjGkho/OxyTJ7bKRDYLoNCz56BC1khIWvECpcf/fZU0nqOFVFqF3H/UCgYEAwmJ4rjl5fksTNtNRL6ivkqkHIPKXzk5wC+L90HKNicic9bqyX8K4JRkGKSNYN3mkjrguAzUlEld390qNBw5Lu7PwATv0e2i+6hdwJsjTKNpj7Nh4Mieq6d7lWe1L8FLyHEhxgIeQ4BgqrVtPPOH8IBGpuzVZdWwIdgOvEvAi/usCgYBdfk3NB/+SEEW5jn0uldE0s4vmHKq6fJwxWIT/X4XxGJ4qBmecNbeoOAtMbkEdWbNtXBXHyMbA+RTRJctUG5ooNou0Le2wPr6+PMAVilXVGD8dIWpjv9htpFvENvkZlbU++IKhCY0ICR++3ARpUrOZ3Hou/NRN36y9nlZT48tSoQKBgES2Bi6fxmBsLUiN/f64xAc1lH2DA0I728N343xRYdK4hTMfYXoUHH+QjurvwXkqmI6ScEFWAdqv7IoPYjaCSSb6ffYRuWP+LK4WxuAO0QV53SSViDdCalntHmlhRhyXVVnGCckDIqT0JfHNev7savDzDWpNe2fUXlFJEBPDqrstAoGBAOpd5+QBHF/tP5oPILH4aD/zmqMH7VtB+b/fOPwtIM+B/WnU7hHLO5t2lJYu18Be3amPkfoQIB7bpkM3Cer2G7Jw+TcHrY+EtIziDB5vwau1fl4VcbA9SfWpBojJ5Ifo9ELVxGiK95WxeQNSmLUy7AJzhK1Gwey8a/v+xfqiu9sE", + "algorithm": "SHA256withRSA", + "encoding": "DER", + "type": "private" + }, + "awsKmsUsWest2": { + "keyId": "arn:aws:kms:us-west-2:658956600833:key/b3537ef1-d8dc-4780-9f5a-55776cbb2f7f" + } +} diff --git a/sdk1/src/test/resources/vectors/encrypted_item/scenarios.json b/sdk1/src/test/resources/vectors/encrypted_item/scenarios.json new file mode 100644 index 00000000..00fa924c --- /dev/null +++ b/sdk1/src/test/resources/vectors/encrypted_item/scenarios.json @@ -0,0 +1,300 @@ +{ + "plaintext": "file://plaintext.json", + "keys": "file://keys.json", + "scenarios": [ + { + "version": "v0", + "provider": "static", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/static-aes-hmac-1.json", + "network": false + }, + { + "version": "v0", + "provider": "static", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/static-aes-hmac-2.json", + "network": false + }, + { + "version": "v1", + "provider": "static", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/static-aes-hmac-3.json", + "network": false + }, + { + "version": "v0", + "provider": "wrapped", + "keys": { + "encrypt": "rsaEncPub", + "decrypt": "rsaEncPriv", + "verify": "rsaSignPub", + "sign": "rsaSignPriv" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/wrapped-rsa-rsa-1.json", + "network": false + }, + { + "version": "v1", + "provider": "wrapped", + "keys": { + "encrypt": "rsaEncPub", + "decrypt": "rsaEncPriv", + "verify": "rsaSignPub", + "sign": "rsaSignPriv" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/wrapped-rsa-rsa-2.json", + "network": false + }, + { + "version": "v0", + "provider": "wrapped", + "keys": { + "encrypt": "rsaEncPub", + "decrypt": "rsaEncPriv", + "verify": "rsaSignPub", + "sign": "rsaSignPriv" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/wrapped-rsa-rsa-3.json", + "network": false + }, + { + "version": "v1", + "provider": "wrapped", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/wrapped-aes-hmac-1.json", + "network": false + }, + { + "version": "v1", + "provider": "awskms", + "keys": { + "decrypt": "awsKmsUsWest2", + "verify": "awsKmsUsWest2" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/aws-kms-direct-1.json", + "network": true + }, + { + "version": "v1", + "provider": "most_recent", + "material_name": "my material name", + "metastore": { + "table_name": "MetaTable", + "provider": "wrapped", + "keys": { + "encrypt": "rsaEncPub", + "decrypt": "rsaEncPriv", + "verify": "rsaSignPub", + "sign": "rsaSignPriv" + }, + "ciphertext": "file://ciphertext/python/metastore-rsa-rsa-1.json" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/metastore-data-tables-1.json", + "network": false + }, + { + "version": "v1", + "provider": "most_recent", + "material_name": "materialName", + "metastore": { + "table_name": "metastore", + "provider": "static", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "ciphertext": "file://ciphertext/python/metastore-aes-hmac-2.json" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/metastore-data-tables-2.json", + "network": false + }, + { + "version": "v1", + "provider": "most_recent", + "material_name": "materialName", + "metastore": { + "table_name": "metastore", + "provider": "awskms", + "keys": { + "decrypt": "awsKmsUsWest2", + "verify": "awsKmsUsWest2" + }, + "ciphertext": "file://ciphertext/python/metastore-aws-kms-1.json" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/python/metastore-data-tables-3.json", + "network": true + }, + { + "version": "v0", + "provider": "static", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/static-aes-hmac-1.json", + "network": false + }, + { + "version": "v0", + "provider": "static", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/static-aes-hmac-2.json", + "network": false + }, + { + "version": "v1", + "provider": "static", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/static-aes-hmac-3.json", + "network": false + }, + { + "version": "v0", + "provider": "wrapped", + "keys": { + "encrypt": "rsaEncPub", + "decrypt": "rsaEncPriv", + "verify": "rsaSignPub", + "sign": "rsaSignPriv" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/wrapped-rsa-rsa-1.json", + "network": false + }, + { + "version": "v1", + "provider": "wrapped", + "keys": { + "encrypt": "rsaEncPub", + "decrypt": "rsaEncPriv", + "verify": "rsaSignPub", + "sign": "rsaSignPriv" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/wrapped-rsa-rsa-2.json", + "network": false + }, + { + "version": "v0", + "provider": "wrapped", + "keys": { + "encrypt": "rsaEncPub", + "decrypt": "rsaEncPriv", + "verify": "rsaSignPub", + "sign": "rsaSignPriv" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/wrapped-rsa-rsa-3.json", + "network": false + }, + { + "version": "v1", + "provider": "wrapped", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/wrapped-aes-hmac-1.json", + "network": false + }, + { + "version": "v1", + "provider": "most_recent", + "material_name": "materialName", + "metastore": { + "table_name": "metastore", + "provider": "static", + "keys": { + "decrypt": "aesKey", + "verify": "hmacKey" + }, + "ciphertext": "file://ciphertext/java/metastore-aes-hmac-2.json" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/metastore-data-tables-2.json", + "network": false + }, + { + "version": "v1", + "provider": "awskms", + "keys": { + "decrypt": "awsKmsUsWest2", + "verify": "awsKmsUsWest2" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/aws-kms-direct-1.json", + "network": true + }, + { + "version": "v1", + "provider": "most_recent", + "material_name": "java-rsa-material-name", + "metastore": { + "table_name": "java-rsa-metatable", + "provider": "wrapped", + "keys": { + "encrypt": "rsaEncPub", + "decrypt": "rsaEncPriv", + "verify": "rsaSignPub", + "sign": "rsaSignPriv" + }, + "ciphertext": "file://ciphertext/java/metastore-rsa-rsa-1.json" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/metastore-data-tables-1.json", + "network": false + }, + { + "version": "v1", + "provider": "most_recent", + "material_name": "java-kms-material-name", + "metastore": { + "table_name": "java-kms-metatable", + "provider": "awskms", + "keys": { + "decrypt": "awsKmsUsWest2", + "verify": "awsKmsUsWest2" + }, + "ciphertext": "file://ciphertext/java/metastore-kms-3.json" + }, + "plaintext": "file://plaintext.json", + "ciphertext": "file://ciphertext/java/metastore-data-tables-3.json", + "network": true + } + ] +}