Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MR414N-ID
GitHub Repository: MR414N-ID/botku2
Path: blob/master/node_modules/@adiwajshing/baileys/lib/Utils/signal.js
1129 views
1
"use strict";
2
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
if (k2 === undefined) k2 = k;
4
var desc = Object.getOwnPropertyDescriptor(m, k);
5
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
desc = { enumerable: true, get: function() { return m[k]; } };
7
}
8
Object.defineProperty(o, k2, desc);
9
}) : (function(o, m, k, k2) {
10
if (k2 === undefined) k2 = k;
11
o[k2] = m[k];
12
}));
13
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
Object.defineProperty(o, "default", { enumerable: true, value: v });
15
}) : function(o, v) {
16
o["default"] = v;
17
});
18
var __importStar = (this && this.__importStar) || function (mod) {
19
if (mod && mod.__esModule) return mod;
20
var result = {};
21
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
__setModuleDefault(result, mod);
23
return result;
24
};
25
Object.defineProperty(exports, "__esModule", { value: true });
26
exports.getNextPreKeysNode = exports.getNextPreKeys = exports.extractDeviceJids = exports.parseAndInjectE2ESessions = exports.encryptSenderKeyMsgSignalProto = exports.encryptSignalProto = exports.decryptSignalProto = exports.processSenderKeyMessage = exports.decryptGroupSignalProto = exports.signalStorage = exports.xmppPreKey = exports.xmppSignedPreKey = exports.generateOrGetPreKeys = exports.getPreKeys = exports.createSignalIdentity = exports.jidToSignalSenderKeyName = exports.jidToSignalProtocolAddress = void 0;
27
const libsignal = __importStar(require("libsignal"));
28
const WASignalGroup_1 = require("../../WASignalGroup");
29
const Defaults_1 = require("../Defaults");
30
const WABinary_1 = require("../WABinary");
31
const crypto_1 = require("./crypto");
32
const generics_1 = require("./generics");
33
const jidToSignalAddress = (jid) => jid.split('@')[0];
34
const jidToSignalProtocolAddress = (jid) => {
35
return new libsignal.ProtocolAddress(jidToSignalAddress(jid), 0);
36
};
37
exports.jidToSignalProtocolAddress = jidToSignalProtocolAddress;
38
const jidToSignalSenderKeyName = (group, user) => {
39
return new WASignalGroup_1.SenderKeyName(group, (0, exports.jidToSignalProtocolAddress)(user)).toString();
40
};
41
exports.jidToSignalSenderKeyName = jidToSignalSenderKeyName;
42
const createSignalIdentity = (wid, accountSignatureKey) => {
43
return {
44
identifier: { name: wid, deviceId: 0 },
45
identifierKey: (0, crypto_1.generateSignalPubKey)(accountSignatureKey)
46
};
47
};
48
exports.createSignalIdentity = createSignalIdentity;
49
const getPreKeys = async ({ get }, min, limit) => {
50
const idList = [];
51
for (let id = min; id < limit; id++) {
52
idList.push(id.toString());
53
}
54
return get('pre-key', idList);
55
};
56
exports.getPreKeys = getPreKeys;
57
const generateOrGetPreKeys = (creds, range) => {
58
const avaliable = creds.nextPreKeyId - creds.firstUnuploadedPreKeyId;
59
const remaining = range - avaliable;
60
const lastPreKeyId = creds.nextPreKeyId + remaining - 1;
61
const newPreKeys = {};
62
if (remaining > 0) {
63
for (let i = creds.nextPreKeyId; i <= lastPreKeyId; i++) {
64
newPreKeys[i] = crypto_1.Curve.generateKeyPair();
65
}
66
}
67
return {
68
newPreKeys,
69
lastPreKeyId,
70
preKeysRange: [creds.firstUnuploadedPreKeyId, range],
71
};
72
};
73
exports.generateOrGetPreKeys = generateOrGetPreKeys;
74
const xmppSignedPreKey = (key) => ({
75
tag: 'skey',
76
attrs: {},
77
content: [
78
{ tag: 'id', attrs: {}, content: (0, generics_1.encodeBigEndian)(key.keyId, 3) },
79
{ tag: 'value', attrs: {}, content: key.keyPair.public },
80
{ tag: 'signature', attrs: {}, content: key.signature }
81
]
82
});
83
exports.xmppSignedPreKey = xmppSignedPreKey;
84
const xmppPreKey = (pair, id) => ({
85
tag: 'key',
86
attrs: {},
87
content: [
88
{ tag: 'id', attrs: {}, content: (0, generics_1.encodeBigEndian)(id, 3) },
89
{ tag: 'value', attrs: {}, content: pair.public }
90
]
91
});
92
exports.xmppPreKey = xmppPreKey;
93
const signalStorage = ({ creds, keys }) => ({
94
loadSession: async (id) => {
95
const { [id]: sess } = await keys.get('session', [id]);
96
if (sess) {
97
return libsignal.SessionRecord.deserialize(sess);
98
}
99
},
100
storeSession: async (id, session) => {
101
await keys.set({ 'session': { [id]: session.serialize() } });
102
},
103
isTrustedIdentity: () => {
104
return true;
105
},
106
loadPreKey: async (id) => {
107
const keyId = id.toString();
108
const { [keyId]: key } = await keys.get('pre-key', [keyId]);
109
if (key) {
110
return {
111
privKey: Buffer.from(key.private),
112
pubKey: Buffer.from(key.public)
113
};
114
}
115
},
116
removePreKey: (id) => keys.set({ 'pre-key': { [id]: null } }),
117
loadSignedPreKey: () => {
118
const key = creds.signedPreKey;
119
return {
120
privKey: Buffer.from(key.keyPair.private),
121
pubKey: Buffer.from(key.keyPair.public)
122
};
123
},
124
loadSenderKey: async (keyId) => {
125
const { [keyId]: key } = await keys.get('sender-key', [keyId]);
126
if (key) {
127
return new WASignalGroup_1.SenderKeyRecord(key);
128
}
129
},
130
storeSenderKey: async (keyId, key) => {
131
await keys.set({ 'sender-key': { [keyId]: key.serialize() } });
132
},
133
getOurRegistrationId: () => (creds.registrationId),
134
getOurIdentity: () => {
135
const { signedIdentityKey } = creds;
136
return {
137
privKey: Buffer.from(signedIdentityKey.private),
138
pubKey: (0, crypto_1.generateSignalPubKey)(signedIdentityKey.public),
139
};
140
}
141
});
142
exports.signalStorage = signalStorage;
143
const decryptGroupSignalProto = (group, user, msg, auth) => {
144
const senderName = (0, exports.jidToSignalSenderKeyName)(group, user);
145
const cipher = new WASignalGroup_1.GroupCipher((0, exports.signalStorage)(auth), senderName);
146
return cipher.decrypt(Buffer.from(msg));
147
};
148
exports.decryptGroupSignalProto = decryptGroupSignalProto;
149
const processSenderKeyMessage = async (authorJid, item, auth) => {
150
const builder = new WASignalGroup_1.GroupSessionBuilder((0, exports.signalStorage)(auth));
151
const senderName = (0, exports.jidToSignalSenderKeyName)(item.groupId, authorJid);
152
const senderMsg = new WASignalGroup_1.SenderKeyDistributionMessage(null, null, null, null, item.axolotlSenderKeyDistributionMessage);
153
const { [senderName]: senderKey } = await auth.keys.get('sender-key', [senderName]);
154
if (!senderKey) {
155
const record = new WASignalGroup_1.SenderKeyRecord();
156
await auth.keys.set({ 'sender-key': { [senderName]: record } });
157
}
158
await builder.process(senderName, senderMsg);
159
};
160
exports.processSenderKeyMessage = processSenderKeyMessage;
161
const decryptSignalProto = async (user, type, msg, auth) => {
162
const addr = (0, exports.jidToSignalProtocolAddress)(user);
163
const session = new libsignal.SessionCipher((0, exports.signalStorage)(auth), addr);
164
let result;
165
switch (type) {
166
case 'pkmsg':
167
result = await session.decryptPreKeyWhisperMessage(msg);
168
break;
169
case 'msg':
170
result = await session.decryptWhisperMessage(msg);
171
break;
172
}
173
return result;
174
};
175
exports.decryptSignalProto = decryptSignalProto;
176
const encryptSignalProto = async (user, buffer, auth) => {
177
const addr = (0, exports.jidToSignalProtocolAddress)(user);
178
const cipher = new libsignal.SessionCipher((0, exports.signalStorage)(auth), addr);
179
const { type: sigType, body } = await cipher.encrypt(buffer);
180
const type = sigType === 3 ? 'pkmsg' : 'msg';
181
return { type, ciphertext: Buffer.from(body, 'binary') };
182
};
183
exports.encryptSignalProto = encryptSignalProto;
184
const encryptSenderKeyMsgSignalProto = async (group, data, meId, auth) => {
185
const storage = (0, exports.signalStorage)(auth);
186
const senderName = (0, exports.jidToSignalSenderKeyName)(group, meId);
187
const builder = new WASignalGroup_1.GroupSessionBuilder(storage);
188
const { [senderName]: senderKey } = await auth.keys.get('sender-key', [senderName]);
189
if (!senderKey) {
190
const record = new WASignalGroup_1.SenderKeyRecord();
191
await auth.keys.set({ 'sender-key': { [senderName]: record } });
192
}
193
const senderKeyDistributionMessage = await builder.create(senderName);
194
const session = new WASignalGroup_1.GroupCipher(storage, senderName);
195
return {
196
ciphertext: await session.encrypt(data),
197
senderKeyDistributionMessageKey: senderKeyDistributionMessage.serialize(),
198
};
199
};
200
exports.encryptSenderKeyMsgSignalProto = encryptSenderKeyMsgSignalProto;
201
const parseAndInjectE2ESessions = async (node, auth) => {
202
const extractKey = (key) => (key ? ({
203
keyId: (0, WABinary_1.getBinaryNodeChildUInt)(key, 'id', 3),
204
publicKey: (0, crypto_1.generateSignalPubKey)((0, WABinary_1.getBinaryNodeChildBuffer)(key, 'value')),
205
signature: (0, WABinary_1.getBinaryNodeChildBuffer)(key, 'signature'),
206
}) : undefined);
207
const nodes = (0, WABinary_1.getBinaryNodeChildren)((0, WABinary_1.getBinaryNodeChild)(node, 'list'), 'user');
208
for (const node of nodes) {
209
(0, WABinary_1.assertNodeErrorFree)(node);
210
}
211
await Promise.all(nodes.map(async (node) => {
212
const signedKey = (0, WABinary_1.getBinaryNodeChild)(node, 'skey');
213
const key = (0, WABinary_1.getBinaryNodeChild)(node, 'key');
214
const identity = (0, WABinary_1.getBinaryNodeChildBuffer)(node, 'identity');
215
const jid = node.attrs.jid;
216
const registrationId = (0, WABinary_1.getBinaryNodeChildUInt)(node, 'registration', 4);
217
const device = {
218
registrationId,
219
identityKey: (0, crypto_1.generateSignalPubKey)(identity),
220
signedPreKey: extractKey(signedKey),
221
preKey: extractKey(key)
222
};
223
const cipher = new libsignal.SessionBuilder((0, exports.signalStorage)(auth), (0, exports.jidToSignalProtocolAddress)(jid));
224
await cipher.initOutgoing(device);
225
}));
226
};
227
exports.parseAndInjectE2ESessions = parseAndInjectE2ESessions;
228
const extractDeviceJids = (result, myJid, excludeZeroDevices) => {
229
var _a;
230
const { user: myUser, device: myDevice } = (0, WABinary_1.jidDecode)(myJid);
231
const extracted = [];
232
for (const node of result.content) {
233
const list = (_a = (0, WABinary_1.getBinaryNodeChild)(node, 'list')) === null || _a === void 0 ? void 0 : _a.content;
234
if (list && Array.isArray(list)) {
235
for (const item of list) {
236
const { user } = (0, WABinary_1.jidDecode)(item.attrs.jid);
237
const devicesNode = (0, WABinary_1.getBinaryNodeChild)(item, 'devices');
238
const deviceListNode = (0, WABinary_1.getBinaryNodeChild)(devicesNode, 'device-list');
239
if (Array.isArray(deviceListNode === null || deviceListNode === void 0 ? void 0 : deviceListNode.content)) {
240
for (const { tag, attrs } of deviceListNode.content) {
241
const device = +attrs.id;
242
if (tag === 'device' && // ensure the "device" tag
243
(!excludeZeroDevices || device !== 0) && // if zero devices are not-excluded, or device is non zero
244
(myUser !== user || myDevice !== device) && // either different user or if me user, not this device
245
(device === 0 || !!attrs['key-index']) // ensure that "key-index" is specified for "non-zero" devices, produces a bad req otherwise
246
) {
247
extracted.push({ user, device });
248
}
249
}
250
}
251
}
252
}
253
}
254
return extracted;
255
};
256
exports.extractDeviceJids = extractDeviceJids;
257
/**
258
* get the next N keys for upload or processing
259
* @param count number of pre-keys to get or generate
260
*/
261
const getNextPreKeys = async ({ creds, keys }, count) => {
262
const { newPreKeys, lastPreKeyId, preKeysRange } = (0, exports.generateOrGetPreKeys)(creds, count);
263
const update = {
264
nextPreKeyId: Math.max(lastPreKeyId + 1, creds.nextPreKeyId),
265
firstUnuploadedPreKeyId: Math.max(creds.firstUnuploadedPreKeyId, lastPreKeyId + 1)
266
};
267
await keys.set({ 'pre-key': newPreKeys });
268
const preKeys = await (0, exports.getPreKeys)(keys, preKeysRange[0], preKeysRange[0] + preKeysRange[1]);
269
return { update, preKeys };
270
};
271
exports.getNextPreKeys = getNextPreKeys;
272
const getNextPreKeysNode = async (state, count) => {
273
const { creds } = state;
274
const { update, preKeys } = await (0, exports.getNextPreKeys)(state, count);
275
const node = {
276
tag: 'iq',
277
attrs: {
278
xmlns: 'encrypt',
279
type: 'set',
280
to: WABinary_1.S_WHATSAPP_NET,
281
},
282
content: [
283
{ tag: 'registration', attrs: {}, content: (0, generics_1.encodeBigEndian)(creds.registrationId) },
284
{ tag: 'type', attrs: {}, content: Defaults_1.KEY_BUNDLE_TYPE },
285
{ tag: 'identity', attrs: {}, content: creds.signedIdentityKey.public },
286
{ tag: 'list', attrs: {}, content: Object.keys(preKeys).map(k => (0, exports.xmppPreKey)(preKeys[+k], +k)) },
287
(0, exports.xmppSignedPreKey)(creds.signedPreKey)
288
]
289
};
290
return { update, node };
291
};
292
exports.getNextPreKeysNode = getNextPreKeysNode;
293
294