diff --git a/src/client/voice/dispatcher/StreamDispatcher.js b/src/client/voice/dispatcher/StreamDispatcher.js index 4e60d00e2..f4f6b96b1 100644 --- a/src/client/voice/dispatcher/StreamDispatcher.js +++ b/src/client/voice/dispatcher/StreamDispatcher.js @@ -248,7 +248,7 @@ class StreamDispatcher extends Writable { packetBuffer.writeUIntBE(this.player.voiceConnection.authentication.ssrc, 8, 4); packetBuffer.copy(nonce, 0, 0, 12); - return Buffer.concat([packetBuffer, ...this._encrypt(buffer, sequence)]); + return Buffer.concat([packetBuffer, ...this._encrypt(buffer)]); } _sendPacket(packet) { diff --git a/src/client/voice/receiver/PacketHandler.js b/src/client/voice/receiver/PacketHandler.js index 346b9e152..1931f06cf 100644 --- a/src/client/voice/receiver/PacketHandler.js +++ b/src/client/voice/receiver/PacketHandler.js @@ -1,4 +1,3 @@ -const nonce = Buffer.alloc(24); const secretbox = require('../util/Secretbox'); const EventEmitter = require('events'); @@ -7,6 +6,7 @@ class Readable extends require('stream').Readable { _read() {} } // eslint-disab class PacketHandler extends EventEmitter { constructor(receiver) { super(); + this.nonce = Buffer.alloc(24); this.receiver = receiver; this.streams = new Map(); } @@ -27,10 +27,22 @@ class PacketHandler extends EventEmitter { } parseBuffer(buffer) { - // Reuse nonce buffer - buffer.copy(nonce, 0, 0, 12); + const { secretKey, encryptionMode } = this.receiver.connection.authentication; - let packet = secretbox.methods.open(buffer.slice(12), nonce, this.receiver.connection.authentication.secretKey); + // Choose correct nonce depending on encryption + let end; + if (encryptionMode === 'xsalsa20_poly1305_lite') { + buffer.copy(this.nonce, 0, buffer.length - 4); + end = buffer.length - 4; + } else if (encryptionMode === 'xsalsa20_poly1305_suffix') { + buffer.copy(this.nonce, 0, buffer.length - 24); + end = buffer.length - 24; + } else { + buffer.copy(this.nonce, 0, 0, 12); + } + + // Open packet + let packet = secretbox.methods.open(buffer.slice(12, end), this.nonce, secretKey); if (!packet) return new Error('Failed to decrypt voice packet'); packet = Buffer.from(packet);