feat: decryption?
This commit is contained in:
parent
d55988bb83
commit
b9cf17ef3b
|
@ -17,6 +17,16 @@ version = "1.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
|
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aead"
|
||||||
|
version = "0.5.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0"
|
||||||
|
dependencies = [
|
||||||
|
"crypto-common",
|
||||||
|
"generic-array",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ahash"
|
name = "ahash"
|
||||||
version = "0.8.6"
|
version = "0.8.6"
|
||||||
|
@ -206,6 +216,7 @@ dependencies = [
|
||||||
"bitflags 2.4.1",
|
"bitflags 2.4.1",
|
||||||
"chorus-macros",
|
"chorus-macros",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
"crypto_secretbox",
|
||||||
"custom_error",
|
"custom_error",
|
||||||
"discortp",
|
"discortp",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
|
@ -265,6 +276,17 @@ dependencies = [
|
||||||
"windows-targets 0.48.5",
|
"windows-targets 0.48.5",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cipher"
|
||||||
|
version = "0.4.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
|
||||||
|
dependencies = [
|
||||||
|
"crypto-common",
|
||||||
|
"inout",
|
||||||
|
"zeroize",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "console_error_panic_hook"
|
name = "console_error_panic_hook"
|
||||||
version = "0.1.7"
|
version = "0.1.7"
|
||||||
|
@ -347,9 +369,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
|
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"generic-array",
|
"generic-array",
|
||||||
|
"rand_core",
|
||||||
"typenum",
|
"typenum",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crypto_secretbox"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1"
|
||||||
|
dependencies = [
|
||||||
|
"aead",
|
||||||
|
"cipher",
|
||||||
|
"generic-array",
|
||||||
|
"poly1305",
|
||||||
|
"salsa20",
|
||||||
|
"subtle",
|
||||||
|
"zeroize",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "custom_error"
|
name = "custom_error"
|
||||||
version = "1.9.2"
|
version = "1.9.2"
|
||||||
|
@ -658,6 +696,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"typenum",
|
"typenum",
|
||||||
"version_check",
|
"version_check",
|
||||||
|
"zeroize",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -938,6 +977,15 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "inout"
|
||||||
|
version = "0.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
|
||||||
|
dependencies = [
|
||||||
|
"generic-array",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ipnet"
|
name = "ipnet"
|
||||||
version = "2.9.0"
|
version = "2.9.0"
|
||||||
|
@ -1238,6 +1286,12 @@ version = "1.19.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "opaque-debug"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl"
|
name = "openssl"
|
||||||
version = "0.10.61"
|
version = "0.10.61"
|
||||||
|
@ -1457,6 +1511,17 @@ dependencies = [
|
||||||
"syn 2.0.39",
|
"syn 2.0.39",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "poly1305"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf"
|
||||||
|
dependencies = [
|
||||||
|
"cpufeatures",
|
||||||
|
"opaque-debug",
|
||||||
|
"universal-hash",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "powerfmt"
|
name = "powerfmt"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
|
@ -1747,6 +1812,15 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "salsa20"
|
||||||
|
version = "0.10.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213"
|
||||||
|
dependencies = [
|
||||||
|
"cipher",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "schannel"
|
name = "schannel"
|
||||||
version = "0.1.22"
|
version = "0.1.22"
|
||||||
|
@ -2595,6 +2669,16 @@ version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
|
checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "universal-hash"
|
||||||
|
version = "0.5.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea"
|
||||||
|
dependencies = [
|
||||||
|
"crypto-common",
|
||||||
|
"subtle",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "untrusted"
|
name = "untrusted"
|
||||||
version = "0.7.1"
|
version = "0.7.1"
|
||||||
|
|
|
@ -16,7 +16,7 @@ backend = ["dep:poem", "dep:sqlx"]
|
||||||
rt-multi-thread = ["tokio/rt-multi-thread"]
|
rt-multi-thread = ["tokio/rt-multi-thread"]
|
||||||
rt = ["tokio/rt"]
|
rt = ["tokio/rt"]
|
||||||
client = ["voice"]
|
client = ["voice"]
|
||||||
voice = ["dep:discortp"]
|
voice = ["dep:discortp", "dep:crypto_secretbox"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tokio = { version = "1.34.0", features = ["macros", "sync"] }
|
tokio = { version = "1.34.0", features = ["macros", "sync"] }
|
||||||
|
@ -54,6 +54,7 @@ sqlx = { version = "0.7.1", features = [
|
||||||
], optional = true }
|
], optional = true }
|
||||||
thiserror = "1.0.47"
|
thiserror = "1.0.47"
|
||||||
discortp = { version = "0.5.0", optional = true, features = ["rtp", "discord", "demux"] }
|
discortp = { version = "0.5.0", optional = true, features = ["rtp", "discord", "demux"] }
|
||||||
|
crypto_secretbox = {version = "0.1.1", optional = true}
|
||||||
safina-timer = "0.1.11"
|
safina-timer = "0.1.11"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,13 @@
|
||||||
|
|
||||||
use std::{net::SocketAddr, sync::Arc};
|
use std::{net::SocketAddr, sync::Arc};
|
||||||
|
|
||||||
use log::{info, warn};
|
use log::{debug, info, warn, trace};
|
||||||
use tokio::{net::UdpSocket, sync::Mutex};
|
use tokio::{net::UdpSocket, sync::Mutex};
|
||||||
|
|
||||||
|
use crypto_secretbox::{
|
||||||
|
aead::Aead, cipher::generic_array::GenericArray, KeyInit, XSalsa20Poly1305,
|
||||||
|
};
|
||||||
|
|
||||||
use discortp::{
|
use discortp::{
|
||||||
demux::{demux, Demuxed},
|
demux::{demux, Demuxed},
|
||||||
discord::{IpDiscovery, IpDiscoveryPacket, IpDiscoveryType, MutableIpDiscoveryPacket},
|
discord::{IpDiscovery, IpDiscoveryPacket, IpDiscoveryType, MutableIpDiscoveryPacket},
|
||||||
|
@ -139,20 +143,71 @@ impl UdpHandler {
|
||||||
|
|
||||||
/// Handles a message buf
|
/// Handles a message buf
|
||||||
async fn handle_message(&self, buf: &[u8]) {
|
async fn handle_message(&self, buf: &[u8]) {
|
||||||
info!("VUDP: Received messsage");
|
|
||||||
|
|
||||||
let parsed = demux(buf);
|
let parsed = demux(buf);
|
||||||
|
|
||||||
match parsed {
|
match parsed {
|
||||||
Demuxed::Rtp(rtp) => {
|
Demuxed::Rtp(rtp) => {
|
||||||
let data = buf[11..buf.len()].to_vec();
|
let ciphertext = buf[12..buf.len()].to_vec();
|
||||||
info!("VUDP: Parsed packet as rtp! {:?}; data: {:?}", rtp, data);
|
trace!(
|
||||||
|
"VUDP: Parsed packet as rtp! {:?}; data: {:?}",
|
||||||
|
rtp, ciphertext
|
||||||
|
);
|
||||||
|
|
||||||
|
let data_lock = self.data.lock().await;
|
||||||
|
|
||||||
|
let session_description_result = data_lock.session_description.clone();
|
||||||
|
|
||||||
|
if session_description_result.is_none() {
|
||||||
|
warn!("VUDP: Received encyrpted voice data, but no encryption key, CANNOT DECRYPT!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let session_description = session_description_result.unwrap();
|
||||||
|
|
||||||
|
let nonce;
|
||||||
|
|
||||||
|
let mut rtp_header = buf[0..12].to_vec();
|
||||||
|
|
||||||
|
match session_description.encryption_mode {
|
||||||
|
crate::types::VoiceEncryptionMode::Xsalsa20Poly1305 => {
|
||||||
|
|
||||||
|
// The header is only 12 bytes, but the nonce has to be 24
|
||||||
|
// This actually works mind you, and anything else doesn't
|
||||||
|
for _i in 0..12 {
|
||||||
|
rtp_header.push(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
nonce = GenericArray::from_slice(&rtp_header);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let key = GenericArray::from_slice(&session_description.secret_key);
|
||||||
|
|
||||||
|
let decryptor = XSalsa20Poly1305::new(key);
|
||||||
|
|
||||||
|
let decryption_result = decryptor.decrypt(nonce, ciphertext.as_ref());
|
||||||
|
|
||||||
|
if let Err(decryption_error) = decryption_result {
|
||||||
|
warn!(
|
||||||
|
"VUDP: Failed to decypt voice data! ({:?})",
|
||||||
|
decryption_error
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let decrypted = decryption_result.unwrap();
|
||||||
|
|
||||||
|
info!("VUDP: SUCCESSFULLY DECRYPTED VOICE DATA!!! {:?}", decrypted);
|
||||||
}
|
}
|
||||||
Demuxed::Rtcp(rtcp) => {
|
Demuxed::Rtcp(rtcp) => {
|
||||||
info!("VUDP: Parsed packet as rtcp! {:?}", rtcp);
|
trace!("VUDP: Parsed packet as rtcp! {:?}", rtcp);
|
||||||
}
|
}
|
||||||
Demuxed::FailedParse(e) => {
|
Demuxed::FailedParse(e) => {
|
||||||
warn!("VUDP: Failed to parse packet: {:?}", e);
|
trace!("VUDP: Failed to parse packet: {:?}", e);
|
||||||
}
|
}
|
||||||
Demuxed::TooSmall => {
|
Demuxed::TooSmall => {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
use discortp::discord::IpDiscovery;
|
use discortp::discord::IpDiscovery;
|
||||||
|
|
||||||
use crate::types::{Snowflake, VoiceReady, VoiceServerUpdate};
|
use crate::types::{Snowflake, VoiceReady, VoiceServerUpdate, SessionDescription};
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
/// Saves data shared between parts of the voice architecture
|
/// Saves data shared between parts of the voice architecture
|
||||||
pub struct VoiceData {
|
pub struct VoiceData {
|
||||||
pub server_data: Option<VoiceServerUpdate>,
|
pub server_data: Option<VoiceServerUpdate>,
|
||||||
pub ready_data: Option<VoiceReady>,
|
pub ready_data: Option<VoiceReady>,
|
||||||
|
pub session_description: Option<SessionDescription>,
|
||||||
pub user_id: Snowflake,
|
pub user_id: Snowflake,
|
||||||
pub session_id: String,
|
pub session_id: String,
|
||||||
pub ip_discovery: Option<IpDiscovery>,
|
pub ip_discovery: Option<IpDiscovery>,
|
||||||
|
|
Loading…
Reference in New Issue