Add a data store for client public keys for transport-level authentication/encryption

This commit is contained in:
Jon Chambers
2024-01-17 11:43:01 -05:00
committed by Jon Chambers
parent 61809107c8
commit 6c13193623
4 changed files with 247 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
package org.whispersystems.textsecuregcm.storage;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Optional;
import java.util.UUID;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.signal.libsignal.protocol.ecc.Curve;
import org.signal.libsignal.protocol.ecc.ECPublicKey;
import software.amazon.awssdk.services.dynamodb.model.TransactWriteItemsRequest;
class ClientPublicKeysTest {
private ClientPublicKeys clientPublicKeys;
@RegisterExtension
static final DynamoDbExtension DYNAMO_DB_EXTENSION =
new DynamoDbExtension(DynamoDbExtensionSchema.Tables.CLIENT_PUBLIC_KEYS);
@BeforeEach
void setUp() {
clientPublicKeys = new ClientPublicKeys(DYNAMO_DB_EXTENSION.getDynamoDbAsyncClient(),
DynamoDbExtensionSchema.Tables.CLIENT_PUBLIC_KEYS.tableName());
}
@Test
void buildTransactWriteItemForInsertionAndDeletion() {
final UUID accountIdentifier = UUID.randomUUID();
final byte deviceId = Device.PRIMARY_ID;
final ECPublicKey publicKey = Curve.generateKeyPair().getPublicKey();
assertEquals(Optional.empty(), clientPublicKeys.findPublicKey(accountIdentifier, deviceId).join());
DYNAMO_DB_EXTENSION.getDynamoDbClient().transactWriteItems(TransactWriteItemsRequest.builder()
.transactItems(clientPublicKeys.buildTransactWriteItemForInsertion(accountIdentifier, deviceId, publicKey))
.build());
assertEquals(Optional.of(publicKey), clientPublicKeys.findPublicKey(accountIdentifier, deviceId).join());
DYNAMO_DB_EXTENSION.getDynamoDbClient().transactWriteItems(TransactWriteItemsRequest.builder()
.transactItems(clientPublicKeys.buildTransactWriteItemForDeletion(accountIdentifier, deviceId))
.build());
assertEquals(Optional.empty(), clientPublicKeys.findPublicKey(accountIdentifier, deviceId).join());
}
}

View File

@@ -326,6 +326,21 @@ public final class DynamoDbExtensionSchema {
.build()),
List.of()),
CLIENT_PUBLIC_KEYS("client_public_keys_test",
ClientPublicKeys.KEY_ACCOUNT_UUID,
ClientPublicKeys.KEY_DEVICE_ID,
List.of(
AttributeDefinition.builder()
.attributeName(ClientPublicKeys.KEY_ACCOUNT_UUID)
.attributeType(ScalarAttributeType.B)
.build(),
AttributeDefinition.builder()
.attributeName(ClientPublicKeys.KEY_DEVICE_ID)
.attributeType(ScalarAttributeType.N)
.build()),
List.of(),
List.of()),
USERNAMES("usernames_test",
Accounts.ATTR_USERNAME_HASH,
null,