@oxidezap/baileyrs 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Utils/__tests__/_legacy-store-fixtures.d.ts +65 -0
- package/lib/Utils/__tests__/_legacy-store-fixtures.d.ts.map +1 -0
- package/lib/Utils/__tests__/_legacy-store-fixtures.js +107 -0
- package/lib/Utils/__tests__/_legacy-store-fixtures.js.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-coverage.test.d.ts +10 -0
- package/lib/Utils/__tests__/wrap-legacy-store-coverage.test.d.ts.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-coverage.test.js +298 -0
- package/lib/Utils/__tests__/wrap-legacy-store-coverage.test.js.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.d.ts +4 -19
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.d.ts.map +1 -1
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.js +31 -97
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.js.map +1 -1
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.d.ts +6 -27
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.d.ts.map +1 -1
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.js +48 -175
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.js.map +1 -1
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.d.ts +10 -28
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.d.ts.map +1 -1
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.js +118 -297
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.js.map +1 -1
- package/lib/Utils/wrap-legacy-store.d.ts.map +1 -1
- package/lib/Utils/wrap-legacy-store.js +128 -273
- package/lib/Utils/wrap-legacy-store.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared fixtures for `wrap-legacy-store` unit tests. The 4 sister test
|
|
3
|
+
* files (sender-key / session / lid-mapping / coverage) all need the same
|
|
4
|
+
* in-memory keys store + wrapped-store factory + byte-pattern generator.
|
|
5
|
+
*/
|
|
6
|
+
/** In-memory keys store mirroring upstream `useMultiFileAuthState`'s
|
|
7
|
+
* `keys.get(type, ids[])` / `keys.set({ [type]: { [id]: value } })`. */
|
|
8
|
+
export declare function makeMemKeys(): {
|
|
9
|
+
raw: Record<string, Record<string, unknown>>;
|
|
10
|
+
get(type: string, ids: string[]): Promise<Record<string, any>>;
|
|
11
|
+
set(updates: Record<string, Record<string, unknown>>): Promise<void>;
|
|
12
|
+
};
|
|
13
|
+
/** Build a wrap-legacy-store wired to a fresh in-memory keys backend. */
|
|
14
|
+
export declare function makeWrapped(): Promise<{
|
|
15
|
+
wrapped: import("../wrap-legacy-store.js").WrappedLegacyStore;
|
|
16
|
+
keys: {
|
|
17
|
+
raw: Record<string, Record<string, unknown>>;
|
|
18
|
+
get(type: string, ids: string[]): Promise<Record<string, any>>;
|
|
19
|
+
set(updates: Record<string, Record<string, unknown>>): Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
creds: import("../../index.js").AuthenticationCreds;
|
|
22
|
+
}>;
|
|
23
|
+
/** Deterministic byte-pattern generator. Distinct `(n, base)` pairs yield
|
|
24
|
+
* distinct buffers, so we can pinpoint which field round-tripped wrong. */
|
|
25
|
+
export declare const fill: (n: number, base: number) => Uint8Array<ArrayBuffer>;
|
|
26
|
+
export declare const SAMPLE_GROUP = "120363012345678900@g.us";
|
|
27
|
+
export declare const BRIDGE_SK_KEY_LID = "120363012345678900@g.us:100000037037034@lid.0";
|
|
28
|
+
export declare const UPSTREAM_SK_KEY_LID = "120363012345678900@g.us::100000037037034_1::0";
|
|
29
|
+
export declare const BRIDGE_SK_KEY_PN_DEV = "120363012345678900@g.us:559980000003:5@s.whatsapp.net.0";
|
|
30
|
+
export declare const UPSTREAM_SK_KEY_PN_DEV = "120363012345678900@g.us::559980000003::5";
|
|
31
|
+
export declare const BRIDGE_SESSION_KEY_LID = "100000037037034@lid.0";
|
|
32
|
+
export declare const UPSTREAM_SESSION_KEY_LID = "100000037037034_1.0";
|
|
33
|
+
export declare const BRIDGE_SESSION_KEY_PN = "559980000003@s.whatsapp.net.0";
|
|
34
|
+
export declare const UPSTREAM_SESSION_KEY_PN = "559980000003.0";
|
|
35
|
+
export declare const BRIDGE_SESSION_KEY_PN_DEV = "559980000003:5@s.whatsapp.net.0";
|
|
36
|
+
export declare const UPSTREAM_SESSION_KEY_PN_DEV = "559980000003.5";
|
|
37
|
+
export interface BuildSenderKeyOpts {
|
|
38
|
+
keyId?: number;
|
|
39
|
+
iteration?: number;
|
|
40
|
+
chainSeed?: Uint8Array;
|
|
41
|
+
signingPublic?: Uint8Array;
|
|
42
|
+
signingPrivate?: Uint8Array;
|
|
43
|
+
}
|
|
44
|
+
/** Encode a `SenderKeyRecordStructure` with one populated state. */
|
|
45
|
+
export declare function buildBridgeSenderKeyBytes(opts?: BuildSenderKeyOpts): Uint8Array;
|
|
46
|
+
export interface BuildSessionOpts {
|
|
47
|
+
rootKey?: Uint8Array;
|
|
48
|
+
rootSeed?: number;
|
|
49
|
+
previousCounter?: number;
|
|
50
|
+
senderRatchetPub?: Uint8Array;
|
|
51
|
+
senderRatchetPriv?: Uint8Array;
|
|
52
|
+
senderChainKey?: Uint8Array;
|
|
53
|
+
senderChainIndex?: number;
|
|
54
|
+
receiverRatchetPub?: Uint8Array;
|
|
55
|
+
receiverChainKey?: Uint8Array;
|
|
56
|
+
receiverChainIndex?: number;
|
|
57
|
+
aliceBaseKey?: Uint8Array;
|
|
58
|
+
remoteIdentity?: Uint8Array;
|
|
59
|
+
remoteRegistrationId?: number;
|
|
60
|
+
localRegistrationId?: number;
|
|
61
|
+
}
|
|
62
|
+
/** Encode a `RecordStructure` with a single established `currentSession`
|
|
63
|
+
* (sender chain + one receiver chain). */
|
|
64
|
+
export declare function buildBridgeSessionBytes(opts?: BuildSessionOpts): Uint8Array;
|
|
65
|
+
//# sourceMappingURL=_legacy-store-fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_legacy-store-fixtures.d.ts","sourceRoot":"","sources":["../../../src/Utils/__tests__/_legacy-store-fixtures.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;yEACyE;AACzE,wBAAgB,WAAW;;cAKT,MAAM,OAAO,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;iBAMjD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;EAU3E;AAED,yEAAyE;AACzE,wBAAsB,WAAW;;;;kBAnBf,MAAM,OAAO,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;qBAMjD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;;;GAmB3E;AAED;4EAC4E;AAC5E,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,EAAE,MAAM,MAAM,4BAA8D,CAAA;AAG1G,eAAO,MAAM,YAAY,4BAA4B,CAAA;AAGrD,eAAO,MAAM,iBAAiB,kDAA0C,CAAA;AACxE,eAAO,MAAM,mBAAmB,kDAA0C,CAAA;AAG1E,eAAO,MAAM,oBAAoB,4DAAoD,CAAA;AACrF,eAAO,MAAM,sBAAsB,6CAAqC,CAAA;AAGxE,eAAO,MAAM,sBAAsB,0BAA0B,CAAA;AAC7D,eAAO,MAAM,wBAAwB,wBAAwB,CAAA;AAC7D,eAAO,MAAM,qBAAqB,kCAAkC,CAAA;AACpE,eAAO,MAAM,uBAAuB,mBAAmB,CAAA;AACvD,eAAO,MAAM,yBAAyB,oCAAoC,CAAA;AAC1E,eAAO,MAAM,2BAA2B,mBAAmB,CAAA;AAI3D,MAAM,WAAW,kBAAkB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,aAAa,CAAC,EAAE,UAAU,CAAA;IAC1B,cAAc,CAAC,EAAE,UAAU,CAAA;CAC3B;AAED,oEAAoE;AACpE,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,kBAAuB,GAAG,UAAU,CAoBnF;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,UAAU,CAAA;IAC7B,iBAAiB,CAAC,EAAE,UAAU,CAAA;IAC9B,cAAc,CAAC,EAAE,UAAU,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kBAAkB,CAAC,EAAE,UAAU,CAAA;IAC/B,gBAAgB,CAAC,EAAE,UAAU,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,YAAY,CAAC,EAAE,UAAU,CAAA;IACzB,cAAc,CAAC,EAAE,UAAU,CAAA;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED;2CAC2C;AAC3C,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,gBAAqB,GAAG,UAAU,CA4C/E"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared fixtures for `wrap-legacy-store` unit tests. The 4 sister test
|
|
3
|
+
* files (sender-key / session / lid-mapping / coverage) all need the same
|
|
4
|
+
* in-memory keys store + wrapped-store factory + byte-pattern generator.
|
|
5
|
+
*/
|
|
6
|
+
import { proto as bridgeProto } from 'whatsapp-rust-bridge/proto-types';
|
|
7
|
+
import { initAuthCreds } from "../generics.js";
|
|
8
|
+
import { wrapLegacyStore } from "../wrap-legacy-store.js";
|
|
9
|
+
/** In-memory keys store mirroring upstream `useMultiFileAuthState`'s
|
|
10
|
+
* `keys.get(type, ids[])` / `keys.set({ [type]: { [id]: value } })`. */
|
|
11
|
+
export function makeMemKeys() {
|
|
12
|
+
const data = {};
|
|
13
|
+
return {
|
|
14
|
+
raw: data,
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- mirrors upstream surface
|
|
16
|
+
async get(type, ids) {
|
|
17
|
+
const bucket = data[type] ?? {};
|
|
18
|
+
const out = {};
|
|
19
|
+
for (const id of ids)
|
|
20
|
+
out[id] = bucket[id] ?? null;
|
|
21
|
+
return out;
|
|
22
|
+
},
|
|
23
|
+
async set(updates) {
|
|
24
|
+
for (const [type, bucket] of Object.entries(updates)) {
|
|
25
|
+
data[type] ?? (data[type] = {});
|
|
26
|
+
for (const [id, val] of Object.entries(bucket)) {
|
|
27
|
+
if (val === null || val === undefined)
|
|
28
|
+
delete data[type][id];
|
|
29
|
+
else
|
|
30
|
+
data[type][id] = val;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Build a wrap-legacy-store wired to a fresh in-memory keys backend. */
|
|
37
|
+
export async function makeWrapped() {
|
|
38
|
+
const creds = initAuthCreds();
|
|
39
|
+
const keys = makeMemKeys();
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal AuthenticationState surface
|
|
41
|
+
const wrapped = await wrapLegacyStore({ creds, keys: keys }, async () => { });
|
|
42
|
+
return { wrapped, keys, creds };
|
|
43
|
+
}
|
|
44
|
+
/** Deterministic byte-pattern generator. Distinct `(n, base)` pairs yield
|
|
45
|
+
* distinct buffers, so we can pinpoint which field round-tripped wrong. */
|
|
46
|
+
export const fill = (n, base) => new Uint8Array(n).map((_, i) => (i * base + base) & 0xff);
|
|
47
|
+
// ── Common LID/PN sample pairs ──
|
|
48
|
+
export const SAMPLE_GROUP = '120363012345678900@g.us';
|
|
49
|
+
// LID sender, no JID device (matches the mock server's default).
|
|
50
|
+
export const BRIDGE_SK_KEY_LID = `${SAMPLE_GROUP}:100000037037034@lid.0`;
|
|
51
|
+
export const UPSTREAM_SK_KEY_LID = `${SAMPLE_GROUP}::100000037037034_1::0`;
|
|
52
|
+
// PN sender on s.whatsapp.net with a JID device → exercises `user:device@server`.
|
|
53
|
+
export const BRIDGE_SK_KEY_PN_DEV = `${SAMPLE_GROUP}:559980000003:5@s.whatsapp.net.0`;
|
|
54
|
+
export const UPSTREAM_SK_KEY_PN_DEV = `${SAMPLE_GROUP}::559980000003::5`;
|
|
55
|
+
// Session keys (pairwise, no group prefix).
|
|
56
|
+
export const BRIDGE_SESSION_KEY_LID = '100000037037034@lid.0';
|
|
57
|
+
export const UPSTREAM_SESSION_KEY_LID = '100000037037034_1.0';
|
|
58
|
+
export const BRIDGE_SESSION_KEY_PN = '559980000003@s.whatsapp.net.0';
|
|
59
|
+
export const UPSTREAM_SESSION_KEY_PN = '559980000003.0';
|
|
60
|
+
export const BRIDGE_SESSION_KEY_PN_DEV = '559980000003:5@s.whatsapp.net.0';
|
|
61
|
+
export const UPSTREAM_SESSION_KEY_PN_DEV = '559980000003.5';
|
|
62
|
+
/** Encode a `SenderKeyRecordStructure` with one populated state. */
|
|
63
|
+
export function buildBridgeSenderKeyBytes(opts = {}) {
|
|
64
|
+
const { keyId = 1, iteration = 0, chainSeed = fill(32, 1), signingPublic = fill(33, 2), signingPrivate = fill(32, 3) } = opts;
|
|
65
|
+
return bridgeProto.SenderKeyRecordStructure.encode(bridgeProto.SenderKeyRecordStructure.create({
|
|
66
|
+
senderKeyStates: [
|
|
67
|
+
{
|
|
68
|
+
senderKeyId: keyId,
|
|
69
|
+
senderChainKey: { iteration, seed: chainSeed },
|
|
70
|
+
senderSigningKey: { public: signingPublic, private: signingPrivate },
|
|
71
|
+
senderMessageKeys: []
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
})).finish();
|
|
75
|
+
}
|
|
76
|
+
/** Encode a `RecordStructure` with a single established `currentSession`
|
|
77
|
+
* (sender chain + one receiver chain). */
|
|
78
|
+
export function buildBridgeSessionBytes(opts = {}) {
|
|
79
|
+
const { rootKey = fill(32, opts.rootSeed ?? 1), previousCounter = 0, senderRatchetPub = fill(33, 2), senderRatchetPriv = fill(32, 3), senderChainKey = fill(32, 4), senderChainIndex = 0, receiverRatchetPub = fill(33, 5), receiverChainKey = fill(32, 6), receiverChainIndex = 1, aliceBaseKey = fill(33, 7), remoteIdentity = fill(33, 8), remoteRegistrationId = 1234, localRegistrationId = 5678 } = opts;
|
|
80
|
+
return bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
|
|
81
|
+
currentSession: bridgeProto.SessionStructure.create({
|
|
82
|
+
sessionVersion: 3,
|
|
83
|
+
localIdentityPublic: fill(33, 9),
|
|
84
|
+
remoteIdentityPublic: remoteIdentity,
|
|
85
|
+
rootKey,
|
|
86
|
+
previousCounter,
|
|
87
|
+
senderChain: {
|
|
88
|
+
senderRatchetKey: senderRatchetPub,
|
|
89
|
+
senderRatchetKeyPrivate: senderRatchetPriv,
|
|
90
|
+
chainKey: { index: senderChainIndex, key: senderChainKey },
|
|
91
|
+
messageKeys: []
|
|
92
|
+
},
|
|
93
|
+
receiverChains: [
|
|
94
|
+
{
|
|
95
|
+
senderRatchetKey: receiverRatchetPub,
|
|
96
|
+
chainKey: { index: receiverChainIndex, key: receiverChainKey },
|
|
97
|
+
messageKeys: []
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
remoteRegistrationId,
|
|
101
|
+
localRegistrationId,
|
|
102
|
+
aliceBaseKey
|
|
103
|
+
}),
|
|
104
|
+
previousSessions: []
|
|
105
|
+
})).finish();
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=_legacy-store-fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_legacy-store-fixtures.js","sourceRoot":"","sources":["../../../src/Utils/__tests__/_legacy-store-fixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-cutting `wrap-legacy-store` coverage:
|
|
3
|
+
* 1. Hosted JID domains (`hosted` → `_2`, `hosted.lid` → `_3`).
|
|
4
|
+
* 2. PreKey cross-impl (proto bytes ↔ {public, private}).
|
|
5
|
+
* 3. Identity cross-impl (32 bytes ↔ 33 bytes with 0x05 prefix + key rewrite).
|
|
6
|
+
* 4. Idempotent round-trip (write→read→write produces identical disk bytes).
|
|
7
|
+
* 5. messageKeys cache JS→Rust HKDF derivation (Finding 2 partial fix).
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=wrap-legacy-store-coverage.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap-legacy-store-coverage.test.d.ts","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-coverage.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-cutting `wrap-legacy-store` coverage:
|
|
3
|
+
* 1. Hosted JID domains (`hosted` → `_2`, `hosted.lid` → `_3`).
|
|
4
|
+
* 2. PreKey cross-impl (proto bytes ↔ {public, private}).
|
|
5
|
+
* 3. Identity cross-impl (32 bytes ↔ 33 bytes with 0x05 prefix + key rewrite).
|
|
6
|
+
* 4. Idempotent round-trip (write→read→write produces identical disk bytes).
|
|
7
|
+
* 5. messageKeys cache JS→Rust HKDF derivation (Finding 2 partial fix).
|
|
8
|
+
*/
|
|
9
|
+
import { Buffer } from 'node:buffer';
|
|
10
|
+
import { createHmac } from 'node:crypto';
|
|
11
|
+
import { describe, test } from 'node:test';
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
13
|
+
// @ts-expect-error -- libsignal lacks .d.ts
|
|
14
|
+
import SessionRecord from 'libsignal/src/session_record.js';
|
|
15
|
+
import { proto as bridgeProto } from 'whatsapp-rust-bridge/proto-types';
|
|
16
|
+
import { expect } from "../../__tests__/expect.js";
|
|
17
|
+
import { BRIDGE_SESSION_KEY_LID, SAMPLE_GROUP, UPSTREAM_SESSION_KEY_LID, buildBridgeSenderKeyBytes, buildBridgeSessionBytes, fill, makeWrapped } from "./_legacy-store-fixtures.js";
|
|
18
|
+
// ── 1. Hosted JID domains ───────────────────────────────────────────────
|
|
19
|
+
describe('wrap-legacy-store: hosted JID domain coverage', () => {
|
|
20
|
+
test('hosted (domainType=2): sender_key key gets `_2` suffix', async () => {
|
|
21
|
+
const { wrapped, keys } = await makeWrapped();
|
|
22
|
+
const bridgeKey = `${SAMPLE_GROUP}:5599800000@hosted.0`;
|
|
23
|
+
const expected = `${SAMPLE_GROUP}::5599800000_2::0`;
|
|
24
|
+
await wrapped.set('sender_key', bridgeKey, buildBridgeSenderKeyBytes());
|
|
25
|
+
expect(keys.raw['sender-key']?.[expected]).toBeDefined();
|
|
26
|
+
});
|
|
27
|
+
test('hosted.lid (domainType=3): sender_key key gets `_3` suffix', async () => {
|
|
28
|
+
const { wrapped, keys } = await makeWrapped();
|
|
29
|
+
const bridgeKey = `${SAMPLE_GROUP}:100000037037034@hosted.lid.0`;
|
|
30
|
+
const expected = `${SAMPLE_GROUP}::100000037037034_3::0`;
|
|
31
|
+
await wrapped.set('sender_key', bridgeKey, buildBridgeSenderKeyBytes());
|
|
32
|
+
expect(keys.raw['sender-key']?.[expected]).toBeDefined();
|
|
33
|
+
});
|
|
34
|
+
test('hosted: session key uses JID device suffix (not signal device)', async () => {
|
|
35
|
+
const { wrapped, keys } = await makeWrapped();
|
|
36
|
+
await wrapped.set('session', '5599800000:7@hosted.0', buildBridgeSessionBytes());
|
|
37
|
+
expect(keys.raw['session']?.['5599800000_2.7']).toBeDefined();
|
|
38
|
+
});
|
|
39
|
+
test('hosted.lid: identity round-trips (32 → 33 bytes + key rewrite)', async () => {
|
|
40
|
+
const { wrapped, keys } = await makeWrapped();
|
|
41
|
+
const raw32 = fill(32, 0xab);
|
|
42
|
+
await wrapped.set('identity', '100000037037034@hosted.lid.0', raw32);
|
|
43
|
+
const stored = keys.raw['identity-key']?.['100000037037034_3.0'];
|
|
44
|
+
expect(stored.length).toBe(33);
|
|
45
|
+
expect(stored[0]).toBe(0x05);
|
|
46
|
+
expect(stored.subarray(1).equals(Buffer.from(raw32))).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
// ── 2. PreKey cross-impl ────────────────────────────────────────────────
|
|
50
|
+
describe('wrap-legacy-store: prekey cross-impl', () => {
|
|
51
|
+
test('upstream {public, private} → bridge GET returns proto bytes', async () => {
|
|
52
|
+
const { wrapped, keys } = await makeWrapped();
|
|
53
|
+
const pub = Buffer.from(fill(33, 0x10));
|
|
54
|
+
const priv = Buffer.from(fill(32, 0x20));
|
|
55
|
+
keys.raw['pre-key'] = { '42': { public: pub, private: priv } };
|
|
56
|
+
const out = (await wrapped.get('prekey', '42'));
|
|
57
|
+
// 33 + 32 + ~6 bytes proto overhead.
|
|
58
|
+
expect(out.length).toBeGreaterThan(60);
|
|
59
|
+
});
|
|
60
|
+
test('bridge proto bytes → upstream {public, private} on disk', async () => {
|
|
61
|
+
const { wrapped, keys } = await makeWrapped();
|
|
62
|
+
const pub = Buffer.from(fill(33, 0x10));
|
|
63
|
+
const priv = Buffer.from(fill(32, 0x20));
|
|
64
|
+
keys.raw['pre-key'] = { '42': { public: pub, private: priv } };
|
|
65
|
+
const protoBytes = (await wrapped.get('prekey', '42'));
|
|
66
|
+
keys.raw['pre-key'] = {};
|
|
67
|
+
await wrapped.set('prekey', '42', protoBytes);
|
|
68
|
+
const stored = keys.raw['pre-key']?.['42'];
|
|
69
|
+
expect(Buffer.from(stored.public).equals(pub)).toBe(true);
|
|
70
|
+
expect(Buffer.from(stored.private).equals(priv)).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
// ── 3. Identity cross-impl ──────────────────────────────────────────────
|
|
74
|
+
describe('wrap-legacy-store: identity cross-impl', () => {
|
|
75
|
+
test('bridge SET 32-byte → upstream-side 33-byte under signalUser key', async () => {
|
|
76
|
+
const { wrapped, keys } = await makeWrapped();
|
|
77
|
+
const raw32 = fill(32, 0xc0);
|
|
78
|
+
await wrapped.set('identity', '559980000003@s.whatsapp.net.0', raw32);
|
|
79
|
+
const stored = keys.raw['identity-key']?.['559980000003.0'];
|
|
80
|
+
expect(stored.length).toBe(33);
|
|
81
|
+
expect(stored[0]).toBe(0x05);
|
|
82
|
+
expect(stored.subarray(1).equals(Buffer.from(raw32))).toBe(true);
|
|
83
|
+
expect(keys.raw['identity-key']?.['559980000003@s.whatsapp.net.0']).toBeUndefined();
|
|
84
|
+
});
|
|
85
|
+
test('upstream 33-byte → bridge GET returns 32-byte (prefix stripped)', async () => {
|
|
86
|
+
const { wrapped, keys } = await makeWrapped();
|
|
87
|
+
const raw32 = fill(32, 0xd0);
|
|
88
|
+
keys.raw['identity-key'] = { '559980000003.0': Buffer.concat([Buffer.from([0x05]), Buffer.from(raw32)]) };
|
|
89
|
+
const out = (await wrapped.get('identity', '559980000003@s.whatsapp.net.0'));
|
|
90
|
+
expect(out.length).toBe(32);
|
|
91
|
+
expect(Buffer.from(out).equals(Buffer.from(raw32))).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
test('LID identity round-trip preserves byte-for-byte', async () => {
|
|
94
|
+
const { wrapped, keys } = await makeWrapped();
|
|
95
|
+
const raw32 = fill(32, 0xe0);
|
|
96
|
+
await wrapped.set('identity', '100000037037034@lid.0', raw32);
|
|
97
|
+
expect(keys.raw['identity-key']?.['100000037037034_1.0']).toBeDefined();
|
|
98
|
+
const out = (await wrapped.get('identity', '100000037037034@lid.0'));
|
|
99
|
+
expect(Buffer.from(out).equals(Buffer.from(raw32))).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
// ── 4. Idempotent round-trip ────────────────────────────────────────────
|
|
103
|
+
describe('wrap-legacy-store: idempotent round-trip', () => {
|
|
104
|
+
test('sender_key: SET → GET → SET produces identical disk bytes', async () => {
|
|
105
|
+
const { wrapped, keys } = await makeWrapped();
|
|
106
|
+
const original = buildBridgeSenderKeyBytes({ keyId: 17, iteration: 5 });
|
|
107
|
+
const upstreamKey = `${SAMPLE_GROUP}::100000037037034_1::0`;
|
|
108
|
+
const bridgeKey = `${SAMPLE_GROUP}:100000037037034@lid.0`;
|
|
109
|
+
await wrapped.set('sender_key', bridgeKey, original);
|
|
110
|
+
const first = keys.raw['sender-key']?.[upstreamKey];
|
|
111
|
+
const back = (await wrapped.get('sender_key', bridgeKey));
|
|
112
|
+
await wrapped.set('sender_key', bridgeKey, back);
|
|
113
|
+
const second = keys.raw['sender-key']?.[upstreamKey];
|
|
114
|
+
expect(Buffer.compare(first, second)).toBe(0);
|
|
115
|
+
});
|
|
116
|
+
test('session: SET → GET → SET preserves baseKey set + open-status + identity', async () => {
|
|
117
|
+
const { wrapped, keys } = await makeWrapped();
|
|
118
|
+
const aliceBaseKey = Buffer.from(fill(33, 0x70));
|
|
119
|
+
const original = buildBridgeSessionBytes({ rootSeed: 11, aliceBaseKey: new Uint8Array(aliceBaseKey) });
|
|
120
|
+
await wrapped.set('session', BRIDGE_SESSION_KEY_LID, original);
|
|
121
|
+
const stored1 = keys.raw['session']?.[UPSTREAM_SESSION_KEY_LID];
|
|
122
|
+
// eslint-disable-next-line unicorn/no-array-sort, eslint-plugin-unicorn/no-useless-spread
|
|
123
|
+
const baseKeys1 = Object.keys(stored1._sessions).slice().sort();
|
|
124
|
+
const back = (await wrapped.get('session', BRIDGE_SESSION_KEY_LID));
|
|
125
|
+
await wrapped.set('session', BRIDGE_SESSION_KEY_LID, back);
|
|
126
|
+
const stored2 = keys.raw['session']?.[UPSTREAM_SESSION_KEY_LID];
|
|
127
|
+
// eslint-disable-next-line unicorn/no-array-sort
|
|
128
|
+
const baseKeys2 = Object.keys(stored2._sessions).slice().sort();
|
|
129
|
+
expect(baseKeys2).toEqual(baseKeys1);
|
|
130
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
131
|
+
const rec = SessionRecord.deserialize(stored2);
|
|
132
|
+
expect(rec.haveOpenSession()).toBe(true);
|
|
133
|
+
expect(Buffer.from(rec.getOpenSession().indexInfo.baseKey).equals(aliceBaseKey)).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
test('identity: SET → GET → SET produces byte-identical upstream blob', async () => {
|
|
136
|
+
const { wrapped, keys } = await makeWrapped();
|
|
137
|
+
const raw32 = fill(32, 0x55);
|
|
138
|
+
await wrapped.set('identity', '100000037037034@lid.0', raw32);
|
|
139
|
+
const first = keys.raw['identity-key']?.['100000037037034_1.0'];
|
|
140
|
+
const back = (await wrapped.get('identity', '100000037037034@lid.0'));
|
|
141
|
+
await wrapped.set('identity', '100000037037034@lid.0', back);
|
|
142
|
+
const second = keys.raw['identity-key']?.['100000037037034_1.0'];
|
|
143
|
+
expect(Buffer.compare(first, second)).toBe(0);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
// ── 5. Sender key multi-state ───────────────────────────────────────────
|
|
147
|
+
describe('wrap-legacy-store: sender_key multi-state record', () => {
|
|
148
|
+
test('multiple senderKeyStates round-trip individually', async () => {
|
|
149
|
+
const { wrapped, keys } = await makeWrapped();
|
|
150
|
+
const states = [1, 2, 3].map(seed => ({
|
|
151
|
+
senderKeyId: seed * 100,
|
|
152
|
+
senderChainKey: { iteration: seed, seed: fill(32, seed * 7) },
|
|
153
|
+
senderSigningKey: { public: fill(33, seed * 11), private: fill(32, seed * 13) },
|
|
154
|
+
senderMessageKeys: []
|
|
155
|
+
}));
|
|
156
|
+
const protoBytes = bridgeProto.SenderKeyRecordStructure.encode(bridgeProto.SenderKeyRecordStructure.create({ senderKeyStates: states })).finish();
|
|
157
|
+
const bridgeKey = `${SAMPLE_GROUP}:100000037037034@lid.0`;
|
|
158
|
+
const upstreamKey = `${SAMPLE_GROUP}::100000037037034_1::0`;
|
|
159
|
+
await wrapped.set('sender_key', bridgeKey, protoBytes);
|
|
160
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
161
|
+
const stored = keys.raw['sender-key']?.[upstreamKey];
|
|
162
|
+
const json = JSON.parse(Buffer.from(stored).toString('utf-8'));
|
|
163
|
+
expect(json.length).toBe(3);
|
|
164
|
+
expect(json[0].senderKeyId).toBe(100);
|
|
165
|
+
expect(json[1].senderKeyId).toBe(200);
|
|
166
|
+
expect(json[2].senderKeyId).toBe(300);
|
|
167
|
+
// Read back via bridge GET — all 3 states preserved.
|
|
168
|
+
const protoBack = (await wrapped.get('sender_key', bridgeKey));
|
|
169
|
+
const decoded = bridgeProto.SenderKeyRecordStructure.decode(protoBack);
|
|
170
|
+
expect(decoded.senderKeyStates.length).toBe(3);
|
|
171
|
+
// eslint-disable-next-line unicorn/no-array-sort
|
|
172
|
+
const ids = decoded.senderKeyStates.map(s => s.senderKeyId).slice().sort((a, b) => a - b);
|
|
173
|
+
expect(ids).toEqual([100, 200, 300]);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
// ── 6. Lid mapping edge cases ───────────────────────────────────────────
|
|
177
|
+
describe('wrap-legacy-store: lid_mapping edge cases', () => {
|
|
178
|
+
test('unknown key prefix → warns + null on read, passthrough on write', async () => {
|
|
179
|
+
const { wrapped, keys } = await makeWrapped();
|
|
180
|
+
// Bridge would never write/read like this, but verify it doesn't crash.
|
|
181
|
+
await wrapped.set('lid_mapping', 'weird:format', new TextEncoder().encode('value'));
|
|
182
|
+
// On unknown prefix, fromBridge returns Buffer.from(value) as fallback.
|
|
183
|
+
expect(keys.raw['lid-mapping']?.['weird:format']).toBeDefined();
|
|
184
|
+
});
|
|
185
|
+
test('empty value on read returns null', async () => {
|
|
186
|
+
const { wrapped, keys } = await makeWrapped();
|
|
187
|
+
keys.raw['lid-mapping'] = { '559980000003': '' };
|
|
188
|
+
const out = await wrapped.get('lid_mapping', 'pn:559980000003');
|
|
189
|
+
expect(out).toBe(null);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
// ── 7. Identity edge cases ──────────────────────────────────────────────
|
|
193
|
+
describe('wrap-legacy-store: identity edge cases', () => {
|
|
194
|
+
test('legacy 33-byte input from bridge → stored as-is (no double-prefix)', async () => {
|
|
195
|
+
const { wrapped, keys } = await makeWrapped();
|
|
196
|
+
const raw33 = Buffer.concat([Buffer.from([0x05]), Buffer.from(fill(32, 0xab))]);
|
|
197
|
+
await wrapped.set('identity', '100000037037034@lid.0', raw33);
|
|
198
|
+
const stored = keys.raw['identity-key']?.['100000037037034_1.0'];
|
|
199
|
+
// Should NOT double-prefix; pass through 33-byte input verbatim.
|
|
200
|
+
expect(stored.length).toBe(33);
|
|
201
|
+
expect(stored[0]).toBe(0x05);
|
|
202
|
+
expect(Buffer.compare(stored, raw33)).toBe(0);
|
|
203
|
+
});
|
|
204
|
+
test('upstream 32-byte stored input → bridge GET returns 32 bytes (no strip)', async () => {
|
|
205
|
+
const { wrapped, keys } = await makeWrapped();
|
|
206
|
+
// Some legacy upstream paths might write 32-byte directly.
|
|
207
|
+
const raw32 = fill(32, 0xab);
|
|
208
|
+
keys.raw['identity-key'] = { '100000037037034_1.0': Buffer.from(raw32) };
|
|
209
|
+
const out = (await wrapped.get('identity', '100000037037034@lid.0'));
|
|
210
|
+
expect(out.length).toBe(32);
|
|
211
|
+
expect(Buffer.from(out).equals(Buffer.from(raw32))).toBe(true);
|
|
212
|
+
});
|
|
213
|
+
test('GET on missing identity returns null (no exception)', async () => {
|
|
214
|
+
const { wrapped } = await makeWrapped();
|
|
215
|
+
const out = await wrapped.get('identity', '999999999999@lid.0');
|
|
216
|
+
expect(out).toBe(null);
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
// ── 8. messageKeys cache derivation (JS → Rust via HKDF) ────────────────
|
|
220
|
+
describe('wrap-legacy-store: messageKeys JS→Rust HKDF derivation', () => {
|
|
221
|
+
// Reference impl matching upstream `libsignal/src/crypto.js:53` exactly.
|
|
222
|
+
function jsLikeDeriveSecrets(seed) {
|
|
223
|
+
const salt = Buffer.alloc(32);
|
|
224
|
+
const info = Buffer.from('WhisperMessageKeys');
|
|
225
|
+
const prk = createHmac('sha256', salt).update(seed).digest();
|
|
226
|
+
const t1 = createHmac('sha256', prk)
|
|
227
|
+
.update(Buffer.concat([info, Buffer.from([0x01])]))
|
|
228
|
+
.digest();
|
|
229
|
+
const t2 = createHmac('sha256', prk)
|
|
230
|
+
.update(Buffer.concat([t1, info, Buffer.from([0x02])]))
|
|
231
|
+
.digest();
|
|
232
|
+
const t3 = createHmac('sha256', prk)
|
|
233
|
+
.update(Buffer.concat([t2, info, Buffer.from([0x03])]))
|
|
234
|
+
.digest();
|
|
235
|
+
return { cipher: t1, mac: t2, iv: t3.subarray(0, 16) };
|
|
236
|
+
}
|
|
237
|
+
test('upstream messageKeys cache → bridge proto carries derived cipher/mac/iv', async () => {
|
|
238
|
+
const { wrapped, keys } = await makeWrapped();
|
|
239
|
+
const baseKey = Buffer.alloc(33, 0xa0);
|
|
240
|
+
const peerRatchet = Buffer.alloc(33, 0xc0);
|
|
241
|
+
const skipSeed3 = Buffer.alloc(32, 0xd1);
|
|
242
|
+
const skipSeed5 = Buffer.alloc(32, 0xd2);
|
|
243
|
+
keys.raw['session'] = {
|
|
244
|
+
[UPSTREAM_SESSION_KEY_LID]: {
|
|
245
|
+
_sessions: {
|
|
246
|
+
[baseKey.toString('base64')]: {
|
|
247
|
+
registrationId: 1,
|
|
248
|
+
currentRatchet: {
|
|
249
|
+
ephemeralKeyPair: {
|
|
250
|
+
pubKey: Buffer.alloc(33, 0xb0).toString('base64'),
|
|
251
|
+
privKey: Buffer.alloc(32, 0xb1).toString('base64')
|
|
252
|
+
},
|
|
253
|
+
lastRemoteEphemeralKey: peerRatchet.toString('base64'),
|
|
254
|
+
previousCounter: 0,
|
|
255
|
+
rootKey: Buffer.alloc(32, 0x01).toString('base64')
|
|
256
|
+
},
|
|
257
|
+
indexInfo: {
|
|
258
|
+
baseKey: baseKey.toString('base64'),
|
|
259
|
+
baseKeyType: 2,
|
|
260
|
+
closed: -1,
|
|
261
|
+
used: Date.now(),
|
|
262
|
+
created: Date.now(),
|
|
263
|
+
remoteIdentityKey: Buffer.alloc(33, 0x02).toString('base64')
|
|
264
|
+
},
|
|
265
|
+
_chains: {
|
|
266
|
+
[peerRatchet.toString('base64')]: {
|
|
267
|
+
chainKey: { counter: 5, key: Buffer.alloc(32, 0xc1).toString('base64') },
|
|
268
|
+
chainType: 2,
|
|
269
|
+
messageKeys: { '3': skipSeed3.toString('base64'), '5': skipSeed5.toString('base64') }
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
version: 'v1'
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
const protoOut = (await wrapped.get('session', BRIDGE_SESSION_KEY_LID));
|
|
278
|
+
const decoded = bridgeProto.RecordStructure.decode(protoOut);
|
|
279
|
+
const recv = decoded.currentSession?.receiverChains?.[0];
|
|
280
|
+
const mks = recv.messageKeys ?? [];
|
|
281
|
+
expect(mks.length).toBe(2);
|
|
282
|
+
// Derived split MUST match HKDF reference exactly. If Rust libsignal
|
|
283
|
+
// ever fails to decrypt skipped messages from the cache, this test
|
|
284
|
+
// pinpoints which byte disagreed before any wire packet does.
|
|
285
|
+
const expected3 = jsLikeDeriveSecrets(skipSeed3);
|
|
286
|
+
const expected5 = jsLikeDeriveSecrets(skipSeed5);
|
|
287
|
+
const byIndex = Object.fromEntries(mks.map(m => [m.index, m]));
|
|
288
|
+
for (const [idx, expected] of [
|
|
289
|
+
[3, expected3],
|
|
290
|
+
[5, expected5]
|
|
291
|
+
]) {
|
|
292
|
+
expect(Buffer.from(byIndex[idx].cipherKey).equals(expected.cipher)).toBe(true);
|
|
293
|
+
expect(Buffer.from(byIndex[idx].macKey).equals(expected.mac)).toBe(true);
|
|
294
|
+
expect(Buffer.from(byIndex[idx].iv).equals(expected.iv)).toBe(true);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
//# sourceMappingURL=wrap-legacy-store-coverage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap-legacy-store-coverage.test.js","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-coverage.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Bridge (`whatsapp-rust-bridge/src/js_backend.rs`):
|
|
7
|
-
* • store: `lid_mapping`
|
|
8
|
-
* • forward key: `lid:{lidUser}` → JSON `LidPnMappingEntry`
|
|
9
|
-
* `{ lid, phone_number, created_at, updated_at, learning_source }`
|
|
10
|
-
* • reverse key: `pn:{pnUser}` → raw bytes of the LID user (UTF-8)
|
|
11
|
-
*
|
|
12
|
-
* Upstream baileys (`Signal/lid-mapping.js`):
|
|
13
|
-
* • store: `lid-mapping`
|
|
14
|
-
* • forward key: bare `{pnUser}` → string `lidUser`
|
|
15
|
-
* • reverse key: bare `{lidUser}_reverse` → string `pnUser`
|
|
16
|
-
*
|
|
17
|
-
* Without a converter, neither library finds the other's entries. Upstream
|
|
18
|
-
* has a USYNC fallback (re-fetch from server) so it doesn't crash, but
|
|
19
|
-
* costs an extra round-trip per cross-impl session start. These tests pin
|
|
20
|
-
* down direct compatibility so the fallback is no longer needed.
|
|
2
|
+
* Cross-impl gap for `lid_mapping`:
|
|
3
|
+
* • Bridge: `lid:{X}` → JSON `LidPnMappingEntry`; `pn:{X}` → bytes(LID).
|
|
4
|
+
* • Upstream: bare `{pnUser}` → string LID; `{lidUser}_reverse` → string PN.
|
|
5
|
+
* Without conversion, upstream falls back to USYNC re-fetch on every cold start.
|
|
21
6
|
*/
|
|
22
7
|
export {};
|
|
23
8
|
//# sourceMappingURL=wrap-legacy-store-lid-mapping.test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-legacy-store-lid-mapping.test.d.ts","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-lid-mapping.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wrap-legacy-store-lid-mapping.test.d.ts","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-lid-mapping.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|