From 48db45ffd8d54db7404b9df4a3915860e85c6e85 Mon Sep 17 00:00:00 2001 From: Kyle Simpson Date: Tue, 9 Aug 2022 17:11:07 +0100 Subject: [PATCH] Chore: Update `xsalsa20poly1305` -> 0.9 A few extra error types needed adding and handling due to the new `KeyInit::new_from_slice` returning a non-exported error. --- Cargo.toml | 2 +- src/driver/connection/error.rs | 6 +++++- src/driver/connection/mod.rs | 5 +++-- src/driver/crypto.rs | 2 +- src/events/context/data/disconnect.rs | 3 ++- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f38dabd..c4dfc4a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,7 +46,7 @@ twilight-model = { default-features = false, optional = true, version = "0.12.0" typemap_rev = { optional = true, version = "0.1" } url = { optional = true, version = "2" } uuid = { features = ["v4"], optional = true, version = "1" } -xsalsa20poly1305 = { features = ["std"], optional = true, version = "0.8" } +xsalsa20poly1305 = { features = ["std"], optional = true, version = "0.9" } [dependencies.serenity] version = "0.11" diff --git a/src/driver/connection/error.rs b/src/driver/connection/error.rs index 3b01eb6..7690e7e 100644 --- a/src/driver/connection/error.rs +++ b/src/driver/connection/error.rs @@ -17,8 +17,10 @@ pub enum Error { /// The driver hung up an internal signaller, either due to another connection attempt /// or a crash. AttemptDiscarded, - /// An error occurred during [en/de]cryption of voice packets or key generation. + /// An error occurred during [en/de]cryption of voice packets. Crypto(CryptoError), + /// The symmetric key supplied by Discord had the wrong size. + CryptoInvalidLength, /// Server did not return the expected crypto mode during negotiation. CryptoModeInvalid, /// Selected crypto mode was not offered by server. @@ -97,6 +99,7 @@ impl fmt::Display for Error { match self { Self::AttemptDiscarded => write!(f, "connection attempt was aborted/discarded"), Self::Crypto(e) => e.fmt(f), + Self::CryptoInvalidLength => write!(f, "server supplied key of wrong length"), Self::CryptoModeInvalid => write!(f, "server changed negotiated encryption mode"), Self::CryptoModeUnavailable => write!(f, "server did not offer chosen encryption mode"), Self::EndpointUrl => write!(f, "endpoint URL received from gateway was invalid"), @@ -117,6 +120,7 @@ impl StdError for Error { fn source(&self) -> Option<&(dyn StdError + 'static)> { match self { Error::AttemptDiscarded + | Error::CryptoInvalidLength | Error::CryptoModeInvalid | Error::CryptoModeUnavailable | Error::EndpointUrl diff --git a/src/driver/connection/mod.rs b/src/driver/connection/mod.rs index 442fd88..2cb094d 100644 --- a/src/driver/connection/mod.rs +++ b/src/driver/connection/mod.rs @@ -30,7 +30,7 @@ use std::{net::IpAddr, str::FromStr}; use tokio::{net::UdpSocket, spawn, time::timeout}; use tracing::{debug, info, instrument}; use url::Url; -use xsalsa20poly1305::{aead::NewAead, XSalsa20Poly1305 as Cipher}; +use xsalsa20poly1305::{KeyInit, XSalsa20Poly1305 as Cipher}; pub(crate) struct Connection { pub(crate) info: ConnectionInfo, @@ -353,7 +353,8 @@ async fn init_cipher(client: &mut WsStream, mode: CryptoMode) -> Result return Err(Error::CryptoModeInvalid); } - return Ok(Cipher::new_from_slice(&desc.secret_key)?); + return Cipher::new_from_slice(&desc.secret_key) + .map_err(|_| Error::CryptoInvalidLength); }, other => { debug!( diff --git a/src/driver/crypto.rs b/src/driver/crypto.rs index db2e898..3fc8a02 100644 --- a/src/driver/crypto.rs +++ b/src/driver/crypto.rs @@ -254,7 +254,7 @@ impl CryptoState { mod test { use super::*; use discortp::rtp::MutableRtpPacket; - use xsalsa20poly1305::{aead::NewAead, KEY_SIZE, TAG_SIZE}; + use xsalsa20poly1305::{KeyInit, KEY_SIZE, TAG_SIZE}; #[test] fn small_packet_decrypts_error() { diff --git a/src/events/context/data/disconnect.rs b/src/events/context/data/disconnect.rs index 536236e..ca07242 100644 --- a/src/events/context/data/disconnect.rs +++ b/src/events/context/data/disconnect.rs @@ -86,7 +86,8 @@ impl From<&ConnectionError> for DisconnectReason { fn from(e: &ConnectionError) -> Self { match e { ConnectionError::AttemptDiscarded => Self::AttemptDiscarded, - ConnectionError::CryptoModeInvalid + ConnectionError::CryptoInvalidLength + | ConnectionError::CryptoModeInvalid | ConnectionError::CryptoModeUnavailable | ConnectionError::EndpointUrl | ConnectionError::ExpectedHandshake