fix: incorrect enc msg detection

This commit is contained in:
Adhiraj Singh
2021-12-19 00:33:33 +05:30
parent 89a159aac3
commit af0804048c

View File

@@ -30,39 +30,42 @@ export const decodeWAMessage = (
if(typeof data === 'string' || !possiblyEnc) { if(typeof data === 'string' || !possiblyEnc) {
json = JSON.parse(data.toString()) // parse the JSON json = JSON.parse(data.toString()) // parse the JSON
} else { } else {
try {
json = JSON.parse(data.toString())
} catch {
const { macKey, encKey } = auth || {}
if (!macKey || !encKey) {
throw new Boom('recieved encrypted buffer when auth creds unavailable', { data: message, statusCode: DisconnectReason.badSession })
}
/*
If the data recieved was not a JSON, then it must be an encrypted message.
Such a message can only be decrypted if we're connected successfully to the servers & have encryption keys
*/
if (fromMe) {
tags = [data[0], data[1]]
data = data.slice(2, data.length)
}
const { macKey, encKey } = auth || {} const checksum = data.slice(0, 32) // the first 32 bytes of the buffer are the HMAC sign of the message
if (!macKey || !encKey) { data = data.slice(32, data.length) // the actual message
throw new Boom('recieved encrypted buffer when auth creds unavailable', { data: message, statusCode: DisconnectReason.badSession }) const computedChecksum = hmacSign(data, macKey) // compute the sign of the message we recieved using our macKey
}
/*
If the data recieved was not a JSON, then it must be an encrypted message.
Such a message can only be decrypted if we're connected successfully to the servers & have encryption keys
*/
if (fromMe) {
tags = [data[0], data[1]]
data = data.slice(2, data.length)
}
const checksum = data.slice(0, 32) // the first 32 bytes of the buffer are the HMAC sign of the message if (checksum.equals(computedChecksum)) {
data = data.slice(32, data.length) // the actual message // the checksum the server sent, must match the one we computed for the message to be valid
const computedChecksum = hmacSign(data, macKey) // compute the sign of the message we recieved using our macKey const decrypted = aesDecrypt(data, encKey) // decrypt using AES
json = decodeBinaryNodeLegacy(decrypted, { index: 0 }) // decode the binary message into a JSON array
if (checksum.equals(computedChecksum)) { } else {
// the checksum the server sent, must match the one we computed for the message to be valid throw new Boom('Bad checksum', {
const decrypted = aesDecrypt(data, encKey) // decrypt using AES data: {
json = decodeBinaryNodeLegacy(decrypted, { index: 0 }) // decode the binary message into a JSON array received: checksum.toString('hex'),
} else { computed: computedChecksum.toString('hex'),
throw new Boom('Bad checksum', { data: data.slice(0, 80).toString(),
data: { tag: messageTag,
received: checksum.toString('hex'), message: message.slice(0, 80).toString()
computed: computedChecksum.toString('hex'), },
data: data.slice(0, 80).toString(), statusCode: DisconnectReason.badSession
tag: messageTag, })
message: message.slice(0, 80).toString() }
},
statusCode: DisconnectReason.badSession
})
} }
} }
} }