@openclaw/crabline 0.1.1 → 0.1.4

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.
Files changed (55) hide show
  1. package/README.md +48 -19
  2. package/dist/src/cli/program.js +10 -1
  3. package/dist/src/cli/program.js.map +1 -1
  4. package/dist/src/fake-servers/http.d.ts +1 -0
  5. package/dist/src/fake-servers/http.js +1 -0
  6. package/dist/src/fake-servers/http.js.map +1 -1
  7. package/dist/src/fake-servers/index.d.ts +10 -4
  8. package/dist/src/fake-servers/index.js +9 -1
  9. package/dist/src/fake-servers/index.js.map +1 -1
  10. package/dist/src/fake-servers/slack.d.ts +34 -0
  11. package/dist/src/fake-servers/slack.js +445 -0
  12. package/dist/src/fake-servers/slack.js.map +1 -0
  13. package/dist/src/fake-servers/whatsapp-baileys-websocket.d.ts +27 -0
  14. package/dist/src/fake-servers/whatsapp-baileys-websocket.js +555 -0
  15. package/dist/src/fake-servers/whatsapp-baileys-websocket.js.map +1 -0
  16. package/dist/src/fake-servers/whatsapp-wire/binary-node.d.ts +9 -0
  17. package/dist/src/fake-servers/whatsapp-wire/binary-node.js +427 -0
  18. package/dist/src/fake-servers/whatsapp-wire/binary-node.js.map +1 -0
  19. package/dist/src/fake-servers/whatsapp-wire/crypto.d.ts +27 -0
  20. package/dist/src/fake-servers/whatsapp-wire/crypto.js +108 -0
  21. package/dist/src/fake-servers/whatsapp-wire/crypto.js.map +1 -0
  22. package/dist/src/fake-servers/whatsapp-wire/handshake.d.ts +17 -0
  23. package/dist/src/fake-servers/whatsapp-wire/handshake.js +154 -0
  24. package/dist/src/fake-servers/whatsapp-wire/handshake.js.map +1 -0
  25. package/dist/src/fake-servers/whatsapp-wire/signal.d.ts +5 -0
  26. package/dist/src/fake-servers/whatsapp-wire/signal.js +24 -0
  27. package/dist/src/fake-servers/whatsapp-wire/signal.js.map +1 -0
  28. package/dist/src/fake-servers/whatsapp.d.ts +5 -61
  29. package/dist/src/fake-servers/whatsapp.js +32 -170
  30. package/dist/src/fake-servers/whatsapp.js.map +1 -1
  31. package/dist/src/index.d.ts +4 -2
  32. package/dist/src/index.js +2 -1
  33. package/dist/src/index.js.map +1 -1
  34. package/dist/src/openclaw/bridges/slack.d.ts +1 -0
  35. package/dist/src/openclaw/bridges/slack.js +150 -0
  36. package/dist/src/openclaw/bridges/slack.js.map +1 -0
  37. package/dist/src/openclaw/bridges/whatsapp.js +2 -2
  38. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  39. package/dist/src/openclaw.js +2 -0
  40. package/dist/src/openclaw.js.map +1 -1
  41. package/dist/src/providers/builtin/native-local-mock.d.ts +2 -5
  42. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  43. package/dist/src/providers/builtin/slack.js +1 -10
  44. package/dist/src/providers/builtin/slack.js.map +1 -1
  45. package/dist/src/providers/catalog.d.ts +1 -1
  46. package/dist/src/providers/catalog.js +1 -1
  47. package/dist/src/providers/catalog.js.map +1 -1
  48. package/dist/src/providers/native-ids.d.ts +5 -0
  49. package/dist/src/providers/native-ids.js +2 -0
  50. package/dist/src/providers/native-ids.js.map +1 -0
  51. package/dist/src/providers/slack-ids.d.ts +6 -0
  52. package/dist/src/providers/slack-ids.js +24 -0
  53. package/dist/src/providers/slack-ids.js.map +1 -0
  54. package/docs/channel-setup.md +52 -15
  55. package/package.json +5 -1
@@ -0,0 +1,427 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { promisify } from "node:util";
3
+ import { inflate } from "node:zlib";
4
+ const inflateAsync = promisify(inflate);
5
+ const TAGS = {
6
+ AD_JID: 247,
7
+ BINARY_8: 252,
8
+ BINARY_20: 253,
9
+ BINARY_32: 254,
10
+ DICTIONARY_0: 236,
11
+ DICTIONARY_1: 237,
12
+ DICTIONARY_2: 238,
13
+ DICTIONARY_3: 239,
14
+ FB_JID: 246,
15
+ HEX_8: 251,
16
+ INTEROP_JID: 245,
17
+ JID_PAIR: 250,
18
+ LIST_8: 248,
19
+ LIST_16: 249,
20
+ LIST_EMPTY: 0,
21
+ NIBBLE_8: 255,
22
+ PACKED_MAX: 127,
23
+ };
24
+ // Minimal WhatsApp binary token dictionary for the nodes this fake server handles.
25
+ const SINGLE_BYTE_TOKENS = {
26
+ 3: "s.whatsapp.net",
27
+ 4: "type",
28
+ 5: "participant",
29
+ 6: "from",
30
+ 7: "receipt",
31
+ 8: "id",
32
+ 12: "jid",
33
+ 14: "user",
34
+ 15: "devices",
35
+ 17: "to",
36
+ 18: "offline",
37
+ 19: "message",
38
+ 20: "result",
39
+ 21: "class",
40
+ 22: "xmlns",
41
+ 25: "iq",
42
+ 26: "t",
43
+ 27: "ack",
44
+ 28: "g.us",
45
+ 29: "enc",
46
+ 31: "presence",
47
+ 41: "get",
48
+ 45: "0",
49
+ 48: "unavailable",
50
+ 56: "text",
51
+ 58: "media_conn",
52
+ 65: "count",
53
+ 69: "2",
54
+ 70: "hostname",
55
+ 76: "success",
56
+ 79: "prop",
57
+ 81: "v",
58
+ 83: "pkmsg",
59
+ 84: "version",
60
+ 90: "set",
61
+ 92: "props",
62
+ 95: "hash",
63
+ 97: "last",
64
+ 106: "mode",
65
+ 107: "participants",
66
+ 108: "value",
67
+ 109: "query",
68
+ 113: "list",
69
+ 114: "host",
70
+ 118: "lid",
71
+ 121: "usync",
72
+ 125: "context",
73
+ 137: "name",
74
+ 143: "index",
75
+ 155: "true",
76
+ 156: "identity",
77
+ 158: "key",
78
+ 169: "auth",
79
+ 173: "registration",
80
+ 189: "ttl",
81
+ 194: "w:m",
82
+ 197: "token",
83
+ 203: "encrypt",
84
+ 212: "signature",
85
+ 217: "trusted_contact",
86
+ 226: "privacy",
87
+ 230: "device-identity",
88
+ };
89
+ const DOUBLE_BYTE_TOKENS = {
90
+ 0: {
91
+ 1: "active",
92
+ 15: "false",
93
+ 24: "passive",
94
+ 45: "skey",
95
+ 46: "reason",
96
+ 68: "tokens",
97
+ 127: "subject",
98
+ 170: "group",
99
+ 217: "blocklist",
100
+ 238: "s_t",
101
+ },
102
+ 1: {
103
+ 51: "w:g2",
104
+ },
105
+ };
106
+ export const S_WHATSAPP_NET = "@s.whatsapp.net";
107
+ export async function decodeBinaryNode(frame) {
108
+ const buffer = await decompressIfRequired(frame);
109
+ return decodeDecompressedBinaryNode(buffer);
110
+ }
111
+ export function encodeBinaryNode(node) {
112
+ return Buffer.from(encodeBinaryNodeInner(node, [0]));
113
+ }
114
+ async function decompressIfRequired(buffer) {
115
+ if (buffer.length === 0) {
116
+ throw new Error("Cannot decode an empty WhatsApp binary node.");
117
+ }
118
+ const flag = buffer.readUInt8();
119
+ if ((flag & 2) !== 0) {
120
+ return await inflateAsync(buffer.subarray(1));
121
+ }
122
+ return buffer.subarray(1);
123
+ }
124
+ function decodeDecompressedBinaryNode(buffer, indexRef = { index: 0 }) {
125
+ const checkEOS = (length) => {
126
+ if (indexRef.index + length > buffer.length) {
127
+ throw new Error("Unexpected end of WhatsApp binary node.");
128
+ }
129
+ };
130
+ const next = () => {
131
+ const value = buffer[indexRef.index];
132
+ indexRef.index += 1;
133
+ if (value === undefined) {
134
+ throw new Error("Unexpected end of WhatsApp binary node.");
135
+ }
136
+ return value;
137
+ };
138
+ const readByte = () => {
139
+ checkEOS(1);
140
+ return next();
141
+ };
142
+ const readBytes = (length) => {
143
+ checkEOS(length);
144
+ const value = buffer.subarray(indexRef.index, indexRef.index + length);
145
+ indexRef.index += length;
146
+ return value;
147
+ };
148
+ const readInt = (length, littleEndian = false) => {
149
+ checkEOS(length);
150
+ let value = 0;
151
+ for (let index = 0; index < length; index += 1) {
152
+ const shift = littleEndian ? index : length - 1 - index;
153
+ value |= next() << (shift * 8);
154
+ }
155
+ return value;
156
+ };
157
+ const readInt20 = () => {
158
+ checkEOS(3);
159
+ return ((next() & 15) << 16) + (next() << 8) + next();
160
+ };
161
+ const readStringFromChars = (length) => readBytes(length).toString("utf8");
162
+ const unpackHex = (value) => {
163
+ if (value >= 0 && value < 16) {
164
+ return value < 10 ? "0".charCodeAt(0) + value : "A".charCodeAt(0) + value - 10;
165
+ }
166
+ throw new Error(`Invalid WhatsApp hex token: ${value}.`);
167
+ };
168
+ const unpackNibble = (value) => {
169
+ if (value >= 0 && value <= 9) {
170
+ return "0".charCodeAt(0) + value;
171
+ }
172
+ if (value === 10) {
173
+ return "-".charCodeAt(0);
174
+ }
175
+ if (value === 11) {
176
+ return ".".charCodeAt(0);
177
+ }
178
+ if (value === 15) {
179
+ return "\0".charCodeAt(0);
180
+ }
181
+ throw new Error(`Invalid WhatsApp nibble token: ${value}.`);
182
+ };
183
+ const unpackByte = (tag, value) => {
184
+ if (tag === TAGS.NIBBLE_8) {
185
+ return unpackNibble(value);
186
+ }
187
+ if (tag === TAGS.HEX_8) {
188
+ return unpackHex(value);
189
+ }
190
+ throw new Error(`Unknown WhatsApp packed string tag: ${tag}.`);
191
+ };
192
+ const readPacked8 = (tag) => {
193
+ const startByte = readByte();
194
+ let value = "";
195
+ for (let index = 0; index < (startByte & 127); index += 1) {
196
+ const current = readByte();
197
+ value += String.fromCharCode(unpackByte(tag, (current & 0xf0) >> 4));
198
+ value += String.fromCharCode(unpackByte(tag, current & 0x0f));
199
+ }
200
+ return startByte >> 7 !== 0 ? value.slice(0, -1) : value;
201
+ };
202
+ const readListSize = (tag) => {
203
+ if (tag === TAGS.LIST_EMPTY) {
204
+ return 0;
205
+ }
206
+ if (tag === TAGS.LIST_8) {
207
+ return readByte();
208
+ }
209
+ if (tag === TAGS.LIST_16) {
210
+ return readInt(2);
211
+ }
212
+ throw new Error(`Invalid WhatsApp list tag: ${tag}.`);
213
+ };
214
+ const isListTag = (tag) => tag === TAGS.LIST_EMPTY || tag === TAGS.LIST_8 || tag === TAGS.LIST_16;
215
+ const readString = (tag) => {
216
+ const token = SINGLE_BYTE_TOKENS[tag];
217
+ if (token !== undefined) {
218
+ return token;
219
+ }
220
+ if (tag >= 1 && tag < 236) {
221
+ throw new Error(`Unsupported WhatsApp single-byte token: ${tag}.`);
222
+ }
223
+ if (tag === TAGS.DICTIONARY_0 ||
224
+ tag === TAGS.DICTIONARY_1 ||
225
+ tag === TAGS.DICTIONARY_2 ||
226
+ tag === TAGS.DICTIONARY_3) {
227
+ return readDoubleToken(tag - TAGS.DICTIONARY_0, readByte());
228
+ }
229
+ if (tag === TAGS.LIST_EMPTY) {
230
+ return "";
231
+ }
232
+ if (tag === TAGS.BINARY_8) {
233
+ return readStringFromChars(readByte());
234
+ }
235
+ if (tag === TAGS.BINARY_20) {
236
+ return readStringFromChars(readInt20());
237
+ }
238
+ if (tag === TAGS.BINARY_32) {
239
+ return readStringFromChars(readInt(4));
240
+ }
241
+ if (tag === TAGS.JID_PAIR) {
242
+ return readJidPair();
243
+ }
244
+ if (tag === TAGS.FB_JID) {
245
+ return readFbJid();
246
+ }
247
+ if (tag === TAGS.INTEROP_JID) {
248
+ return readInteropJid();
249
+ }
250
+ if (tag === TAGS.AD_JID) {
251
+ return readAdJid();
252
+ }
253
+ if (tag === TAGS.HEX_8 || tag === TAGS.NIBBLE_8) {
254
+ return readPacked8(tag);
255
+ }
256
+ throw new Error(`Invalid WhatsApp string tag: ${tag}.`);
257
+ };
258
+ const readList = (tag) => {
259
+ const items = [];
260
+ const size = readListSize(tag);
261
+ for (let index = 0; index < size; index += 1) {
262
+ items.push(decodeDecompressedBinaryNode(buffer, indexRef));
263
+ }
264
+ return items;
265
+ };
266
+ const readJidPair = () => {
267
+ const user = readString(readByte());
268
+ const server = readString(readByte());
269
+ if (!server) {
270
+ throw new Error(`Invalid WhatsApp JID pair: ${user}, ${server}.`);
271
+ }
272
+ return `${user || ""}@${server}`;
273
+ };
274
+ const readAdJid = () => {
275
+ const domainType = readByte();
276
+ const device = readByte();
277
+ const user = readString(readByte());
278
+ const server = domainType === 1
279
+ ? "lid"
280
+ : domainType === 128
281
+ ? "hosted"
282
+ : domainType === 129
283
+ ? "hosted.lid"
284
+ : "s.whatsapp.net";
285
+ return `${user}${device ? `:${device}` : ""}@${server}`;
286
+ };
287
+ const readFbJid = () => {
288
+ const user = readString(readByte());
289
+ const device = readInt(2);
290
+ const server = readString(readByte());
291
+ return `${user}:${device}@${server}`;
292
+ };
293
+ const readInteropJid = () => {
294
+ const user = readString(readByte());
295
+ const device = readInt(2);
296
+ const integrator = readInt(2);
297
+ const beforeServer = indexRef.index;
298
+ let server = "interop";
299
+ try {
300
+ server = readString(readByte());
301
+ }
302
+ catch {
303
+ indexRef.index = beforeServer;
304
+ }
305
+ return `${integrator}-${user}:${device}@${server}`;
306
+ };
307
+ const readDoubleToken = (dictionary, index) => {
308
+ const value = DOUBLE_BYTE_TOKENS[dictionary]?.[index];
309
+ if (value === undefined) {
310
+ throw new Error(`Unsupported WhatsApp dictionary token: ${dictionary}:${index}.`);
311
+ }
312
+ return value;
313
+ };
314
+ const listSize = readListSize(readByte());
315
+ const tag = readString(readByte());
316
+ if (listSize === 0 || !tag) {
317
+ throw new Error("Invalid WhatsApp binary node header.");
318
+ }
319
+ const attrs = {};
320
+ for (let index = 0; index < (listSize - 1) >> 1; index += 1) {
321
+ attrs[readString(readByte())] = readString(readByte());
322
+ }
323
+ let content;
324
+ if (listSize % 2 === 0) {
325
+ const contentTag = readByte();
326
+ if (isListTag(contentTag)) {
327
+ content = readList(contentTag);
328
+ }
329
+ else if (contentTag === TAGS.BINARY_8) {
330
+ content = readBytes(readByte());
331
+ }
332
+ else if (contentTag === TAGS.BINARY_20) {
333
+ content = readBytes(readInt20());
334
+ }
335
+ else if (contentTag === TAGS.BINARY_32) {
336
+ content = readBytes(readInt(4));
337
+ }
338
+ else {
339
+ content = readString(contentTag);
340
+ }
341
+ }
342
+ return content === undefined ? { attrs, tag } : { attrs, content, tag };
343
+ }
344
+ function encodeBinaryNodeInner(node, buffer) {
345
+ if (!node.tag) {
346
+ throw new Error("Invalid WhatsApp binary node: tag is required.");
347
+ }
348
+ const validAttributes = Object.keys(node.attrs ?? {}).filter((key) => {
349
+ const value = node.attrs[key];
350
+ return value !== undefined && value !== null;
351
+ });
352
+ writeListStart(buffer, 2 * validAttributes.length + 1 + (node.content !== undefined ? 1 : 0));
353
+ writeString(buffer, node.tag);
354
+ for (const key of validAttributes) {
355
+ writeString(buffer, key);
356
+ writeString(buffer, node.attrs[key] ?? "");
357
+ }
358
+ if (typeof node.content === "string") {
359
+ writeString(buffer, node.content);
360
+ }
361
+ else if (node.content instanceof Uint8Array) {
362
+ writeByteLength(buffer, node.content.length);
363
+ pushBytes(buffer, node.content);
364
+ }
365
+ else if (Array.isArray(node.content)) {
366
+ writeListStart(buffer, node.content.length);
367
+ for (const child of node.content) {
368
+ encodeBinaryNodeInner(child, buffer);
369
+ }
370
+ }
371
+ else if (node.content !== undefined) {
372
+ throw new Error(`Invalid WhatsApp binary node content for <${node.tag}>.`);
373
+ }
374
+ return buffer;
375
+ }
376
+ function pushByte(buffer, value) {
377
+ buffer.push(value & 0xff);
378
+ }
379
+ function pushBytes(buffer, bytes) {
380
+ for (const byte of bytes) {
381
+ pushByte(buffer, byte);
382
+ }
383
+ }
384
+ function pushInt(buffer, value, length) {
385
+ for (let index = 0; index < length; index += 1) {
386
+ const shift = length - 1 - index;
387
+ pushByte(buffer, value >> (shift * 8));
388
+ }
389
+ }
390
+ function writeByteLength(buffer, length) {
391
+ if (length >= 4294967296) {
392
+ throw new Error(`WhatsApp binary node payload is too large: ${length}.`);
393
+ }
394
+ if (length >= 1 << 20) {
395
+ pushByte(buffer, TAGS.BINARY_32);
396
+ pushInt(buffer, length, 4);
397
+ return;
398
+ }
399
+ if (length >= 256) {
400
+ pushByte(buffer, TAGS.BINARY_20);
401
+ pushByte(buffer, (length >> 16) & 0x0f);
402
+ pushByte(buffer, length >> 8);
403
+ pushByte(buffer, length);
404
+ return;
405
+ }
406
+ pushByte(buffer, TAGS.BINARY_8);
407
+ pushByte(buffer, length);
408
+ }
409
+ function writeString(buffer, value) {
410
+ const bytes = Buffer.from(value, "utf8");
411
+ writeByteLength(buffer, bytes.length);
412
+ pushBytes(buffer, bytes);
413
+ }
414
+ function writeListStart(buffer, size) {
415
+ if (size === 0) {
416
+ pushByte(buffer, TAGS.LIST_EMPTY);
417
+ return;
418
+ }
419
+ if (size < 256) {
420
+ pushByte(buffer, TAGS.LIST_8);
421
+ pushByte(buffer, size);
422
+ return;
423
+ }
424
+ pushByte(buffer, TAGS.LIST_16);
425
+ pushInt(buffer, size, 2);
426
+ }
427
+ //# sourceMappingURL=binary-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-node.js","sourceRoot":"","sources":["../../../../src/fake-servers/whatsapp-wire/binary-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Buffer } from "node:buffer";
2
+ export declare const KEY_BUNDLE_TYPE: Buffer<ArrayBuffer>;
3
+ export declare const NOISE_MODE = "Noise_XX_25519_AESGCM_SHA256\0\0\0\0";
4
+ export declare const NOISE_WA_HEADER: Buffer<ArrayBuffer>;
5
+ export type KeyPair = {
6
+ private: Buffer;
7
+ public: Buffer;
8
+ };
9
+ export type SignedKeyPair = {
10
+ keyId: number;
11
+ keyPair: KeyPair;
12
+ signature: Buffer;
13
+ };
14
+ export declare const Curve: {
15
+ generateKeyPair(): KeyPair;
16
+ sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Buffer;
17
+ sign(privateKey: Uint8Array, message: Uint8Array): Buffer;
18
+ };
19
+ export declare function aesEncryptGCM(plaintext: Uint8Array, key: Uint8Array, iv: Uint8Array, additionalData: Uint8Array): Buffer;
20
+ export declare function aesDecryptGCM(ciphertext: Uint8Array, key: Uint8Array, iv: Uint8Array, additionalData: Uint8Array): Buffer;
21
+ export declare function encodeBigEndian(value: number, length?: number): Buffer;
22
+ export declare function hkdf(input: Uint8Array, length: number, params: {
23
+ info: string;
24
+ salt: Uint8Array;
25
+ }): Buffer<ArrayBuffer>;
26
+ export declare function sha256(input: Uint8Array): Buffer;
27
+ export declare function signedKeyPair(identityKeyPair: KeyPair, keyId: number): SignedKeyPair;
@@ -0,0 +1,108 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { createCipheriv, createDecipheriv, createHash, createPrivateKey, createPublicKey, diffieHellman, generateKeyPairSync, hkdfSync, } from "node:crypto";
3
+ import { createRequire } from "node:module";
4
+ const require = createRequire(import.meta.url);
5
+ const curve25519 = require("curve25519-js");
6
+ const AES_GCM_TAG_LENGTH = 16;
7
+ const PRIVATE_KEY_DER_PREFIX = Buffer.from([
8
+ 48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32,
9
+ ]);
10
+ const PUBLIC_KEY_DER_PREFIX = Buffer.from([48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0]);
11
+ export const KEY_BUNDLE_TYPE = Buffer.from([5]);
12
+ export const NOISE_MODE = "Noise_XX_25519_AESGCM_SHA256\0\0\0\0";
13
+ export const NOISE_WA_HEADER = Buffer.from([87, 65, 6, 3]);
14
+ export const Curve = {
15
+ generateKeyPair() {
16
+ try {
17
+ const { privateKey, publicKey } = generateKeyPairSync("x25519", {
18
+ privateKeyEncoding: { format: "der", type: "pkcs8" },
19
+ publicKeyEncoding: { format: "der", type: "spki" },
20
+ });
21
+ return {
22
+ private: privateKey.subarray(PRIVATE_KEY_DER_PREFIX.length, PRIVATE_KEY_DER_PREFIX.length + 32),
23
+ public: publicKey.subarray(PUBLIC_KEY_DER_PREFIX.length, PUBLIC_KEY_DER_PREFIX.length + 32),
24
+ };
25
+ }
26
+ catch {
27
+ const keyPair = curve25519.generateKeyPair();
28
+ return {
29
+ private: Buffer.from(keyPair.private),
30
+ public: Buffer.from(keyPair.public),
31
+ };
32
+ }
33
+ },
34
+ sharedKey(privateKey, publicKey) {
35
+ const rawPublicKey = scrubSignalPublicKey(publicKey);
36
+ try {
37
+ const nodePrivateKey = createPrivateKey({
38
+ format: "der",
39
+ key: Buffer.concat([PRIVATE_KEY_DER_PREFIX, Buffer.from(privateKey)]),
40
+ type: "pkcs8",
41
+ });
42
+ const nodePublicKey = createPublicKey({
43
+ format: "der",
44
+ key: Buffer.concat([PUBLIC_KEY_DER_PREFIX, rawPublicKey]),
45
+ type: "spki",
46
+ });
47
+ return diffieHellman({ privateKey: nodePrivateKey, publicKey: nodePublicKey });
48
+ }
49
+ catch {
50
+ return Buffer.from(curve25519.sharedKey(Buffer.from(privateKey), rawPublicKey));
51
+ }
52
+ },
53
+ sign(privateKey, message) {
54
+ return Buffer.from(curve25519.sign(Buffer.from(privateKey), Buffer.from(message)));
55
+ },
56
+ };
57
+ export function aesEncryptGCM(plaintext, key, iv, additionalData) {
58
+ const cipher = createCipheriv("aes-256-gcm", key, iv);
59
+ cipher.setAAD(additionalData);
60
+ return Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()]);
61
+ }
62
+ export function aesDecryptGCM(ciphertext, key, iv, additionalData) {
63
+ const decipher = createDecipheriv("aes-256-gcm", key, iv);
64
+ const encrypted = ciphertext.subarray(0, ciphertext.byteLength - AES_GCM_TAG_LENGTH);
65
+ const tag = ciphertext.subarray(ciphertext.byteLength - AES_GCM_TAG_LENGTH);
66
+ decipher.setAAD(additionalData);
67
+ decipher.setAuthTag(tag);
68
+ return Buffer.concat([decipher.update(encrypted), decipher.final()]);
69
+ }
70
+ export function encodeBigEndian(value, length = 4) {
71
+ let remaining = value;
72
+ const bytes = new Array(length).fill(0);
73
+ for (let index = length - 1; index >= 0; index -= 1) {
74
+ bytes[index] = remaining & 0xff;
75
+ remaining >>>= 8;
76
+ }
77
+ return Buffer.from(bytes);
78
+ }
79
+ export function hkdf(input, length, params) {
80
+ return Buffer.from(hkdfSync("sha256", input, params.salt, params.info, length));
81
+ }
82
+ export function sha256(input) {
83
+ return createHash("sha256").update(input).digest();
84
+ }
85
+ export function signedKeyPair(identityKeyPair, keyId) {
86
+ const keyPair = Curve.generateKeyPair();
87
+ const publicKey = ensureSignalPublicKey(keyPair.public);
88
+ return {
89
+ keyId,
90
+ keyPair,
91
+ signature: Curve.sign(identityKeyPair.private, publicKey),
92
+ };
93
+ }
94
+ function ensureSignalPublicKey(publicKey) {
95
+ const buffer = Buffer.from(publicKey);
96
+ return buffer.length === 33 ? buffer : Buffer.concat([KEY_BUNDLE_TYPE, buffer]);
97
+ }
98
+ function scrubSignalPublicKey(publicKey) {
99
+ const buffer = Buffer.from(publicKey);
100
+ if (buffer.length === 33 && buffer[0] === KEY_BUNDLE_TYPE[0]) {
101
+ return buffer.subarray(1);
102
+ }
103
+ if (buffer.length === 32) {
104
+ return buffer;
105
+ }
106
+ throw new Error(`Invalid Signal public key length: ${buffer.length}.`);
107
+ }
108
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../../src/fake-servers/whatsapp-wire/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,QAAQ,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAQ/C,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAqB,CAAC;AAEhE,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,sBAAsB,GAAG,MAAM,CAAC,IAAI,CAAC;IACzC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;CACzD,CAAC,CAAC;AACH,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzF,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,UAAU,GAAG,sCAAsC,CAAC;AACjE,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAa3D,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,eAAe;QACb,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,QAAQ,EAAE;gBAC9D,kBAAkB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;gBACpD,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;aACnD,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,UAAU,CAAC,QAAQ,CAC1B,sBAAsB,CAAC,MAAM,EAC7B,sBAAsB,CAAC,MAAM,GAAG,EAAE,CACnC;gBACD,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,CAAC,MAAM,GAAG,EAAE,CAAC;aAC5F,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBACrC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,SAAS,CAAC,UAAsB,EAAE,SAAqB;QACrD,MAAM,YAAY,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,gBAAgB,CAAC;gBACtC,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBACrE,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;YACH,MAAM,aAAa,GAAG,eAAe,CAAC;gBACpC,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;gBACzD,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;YACH,OAAO,aAAa,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAsB,EAAE,OAAmB;QAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAC3B,SAAqB,EACrB,GAAe,EACf,EAAc,EACd,cAA0B;IAE1B,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,UAAsB,EACtB,GAAe,EACf,EAAc,EACd,cAA0B;IAE1B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU,GAAG,kBAAkB,CAAC,CAAC;IACrF,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,GAAG,kBAAkB,CAAC,CAAC;IAC5E,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,MAAM,GAAG,CAAC;IACvD,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAS,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,KAAK,CAAC,KAAK,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;QAChC,SAAS,MAAM,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,KAAiB,EACjB,MAAc,EACd,MAA0C;IAE1C,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAiB;IACtC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,eAAwB,EAAE,KAAa;IACnE,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,OAAO;QACL,KAAK;QACL,OAAO;QACP,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAqB;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAqB;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Buffer } from "node:buffer";
2
+ export type HandshakeMessage = {
3
+ clientFinish?: {
4
+ payload?: Buffer;
5
+ staticKey?: Buffer;
6
+ };
7
+ clientHello?: {
8
+ ephemeral?: Buffer;
9
+ };
10
+ serverHello?: {
11
+ ephemeral: Uint8Array;
12
+ payload: Uint8Array;
13
+ staticKey: Uint8Array;
14
+ };
15
+ };
16
+ export declare function decodeHandshakeMessage(data: Uint8Array): HandshakeMessage;
17
+ export declare function encodeHandshakeMessage(message: HandshakeMessage): Buffer;