From 5fc6bdd478dd8ec63b7cf76a669e115296399c40 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Mon, 9 Jun 2025 14:18:49 -0400 Subject: [PATCH] Add a device capability for sparse post-quantum ratchet (SPQR) --- .../textsecuregcm/grpc/DeviceCapabilityUtil.java | 2 ++ .../textsecuregcm/storage/DeviceCapability.java | 3 ++- service/src/main/proto/org/signal/chat/common.proto | 1 + .../textsecuregcm/grpc/DevicesGrpcServiceTest.java | 11 ++++++++++- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/DeviceCapabilityUtil.java b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/DeviceCapabilityUtil.java index 0b9bd4ee5..eba69c5a3 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/DeviceCapabilityUtil.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/DeviceCapabilityUtil.java @@ -20,6 +20,7 @@ public class DeviceCapabilityUtil { case DEVICE_CAPABILITY_DELETE_SYNC -> DeviceCapability.DELETE_SYNC; case DEVICE_CAPABILITY_STORAGE_SERVICE_RECORD_KEY_ROTATION -> DeviceCapability.STORAGE_SERVICE_RECORD_KEY_ROTATION; case DEVICE_CAPABILITY_ATTACHMENT_BACKFILL -> DeviceCapability.ATTACHMENT_BACKFILL; + case DEVICE_CAPABILITY_SPARSE_POST_QUANTUM_RATCHET -> DeviceCapability.SPARSE_POST_QUANTUM_RATCHET; case DEVICE_CAPABILITY_UNSPECIFIED, UNRECOGNIZED -> throw Status.INVALID_ARGUMENT.withDescription("Unrecognized device capability").asRuntimeException(); }; } @@ -31,6 +32,7 @@ public class DeviceCapabilityUtil { case DELETE_SYNC -> org.signal.chat.common.DeviceCapability.DEVICE_CAPABILITY_DELETE_SYNC; case STORAGE_SERVICE_RECORD_KEY_ROTATION -> org.signal.chat.common.DeviceCapability.DEVICE_CAPABILITY_STORAGE_SERVICE_RECORD_KEY_ROTATION; case ATTACHMENT_BACKFILL -> org.signal.chat.common.DeviceCapability.DEVICE_CAPABILITY_ATTACHMENT_BACKFILL; + case SPARSE_POST_QUANTUM_RATCHET -> org.signal.chat.common.DeviceCapability.DEVICE_CAPABILITY_SPARSE_POST_QUANTUM_RATCHET; }; } } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/DeviceCapability.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/DeviceCapability.java index 9893ff06f..1b43f35fc 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/DeviceCapability.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/DeviceCapability.java @@ -12,7 +12,8 @@ public enum DeviceCapability { TRANSFER("transfer", AccountCapabilityMode.PRIMARY_DEVICE, false, false), DELETE_SYNC("deleteSync", AccountCapabilityMode.ALL_DEVICES, true, true), STORAGE_SERVICE_RECORD_KEY_ROTATION("ssre2", AccountCapabilityMode.ALL_DEVICES, true, true), - ATTACHMENT_BACKFILL("attachmentBackfill", AccountCapabilityMode.PRIMARY_DEVICE, false, true); + ATTACHMENT_BACKFILL("attachmentBackfill", AccountCapabilityMode.PRIMARY_DEVICE, false, true), + SPARSE_POST_QUANTUM_RATCHET("spqr", AccountCapabilityMode.ALL_DEVICES, true, true); public enum AccountCapabilityMode { /** diff --git a/service/src/main/proto/org/signal/chat/common.proto b/service/src/main/proto/org/signal/chat/common.proto index 2f08a2bfa..47e09fb33 100644 --- a/service/src/main/proto/org/signal/chat/common.proto +++ b/service/src/main/proto/org/signal/chat/common.proto @@ -101,6 +101,7 @@ enum DeviceCapability { reserved 4; DEVICE_CAPABILITY_STORAGE_SERVICE_RECORD_KEY_ROTATION = 5; DEVICE_CAPABILITY_ATTACHMENT_BACKFILL = 6; + DEVICE_CAPABILITY_SPARSE_POST_QUANTUM_RATCHET = 7; } message ZkCredential { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcServiceTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcServiceTest.java index cd99b894b..4acff9cc3 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcServiceTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcServiceTest.java @@ -435,7 +435,8 @@ class DevicesGrpcServiceTest extends SimpleBaseGrpcTest expectedCapabilities = new HashSet<>(); @@ -480,6 +485,10 @@ class DevicesGrpcServiceTest extends SimpleBaseGrpcTest