Path: blob/master/node_modules/@adiwajshing/baileys/lib/Utils/validate-connection.js
2593 views
"use strict";1Object.defineProperty(exports, "__esModule", { value: true });2exports.configureSuccessfulPairing = exports.generateRegistrationNode = exports.generateLoginNode = void 0;3const boom_1 = require("@hapi/boom");4const WAProto_1 = require("../../WAProto");5const WABinary_1 = require("../WABinary");6const crypto_1 = require("./crypto");7const generics_1 = require("./generics");8const signal_1 = require("./signal");9const ENCODED_VERSION = 'S9Kdc4pc4EJryo21snc5cg==';10const getUserAgent = ({ version, browser }) => ({11appVersion: {12primary: version[0],13secondary: version[1],14tertiary: version[2],15},16platform: 14,17releaseChannel: 0,18mcc: '000',19mnc: '000',20osVersion: browser[2],21manufacturer: '',22device: browser[1],23osBuildNumber: '0.1',24localeLanguageIso6391: 'en',25localeCountryIso31661Alpha2: 'en',26});27const generateLoginNode = (userJid, config) => {28const { user, device } = WABinary_1.jidDecode(userJid);29const payload = {30passive: true,31connectType: 1,32connectReason: 1,33userAgent: getUserAgent(config),34webInfo: { webSubPlatform: 0 },35username: parseInt(user, 10),36device: device,37};38return WAProto_1.proto.ClientPayload.encode(payload).finish();39};40exports.generateLoginNode = generateLoginNode;41const generateRegistrationNode = ({ registrationId, signedPreKey, signedIdentityKey }, config) => {42const appVersionBuf = new Uint8Array(Buffer.from(ENCODED_VERSION, 'base64'));43const companion = {44os: config.browser[0],45version: {46primary: 10,47secondary: undefined,48tertiary: undefined,49},50platformType: 1,51requireFullSync: false,52};53const companionProto = WAProto_1.proto.CompanionProps.encode(companion).finish();54const registerPayload = {55connectReason: 1,56connectType: 1,57passive: false,58regData: {59buildHash: appVersionBuf,60companionProps: companionProto,61eRegid: generics_1.encodeInt(4, registrationId),62eKeytype: generics_1.encodeInt(1, 5),63eIdent: signedIdentityKey.public,64eSkeyId: generics_1.encodeInt(3, signedPreKey.keyId),65eSkeyVal: signedPreKey.keyPair.public,66eSkeySig: signedPreKey.signature,67},68userAgent: getUserAgent(config),69webInfo: {70webSubPlatform: 0,71},72};73return WAProto_1.proto.ClientPayload.encode(registerPayload).finish();74};75exports.generateRegistrationNode = generateRegistrationNode;76const configureSuccessfulPairing = (stanza, { advSecretKey, signedIdentityKey, signalIdentities }) => {77var _a, _b, _c, _d, _e;78const [pair] = WABinary_1.getAllBinaryNodeChildren(stanza);79const pairContent = Array.isArray(pair.content) ? pair.content : [];80const msgId = stanza.attrs.id;81const deviceIdentity = (_a = pairContent.find(m => m.tag === 'device-identity')) === null || _a === void 0 ? void 0 : _a.content;82const businessName = (_c = (_b = pairContent.find(m => m.tag === 'biz')) === null || _b === void 0 ? void 0 : _b.attrs) === null || _c === void 0 ? void 0 : _c.name;83const verifiedName = businessName || '';84const jid = (_e = (_d = pairContent.find(m => m.tag === 'device')) === null || _d === void 0 ? void 0 : _d.attrs) === null || _e === void 0 ? void 0 : _e.jid;85const { details, hmac } = WAProto_1.proto.ADVSignedDeviceIdentityHMAC.decode(deviceIdentity);86const advSign = crypto_1.hmacSign(details, Buffer.from(advSecretKey, 'base64'));87if (Buffer.compare(hmac, advSign) !== 0) {88throw new boom_1.Boom('Invalid pairing');89}90const account = WAProto_1.proto.ADVSignedDeviceIdentity.decode(details);91const { accountSignatureKey, accountSignature } = account;92const accountMsg = WABinary_1.Binary.build(new Uint8Array([6, 0]), account.details, signedIdentityKey.public).readByteArray();93if (!crypto_1.Curve.verify(accountSignatureKey, accountMsg, accountSignature)) {94throw new boom_1.Boom('Failed to verify account signature');95}96const deviceMsg = WABinary_1.Binary.build(new Uint8Array([6, 1]), account.details, signedIdentityKey.public, account.accountSignatureKey).readByteArray();97account.deviceSignature = crypto_1.Curve.sign(signedIdentityKey.private, deviceMsg);98const identity = signal_1.createSignalIdentity(jid, accountSignatureKey);99const keyIndex = WAProto_1.proto.ADVDeviceIdentity.decode(account.details).keyIndex;100const accountEnc = WAProto_1.proto.ADVSignedDeviceIdentity.encode({101...account.toJSON(),102accountSignatureKey: undefined103}).finish();104const reply = {105tag: 'iq',106attrs: {107to: WABinary_1.S_WHATSAPP_NET,108type: 'result',109id: msgId,110},111content: [112{113tag: 'pair-device-sign',114attrs: {},115content: [116{ tag: 'device-identity', attrs: { 'key-index': `${keyIndex}` }, content: accountEnc }117]118}119]120};121const authUpdate = {122account,123me: { id: jid, verifiedName },124signalIdentities: [...(signalIdentities || []), identity]125};126return {127creds: authUpdate,128reply129};130};131exports.configureSuccessfulPairing = configureSuccessfulPairing;132133134