From e88bf72c734c986f07f417c557d3e0f1bb676ebb Mon Sep 17 00:00:00 2001 From: trevor-signal <131492920+trevor-signal@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:41:37 -0400 Subject: [PATCH] Fix local backup backupId iv and counter mechanism --- ts/services/backups/constants.std.ts | 2 +- ts/services/backups/util/localBackup.node.ts | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ts/services/backups/constants.std.ts b/ts/services/backups/constants.std.ts index 9d47df6ccd..94f39b41e9 100644 --- a/ts/services/backups/constants.std.ts +++ b/ts/services/backups/constants.std.ts @@ -8,7 +8,7 @@ export const BACKUP_VERSION = 1n; export const LOCAL_BACKUP_VERSION = 1; -export const LOCAL_BACKUP_BACKUP_ID_IV_LENGTH = 16; +export const LOCAL_BACKUP_BACKUP_ID_IV_LENGTH = 12; const { WallpaperPreset } = Backups.ChatStyle; diff --git a/ts/services/backups/util/localBackup.node.ts b/ts/services/backups/util/localBackup.node.ts index c87fbebc5a..cdaa0c7b92 100644 --- a/ts/services/backups/util/localBackup.node.ts +++ b/ts/services/backups/util/localBackup.node.ts @@ -212,13 +212,25 @@ export function getAttachmentLocalBackupPathFromSnapshotDir( ); } +function getBackupIdIvAndCounter({ + iv, +}: { + iv: Uint8Array; +}): Uint8Array { + return Buffer.concat([iv, Buffer.alloc(4)]); +} + export async function writeLocalBackupMetadata({ snapshotDir, backupId, metadataKey, }: LocalBackupMetadataVerificationType): Promise { const iv = randomBytes(LOCAL_BACKUP_BACKUP_ID_IV_LENGTH); - const encryptedId = encryptAesCtr(metadataKey, backupId, iv); + const encryptedId = encryptAesCtr( + metadataKey, + backupId, + getBackupIdIvAndCounter({ iv }) + ); const metadataSerialized = Signal.backup.local.Metadata.encode({ backupId: { @@ -257,7 +269,11 @@ export async function verifyLocalBackupMetadata({ 'verifyLocalBackupMetadata: Must have backupId.encryptedId' ); - const localBackupBackupId = decryptAesCtr(metadataKey, encryptedId, iv); + const localBackupBackupId = decryptAesCtr( + metadataKey, + encryptedId, + getBackupIdIvAndCounter({ iv }) + ); strictAssert( Bytes.areEqual(backupId, localBackupBackupId), 'verifyLocalBackupMetadata: backupId must match the local backup backupId'