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