diff --git a/.vscode/settings.json b/.vscode/settings.json index 2abeb10..b66d9a8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,4 @@ { - // "rust-analyzer.cargo.target": "x86_64-pc-windows-gnu" - // "rust-analyzer.cargo.features": ["tun"] + "rust-analyzer.cargo.target": "x86_64-pc-windows-gnu", + "rust-analyzer.cargo.features": ["tun"] } \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index eb7219c..9fb71bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -159,6 +159,28 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "aws-lc-rs" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9a7b350e3bb1767102698302bc37256cbd48422809984b98d292c40e2579aa9" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.37.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "base64" version = "0.21.7" @@ -302,9 +324,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfg-if" version = "1.0.4" @@ -382,18 +412,47 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" +[[package]] +name = "cmake" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] + [[package]] name = "colorchoice" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "const-oid" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -640,6 +699,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "either" version = "1.15.0" @@ -719,6 +784,18 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "fastbloom" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" +dependencies = [ + "getrandom 0.3.4", + "libm", + "rand 0.9.2", + "siphasher", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -775,6 +852,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" version = "0.3.31" @@ -1320,6 +1403,38 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[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.85" @@ -1620,6 +1735,12 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + [[package]] name = "parking_lot" version = "0.12.5" @@ -1883,9 +2004,12 @@ dependencies = [ "once_cell", "prost", "prost-build", + "quinn", "rand 0.8.5", "reqwest", "rsa", + "rustls", + "rustls-pemfile", "sdlan-sn-rs", "serde", "structopt", @@ -1929,6 +2053,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", + "fastbloom", "getrandom 0.3.4", "lru-slab", "rand 0.9.2", @@ -1936,6 +2061,7 @@ dependencies = [ "rustc-hash", "rustls", "rustls-pki-types", + "rustls-platform-verifier", "slab", "thiserror 2.0.17", "tinyvec", @@ -2204,10 +2330,12 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.36" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ + "aws-lc-rs", + "log", "once_cell", "ring", "rustls-pki-types", @@ -2216,6 +2344,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "rustls-pki-types" version = "1.13.2" @@ -2226,12 +2375,40 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -2249,6 +2426,24 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -2280,6 +2475,29 @@ dependencies = [ "uuid", ] +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags 2.10.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.228" @@ -2418,6 +2636,12 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + [[package]] name = "slab" version = "0.4.11" @@ -3243,6 +3467,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -3352,6 +3586,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "1.0.5" @@ -3387,6 +3630,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -3471,6 +3723,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -3507,6 +3768,21 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -3555,6 +3831,12 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -3573,6 +3855,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3591,6 +3879,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -3621,6 +3915,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -3639,6 +3939,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -3657,6 +3963,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -3675,6 +3987,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" diff --git a/Cargo.toml b/Cargo.toml index 5d1f483..1993892 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,9 @@ tokio-util = "0.7.11" tracing = "0.1.40" myactor = { git = "https://gitea.s5s8.com/rust/actor-rs.git" } bytes = "1.11.1" +quinn = "0.11.9" +rustls = "0.23.37" +rustls-pemfile = "2.2.0" # rolling-file = { path = "../rolling-file" } [target.'cfg(unix)'.dependencies] diff --git a/src/lib.rs b/src/lib.rs index 207e305..62bbc7c 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ mod network; mod pb; mod tcp; mod utils; +mod quic; use std::sync::Arc; use std::{sync::atomic::AtomicU8, time::Duration}; diff --git a/src/network/async_main.rs b/src/network/async_main.rs index 4718097..19a834f 100755 --- a/src/network/async_main.rs +++ b/src/network/async_main.rs @@ -15,6 +15,7 @@ use sdlan_sn_rs::utils::{get_current_timestamp, is_multi_broadcast}; use sdlan_sn_rs::utils::{Mac, Result}; use tokio::net::{UdpSocket}; use tokio::sync::mpsc::{channel, Receiver, Sender}; +use tokio::time::sleep; use tokio_util::sync::CancellationToken; use super::{Node, StartStopInfo}; @@ -35,6 +36,43 @@ pub async fn async_main( let cancel_tcp = cancel.clone(); let (ipv6_network_restarter, rx) = channel(10); tokio::spawn(run_ipv6(edge, rx)); + + // TODO: change the quic logic + /* + tokio::spawn(async move { + loop { + let conn = edge.quic_endpoint.connect("192.168.0.1".parse().unwrap(), "www.punchnet.com").unwrap().await.unwrap(); + println!("连ζŽ₯成功!"); + + let (mut send, mut recv) = conn.open_bi().await.unwrap(); + + loop { + send.write_all(b"Hello QUIC!").await.unwrap(); + let mut buf = vec![0u8; 1024]; + if let Ok(size) = recv.read(&mut buf).await { + if let Some(size) = size { + println!("got data from server: {}", String::from_utf8_lossy(&buf[..size])) + } else { + println!("no data size found"); + } + } else { + println!("read failed"); + break; + } + + recv.read(&mut buf).await.unwrap(); + sleep(Duration::from_secs(11)).await; + } + + println!("hello"); + // conn.close(0u32.into(), b"donw"); + + edge.quic_endpoint.wait_idle().await; + } + }); + */ + ////////////////// to here + init_tcp_conn( cancel_tcp, &args.tcp, diff --git a/src/network/node.rs b/src/network/node.rs index 38ba667..9d804fc 100755 --- a/src/network/node.rs +++ b/src/network/node.rs @@ -1,4 +1,5 @@ use dashmap::DashMap; +use quinn::Endpoint; use rsa::RsaPrivateKey; use sdlan_sn_rs::config::{AF_INET, AF_INET6}; use tokio::net::UdpSocket; @@ -11,6 +12,7 @@ use tokio::sync::mpsc::Sender; use tokio::sync::oneshot; use tracing::{debug, error}; +use crate::quic::quic_init; use crate::{ConnectionInfo, get_base_dir}; use crate::pb::{ encode_to_tcp_message, encode_to_udp_message, SdlEmpty, SdlStunProbe, SdlStunProbeReply, @@ -168,6 +170,8 @@ pub struct Node { pub hostname: RwLock, + pub quic_endpoint: Endpoint, + pub udp_sock_for_dns: Arc, pub server_ip: String, @@ -384,6 +388,8 @@ impl Node { udp_sock_for_dns: udpsock_for_dns, + quic_endpoint: quic_init(), + identity_id: IdentityID::new(0), access_token: StringToken::new(String::new()), session_token: StringToken::new(Vec::new()), diff --git a/src/network/tun_linux.rs b/src/network/tun_linux.rs index f8585fc..78b50b3 100755 --- a/src/network/tun_linux.rs +++ b/src/network/tun_linux.rs @@ -336,6 +336,7 @@ impl TunTapPacketHandler for Iface { return Ok(()); } if dest_ip == self_ip { + use bytes::Bytes; use sdlan_sn_rs::utils::mac_to_string; use crate::network::{ARP_REPLY, ArpRequestInfo, send_arp_request}; @@ -364,13 +365,17 @@ impl TunTapPacketHandler for Iface { return Ok(()); }; + let data_bytes = Bytes::from(encrypted); + let data = SdlData { is_p2p: true, ttl: 2, network_id: edge.network_id.load(Ordering::Relaxed), src_mac: Vec::from(self_mac), dst_mac: Vec::from(arp.dhwaddr), - data: encrypted, + data: data_bytes, + session_token: edge.session_token.get(), + identity_id: edge.identity_id.load(), }; let v = encode_to_udp_message(Some(data), PacketType::Data as u8) @@ -497,6 +502,8 @@ impl TunTapPacketHandler for Iface { ip, do_arp_request, } => { + use bytes::Bytes; + use crate::utils::caculate_crc; if do_arp_request { @@ -523,7 +530,9 @@ impl TunTapPacketHandler for Iface { dst_mac: Vec::from([0xff; 6]), is_p2p: true, ttl: SDLAN_DEFAULT_TTL as u32, - data: encrypted, + data: Bytes::from(encrypted), + session_token: eee.session_token.get(), + identity_id: eee.identity_id.load(), }; let data = encode_to_udp_message(Some(data), PacketType::Data as u8).unwrap(); @@ -560,7 +569,9 @@ impl TunTapPacketHandler for Iface { ttl: SDLAN_DEFAULT_TTL as u32, src_mac: Vec::from(src_mac), dst_mac: Vec::from(mac), - data: Vec::from(encrypted), + data: Bytes::from(encrypted), + session_token: eee.session_token.get(), + identity_id: eee.identity_id.load(), }; let msg = encode_to_udp_message(Some(data), PacketType::Data as u8).unwrap(); diff --git a/src/network/tun_win.rs b/src/network/tun_win.rs index 60e2d70..8db6a3a 100755 --- a/src/network/tun_win.rs +++ b/src/network/tun_win.rs @@ -1,3 +1,4 @@ +use bytes::Bytes; use etherparse::ether_type::ARP; use etherparse::{Ethernet2Header, IpHeaders}; use sdlan_sn_rs::config::SDLAN_DEFAULT_TTL; @@ -209,7 +210,9 @@ impl TunTapPacketHandler for Iface { network_id: edge.network_id.load(Ordering::Relaxed), src_mac: Vec::from(self_mac), dst_mac: Vec::from(arp.dhwaddr), - data: encrypted, + data: Bytes::from(encrypted), + session_token: edge.session_token.get(), + identity_id: edge.identity_id.load(), }; let v = encode_to_udp_message(Some(data), PacketType::Data as u8) @@ -344,7 +347,10 @@ impl TunTapPacketHandler for Iface { dst_mac: Vec::from([0xff; 6]), is_p2p: true, ttl: SDLAN_DEFAULT_TTL as u32, - data: encrypted, + data: Bytes::from(encrypted), + + session_token: eee.session_token.get(), + identity_id: eee.identity_id.load(), }; let data = encode_to_udp_message(Some(data), PacketType::Data as u8).unwrap(); @@ -384,7 +390,9 @@ impl TunTapPacketHandler for Iface { ttl: SDLAN_DEFAULT_TTL as u32, src_mac: Vec::from(src_mac), dst_mac: Vec::from(mac), - data: Vec::from(encrypted), + data: Bytes::from(encrypted), + session_token: eee.session_token.get(), + identity_id: eee.identity_id.load(), }; let msg = encode_to_udp_message(Some(data), PacketType::Data as u8).unwrap(); diff --git a/src/quic/mod.rs b/src/quic/mod.rs new file mode 100644 index 0000000..d1a30d3 --- /dev/null +++ b/src/quic/mod.rs @@ -0,0 +1,76 @@ +use std::fs::File; +use std::io::BufReader; +use std::path::Path; +use std::sync::Arc; + +use quinn::Endpoint; +use quinn::crypto::rustls::QuicClientConfig; +use rustls::crypto::CryptoProvider; +use rustls::crypto::ring; +use rustls::pki_types::CertificateDer; +use rustls::pki_types::PrivateKeyDer; + +use rustls::pki_types::ServerName; +use rustls_pemfile::{certs, pkcs8_private_keys, private_key}; + +pub fn quic_init() -> Endpoint { + let default_provider = ring::default_provider(); + CryptoProvider::install_default(default_provider).unwrap(); + + let certificate_chain = load_certs_from_pem("./ca/ca.crt").unwrap(); + let mut root_store = rustls::RootCertStore::empty(); + for cert in certificate_chain { + root_store.add(cert).unwrap(); + } + + let mut rustls_config = rustls::ClientConfig::builder() + .dangerous() + .with_custom_certificate_verifier(Arc::new(SkipServerVerification{})) + .with_no_client_auth(); + + rustls_config.alpn_protocols = vec![b"punchnet/1.0".to_vec()]; + + let quinn_client_config = quinn::ClientConfig::new(Arc::new(QuicClientConfig::try_from(rustls_config).unwrap())); + + let mut endpoint = Endpoint::client("0.0.0.0:0".parse().unwrap()).unwrap(); + endpoint.set_default_client_config(quinn_client_config); + + endpoint +} + +#[derive(Debug)] +struct SkipServerVerification; +impl rustls::client::danger::ServerCertVerifier for SkipServerVerification { + fn verify_server_cert(&self, _: &CertificateDer<'_>, _: &[CertificateDer<'_>], _: &ServerName<'_>, _: &[u8], _: rustls::pki_types::UnixTime) -> Result { + Ok(rustls::client::danger::ServerCertVerified::assertion()) + } + fn verify_tls12_signature(&self, _: &[u8], _: &CertificateDer<'_>, _: &rustls::DigitallySignedStruct) -> Result { + Ok(rustls::client::danger::HandshakeSignatureValid::assertion()) + } + fn verify_tls13_signature(&self, _: &[u8], _: &CertificateDer<'_>, _: &rustls::DigitallySignedStruct) -> Result { + Ok(rustls::client::danger::HandshakeSignatureValid::assertion()) + } + fn supported_verify_schemes(&self) -> Vec { + rustls::crypto::ring::default_provider().signature_verification_algorithms.supported_schemes() + } +} + +pub fn load_certs_from_pem(path: impl AsRef) -> Result>, Box> { + let file = File::open(path.as_ref())?; + let mut reader = BufReader::new(file); + let certs = certs(&mut reader) + .into_iter() + .map(|it| it.unwrap()) + .collect::>(); + + Ok(certs) +} + +pub fn load_private_key_from_pem(path: impl AsRef) -> Option>{ + let Ok(file) = File::open(path.as_ref()) else { + return None; + }; + let mut reader = BufReader::new(file); + let key = private_key(&mut reader).unwrap(); + key +}