mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-09-01 02:41:22 +01:00
Fix local backup backupId iv and counter mechanism
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user