From 0cb301beae0c55576c71d4e94a08c8a1f932af48 Mon Sep 17 00:00:00 2001 From: SpinnySpiwal <99829343+SpinnySpiwal@users.noreply.github.com> Date: Sun, 1 Dec 2024 03:31:17 +0000 Subject: [PATCH] Implement aead_xchacha20_poly1305_rtpsize voice encryption mode (#764) --- discord/voice_client.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/discord/voice_client.py b/discord/voice_client.py index 91b5824a8..10c1861ca 100644 --- a/discord/voice_client.py +++ b/discord/voice_client.py @@ -260,6 +260,7 @@ class VoiceClient(VoiceProtocol): self._player: Optional[AudioPlayer] = None self.encoder: Encoder = MISSING self._lite_nonce: int = 0 + self._incr_nonce: int = 0 self.ws: DiscordVoiceWebSocket = MISSING warn_nacl: bool = not has_nacl @@ -267,6 +268,7 @@ class VoiceClient(VoiceProtocol): 'xsalsa20_poly1305_lite', 'xsalsa20_poly1305_suffix', 'xsalsa20_poly1305', + 'aead_xchacha20_poly1305_rtpsize' ) @property @@ -556,6 +558,15 @@ class VoiceClient(VoiceProtocol): encrypt_packet = getattr(self, '_encrypt_' + self.mode) return encrypt_packet(header, data) + def _encrypt_aead_xchacha20_poly1305_rtpsize(self, header: bytes, data) -> bytes: + box = nacl.secret.Aead(bytes(self.secret_key)) + nonce = bytearray(24) + + nonce[:4] = struct.pack('>I', self._incr_nonce) + self.checked_add('_incr_nonce', 1, 4294967295) + + return header + box.encrypt(bytes(data), bytes(header), bytes(nonce)).ciphertext + nonce[:4] + def _encrypt_xsalsa20_poly1305(self, header: bytes, data) -> bytes: box = nacl.secret.SecretBox(bytes(self.secret_key)) nonce = bytearray(24)