Retire "migrate signed pre-keys" configuration

This commit is contained in:
Jon Chambers 2023-12-11 12:52:09 -05:00 committed by Jon Chambers
parent feb933b4df
commit 44145073f1
13 changed files with 28 additions and 97 deletions

View File

@ -344,8 +344,8 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
config.getDynamoDbTables().getEcKeys().getTableName(), config.getDynamoDbTables().getEcKeys().getTableName(),
config.getDynamoDbTables().getKemKeys().getTableName(), config.getDynamoDbTables().getKemKeys().getTableName(),
config.getDynamoDbTables().getEcSignedPreKeys().getTableName(), config.getDynamoDbTables().getEcSignedPreKeys().getTableName(),
config.getDynamoDbTables().getKemLastResortKeys().getTableName(), config.getDynamoDbTables().getKemLastResortKeys().getTableName()
dynamicConfigurationManager); );
MessagesDynamoDb messagesDynamoDb = new MessagesDynamoDb(dynamoDbClient, dynamoDbAsyncClient, MessagesDynamoDb messagesDynamoDb = new MessagesDynamoDb(dynamoDbClient, dynamoDbAsyncClient,
config.getDynamoDbTables().getMessages().getTableName(), config.getDynamoDbTables().getMessages().getTableName(),
config.getDynamoDbTables().getMessages().getExpiration(), config.getDynamoDbTables().getMessages().getExpiration(),

View File

@ -51,10 +51,6 @@ public class DynamicConfiguration {
@Valid @Valid
DynamicRateLimitPolicy rateLimitPolicy = new DynamicRateLimitPolicy(false); DynamicRateLimitPolicy rateLimitPolicy = new DynamicRateLimitPolicy(false);
@JsonProperty
@Valid
DynamicECPreKeyMigrationConfiguration ecPreKeyMigration = new DynamicECPreKeyMigrationConfiguration(true, false);
@JsonProperty @JsonProperty
@Valid @Valid
DynamicInboundMessageByteLimitConfiguration inboundMessageByteLimit = new DynamicInboundMessageByteLimitConfiguration(true); DynamicInboundMessageByteLimitConfiguration inboundMessageByteLimit = new DynamicInboundMessageByteLimitConfiguration(true);
@ -97,10 +93,6 @@ public class DynamicConfiguration {
return rateLimitPolicy; return rateLimitPolicy;
} }
public DynamicECPreKeyMigrationConfiguration getEcPreKeyMigrationConfiguration() {
return ecPreKeyMigration;
}
public DynamicInboundMessageByteLimitConfiguration getInboundMessageByteLimitConfiguration() { public DynamicInboundMessageByteLimitConfiguration getInboundMessageByteLimitConfiguration() {
return inboundMessageByteLimit; return inboundMessageByteLimit;
} }

View File

@ -1,9 +0,0 @@
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.whispersystems.textsecuregcm.configuration.dynamic;
public record DynamicECPreKeyMigrationConfiguration(boolean deleteEcSignedPreKeys, boolean storeEcSignedPreKeys) {
}

View File

@ -131,9 +131,7 @@ public class KeysController {
case PNI -> d.setPhoneNumberIdentitySignedPreKey(setKeysRequest.signedPreKey()); case PNI -> d.setPhoneNumberIdentitySignedPreKey(setKeysRequest.signedPreKey());
} }
}, },
d -> keys.buildWriteItemForEcSignedPreKey(identifier, d.getId(), setKeysRequest.signedPreKey()) d -> List.of(keys.buildWriteItemForEcSignedPreKey(identifier, d.getId(), setKeysRequest.signedPreKey())))
.map(List::of)
.orElseGet(Collections::emptyList))
.toCompletableFuture(); .toCompletableFuture();
} else { } else {
updateAccountFuture = CompletableFuture.completedFuture(account); updateAccountFuture = CompletableFuture.completedFuture(account);
@ -302,9 +300,7 @@ public class KeysController {
case PNI -> d.setPhoneNumberIdentitySignedPreKey(signedPreKey); case PNI -> d.setPhoneNumberIdentitySignedPreKey(signedPreKey);
} }
}, },
d -> keys.buildWriteItemForEcSignedPreKey(identifier, d.getId(), signedPreKey) d -> List.of(keys.buildWriteItemForEcSignedPreKey(identifier, d.getId(), signedPreKey)))
.map(List::of)
.orElseGet(Collections::emptyList))
.toCompletableFuture() .toCompletableFuture()
.thenApply(Util.ASYNC_EMPTY_RESPONSE); .thenApply(Util.ASYNC_EMPTY_RESPONSE);
} }

View File

@ -430,8 +430,7 @@ public class AccountsManager {
if (pniSignedPreKeys != null) { if (pniSignedPreKeys != null) {
pniSignedPreKeys.forEach((deviceId, signedPreKey) -> pniSignedPreKeys.forEach((deviceId, signedPreKey) ->
keysManager.buildWriteItemForEcSignedPreKey(phoneNumberIdentifier, deviceId, signedPreKey) keyWriteItems.add(keysManager.buildWriteItemForEcSignedPreKey(phoneNumberIdentifier, deviceId, signedPreKey)));
.ifPresent(keyWriteItems::add));
} }
if (pniPqLastResortPreKeys != null) { if (pniPqLastResortPreKeys != null) {

View File

@ -11,7 +11,6 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration;
import org.whispersystems.textsecuregcm.entities.ECPreKey; import org.whispersystems.textsecuregcm.entities.ECPreKey;
import org.whispersystems.textsecuregcm.entities.ECSignedPreKey; import org.whispersystems.textsecuregcm.entities.ECSignedPreKey;
import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey; import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey;
@ -20,8 +19,6 @@ import software.amazon.awssdk.services.dynamodb.model.TransactWriteItem;
public class KeysManager { public class KeysManager {
private final DynamicConfigurationManager<DynamicConfiguration> dynamicConfigurationManager;
private final SingleUseECPreKeyStore ecPreKeys; private final SingleUseECPreKeyStore ecPreKeys;
private final SingleUseKEMPreKeyStore pqPreKeys; private final SingleUseKEMPreKeyStore pqPreKeys;
private final RepeatedUseECSignedPreKeyStore ecSignedPreKeys; private final RepeatedUseECSignedPreKeyStore ecSignedPreKeys;
@ -32,22 +29,18 @@ public class KeysManager {
final String ecTableName, final String ecTableName,
final String pqTableName, final String pqTableName,
final String ecSignedPreKeysTableName, final String ecSignedPreKeysTableName,
final String pqLastResortTableName, final String pqLastResortTableName) {
final DynamicConfigurationManager<DynamicConfiguration> dynamicConfigurationManager) {
this.ecPreKeys = new SingleUseECPreKeyStore(dynamoDbAsyncClient, ecTableName); this.ecPreKeys = new SingleUseECPreKeyStore(dynamoDbAsyncClient, ecTableName);
this.pqPreKeys = new SingleUseKEMPreKeyStore(dynamoDbAsyncClient, pqTableName); this.pqPreKeys = new SingleUseKEMPreKeyStore(dynamoDbAsyncClient, pqTableName);
this.ecSignedPreKeys = new RepeatedUseECSignedPreKeyStore(dynamoDbAsyncClient, ecSignedPreKeysTableName); this.ecSignedPreKeys = new RepeatedUseECSignedPreKeyStore(dynamoDbAsyncClient, ecSignedPreKeysTableName);
this.pqLastResortKeys = new RepeatedUseKEMSignedPreKeyStore(dynamoDbAsyncClient, pqLastResortTableName); this.pqLastResortKeys = new RepeatedUseKEMSignedPreKeyStore(dynamoDbAsyncClient, pqLastResortTableName);
this.dynamicConfigurationManager = dynamicConfigurationManager;
} }
public Optional<TransactWriteItem> buildWriteItemForEcSignedPreKey(final UUID identifier, public TransactWriteItem buildWriteItemForEcSignedPreKey(final UUID identifier,
final byte deviceId, final byte deviceId,
final ECSignedPreKey ecSignedPreKey) { final ECSignedPreKey ecSignedPreKey) {
return dynamicConfigurationManager.getConfiguration().getEcPreKeyMigrationConfiguration().storeEcSignedPreKeys() return ecSignedPreKeys.buildTransactWriteItem(identifier, deviceId, ecSignedPreKey);
? Optional.of(ecSignedPreKeys.buildTransactWriteItem(identifier, deviceId, ecSignedPreKey))
: Optional.empty();
} }
public TransactWriteItem buildWriteItemForLastResortKey(final UUID identifier, public TransactWriteItem buildWriteItemForLastResortKey(final UUID identifier,
@ -72,11 +65,7 @@ public class KeysManager {
} }
public CompletableFuture<Void> storeEcSignedPreKeys(final UUID identifier, final Map<Byte, ECSignedPreKey> keys) { public CompletableFuture<Void> storeEcSignedPreKeys(final UUID identifier, final Map<Byte, ECSignedPreKey> keys) {
if (dynamicConfigurationManager.getConfiguration().getEcPreKeyMigrationConfiguration().storeEcSignedPreKeys()) { return ecSignedPreKeys.store(identifier, keys);
return ecSignedPreKeys.store(identifier, keys);
} else {
return CompletableFuture.completedFuture(null);
}
} }
public CompletableFuture<Void> storePqLastResort(final UUID identifier, final Map<Byte, KEMSignedPreKey> keys) { public CompletableFuture<Void> storePqLastResort(final UUID identifier, final Map<Byte, KEMSignedPreKey> keys) {
@ -133,19 +122,15 @@ public class KeysManager {
return CompletableFuture.allOf( return CompletableFuture.allOf(
ecPreKeys.delete(identifier), ecPreKeys.delete(identifier),
pqPreKeys.delete(identifier), pqPreKeys.delete(identifier),
dynamicConfigurationManager.getConfiguration().getEcPreKeyMigrationConfiguration().deleteEcSignedPreKeys() ecSignedPreKeys.delete(identifier, excludePrimaryDevice),
? ecSignedPreKeys.delete(identifier, excludePrimaryDevice)
: CompletableFuture.completedFuture(null),
pqLastResortKeys.delete(identifier, excludePrimaryDevice)); pqLastResortKeys.delete(identifier, excludePrimaryDevice));
} }
public CompletableFuture<Void> delete(final UUID accountUuid, final byte deviceId) { public CompletableFuture<Void> delete(final UUID accountUuid, final byte deviceId) {
return CompletableFuture.allOf( return CompletableFuture.allOf(
ecPreKeys.delete(accountUuid, deviceId), ecPreKeys.delete(accountUuid, deviceId),
pqPreKeys.delete(accountUuid, deviceId), pqPreKeys.delete(accountUuid, deviceId),
dynamicConfigurationManager.getConfiguration().getEcPreKeyMigrationConfiguration().deleteEcSignedPreKeys() ecSignedPreKeys.delete(accountUuid, deviceId),
? ecSignedPreKeys.delete(accountUuid, deviceId) pqLastResortKeys.delete(accountUuid, deviceId));
: CompletableFuture.completedFuture(null),
pqLastResortKeys.delete(accountUuid, deviceId));
} }
} }

View File

@ -168,8 +168,8 @@ public class AssignUsernameCommand extends EnvironmentCommand<WhisperServerConfi
configuration.getDynamoDbTables().getEcKeys().getTableName(), configuration.getDynamoDbTables().getEcKeys().getTableName(),
configuration.getDynamoDbTables().getKemKeys().getTableName(), configuration.getDynamoDbTables().getKemKeys().getTableName(),
configuration.getDynamoDbTables().getEcSignedPreKeys().getTableName(), configuration.getDynamoDbTables().getEcSignedPreKeys().getTableName(),
configuration.getDynamoDbTables().getKemLastResortKeys().getTableName(), configuration.getDynamoDbTables().getKemLastResortKeys().getTableName()
dynamicConfigurationManager); );
MessagesDynamoDb messagesDynamoDb = new MessagesDynamoDb(dynamoDbClient, dynamoDbAsyncClient, MessagesDynamoDb messagesDynamoDb = new MessagesDynamoDb(dynamoDbClient, dynamoDbAsyncClient,
configuration.getDynamoDbTables().getMessages().getTableName(), configuration.getDynamoDbTables().getMessages().getTableName(),
configuration.getDynamoDbTables().getMessages().getExpiration(), configuration.getDynamoDbTables().getMessages().getExpiration(),

View File

@ -142,8 +142,8 @@ record CommandDependencies(
configuration.getDynamoDbTables().getEcKeys().getTableName(), configuration.getDynamoDbTables().getEcKeys().getTableName(),
configuration.getDynamoDbTables().getKemKeys().getTableName(), configuration.getDynamoDbTables().getKemKeys().getTableName(),
configuration.getDynamoDbTables().getEcSignedPreKeys().getTableName(), configuration.getDynamoDbTables().getEcSignedPreKeys().getTableName(),
configuration.getDynamoDbTables().getKemLastResortKeys().getTableName(), configuration.getDynamoDbTables().getKemLastResortKeys().getTableName()
dynamicConfigurationManager); );
MessagesDynamoDb messagesDynamoDb = new MessagesDynamoDb(dynamoDbClient, dynamoDbAsyncClient, MessagesDynamoDb messagesDynamoDb = new MessagesDynamoDb(dynamoDbClient, dynamoDbAsyncClient,
configuration.getDynamoDbTables().getMessages().getTableName(), configuration.getDynamoDbTables().getMessages().getTableName(),
configuration.getDynamoDbTables().getMessages().getExpiration(), configuration.getDynamoDbTables().getMessages().getExpiration(),

View File

@ -89,8 +89,8 @@ public class AccountCreationIntegrationTest {
DynamoDbExtensionSchema.Tables.EC_KEYS.tableName(), DynamoDbExtensionSchema.Tables.EC_KEYS.tableName(),
DynamoDbExtensionSchema.Tables.PQ_KEYS.tableName(), DynamoDbExtensionSchema.Tables.PQ_KEYS.tableName(),
DynamoDbExtensionSchema.Tables.REPEATED_USE_EC_SIGNED_PRE_KEYS.tableName(), DynamoDbExtensionSchema.Tables.REPEATED_USE_EC_SIGNED_PRE_KEYS.tableName(),
DynamoDbExtensionSchema.Tables.REPEATED_USE_KEM_SIGNED_PRE_KEYS.tableName(), DynamoDbExtensionSchema.Tables.REPEATED_USE_KEM_SIGNED_PRE_KEYS.tableName()
dynamicConfigurationManager); );
final Accounts accounts = new Accounts( final Accounts accounts = new Accounts(
DYNAMO_DB_EXTENSION.getDynamoDbClient(), DYNAMO_DB_EXTENSION.getDynamoDbClient(),

View File

@ -84,8 +84,8 @@ class AccountsManagerChangeNumberIntegrationTest {
Tables.EC_KEYS.tableName(), Tables.EC_KEYS.tableName(),
Tables.PQ_KEYS.tableName(), Tables.PQ_KEYS.tableName(),
Tables.REPEATED_USE_EC_SIGNED_PRE_KEYS.tableName(), Tables.REPEATED_USE_EC_SIGNED_PRE_KEYS.tableName(),
Tables.REPEATED_USE_KEM_SIGNED_PRE_KEYS.tableName(), Tables.REPEATED_USE_KEM_SIGNED_PRE_KEYS.tableName()
dynamicConfigurationManager); );
final Accounts accounts = new Accounts( final Accounts accounts = new Accounts(
DYNAMO_DB_EXTENSION.getDynamoDbClient(), DYNAMO_DB_EXTENSION.getDynamoDbClient(),

View File

@ -100,8 +100,8 @@ class AccountsManagerUsernameIntegrationTest {
Tables.EC_KEYS.tableName(), Tables.EC_KEYS.tableName(),
Tables.PQ_KEYS.tableName(), Tables.PQ_KEYS.tableName(),
Tables.REPEATED_USE_EC_SIGNED_PRE_KEYS.tableName(), Tables.REPEATED_USE_EC_SIGNED_PRE_KEYS.tableName(),
Tables.REPEATED_USE_KEM_SIGNED_PRE_KEYS.tableName(), Tables.REPEATED_USE_KEM_SIGNED_PRE_KEYS.tableName()
dynamicConfigurationManager); );
accounts = Mockito.spy(new Accounts( accounts = Mockito.spy(new Accounts(
DYNAMO_DB_EXTENSION.getDynamoDbClient(), DYNAMO_DB_EXTENSION.getDynamoDbClient(),

View File

@ -9,8 +9,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertIterableEquals; import static org.junit.jupiter.api.Assertions.assertIterableEquals;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -20,12 +18,8 @@ import java.util.UUID;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.signal.libsignal.protocol.ecc.Curve; import org.signal.libsignal.protocol.ecc.Curve;
import org.signal.libsignal.protocol.ecc.ECKeyPair; import org.signal.libsignal.protocol.ecc.ECKeyPair;
import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration;
import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicECPreKeyMigrationConfiguration;
import org.whispersystems.textsecuregcm.entities.ECPreKey; import org.whispersystems.textsecuregcm.entities.ECPreKey;
import org.whispersystems.textsecuregcm.entities.ECSignedPreKey; import org.whispersystems.textsecuregcm.entities.ECSignedPreKey;
import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey; import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey;
@ -34,7 +28,6 @@ import org.whispersystems.textsecuregcm.tests.util.KeysHelper;
class KeysManagerTest { class KeysManagerTest {
private DynamicECPreKeyMigrationConfiguration ecPreKeyMigrationConfiguration;
private KeysManager keysManager; private KeysManager keysManager;
@RegisterExtension @RegisterExtension
@ -48,22 +41,13 @@ class KeysManagerTest {
@BeforeEach @BeforeEach
void setup() { void setup() {
final DynamicConfigurationManager<DynamicConfiguration> dynamicConfigurationManager = mock(DynamicConfigurationManager.class);
final DynamicConfiguration dynamicConfiguration = mock(DynamicConfiguration.class);
ecPreKeyMigrationConfiguration = mock(DynamicECPreKeyMigrationConfiguration.class);
when(dynamicConfigurationManager.getConfiguration()).thenReturn(dynamicConfiguration);
when(dynamicConfiguration.getEcPreKeyMigrationConfiguration()).thenReturn(ecPreKeyMigrationConfiguration);
when(ecPreKeyMigrationConfiguration.storeEcSignedPreKeys()).thenReturn(true);
when(ecPreKeyMigrationConfiguration.deleteEcSignedPreKeys()).thenReturn(true);
keysManager = new KeysManager( keysManager = new KeysManager(
DYNAMO_DB_EXTENSION.getDynamoDbAsyncClient(), DYNAMO_DB_EXTENSION.getDynamoDbAsyncClient(),
Tables.EC_KEYS.tableName(), Tables.EC_KEYS.tableName(),
Tables.PQ_KEYS.tableName(), Tables.PQ_KEYS.tableName(),
Tables.REPEATED_USE_EC_SIGNED_PRE_KEYS.tableName(), Tables.REPEATED_USE_EC_SIGNED_PRE_KEYS.tableName(),
Tables.REPEATED_USE_KEM_SIGNED_PRE_KEYS.tableName(), Tables.REPEATED_USE_KEM_SIGNED_PRE_KEYS.tableName()
dynamicConfigurationManager); );
} }
@Test @Test
@ -246,22 +230,6 @@ class KeysManagerTest {
Set.copyOf(keysManager.getPqEnabledDevices(ACCOUNT_UUID).join())); Set.copyOf(keysManager.getPqEnabledDevices(ACCOUNT_UUID).join()));
} }
@Test
void testStoreEcSignedPreKeyDisabled() {
when(ecPreKeyMigrationConfiguration.storeEcSignedPreKeys()).thenReturn(false);
keysManager.storeEcSignedPreKeys(ACCOUNT_UUID, Map.of(DEVICE_ID, generateTestECSignedPreKey(1))).join();
assertFalse(keysManager.getEcSignedPreKey(ACCOUNT_UUID, DEVICE_ID).join().isPresent());
}
@ParameterizedTest
@ValueSource(booleans = {true, false})
void buildWriteItemForEcSignedPreKey(final boolean enableSignedPreKeyWrite) {
when(ecPreKeyMigrationConfiguration.storeEcSignedPreKeys()).thenReturn(enableSignedPreKeyWrite);
assertEquals(enableSignedPreKeyWrite,
keysManager.buildWriteItemForEcSignedPreKey(ACCOUNT_UUID, DEVICE_ID, generateTestECSignedPreKey(1)).isPresent());
}
private static ECPreKey generateTestPreKey(final long keyId) { private static ECPreKey generateTestPreKey(final long keyId) {
return new ECPreKey(keyId, Curve.generateKeyPair().getPublicKey()); return new ECPreKey(keyId, Curve.generateKeyPair().getPublicKey());
} }

View File

@ -72,8 +72,8 @@ public class LinkDeviceIntegrationTest {
DynamoDbExtensionSchema.Tables.EC_KEYS.tableName(), DynamoDbExtensionSchema.Tables.EC_KEYS.tableName(),
DynamoDbExtensionSchema.Tables.PQ_KEYS.tableName(), DynamoDbExtensionSchema.Tables.PQ_KEYS.tableName(),
DynamoDbExtensionSchema.Tables.REPEATED_USE_EC_SIGNED_PRE_KEYS.tableName(), DynamoDbExtensionSchema.Tables.REPEATED_USE_EC_SIGNED_PRE_KEYS.tableName(),
DynamoDbExtensionSchema.Tables.REPEATED_USE_KEM_SIGNED_PRE_KEYS.tableName(), DynamoDbExtensionSchema.Tables.REPEATED_USE_KEM_SIGNED_PRE_KEYS.tableName()
dynamicConfigurationManager); );
final Accounts accounts = new Accounts( final Accounts accounts = new Accounts(
DYNAMO_DB_EXTENSION.getDynamoDbClient(), DYNAMO_DB_EXTENSION.getDynamoDbClient(),