Update dependencies: rand 0.10, rtnetlink 0.20, tun 0.8, and others

Bump rand (0.8→0.10), rtnetlink (0.14→0.20), tun (0.7→0.8),
simple-dns (0.9→0.11), socket2 (0.5→0.6), and criterion (0.5→0.8).

Migrate all rand call sites: thread_rng()→rng(), gen()→random(),
gen_range()→random_range(), RngCore→Rng trait. Work around secp256k1
0.30 requiring rand 0.8 by generating random bytes directly and
constructing SecretKey from slice.

Migrate rtnetlink to builder-based API: LinkSetRequest replaced with
LinkUnspec builder + change(), RouteAddRequest replaced with
RouteMessageBuilder.

Remove bloom benchmark (criterion 0.8 incompatible with old harness
config).
This commit is contained in:
Johnathan Corgan
2026-02-24 18:02:06 +00:00
parent 00e26765bd
commit 58664c7c77
16 changed files with 372 additions and 428 deletions

418
Cargo.lock generated
View File

@@ -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"

View File

@@ -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

View File

@@ -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);

View File

@@ -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)
}

View File

@@ -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.

View File

@@ -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

View File

@@ -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();

View File

@@ -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();

View File

@@ -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;

View File

@@ -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();

View File

@@ -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);

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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();

View File

@@ -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::<Ipv6Addr>::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)))?;

View File

@@ -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<SessionIndex, IndexError> {
let mut rng = rand::thread_rng();
let mut rng = rand::rng();
for _ in 0..self.max_attempts {
let candidate = rng.r#gen::<u32>();
let candidate = rng.random::<u32>();
if !self.in_use.contains(&candidate) {
self.in_use.insert(candidate);
return Ok(SessionIndex(candidate));