diff --git a/Cargo.lock b/Cargo.lock index 94d3684..e399f9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -87,6 +87,28 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +[[package]] +name = "aws-lc-rs" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "base64" version = "0.13.1" @@ -150,6 +172,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] @@ -222,6 +246,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + [[package]] name = "colorchoice" version = "1.0.5" @@ -436,6 +469,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "ed25519" version = "2.2.3" @@ -535,6 +574,8 @@ dependencies = [ "quinn", "rand 0.8.6", "rmp-serde", + "rustls", + "rustls-platform-verifier 0.7.0", "serde", "thiserror 2.0.18", "time", @@ -572,6 +613,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures-channel" version = "0.3.32" @@ -1005,6 +1052,16 @@ dependencies = [ "syn", ] +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + [[package]] name = "js-sys" version = "0.3.99" @@ -1326,7 +1383,7 @@ dependencies = [ "rustc-hash", "rustls", "rustls-pki-types", - "rustls-platform-verifier", + "rustls-platform-verifier 0.6.2", "slab", "thiserror 2.0.18", "tinyvec", @@ -1543,6 +1600,8 @@ version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ + "aws-lc-rs", + "log", "once_cell", "ring", "rustls-pki-types", @@ -1594,6 +1653,27 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni 0.22.4", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + [[package]] name = "rustls-platform-verifier-android" version = "0.1.1" @@ -1606,6 +1686,7 @@ version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", diff --git a/Cargo.toml b/Cargo.toml index 1fcdebf..e2091d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,3 +23,5 @@ expanduser = "1.2.2" uuid = { version = "1.23.2", features = ["v4"] } ed25519-dalek = { version = "2.2.0", features = ["rand_core", "serde"] } rand = "0.8" +rustls = {version = "0.23.40" } +rustls-platform-verifier = "0.7.0" diff --git a/src/main.rs b/src/main.rs index fc95b0a..d969ad2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,9 +15,11 @@ use std::time::Duration; use std::sync::Arc; use quinn::Endpoint; use quinn::TransportConfig; +use quinn::crypto::rustls::QuicClientConfig; use rmp_serde::encode::Serializer; use serde::Serialize; use tracing::{instrument,debug,Level}; +use rustls_platform_verifier::{BuilderVerifierExt}; const CLIENT_ADDR: SocketAddr = SocketAddr::new(IpAddr::V6(std::net::Ipv6Addr::UNSPECIFIED), 0); const PORT: u16 = 53512; @@ -76,11 +78,26 @@ async fn main() -> Result<(), Box> { let response = resolver.lookup_ip(&target_server).await.unwrap().iter() .next().expect("DNS lookup of server failed"); debug!("Found address {response}"); + // create connection let mut transport_config: TransportConfig = TransportConfig::default(); transport_config.keep_alive_interval(Some(Duration::from_secs(1))); - let mut client_config = quinn::ClientConfig::try_with_platform_verifier().unwrap(); + + let provider = rustls::crypto::aws_lc_rs::default_provider(); + + let mut client_crypto = rustls::ClientConfig::builder_with_provider(Arc::new(provider)) + .with_protocol_versions(&[&rustls::version::TLS13])? + .with_platform_verifier()? + .with_no_client_auth(); + + client_crypto.enable_early_data = true; + + client_crypto.alpn_protocols = vec![b"fedichatv0".to_vec()]; + + let mut client_config = quinn::ClientConfig::new(Arc::new(QuicClientConfig::try_from(client_crypto)?)); + client_config.transport_config(Arc::new(transport_config)); + let endpoint = Endpoint::client(CLIENT_ADDR)?; let connection = endpoint.connect_with( client_config,