Fix local backup backupId iv and counter mechanism

This commit is contained in:
trevor-signal
2026-04-02 09:41:37 -07:00
committed by GitHub
parent 0cecca0e0b
commit e88bf72c73
2 changed files with 19 additions and 3 deletions
+1 -1
View File
@@ -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;
+18 -2
View File
@@ -212,13 +212,25 @@ export function getAttachmentLocalBackupPathFromSnapshotDir(
);
}
function getBackupIdIvAndCounter({
iv,
}: {
iv: Uint8Array<ArrayBuffer>;
}): Uint8Array<ArrayBuffer> {
return Buffer.concat([iv, Buffer.alloc(4)]);
}
export async function writeLocalBackupMetadata({
snapshotDir,
backupId,
metadataKey,
}: LocalBackupMetadataVerificationType): Promise<void> {
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'