diff --git a/Cargo.lock b/Cargo.lock index 7f6a1ff..ac69ca2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,6 +21,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + [[package]] name = "anes" version = "0.1.6" @@ -175,12 +184,6 @@ version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "bytes" version = "1.11.0" @@ -243,7 +246,18 @@ checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", ] [[package]] @@ -253,7 +267,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ "aead", - "chacha20", + "chacha20 0.9.1", "cipher", "poly1305", "zeroize", @@ -362,26 +376,34 @@ dependencies = [ ] [[package]] -name = "criterion" -version = "0.5.1" +name = "cpufeatures" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ + "libc", +] + +[[package]] +name = "criterion" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +dependencies = [ + "alloca", "anes", "cast", "ciborium", "clap", "criterion-plot", - "is-terminal", "itertools", "num-traits", - "once_cell", "oorandom", + "page_size", "plotters", "rayon", "regex", "serde", - "serde_derive", "serde_json", "tinytemplate", "walkdir", @@ -389,9 +411,9 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.5.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" dependencies = [ "cast", "itertools", @@ -435,7 +457,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "typenum", ] @@ -539,7 +561,7 @@ dependencies = [ "hex", "hkdf", "libc", - "rand", + "rand 0.10.0", "rtnetlink", "secp256k1", "serde", @@ -547,7 +569,7 @@ dependencies = [ "serde_yaml", "sha2", "simple-dns", - "socket2 0.5.10", + "socket2", "tempfile", "thiserror 2.0.18", "tokio", @@ -556,6 +578,12 @@ dependencies = [ "tun", ] +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "futures" version = "0.3.31" @@ -688,6 +716,20 @@ dependencies = [ "wasip2", ] +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "rand_core 0.10.0", + "wasip2", + "wasip3", +] + [[package]] name = "half" version = "2.7.1" @@ -699,6 +741,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + [[package]] name = "hashbrown" version = "0.16.1" @@ -711,12 +762,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hex" version = "0.4.3" @@ -750,6 +795,12 @@ dependencies = [ "digest", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "indexmap" version = "2.13.0" @@ -757,7 +808,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.1", + "serde", + "serde_core", ] [[package]] @@ -775,17 +828,6 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" -[[package]] -name = "is-terminal" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -794,9 +836,9 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" -version = "0.10.5" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] @@ -823,6 +865,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" version = "0.2.180" @@ -889,46 +937,30 @@ dependencies = [ [[package]] name = "netlink-packet-core" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" +checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" dependencies = [ - "anyhow", - "byteorder", - "netlink-packet-utils", + "paste", ] [[package]] name = "netlink-packet-route" -version = "0.19.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c171cd77b4ee8c7708da746ce392440cb7bcf618d122ec9ecc607b12938bf4" +checksum = "4ce3636fa715e988114552619582b530481fd5ef176a1e5c1bf024077c2c9445" dependencies = [ - "anyhow", - "byteorder", + "bitflags", "libc", "log", "netlink-packet-core", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-utils" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" -dependencies = [ - "anyhow", - "byteorder", - "paste", - "thiserror 1.0.69", ] [[package]] name = "netlink-proto" -version = "0.11.5" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72452e012c2f8d612410d89eea01e2d9b56205274abb35d53f60200b2ec41d60" +checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" dependencies = [ "bytes", "futures", @@ -951,17 +983,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags", - "cfg-if", - "libc", -] - [[package]] name = "nix" version = "0.30.1" @@ -1022,6 +1043,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "parking" version = "2.2.1" @@ -1091,7 +1122,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", "universal-hash", ] @@ -1105,6 +1136,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "proc-macro2" version = "1.0.106" @@ -1137,7 +1178,18 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20 0.10.0", + "getrandom 0.4.1", + "rand_core 0.10.0", ] [[package]] @@ -1147,7 +1199,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -1159,6 +1211,12 @@ dependencies = [ "getrandom 0.2.17", ] +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + [[package]] name = "rayon" version = "1.11.0" @@ -1221,18 +1279,18 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rtnetlink" -version = "0.14.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b684475344d8df1859ddb2d395dd3dac4f8f3422a1aa0725993cb375fc5caba5" +checksum = "4b960d5d873a75b5be9761b1e73b146f52dddcd27bac75263f40fba686d4d7b5" dependencies = [ - "futures", + "futures-channel", + "futures-util", "log", "netlink-packet-core", "netlink-packet-route", - "netlink-packet-utils", "netlink-proto", "netlink-sys", - "nix 0.27.1", + "nix", "thiserror 1.0.69", "tokio", ] @@ -1278,7 +1336,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes", - "rand", + "rand 0.8.5", "secp256k1-sys", ] @@ -1291,6 +1349,12 @@ dependencies = [ "cc", ] +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "serde" version = "1.0.228" @@ -1354,7 +1418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -1385,9 +1449,9 @@ dependencies = [ [[package]] name = "simple-dns" -version = "0.9.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee851d0e5e7af3721faea1843e8015e820a234f81fda3dea9247e15bac9a86a" +checksum = "df350943049174c4ae8ced56c604e28270258faec12a6a48637a7655287c9ce0" dependencies = [ "bitflags", ] @@ -1404,16 +1468,6 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "socket2" version = "0.6.2" @@ -1530,7 +1584,7 @@ dependencies = [ "mio", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.2", + "socket2", "tokio-macros", "windows-sys 0.61.2", ] @@ -1622,9 +1676,9 @@ dependencies = [ [[package]] name = "tun" -version = "0.7.22" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7904c94104239657089d14bccbf23fd6d363e30639ce49af21ef008a445baf97" +checksum = "b35f176015650e3bd849e85808d809e5b54da2ba7df983c5c3b601a2a8f1095e" dependencies = [ "bytes", "cfg-if", @@ -1633,11 +1687,11 @@ dependencies = [ "ipnet", "libc", "log", - "nix 0.30.1", + "nix", "thiserror 2.0.18", "tokio", "tokio-util", - "windows-sys 0.59.0", + "windows-sys 0.61.2", "wintun-bindings", ] @@ -1653,6 +1707,12 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "universal-hash" version = "0.5.1" @@ -1712,6 +1772,15 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasm-bindgen" version = "0.2.108" @@ -1757,6 +1826,40 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "web-sys" version = "0.3.85" @@ -1767,6 +1870,22 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + [[package]] name = "winapi-util" version = "0.1.11" @@ -1776,21 +1895,18 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.59.0" @@ -1978,6 +2094,88 @@ name = "wit-bindgen" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "zerocopy" diff --git a/Cargo.toml b/Cargo.toml index 06b4817..442b600 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ secp256k1 = { version = "0.30", features = ["rand", "global-context"] } sha2 = "0.10" hkdf = "0.12" chacha20poly1305 = "0.10" -rand = "0.8" +rand = "0.10.0" thiserror = "2.0" bech32 = "0.11" serde = { version = "1.0", features = ["derive"] } @@ -24,22 +24,18 @@ hex = "0.4" clap = { version = "4.5", features = ["derive"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } -tun = { version = "0.7", features = ["async"] } +tun = { version = "0.8.5", features = ["async"] } libc = "0.2" -rtnetlink = "0.14" +rtnetlink = "0.20.0" tokio = { version = "1", features = ["rt", "macros", "signal", "sync", "net", "time"] } futures = "0.3" -simple-dns = "0.9" -socket2 = { version = "0.5", features = ["all"] } +simple-dns = "0.11.2" +socket2 = { version = "0.6.2", features = ["all"] } [dev-dependencies] tempfile = "3.15" -criterion = { version = "0.5", features = ["html_reports"] } +criterion = { version = "0.8.2", features = ["html_reports"] } [[bin]] name = "fipsctl" path = "src/bin/fipsctl.rs" - -[[bench]] -name = "bloom" -harness = false diff --git a/benches/bloom.rs b/benches/bloom.rs deleted file mode 100644 index b63d4a2..0000000 --- a/benches/bloom.rs +++ /dev/null @@ -1,266 +0,0 @@ -//! Benchmarks for the bloom filter module. -//! -//! Run with: cargo bench --bench bloom - -use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; -use fips::bloom::{BloomFilter, BloomState}; -use fips::NodeAddr; -use std::collections::HashMap; - -fn make_node_addr(val: u16) -> NodeAddr { - let mut bytes = [0u8; 16]; - bytes[0..2].copy_from_slice(&val.to_le_bytes()); - NodeAddr::from_bytes(bytes) -} - -/// Pre-populate a filter with `n` entries for realistic benchmarks. -fn populated_filter(n: u16) -> BloomFilter { - let mut filter = BloomFilter::new(); - for i in 0..n { - filter.insert(&make_node_addr(i)); - } - filter -} - -// ===== BloomFilter Benchmarks ===== - -fn bench_insert(c: &mut Criterion) { - let mut group = c.benchmark_group("bloom_insert"); - - let node = make_node_addr(9999); - - // Insert into empty filter - group.bench_function("empty", |b| { - b.iter(|| { - let mut filter = BloomFilter::new(); - filter.insert(black_box(&node)); - }) - }); - - // Insert into a filter with 400 entries (typical occupancy) - let base = populated_filter(400); - group.bench_function("400_entries", |b| { - b.iter(|| { - let mut filter = base.clone(); - filter.insert(black_box(&node)); - }) - }); - - group.finish(); -} - -fn bench_contains(c: &mut Criterion) { - let mut group = c.benchmark_group("bloom_contains"); - - let present = make_node_addr(200); - let absent = make_node_addr(9999); - - for &count in &[100, 400, 800] { - let filter = populated_filter(count); - - group.bench_with_input( - BenchmarkId::new("hit", count), - &count, - |b, _| { - b.iter(|| filter.contains(black_box(&present))) - }, - ); - - group.bench_with_input( - BenchmarkId::new("miss", count), - &count, - |b, _| { - b.iter(|| filter.contains(black_box(&absent))) - }, - ); - } - - group.finish(); -} - -fn bench_merge(c: &mut Criterion) { - let mut group = c.benchmark_group("bloom_merge"); - - for &count in &[100, 400, 800] { - let filter_a = populated_filter(count); - let filter_b = populated_filter(count + 500); // different entries - - group.bench_with_input( - BenchmarkId::from_parameter(count), - &count, - |b, _| { - b.iter(|| { - let mut target = filter_a.clone(); - target.merge(black_box(&filter_b)).unwrap(); - }) - }, - ); - } - - group.finish(); -} - -fn bench_from_bytes(c: &mut Criterion) { - let filter = populated_filter(400); - let bytes = filter.as_bytes().to_vec(); - let hash_count = filter.hash_count(); - - c.bench_function("bloom_from_bytes", |b| { - b.iter(|| { - BloomFilter::from_bytes(black_box(bytes.clone()), black_box(hash_count)).unwrap() - }) - }); -} - -fn bench_fill_ratio(c: &mut Criterion) { - let filter = populated_filter(400); - - c.bench_function("bloom_fill_ratio", |b| { - b.iter(|| filter.fill_ratio()) - }); -} - -fn bench_estimated_count(c: &mut Criterion) { - let filter = populated_filter(400); - - c.bench_function("bloom_estimated_count", |b| { - b.iter(|| filter.estimated_count()) - }); -} - -fn bench_equality(c: &mut Criterion) { - let mut group = c.benchmark_group("bloom_equality"); - - let filter_a = populated_filter(400); - let filter_b = filter_a.clone(); - let mut filter_c = filter_a.clone(); - filter_c.insert(&make_node_addr(9999)); - - group.bench_function("equal", |b| { - b.iter(|| black_box(&filter_a) == black_box(&filter_b)) - }); - - group.bench_function("not_equal", |b| { - b.iter(|| black_box(&filter_a) == black_box(&filter_c)) - }); - - group.finish(); -} - -// ===== BloomState Benchmarks ===== - -fn bench_compute_outgoing_filter(c: &mut Criterion) { - let mut group = c.benchmark_group("bloom_compute_outgoing"); - - for &peer_count in &[2, 5, 10, 20] { - let my_node = make_node_addr(0); - let mut state = BloomState::new(my_node); - state.add_leaf_dependent(make_node_addr(1)); - - // Create peer filters with realistic content - let mut peer_filters = HashMap::new(); - let mut peer_addrs = Vec::new(); - for i in 0..peer_count { - let peer = make_node_addr(100 + i); - peer_addrs.push(peer); - let mut pf = BloomFilter::new(); - // Each peer knows about ~50 nodes - for j in 0..50 { - pf.insert(&make_node_addr(1000 + i * 50 + j)); - } - peer_filters.insert(peer, pf); - } - - let exclude = peer_addrs[0]; - - group.bench_with_input( - BenchmarkId::from_parameter(peer_count), - &peer_count, - |b, _| { - b.iter(|| { - state.compute_outgoing_filter( - black_box(&exclude), - black_box(&peer_filters), - ) - }) - }, - ); - } - - group.finish(); -} - -fn bench_mark_changed_peers(c: &mut Criterion) { - let mut group = c.benchmark_group("bloom_mark_changed_peers"); - - for &peer_count in &[2, 5, 10, 20] { - let my_node = make_node_addr(0); - let mut state = BloomState::new(my_node); - - let mut peer_filters = HashMap::new(); - let mut peer_addrs = Vec::new(); - for i in 0..peer_count { - let peer = make_node_addr(100 + i); - peer_addrs.push(peer); - let mut pf = BloomFilter::new(); - for j in 0..50 { - pf.insert(&make_node_addr(1000 + i * 50 + j)); - } - peer_filters.insert(peer, pf); - } - - // Record initial outgoing filters so the benchmark measures - // the change-detection comparison, not just "never sent" - for &peer in &peer_addrs { - let outgoing = state.compute_outgoing_filter(&peer, &peer_filters); - state.record_sent_filter(peer, outgoing); - } - - let source = peer_addrs[0]; - - group.bench_with_input( - BenchmarkId::new("steady_state", peer_count), - &peer_count, - |b, _| { - b.iter(|| { - // Clone state so mark_changed_peers doesn't accumulate - let mut s = state.clone(); - s.mark_changed_peers( - black_box(&source), - black_box(&peer_addrs), - black_box(&peer_filters), - ); - }) - }, - ); - } - - group.finish(); -} - -fn bench_base_filter(c: &mut Criterion) { - let my_node = make_node_addr(0); - let mut state = BloomState::new(my_node); - for i in 1..=10 { - state.add_leaf_dependent(make_node_addr(i)); - } - - c.bench_function("bloom_base_filter_10_deps", |b| { - b.iter(|| state.base_filter()) - }); -} - -criterion_group!( - benches, - bench_insert, - bench_contains, - bench_merge, - bench_from_bytes, - bench_fill_ratio, - bench_estimated_count, - bench_equality, - bench_compute_outgoing_filter, - bench_mark_changed_peers, - bench_base_filter, -); -criterion_main!(benches); diff --git a/src/identity/auth.rs b/src/identity/auth.rs index 7936234..6e383b7 100644 --- a/src/identity/auth.rs +++ b/src/identity/auth.rs @@ -17,7 +17,7 @@ impl AuthChallenge { /// Generate a new random challenge. pub fn generate() -> Self { let mut bytes = [0u8; 32]; - rand::thread_rng().fill(&mut bytes); + rand::rng().fill_bytes(&mut bytes); Self(bytes) } diff --git a/src/identity/local.rs b/src/identity/local.rs index fe5e1f8..a88c944 100644 --- a/src/identity/local.rs +++ b/src/identity/local.rs @@ -20,9 +20,11 @@ pub struct Identity { impl Identity { /// Create a new random identity. pub fn generate() -> Self { - let secp = Secp256k1::new(); - let keypair = Keypair::new(&secp, &mut rand::thread_rng()); - Self::from_keypair(keypair) + let mut secret_bytes = [0u8; 32]; + rand::Rng::fill_bytes(&mut rand::rng(), &mut secret_bytes); + let secret_key = SecretKey::from_slice(&secret_bytes) + .expect("32 random bytes is a valid secret key"); + Self::from_secret_key(secret_key) } /// Create an identity from an existing keypair. diff --git a/src/node/mod.rs b/src/node/mod.rs index 8012822..5b40fdf 100644 --- a/src/node/mod.rs +++ b/src/node/mod.rs @@ -33,7 +33,7 @@ use crate::upper::icmp_rate_limit::IcmpRateLimiter; use crate::upper::tun::{TunError, TunOutboundRx, TunState, TunTx}; use self::wire::{build_encrypted, build_established_header, prepend_inner_header, FLAG_SP}; use crate::{Config, ConfigError, Identity, IdentityError, NodeAddr, PeerIdentity}; -use rand::RngCore; +use rand::Rng; use std::collections::{HashMap, VecDeque}; use std::fmt; use std::thread::JoinHandle; @@ -355,7 +355,7 @@ impl Node { let is_leaf_only = config.is_leaf_only(); let mut startup_epoch = [0u8; 8]; - rand::thread_rng().fill_bytes(&mut startup_epoch); + rand::rng().fill_bytes(&mut startup_epoch); let mut bloom_state = if is_leaf_only { BloomState::leaf_only(node_addr) @@ -452,7 +452,7 @@ impl Node { let node_addr = *identity.node_addr(); let mut startup_epoch = [0u8; 8]; - rand::thread_rng().fill_bytes(&mut startup_epoch); + rand::rng().fill_bytes(&mut startup_epoch); let tun_state = if config.tun.enabled { TunState::Configured diff --git a/src/node/tests/mod.rs b/src/node/tests/mod.rs index d856b7f..65d72df 100644 --- a/src/node/tests/mod.rs +++ b/src/node/tests/mod.rs @@ -56,7 +56,7 @@ pub(super) fn make_completed_connection( let mut resp_conn = PeerConnection::inbound(LinkId::new(999), current_time_ms); let peer_keypair = peer_identity_full.keypair(); let mut resp_epoch = [0u8; 8]; - rand::RngCore::fill_bytes(&mut rand::thread_rng(), &mut resp_epoch); + rand::Rng::fill_bytes(&mut rand::rng(), &mut resp_epoch); let msg2 = resp_conn .receive_handshake_init(peer_keypair, resp_epoch, &msg1, current_time_ms) .unwrap(); diff --git a/src/node/tests/session.rs b/src/node/tests/session.rs index 6c15839..392aca3 100644 --- a/src/node/tests/session.rs +++ b/src/node/tests/session.rs @@ -499,7 +499,7 @@ async fn drain_to_quiescence(nodes: &mut [TestNode]) { #[tokio::test] async fn test_session_100_nodes() { use rand::rngs::StdRng; - use rand::{Rng, SeedableRng}; + use rand::{RngExt, SeedableRng}; use std::sync::mpsc; use std::time::Instant; @@ -533,9 +533,9 @@ async fn test_session_100_nodes() { let mut rng = StdRng::seed_from_u64(SEED + 1); let mut session_pairs: Vec<(usize, usize)> = Vec::with_capacity(NUM_NODES); for src in 0..NUM_NODES { - let mut dst = rng.gen_range(0..NUM_NODES); + let mut dst = rng.random_range(0..NUM_NODES); while dst == src { - dst = rng.gen_range(0..NUM_NODES); + dst = rng.random_range(0..NUM_NODES); } session_pairs.push((src, dst)); } @@ -1192,10 +1192,10 @@ fn make_noise_session( // Set epochs for both sides (required for handshake message encryption) let mut init_epoch = [0u8; 8]; - rand::RngCore::fill_bytes(&mut rand::thread_rng(), &mut init_epoch); + rand::Rng::fill_bytes(&mut rand::rng(), &mut init_epoch); initiator.set_local_epoch(init_epoch); let mut resp_epoch = [0u8; 8]; - rand::RngCore::fill_bytes(&mut rand::thread_rng(), &mut resp_epoch); + rand::Rng::fill_bytes(&mut rand::rng(), &mut resp_epoch); responder.set_local_epoch(resp_epoch); let msg1 = initiator.write_message_1().unwrap(); diff --git a/src/node/tests/spanning_tree.rs b/src/node/tests/spanning_tree.rs index 78df33a..3ab1e2d 100644 --- a/src/node/tests/spanning_tree.rs +++ b/src/node/tests/spanning_tree.rs @@ -316,7 +316,7 @@ pub(super) async fn drain_all_packets(nodes: &mut [TestNode], verbose: bool) -> /// then adds extra edges up to the target count. pub(super) fn generate_random_edges(n: usize, target_edges: usize, seed: u64) -> Vec<(usize, usize)> { use rand::rngs::StdRng; - use rand::{Rng, SeedableRng}; + use rand::{RngExt, SeedableRng}; let mut rng = StdRng::seed_from_u64(seed); let mut edges = Vec::new(); @@ -328,11 +328,11 @@ pub(super) fn generate_random_edges(n: usize, target_edges: usize, seed: u64) -> let mut connected_count = 1; while connected_count < n { - let from = rng.gen_range(0..n); + let from = rng.random_range(0..n); if !connected[from] { continue; } - let to = rng.gen_range(0..n); + let to = rng.random_range(0..n); if connected[to] || from == to { continue; } @@ -347,8 +347,8 @@ pub(super) fn generate_random_edges(n: usize, target_edges: usize, seed: u64) -> // Add random extra edges up to target let mut attempts = 0; while edges.len() < target_edges && attempts < target_edges * 10 { - let a = rng.gen_range(0..n); - let b = rng.gen_range(0..n); + let a = rng.random_range(0..n); + let b = rng.random_range(0..n); attempts += 1; if a == b || adj[a][b] { continue; diff --git a/src/node/tests/unit.rs b/src/node/tests/unit.rs index f44f833..9a551b0 100644 --- a/src/node/tests/unit.rs +++ b/src/node/tests/unit.rs @@ -498,7 +498,7 @@ fn test_promote_cleans_up_pending_outbound_to_same_peer() { let mut resp_conn = PeerConnection::inbound(LinkId::new(999), completing_time_ms); let peer_keypair = peer_b_full.keypair(); let mut resp_epoch = [0u8; 8]; - rand::RngCore::fill_bytes(&mut rand::thread_rng(), &mut resp_epoch); + rand::Rng::fill_bytes(&mut rand::rng(), &mut resp_epoch); let msg2 = resp_conn .receive_handshake_init(peer_keypair, resp_epoch, &msg1, completing_time_ms) .unwrap(); diff --git a/src/noise/handshake.rs b/src/noise/handshake.rs index 71b4975..b5a3398 100644 --- a/src/noise/handshake.rs +++ b/src/noise/handshake.rs @@ -5,7 +5,7 @@ use super::{ XK_HANDSHAKE_MSG1_SIZE, XK_HANDSHAKE_MSG2_SIZE, XK_HANDSHAKE_MSG3_SIZE, }; use hkdf::Hkdf; -use rand::RngCore; +use rand::Rng; use secp256k1::{ecdh::shared_secret_point, Keypair, PublicKey, Secp256k1, SecretKey}; use sha2::{Digest, Sha256}; use std::fmt; @@ -292,7 +292,7 @@ impl HandshakeState { /// Generate ephemeral keypair. fn generate_ephemeral(&mut self) { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut secret_bytes = [0u8; 32]; rng.fill_bytes(&mut secret_bytes); diff --git a/src/noise/tests.rs b/src/noise/tests.rs index a986d02..964a75c 100644 --- a/src/noise/tests.rs +++ b/src/noise/tests.rs @@ -1,17 +1,19 @@ use super::*; -use rand::RngCore; +use rand::Rng; use secp256k1::Parity; fn generate_keypair() -> secp256k1::Keypair { let secp = secp256k1::Secp256k1::new(); - let mut rng = rand::thread_rng(); - let (secret_key, _) = secp.generate_keypair(&mut rng); + let mut secret_bytes = [0u8; 32]; + rand::rng().fill_bytes(&mut secret_bytes); + let secret_key = secp256k1::SecretKey::from_slice(&secret_bytes) + .expect("32 random bytes is a valid secret key"); secp256k1::Keypair::from_secret_key(&secp, &secret_key) } fn generate_epoch() -> [u8; 8] { let mut epoch = [0u8; 8]; - rand::thread_rng().fill_bytes(&mut epoch); + rand::rng().fill_bytes(&mut epoch); epoch } diff --git a/src/peer/connection.rs b/src/peer/connection.rs index 6f546e4..4829309 100644 --- a/src/peer/connection.rs +++ b/src/peer/connection.rs @@ -583,7 +583,7 @@ impl fmt::Debug for PeerConnection { mod tests { use super::*; use crate::Identity; - use rand::RngCore; + use rand::Rng; fn make_peer_identity() -> PeerIdentity { let identity = Identity::generate(); @@ -597,7 +597,7 @@ mod tests { fn make_epoch() -> [u8; 8] { let mut epoch = [0u8; 8]; - rand::thread_rng().fill_bytes(&mut epoch); + rand::rng().fill_bytes(&mut epoch); epoch } diff --git a/src/protocol/discovery.rs b/src/protocol/discovery.rs index 6bb20b1..4f72e14 100644 --- a/src/protocol/discovery.rs +++ b/src/protocol/discovery.rs @@ -61,8 +61,8 @@ impl LookupRequest { ttl: u8, min_mtu: u16, ) -> Self { - use rand::Rng; - let request_id = rand::thread_rng().r#gen(); + use rand::RngExt; + let request_id = rand::rng().random(); Self::new(request_id, target, origin, origin_coords, ttl, min_mtu) } @@ -428,7 +428,11 @@ mod tests { // Create a dummy signature for testing let secp = Secp256k1::new(); - let keypair = secp256k1::Keypair::new(&secp, &mut rand::thread_rng()); + let mut secret_bytes = [0u8; 32]; + rand::Rng::fill_bytes(&mut rand::rng(), &mut secret_bytes); + let secret_key = secp256k1::SecretKey::from_slice(&secret_bytes) + .expect("32 random bytes is a valid secret key"); + let keypair = secp256k1::Keypair::from_secret_key(&secp, &secret_key); let proof_data = LookupResponse::proof_bytes(999, &target, &coords); use sha2::Digest; let digest: [u8; 32] = sha2::Sha256::digest(&proof_data).into(); @@ -457,7 +461,11 @@ mod tests { let coords = make_coords(&[42, 1, 0]); let secp = Secp256k1::new(); - let keypair = secp256k1::Keypair::new(&secp, &mut rand::thread_rng()); + let mut secret_bytes = [0u8; 32]; + rand::Rng::fill_bytes(&mut rand::rng(), &mut secret_bytes); + let secret_key = secp256k1::SecretKey::from_slice(&secret_bytes) + .expect("32 random bytes is a valid secret key"); + let keypair = secp256k1::Keypair::from_secret_key(&secp, &secret_key); let proof_data = LookupResponse::proof_bytes(999, &target, &coords); use sha2::Digest; let digest: [u8; 32] = sha2::Sha256::digest(&proof_data).into(); diff --git a/src/upper/tun.rs b/src/upper/tun.rs index e973601..50c9e6c 100644 --- a/src/upper/tun.rs +++ b/src/upper/tun.rs @@ -6,7 +6,7 @@ use crate::{FipsAddress, TunConfig}; use futures::TryStreamExt; -use rtnetlink::{new_connection, Handle}; +use rtnetlink::{new_connection, Handle, LinkUnspec, RouteMessageBuilder}; use std::fs::File; use std::io::{Read, Write}; use std::net::Ipv6Addr; @@ -443,22 +443,26 @@ async fn configure_interface(name: &str, addr: Ipv6Addr, mtu: u16) -> Result<(), // Set MTU handle .link() - .set(index) - .mtu(mtu as u32) + .change(LinkUnspec::new_with_index(index).mtu(mtu as u32).build()) .execute() .await?; // Bring interface up - handle.link().set(index).up().execute().await?; + handle + .link() + .change(LinkUnspec::new_with_index(index).up().build()) + .execute() + .await?; // Add route for fd00::/8 (FIPS address space) via this interface let fd_prefix: Ipv6Addr = "fd00::".parse().unwrap(); - handle - .route() - .add() - .v6() + let route = RouteMessageBuilder::::new() .destination_prefix(fd_prefix, 8) .output_interface(index) + .build(); + handle + .route() + .add(route) .execute() .await .map_err(|e| TunError::Configure(format!("failed to add fd00::/8 route: {}", e)))?; diff --git a/src/utils/index.rs b/src/utils/index.rs index 23bb4ba..94a9463 100644 --- a/src/utils/index.rs +++ b/src/utils/index.rs @@ -19,7 +19,7 @@ //! [0x00][receiver_idx:4 LE][counter:8 LE][ciphertext+tag] //! ``` -use rand::Rng; +use rand::RngExt; use std::collections::HashSet; use thiserror::Error; @@ -105,10 +105,10 @@ impl IndexAllocator { /// currently in use. Returns error if allocation fails after /// max_attempts tries (indicates too many active sessions). pub fn allocate(&mut self) -> Result { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); for _ in 0..self.max_attempts { - let candidate = rng.r#gen::(); + let candidate = rng.random::(); if !self.in_use.contains(&candidate) { self.in_use.insert(candidate); return Ok(SessionIndex(candidate));