Simplify list-MFA-keys RPC

Turns out clients only actually want the metadata, repeating the crypto
parameters is useless
This commit is contained in:
Jonathan Klabunde Tomer authored and Jon Chambers committed 2026-09-02 16:55:26 -04:00
1 parent d79e37230e
commit 3a75f705c2
3 files changed
+18 -20

No files matched your search

@@ -53,6 +53,7 @@ import org.signal.chat.account.GetEntitlementsRequest;
import org.signal.chat.account.GetEntitlementsResponse;
import org.signal.chat.account.ListMfaKeysRequest;
import org.signal.chat.account.ListMfaKeysResponse;
import org.signal.chat.account.ListMfaKeysResponse.MfaKeyMetadata.MfaKeyType;
import org.signal.chat.account.RegistrationLockFailure;
import org.signal.chat.account.RemoveMfaKeyRequest;
import org.signal.chat.account.RemoveMfaKeyResponse;
@@ -612,14 +613,13 @@ public class AccountsGrpcService extends SimpleAccountsGrpc.AccountsImplBase {
getAuthenticatedAccount().getMfaKeys().forEach((keyId, mfaKey) -> {
assert mfaKey.metadataCiphertext() != null;
ListMfaKeysResponse.MfaKeyMetadata.Builder metadataBuilder = ListMfaKeysResponse.MfaKeyMetadata.newBuilder()
.setMetadataCiphertext(ByteString.copyFrom(mfaKey.metadataCiphertext()));
switch (mfaKey) {
case AnnotatedTotpKey k -> metadataBuilder.setTotpParameters(toGrpcTotpParameters(k.totpKey().totpParameters()));
}
responseBuilder.putKeys(keyId, metadataBuilder.build());
responseBuilder.putKeys(
keyId,
ListMfaKeysResponse.MfaKeyMetadata.newBuilder()
.setMetadataCiphertext(ByteString.copyFrom(mfaKey.metadataCiphertext()))
.setType(switch (mfaKey) {
case AnnotatedTotpKey _ -> MfaKeyType.MFA_KEY_TYPE_TOTP;
}).build());
});
return responseBuilder.build();
@@ -575,13 +575,16 @@ message ListMfaKeysRequest {}
message ListMfaKeysResponse {
message MfaKeyMetadata {
// The user-provided ciphertext for metadata associated with this MFA key
enum MfaKeyType {
MFA_KEY_TYPE_UNSPECIFIED = 0;
MFA_KEY_TYPE_TOTP = 1;
}
/// The user-provided ciphertext for metadata associated with this MFA key
bytes metadata_ciphertext = 1 [(require.exactlySize) = 160];
oneof mfa_key {
// The TOTP parameters associated with this key, which is a TOTP key
TotpParameters totp_parameters = 2;
}
/// The type of MFA factor this key is for
MfaKeyType type = 2;
}
map<uint32, MfaKeyMetadata> keys = 1;
@@ -92,6 +92,7 @@ import org.signal.chat.account.SetZkCredentialKeyResponse;
import org.signal.chat.account.StaleDevices;
import org.signal.chat.account.TotpParameters;
import org.signal.chat.account.UsernameNotAvailable;
import org.signal.chat.account.ListMfaKeysResponse.MfaKeyMetadata.MfaKeyType;
import org.signal.chat.common.AccountIdentifiers;
import org.signal.chat.common.EcSignedPreKey;
import org.signal.chat.common.KemSignedPreKey;
@@ -1236,15 +1237,9 @@ class AccountsGrpcServiceTest extends SimpleBaseGrpcTest<AccountsGrpcService, Ac
final ListMfaKeysResponse response =
authenticatedServiceStub().listMfaKeys(ListMfaKeysRequest.getDefaultInstance());
final TotpParameters expectedTotpParameters = TotpParameters.newBuilder()
.setAlgorithm(AccountsManager.TOTP.getAlgorithm())
.setPasswordLength(AccountsManager.TOTP.getPasswordLength())
.setTimeStepSeconds(Math.toIntExact(AccountsManager.TOTP.getTimeStep().toSeconds()))
.build();
final Map<Integer, ListMfaKeysResponse.MfaKeyMetadata> expectedTotpKeys = totpKeys.entrySet().stream()
.collect(Collectors.toMap(entry -> entry.getKey().intValue(), entry -> ListMfaKeysResponse.MfaKeyMetadata.newBuilder()
.setTotpParameters(expectedTotpParameters)
.setType(MfaKeyType.MFA_KEY_TYPE_TOTP)
.setMetadataCiphertext(ByteString.copyFrom(entry.getValue().metadataCiphertext()))
.build()));