From 9573d5cbb7bbaed7182afd34a474d236b6263884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas=20de=20Oliveira=20Lopes?= <55464917+jlucaso1@users.noreply.github.com> Date: Sun, 7 Sep 2025 08:10:56 -0300 Subject: [PATCH] Fix/signal group sender message keys init (#1731) * fix(signal-group): initialize senderMessageKeys when deserializing SenderKeyState * test(signal-group): add regression test for missing senderMessageKeys initialization --- src/Signal/Group/sender-key-state.ts | 6 ++++- .../Group/sender-key-state-regression.test.ts | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/__tests__/Signal/Group/sender-key-state-regression.test.ts diff --git a/src/Signal/Group/sender-key-state.ts b/src/Signal/Group/sender-key-state.ts index 2c9d6b0f..49ede567 100644 --- a/src/Signal/Group/sender-key-state.ts +++ b/src/Signal/Group/sender-key-state.ts @@ -37,7 +37,11 @@ export class SenderKeyState { senderKeyStateStructure?: SenderKeyStateStructure | null ) { if (senderKeyStateStructure) { - this.senderKeyStateStructure = senderKeyStateStructure + if (!Array.isArray(senderKeyStateStructure.senderMessageKeys)) { + this.senderKeyStateStructure = { ...senderKeyStateStructure, senderMessageKeys: [] } + } else { + this.senderKeyStateStructure = senderKeyStateStructure + } } else { if (signatureKeyPair) { signatureKeyPublic = signatureKeyPair.public diff --git a/src/__tests__/Signal/Group/sender-key-state-regression.test.ts b/src/__tests__/Signal/Group/sender-key-state-regression.test.ts new file mode 100644 index 00000000..9c49f626 --- /dev/null +++ b/src/__tests__/Signal/Group/sender-key-state-regression.test.ts @@ -0,0 +1,22 @@ +import { SenderKeyState } from '../../../Signal/Group/sender-key-state' +import { SenderMessageKey } from '../../../Signal/Group/sender-message-key' + +describe('SenderKeyState regression: missing senderMessageKeys array', () => { + it('should initialize senderMessageKeys when absent in provided structure', () => { + const legacyStructure = { + senderKeyId: 42, + senderChainKey: { iteration: 0, seed: Buffer.from([1, 2, 3]) }, + senderSigningKey: { public: Buffer.from([4, 5, 6]) } + } + + const state = new SenderKeyState(null, null, null, null, null, null, legacyStructure as any) + const msgKey = new SenderMessageKey(0, Buffer.from([7, 8, 9])) + state.addSenderMessageKey(msgKey) + + const structure = state.getStructure() + expect(structure.senderMessageKeys).toBeDefined() + expect(Array.isArray(structure.senderMessageKeys)).toBe(true) + expect(structure.senderMessageKeys.length).toBe(1) + expect(structure.senderMessageKeys[0]?.iteration).toBe(0) + }) +})