diff --git a/Cargo.lock b/Cargo.lock index 3b01878b9..d08128a00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -106,7 +106,7 @@ dependencies = [ "amplify_derive", "amplify_num", "ascii", - "getrandom 0.2.16", + "getrandom 0.2.17", "getrandom 0.3.4", "wasm-bindgen", ] @@ -328,7 +328,7 @@ checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", "synstructure", ] @@ -340,7 +340,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -374,13 +374,12 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.36" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ec5f6c2f8bc326c994cb9e241cc257ddaba9afa8555a43cffbb5dd86efaa37" +checksum = "d10e4f991a553474232bc0a31799f6d24b034a84c0971d80d2e2f78b2e576e40" dependencies = [ "compression-codecs", "compression-core", - "futures-core", "futures-io", "pin-project-lite", ] @@ -542,7 +541,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -649,9 +648,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bcrypt" @@ -693,7 +692,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -713,7 +712,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -766,9 +765,9 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +checksum = "b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3" dependencies = [ "arrayref", "arrayvec", @@ -777,15 +776,16 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.2" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", + "cpufeatures", "rayon-core", ] @@ -797,7 +797,7 @@ checksum = "e0b121a9fe0df916e362fb3271088d071159cdf11db0e4182d02152850756eff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -931,7 +931,7 @@ checksum = "89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -1003,9 +1003,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.51" +version = "1.2.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" dependencies = [ "find-msvc-tools", "jobserver", @@ -1066,9 +1066,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", @@ -1144,9 +1144,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.53" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" dependencies = [ "clap_builder", "clap_derive", @@ -1154,9 +1154,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.53" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" dependencies = [ "anstream", "anstyle", @@ -1173,14 +1173,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] name = "clap_lex" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" [[package]] name = "cmake" @@ -1193,9 +1193,9 @@ dependencies = [ [[package]] name = "coarsetime" -version = "0.1.36" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91849686042de1b41cd81490edc83afbcb0abe5a9b6f2c4114f23ce8cca1bcf4" +checksum = "e58eb270476aa4fc7843849f8a35063e8743b4dbcdf6dd0f8ea0886980c204c2" dependencies = [ "libc", "wasix", @@ -1226,9 +1226,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.35" +version = "0.4.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f7ac3e5b97fdce45e8922fb05cae2c37f7bbd63d30dd94821dacfd8f3f2bf2" +checksum = "00828ba6fd27b45a448e57dbfe84f1029d4c9f26b368157e9a448a5f49a2ec2a" dependencies = [ "compression-core", "flate2", @@ -1280,9 +1280,9 @@ dependencies = [ [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] name = "convert_case" @@ -1523,7 +1523,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.5.53", + "clap 4.5.54", "criterion-plot 0.6.0", "itertools 0.13.0", "num-traits", @@ -1547,7 +1547,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.5.53", + "clap 4.5.54", "criterion-plot 0.8.1", "itertools 0.13.0", "num-traits", @@ -1781,7 +1781,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -1792,7 +1792,7 @@ dependencies = [ "async-trait", "blake3", "bs58", - "clap 4.5.53", + "clap 4.5.54", "criterion 0.8.1", "crypto_api_chachapoly", "darkfi-sdk", @@ -1814,6 +1814,7 @@ dependencies = [ "plotters", "prettytable-rs", "primitive-types", + "quinn", "rand 0.8.5", "randomx", "rcgen", @@ -1828,7 +1829,7 @@ dependencies = [ "thiserror 2.0.17", "tiny-keccak", "tinyjson", - "toml 0.9.10+spec-1.1.0", + "toml 0.9.11+spec-1.1.0", "tor-cell", "tor-error", "tor-hscrypto", @@ -1871,7 +1872,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -1880,7 +1881,7 @@ version = "0.5.1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -1954,7 +1955,7 @@ dependencies = [ "darkfi-sdk", "darkfi-serial", "darkfi_money_contract", - "getrandom 0.2.16", + "getrandom 0.2.17", "halo2_proofs", "rand 0.8.5", "smol", @@ -1970,7 +1971,7 @@ dependencies = [ "darkfi-contract-test-harness", "darkfi-sdk", "darkfi-serial", - "getrandom 0.2.16", + "getrandom 0.2.17", "rand 0.8.5", "smol", "thiserror 2.0.17", @@ -1989,7 +1990,7 @@ dependencies = [ "darkfi-contract-test-harness", "darkfi-sdk", "darkfi-serial", - "getrandom 0.2.16", + "getrandom 0.2.17", "halo2_proofs", "lazy_static", "rand 0.8.5", @@ -2023,7 +2024,7 @@ dependencies = [ "structopt", "structopt-toml", "tinyjson", - "toml 0.9.10+spec-1.1.0", + "toml 0.9.11+spec-1.1.0", "tracing", "tracing-appender", "tracing-subscriber", @@ -2058,7 +2059,7 @@ dependencies = [ "smol", "structopt", "structopt-toml", - "toml 0.9.10+spec-1.1.0", + "toml 0.9.11+spec-1.1.0", "tracing", "tracing-appender", "tracing-subscriber", @@ -2134,7 +2135,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -2167,7 +2168,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -2192,9 +2193,9 @@ checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" [[package]] name = "dchatd" @@ -2269,14 +2270,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "337f65eb93d9996551b9442423480eca4532586b337484446eb5138d0cd8fcf0" dependencies = [ "heck 0.5.0", - "indexmap 2.12.1", + "indexmap 2.13.0", "itertools 0.14.0", "proc-macro-crate", "proc-macro2", "quote", "sha3", "strum", - "syn 2.0.112", + "syn 2.0.114", "void", ] @@ -2344,7 +2345,7 @@ checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -2366,7 +2367,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.112", + "syn 2.0.114", "unicode-xid", ] @@ -2453,7 +2454,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -2500,7 +2501,7 @@ dependencies = [ "smol", "structopt", "structopt-toml", - "toml 0.9.10+spec-1.1.0", + "toml 0.9.11+spec-1.1.0", "tracing", "tracing-appender", "tracing-subscriber", @@ -2537,7 +2538,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -2690,7 +2691,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -2702,7 +2703,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -2723,7 +2724,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -2813,7 +2814,7 @@ dependencies = [ "tempdir", "thiserror 2.0.17", "tinyjson", - "toml 0.9.10+spec-1.1.0", + "toml 0.9.11+spec-1.1.0", "tracing", "tracing-appender", "tracing-subscriber", @@ -2891,9 +2892,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" [[package]] name = "fixed-capacity-vec" @@ -2915,9 +2916,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" dependencies = [ "crc32fast", "miniz_oxide", @@ -3005,7 +3006,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -3099,7 +3100,7 @@ dependencies = [ name = "fu" version = "0.5.0" dependencies = [ - "clap 4.5.53", + "clap 4.5.54", "darkfi", "fud", "smol", @@ -3221,7 +3222,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -3289,7 +3290,7 @@ dependencies = [ name = "genev" version = "0.5.0" dependencies = [ - "clap 4.5.53", + "clap 4.5.54", "darkfi", "darkfi-serial", "genevd", @@ -3325,9 +3326,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -3359,7 +3360,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -3379,7 +3380,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" dependencies = [ "fallible-iterator", - "indexmap 2.12.1", + "indexmap 2.13.0", "stable_deref_trait", ] @@ -3560,7 +3561,7 @@ dependencies = [ "dynasmrt", "fixed-capacity-vec", "hex", - "rand_core 0.9.3", + "rand_core 0.9.5", "thiserror 2.0.17", ] @@ -3836,7 +3837,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -3861,9 +3862,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", @@ -4017,9 +4018,9 @@ checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" [[package]] name = "js-sys" -version = "0.3.83" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -4096,9 +4097,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.178" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libloading" @@ -4180,7 +4181,7 @@ dependencies = [ "structopt", "structopt-toml", "tinyjson", - "toml 0.9.10+spec-1.1.0", + "toml 0.9.11+spec-1.1.0", "tracing", "tracing-appender", "tracing-subscriber", @@ -4227,6 +4228,12 @@ dependencies = [ "value-bag", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mach2" version = "0.4.3" @@ -4378,7 +4385,7 @@ checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -4542,7 +4549,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -4605,7 +4612,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -4699,7 +4706,7 @@ dependencies = [ "crc32fast", "flate2", "hashbrown 0.14.5", - "indexmap 2.12.1", + "indexmap 2.13.0", "memchr", "ruzstd", ] @@ -4778,7 +4785,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -4900,7 +4907,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -5052,7 +5059,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -5081,7 +5088,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -5270,7 +5277,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -5314,7 +5321,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93980406f12d9f8140ed5abe7155acb10bb1e69ea55c88960b9c2f117445ef96" dependencies = [ "equivalent", - "indexmap 2.12.1", + "indexmap 2.13.0", "serde", ] @@ -5370,14 +5377,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] name = "proc-macro2" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ "unicode-ident", ] @@ -5438,7 +5445,7 @@ checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -5509,7 +5516,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -5522,7 +5529,7 @@ dependencies = [ "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -5531,11 +5538,66 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quinn" +version = "0.12.0" +source = "git+https://github.com/parazyd/quinn?branch=no-tokio#b254813169d1421641b48f241b20545543131912" +dependencies = [ + "async-channel 2.5.0", + "async-io", + "bytes", + "cfg_aliases", + "event-listener 5.4.1", + "futures-io", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls", + "smol", + "socket2", + "thiserror 2.0.17", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.12.0" +source = "git+https://github.com/parazyd/quinn?branch=no-tokio#b254813169d1421641b48f241b20545543131912" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash 2.1.1", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.6.0" +source = "git+https://github.com/parazyd/quinn?branch=no-tokio#b254813169d1421641b48f241b20545543131912" +dependencies = [ + "cfg_aliases", + "libc", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + [[package]] name = "quote" -version = "1.0.42" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" dependencies = [ "proc-macro2", ] @@ -5592,7 +5654,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -5612,7 +5674,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -5636,14 +5698,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] @@ -5655,7 +5717,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b16df48f071248e67b8fc5e866d9448d45c08ad8b672baaaf796e2f15e606ff0" dependencies = [ "libc", - "rand_core 0.9.3", + "rand_core 0.9.5", "winapi", ] @@ -5665,7 +5727,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -5763,7 +5825,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 1.0.69", ] @@ -5774,7 +5836,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 2.0.17", ] @@ -5796,7 +5858,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -5895,7 +5957,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -5903,14 +5965,14 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.8.12" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a640b26f007713818e9a9b65d34da1cf58538207b052916a83d80e43f3ffa4" +checksum = "360b333c61ae24e5af3ae7c8660bd6b21ccd8200dbbc5d33c2454421e85b9c69" dependencies = [ "bytecheck 0.8.2", "bytes", - "hashbrown 0.15.5", - "indexmap 2.12.1", + "hashbrown 0.16.1", + "indexmap 2.13.0", "munge", "ptr_meta 0.3.1", "rancor", @@ -5922,13 +5984,13 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.8.12" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd83f5f173ff41e00337d97f6572e416d022ef8a19f371817259ae960324c482" +checksum = "7c02f8cdd12b307ab69fe0acf4cd2249c7460eb89dce64a0febadf934ebb6a9e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -5945,9 +6007,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ "const-oid", "digest", @@ -5981,9 +6043,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc-hash" @@ -6036,9 +6098,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" dependencies = [ "log", "once_cell", @@ -6064,6 +6126,7 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" dependencies = [ + "web-time", "zeroize", ] @@ -6192,7 +6255,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -6283,7 +6346,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -6298,9 +6361,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.148" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3084b546a1dd6289475996f182a22aba973866ea8e8b02c51d9f46b1336a22da" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", @@ -6337,7 +6400,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.12.1", + "indexmap 2.13.0", "schemars 0.9.0", "schemars 1.2.0", "serde_core", @@ -6355,7 +6418,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -6769,7 +6832,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -6840,9 +6903,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.112" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21f182278bf2d2bcb3c88b1b08a37df029d71ce3d3ae26168e3c653b213b99d4" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -6863,7 +6926,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -6945,7 +7008,7 @@ dependencies = [ "structopt-toml", "thiserror 2.0.17", "tinyjson", - "toml 0.9.10+spec-1.1.0", + "toml 0.9.11+spec-1.1.0", "tracing", "tracing-appender", "tracing-subscriber", @@ -7030,7 +7093,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -7041,7 +7104,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -7055,30 +7118,30 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" dependencies = [ "num-conv", "time-core", @@ -7158,11 +7221,11 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.10+spec-1.1.0" +version = "0.9.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" +checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.13.0", "serde_core", "serde_spanned 1.0.4", "toml_datetime 0.7.5+spec-1.1.0", @@ -7195,7 +7258,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.13.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -7209,7 +7272,7 @@ version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.13.0", "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "winnow", @@ -7459,7 +7522,7 @@ dependencies = [ "serde_ignored", "strum", "thiserror 2.0.17", - "toml 0.9.10+spec-1.1.0", + "toml 0.9.11+spec-1.1.0", "tor-basic-utils", "tor-error", "tor-rtcompat", @@ -7770,7 +7833,7 @@ dependencies = [ "oneshot-fused-workaround", "postage", "rand 0.9.2", - "rand_core 0.9.3", + "rand_core 0.9.5", "retry-error", "safelog", "serde", @@ -7912,7 +7975,7 @@ dependencies = [ "rand 0.9.2", "rand_chacha 0.9.0", "rand_core 0.6.4", - "rand_core 0.9.3", + "rand_core 0.9.5", "rand_jitter", "rdrand 0.8.3", "rsa", @@ -8115,7 +8178,7 @@ dependencies = [ "pin-project", "postage", "rand 0.9.2", - "rand_core 0.9.3", + "rand_core 0.9.5", "safelog", "slotmap-careful", "smallvec", @@ -8314,7 +8377,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -8374,7 +8437,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -8450,9 +8513,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-ident" @@ -8598,7 +8661,7 @@ checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -8634,27 +8697,27 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ "wit-bindgen", ] [[package]] name = "wasix" -version = "0.12.21" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fbb4ef9bbca0c1170e0b00dd28abc9e3b68669821600cad1caaed606583c6d" +checksum = "1757e0d1f8456693c7e5c6c629bdb54884e032aa0bb53c155f6a39f94440d332" dependencies = [ "wasi", ] [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -8665,11 +8728,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.56" +version = "0.4.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -8678,9 +8742,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8688,34 +8752,34 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-encoder" -version = "0.243.0" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55db9c896d70bd9fa535ce83cd4e1f2ec3726b0edd2142079f594fc3be1cb35" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" dependencies = [ "leb128fmt", - "wasmparser 0.243.0", + "wasmparser 0.244.0", ] [[package]] @@ -8729,7 +8793,7 @@ dependencies = [ "cfg-if", "cmake", "derive_more 2.1.1", - "indexmap 2.12.1", + "indexmap 2.13.0", "js-sys", "more-asserts", "paste", @@ -8854,9 +8918,9 @@ dependencies = [ "bytecheck 0.6.12", "enum-iterator", "enumset", - "getrandom 0.2.16", + "getrandom 0.2.17", "hex", - "indexmap 2.12.1", + "indexmap 2.13.0", "more-asserts", "rkyv", "sha2", @@ -8879,7 +8943,7 @@ dependencies = [ "dashmap", "enum-iterator", "fnv", - "indexmap 2.12.1", + "indexmap 2.13.0", "libc", "libunwind", "mach2", @@ -8910,16 +8974,27 @@ checksum = "f6d8db401b0528ec316dfbe579e6ab4152d61739cfe076706d2009127970159d" dependencies = [ "bitflags 2.10.0", "hashbrown 0.15.5", - "indexmap 2.12.1", + "indexmap 2.13.0", "semver", "serde", ] [[package]] -name = "wast" -version = "243.0.0" +name = "wasmparser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df21d01c2d91e46cb7a221d79e58a2d210ea02020d57c092e79255cc2999ca7f" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.10.0", + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "wast" +version = "244.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e7b9f9e23311275920e3d6b56d64137c160cf8af4f84a7283b36cfecbf4acb" dependencies = [ "bumpalo", "leb128fmt", @@ -8930,9 +9005,9 @@ dependencies = [ [[package]] name = "wat" -version = "1.243.0" +version = "1.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226a9a91cd80a50449312fef0c75c23478fcecfcc4092bdebe1dc8e760ef521b" +checksum = "bbf35b87ed352f9ab6cd0732abde5a67dd6153dfd02c493e61459218b19456fa" dependencies = [ "wast", ] @@ -8945,9 +9020,19 @@ checksum = "323f4da9523e9a669e1eaf9c6e763892769b1d38c623913647bfdc1532fe4549" [[package]] name = "web-sys" -version = "0.3.83" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -9077,7 +9162,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -9088,7 +9173,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -9418,9 +9503,9 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" [[package]] name = "writeable" @@ -9522,28 +9607,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.31" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.31" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -9563,7 +9648,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", "synstructure", ] @@ -9584,7 +9669,7 @@ checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -9618,7 +9703,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.112", + "syn 2.0.114", ] [[package]] @@ -9631,9 +9716,9 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.6" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac060176f7020d62c3bcc1cdbcec619d54f48b07ad1963a3f80ce7a0c17755f" +checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" [[package]] name = "zstd" diff --git a/Cargo.toml b/Cargo.toml index 0c42dcdc0..59467572b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,6 +67,7 @@ tor-hscrypto = {version = "0.37.0", optional = true} tor-hsservice = {version = "0.37.0", optional = true} tor-proto = {version = "0.37.0", optional = true} tor-cell = {version = "0.37.0", optional = true} +quinn = {git="https://github.com/parazyd/quinn", branch="no-tokio", default-features = false, features = ["rustls-ring", "runtime-smol"], optional = true} # TLS cert utilities ed25519-compact = {version = "2.2.0", optional = true} @@ -228,6 +229,7 @@ net-defaults = [ "p2p-i2p", "p2p-socks5", "p2p-unix", + "p2p-quic", ] p2p-unix = [] @@ -238,6 +240,10 @@ p2p-i2p = [ "p2p-socks5" ] +p2p-quic = [ + "quinn" +] + net = ["net-defaults"] rpc = [ diff --git a/src/net/transport/mod.rs b/src/net/transport/mod.rs index 629eda46a..d8912e14d 100644 --- a/src/net/transport/mod.rs +++ b/src/net/transport/mod.rs @@ -48,6 +48,10 @@ pub(crate) mod nym; #[cfg(feature = "p2p-unix")] pub(crate) mod unix; +/// QUIC transport +#[cfg(feature = "p2p-quic")] +pub(crate) mod quic; + /// Dialer variants #[derive(Debug, Clone)] pub enum DialerVariant { @@ -84,6 +88,9 @@ pub enum DialerVariant { /// SOCKS5 proxy with TLS #[cfg(feature = "p2p-socks5")] Socks5Tls(socks5::Socks5Dialer), + + /// QUIC (with built-in TLS) + Quic(quic::QuicDialer), } /// Listener variants @@ -99,9 +106,13 @@ pub enum ListenerVariant { /// Tor Tor(tor::TorListener), - /// Unix socket #[cfg(feature = "p2p-unix")] + /// Unix socket Unix(unix::UnixListener), + + #[cfg(feature = "p2p-quic")] + /// QUIC (with built-in TLS) + Quic(quic::QuicListener), } /// A dialer that is able to transparently operate over arbitrary transports. @@ -243,6 +254,15 @@ impl Dialer { Ok(Self { endpoint, variant }) } + #[cfg(feature = "p2p-quic")] + "quic" => { + // Build a QUIC dialer (TLS is built-in) + enforce_hostport!(endpoint); + let variant = quic::QuicDialer::new().await?; + let variant = DialerVariant::Quic(variant); + Ok(Self { endpoint, variant }) + } + x => { error!("[P2P] Requested unsupported transport: {x}"); Err(io::Error::from_raw_os_error(libc::ENETUNREACH)) @@ -323,6 +343,13 @@ impl Dialer { let stream = tlsupgrade.upgrade_dialer_tls(stream).await?; Ok(Box::new(stream)) } + + #[cfg(feature = "p2p-quic")] + DialerVariant::Quic(dialer) => { + let sockaddr = self.endpoint.socket_addrs(|| None)?; + let stream = dialer.do_dial(sockaddr[0], timeout).await?; + Ok(Box::new(stream)) + } } } @@ -378,6 +405,14 @@ impl Listener { Ok(Self { endpoint, variant }) } + #[cfg(feature = "p2p-quic")] + "quic" => { + enforce_hostport!(endpoint); + let variant = quic::QuicListener::new().await?; + let variant = ListenerVariant::Quic(variant); + Ok(Self { endpoint, variant }) + } + x => { error!("[P2P] Requested unsupported transport: {x}"); Err(io::Error::from_raw_os_error(libc::ENETUNREACH)) @@ -419,6 +454,13 @@ impl Listener { let l = listener.do_listen(&path).await?; Ok(Box::new(l)) } + + #[cfg(feature = "p2p-quic")] + ListenerVariant::Quic(listener) => { + let sockaddr = self.endpoint.socket_addrs(|| None)?; + let l = listener.do_listen(sockaddr[0]).await?; + Ok(Box::new(l)) + } } } @@ -443,8 +485,24 @@ impl Listener { endpoint } + #[cfg(feature = "p2p-tor")] ListenerVariant::Tor(listener) => listener.endpoint.get().unwrap().clone(), + + #[cfg(feature = "p2p-quic")] + ListenerVariant::Quic(listener) => { + let mut endpoint = self.endpoint.clone(); + let port = self.endpoint.port().unwrap(); + + if port == 0 { + if let Some(actual_port) = listener.port.get() { + endpoint.set_port(Some(*actual_port)).unwrap(); + } + } + + endpoint + } + #[allow(unreachable_patterns)] _ => self.endpoint.clone(), } @@ -467,6 +525,9 @@ impl PtStream for futures_rustls::TlsStream {} #[cfg(feature = "p2p-unix")] impl PtStream for smol::net::unix::UnixStream {} +#[cfg(feature = "p2p-quic")] +impl PtStream for quic::QuicStream {} + /// Wrapper trait for async listeners #[async_trait] pub trait PtListener: Send + Unpin { diff --git a/src/net/transport/quic.rs b/src/net/transport/quic.rs new file mode 100644 index 000000000..24f5268b9 --- /dev/null +++ b/src/net/transport/quic.rs @@ -0,0 +1,286 @@ +/* This file is part of DarkFi (https://dark.fi) + * + * Copyright (C) 2020-2026 Dyne.org foundation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +use std::{ + io, + net::SocketAddr, + pin::Pin, + sync::Arc, + task::{Context, Poll}, + time::Duration, +}; + +use async_trait::async_trait; +use futures::{ + future::{select, Either}, + pin_mut, +}; +use futures_rustls::rustls::{self, version::TLS13}; +use quinn::{ + crypto::rustls::{QuicClientConfig, QuicServerConfig}, + ClientConfig, Endpoint, RecvStream, SendStream, ServerConfig, TransportConfig, VarInt, +}; +use smol::{ + io::{AsyncRead, AsyncWrite}, + lock::OnceCell, + Timer, +}; +use tracing::debug; +use url::Url; + +use super::{ + tls::{ + generate_certificate, ClientCertificateVerifier, ServerCertificateVerifier, TLS_DNS_NAME, + }, + PtListener, PtStream, +}; + +/// Create QUIC client configuration with our TLS config +fn create_client_config() -> io::Result { + let (certificate, secret_key) = generate_certificate()?; + + let server_cert_verifier = Arc::new(ServerCertificateVerifier {}); + + let tls_config = rustls::ClientConfig::builder_with_protocol_versions(&[&TLS13]) + .dangerous() + .with_custom_certificate_verifier(server_cert_verifier) + .with_client_auth_cert(vec![certificate], secret_key) + .map_err(|e| io::Error::other(format!("Failed to create QUIC client TLS config: {e}")))?; + + let quic_config: QuicClientConfig = tls_config + .try_into() + .map_err(|e| io::Error::other(format!("Failed to create QUIC client config: {e}")))?; + + let mut config = ClientConfig::new(Arc::new(quic_config)); + + // Configure transport parameters + let mut transport = TransportConfig::default(); + transport.keep_alive_interval(Some(Duration::from_secs(15))); + transport.max_idle_timeout(Some(VarInt::from_u32(30_000).into())); + config.transport_config(Arc::new(transport)); + + Ok(config) +} + +/// Create QUIC server configuration with our TLS config +fn create_server_config() -> io::Result { + let (certificate, secret_key) = generate_certificate()?; + + let client_cert_verifier = Arc::new(ClientCertificateVerifier {}); + + let tls_config = rustls::ServerConfig::builder_with_protocol_versions(&[&TLS13]) + .with_client_cert_verifier(client_cert_verifier) + .with_single_cert(vec![certificate], secret_key) + .map_err(|e| io::Error::other(format!("Failed to create QUIC server TLS config: {e}")))?; + + let quic_config: QuicServerConfig = tls_config + .try_into() + .map_err(|e| io::Error::other(format!("Failed to create QUIC server config: {e}")))?; + + let mut config = ServerConfig::with_crypto(Arc::new(quic_config)); + + // Configure transport parameters + let mut transport = TransportConfig::default(); + transport.keep_alive_interval(Some(Duration::from_secs(15))); + transport.max_idle_timeout(Some(VarInt::from_u32(30_000).into())); + config.transport_config(Arc::new(transport)); + + Ok(config) +} + +/// Wrapper around quinn's bidirectional stream to implement PtStream +pub struct QuicStream { + send: SendStream, + recv: RecvStream, +} + +impl QuicStream { + fn new(send: SendStream, recv: RecvStream) -> Self { + Self { send, recv } + } +} + +impl AsyncRead for QuicStream { + fn poll_read( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &mut [u8], + ) -> Poll> { + Pin::new(&mut self.recv) + .poll_read(cx, buf) + .map_err(|e| io::Error::other(format!("QUIC read error: {e}"))) + } +} + +impl AsyncWrite for QuicStream { + fn poll_write( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &[u8], + ) -> Poll> { + Pin::new(&mut self.send) + .poll_write(cx, buf) + .map_err(|e| io::Error::other(format!("QUIC write error: {e}"))) + } + + fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.send) + .poll_flush(cx) + .map_err(|e| io::Error::other(format!("QUIC flush error: {e}"))) + } + + fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.send) + .poll_close(cx) + .map_err(|e| io::Error::other(format!("QUIC close error: {e}"))) + } +} + +/// QUIC Dialer implementation +#[derive(Clone, Debug)] +pub struct QuicDialer { + endpoint: Endpoint, +} + +impl QuicDialer { + /// Instantiate a new [`QuicDialer`] object + pub(crate) async fn new() -> io::Result { + let client_config = create_client_config()?; + + // Bind to any available port for outgoing connections + let endpoint = Endpoint::client("0.0.0.0:0".parse().unwrap()) + .map_err(|e| io::Error::other(format!("Failed to create QUIC endpoint: {e}")))?; + + endpoint.set_default_client_config(client_config); + + Ok(Self { endpoint }) + } + + /// Internal dial function + pub(crate) async fn do_dial( + &self, + socket_addr: SocketAddr, + timeout: Option, + ) -> io::Result { + debug!(target: "net::quic::do_dial", "Dialing {socket_addr} with QUIC..."); + + let connect = async { + // Connect to the remote endpoint + let connection = self + .endpoint + .connect(socket_addr, TLS_DNS_NAME) + .map_err(|e| io::Error::other(format!("QUIC connect error: {e}")))? + .await + .map_err(|e| io::Error::other(format!("QUIC connection error: {e}")))?; + + // Open a bidirectional stream + let (send, recv) = connection + .open_bi() + .await + .map_err(|e| io::Error::other(format!("QUIC stream error: {e}")))?; + + Ok(QuicStream::new(send, recv)) + }; + + match timeout { + Some(t) => { + let timer = Timer::after(t); + pin_mut!(timer); + pin_mut!(connect); + + match select(connect, timer).await { + Either::Left((Ok(stream), _)) => Ok(stream), + Either::Left((Err(e), _)) => Err(e), + Either::Right((_, _)) => Err(io::ErrorKind::TimedOut.into()), + } + } + None => connect.await, + } + } +} + +/// QUIC Listener implementation +#[derive(Debug, Clone)] +pub struct QuicListener { + /// When the user puts a port of 0, the OS will assign a random port. + /// We get it from the listener so we know what the true endpoint is. + pub port: Arc>, +} + +impl QuicListener { + /// Instantiate a new [`QuicListener`] + pub async fn new() -> io::Result { + Ok(Self { port: Arc::new(OnceCell::new()) }) + } + + /// Internal listen function + pub(crate) async fn do_listen( + &self, + socket_addr: SocketAddr, + ) -> io::Result { + let server_config = create_server_config()?; + + let endpoint = Endpoint::server(server_config, socket_addr) + .map_err(|e| io::Error::other(format!("Failed to create QUIC server endpoint: {e}")))?; + + let local_port = endpoint.local_addr()?.port(); + + debug!( + target: "net::quic::do_listen", + "Listening on QUIC endpoint: {}", + endpoint.local_addr()?, + ); + + self.port.set(local_port).await.expect("fatal port already set for QuicListener"); + + Ok(QuicListenerIntern { endpoint }) + } +} + +/// Internal QUIC Listener implementation, used with `PtListener` +pub struct QuicListenerIntern { + endpoint: Endpoint, +} + +#[async_trait] +impl PtListener for QuicListenerIntern { + async fn next(&self) -> io::Result<(Box, Url)> { + // Wait for an incoming connection + let incoming = + self.endpoint.accept().await.ok_or_else(|| { + io::Error::new(io::ErrorKind::ConnectionAborted, "Endpoint closed") + })?; + + let peer_addr = incoming.remote_address(); + + let connection = + incoming.await.map_err(|e| io::Error::other(format!("QUIC accept error: {e}")))?; + + // Accept a bidirectional stream from the client + let (send, recv) = connection + .accept_bi() + .await + .map_err(|e| io::Error::other(format!("QUIC stream accept error: {e}")))?; + + let url = Url::parse(&format!("quic://{peer_addr}")).map_err(|e| { + io::Error::new(io::ErrorKind::InvalidData, format!("Invalid peer address: {e}")) + })?; + + Ok((Box::new(QuicStream::new(send, recv)), url)) + } +} diff --git a/src/net/transport/tls.rs b/src/net/transport/tls.rs index 3d3165715..e386134fd 100644 --- a/src/net/transport/tls.rs +++ b/src/net/transport/tls.rs @@ -36,10 +36,13 @@ use x509_parser::{ prelude::{GeneralName, ParsedExtension, X509Certificate}, }; +/// The DNS name used for certificate validation across all transports +pub(crate) const TLS_DNS_NAME: &str = "dark.fi"; + /// Validate certificate DNSName. fn validate_dnsname(cert: &X509Certificate) -> std::result::Result<(), rustls::Error> { #[rustfmt::skip] - let oid = x509_parser::oid_registry::asn1_rs::oid!(2.5.29.17); + let oid = x509_parser::oid_registry::asn1_rs::oid!(2.5.29.17); let Ok(Some(extension)) = cert.get_extension_unique(&oid) else { return Err(rustls::CertificateError::BadEncoding.into()) }; @@ -59,15 +62,52 @@ fn validate_dnsname(cert: &X509Certificate) -> std::result::Result<(), rustls::E _ => return Err(rustls::CertificateError::BadEncoding.into()), }; - if dns_name != "dark.fi" { + if dns_name != TLS_DNS_NAME { return Err(rustls::CertificateError::BadEncoding.into()) } Ok(()) } +fn verify_ed25519_signature( + message: &[u8], + cert: &CertificateDer, + dss: &DigitallySignedStruct, +) -> std::result::Result { + if dss.scheme != SignatureScheme::ED25519 { + return Err(rustls::CertificateError::BadSignature.into()) + } + + // Read the DER-encoded certificate into a buffer + let buf: Vec = cert.iter().copied().collect(); + + // Parse the cert and extract the public key + let Ok((_, cert)) = parse_x509_certificate(&buf) else { + error!(target: "net::tls::verify_ed25519_signature", "[net::tls] Failed parsing TLS certificate"); + return Err(rustls::CertificateError::BadEncoding.into()) + }; + + let Ok(public_key) = ed25519_compact::PublicKey::from_der(cert.public_key().raw) else { + error!(target: "net::tls::verify_ed25519_signature", "[net::tls] Failed parsing public key"); + return Err(rustls::CertificateError::BadEncoding.into()) + }; + + let Ok(signature) = ed25519_compact::Signature::from_slice(dss.signature()) else { + error!(target: "net::tls::verify_ed25519_signature", "[net::tls] Failed verifying signature"); + return Err(rustls::CertificateError::BadSignature.into()) + }; + + if let Err(e) = public_key.verify(message, &signature) { + error!(target: "net::tls::verify_ed25519_signature", "[net::tls] Failed verifying signature: {e}"); + return Err(rustls::CertificateError::BadSignature.into()) + } + + Ok(HandshakeSignatureValid::assertion()) +} + #[derive(Debug)] -struct ServerCertificateVerifier; +pub(crate) struct ServerCertificateVerifier; + impl ServerCertVerifier for ServerCertificateVerifier { fn verify_server_cert( &self, @@ -78,10 +118,7 @@ impl ServerCertVerifier for ServerCertificateVerifier { _now: UnixTime, ) -> std::result::Result { // Read the DER-encoded certificate into a buffer - let mut buf = Vec::with_capacity(end_entity.len()); - for byte in end_entity.iter() { - buf.push(*byte); - } + let buf: Vec = end_entity.iter().copied().collect(); // Parse the certificate let Ok((_, cert)) = parse_x509_certificate(&buf) else { @@ -110,40 +147,7 @@ impl ServerCertVerifier for ServerCertificateVerifier { cert: &CertificateDer, dss: &DigitallySignedStruct, ) -> std::result::Result { - // Verify we're using the correct signature scheme - if dss.scheme != SignatureScheme::ED25519 { - return Err(rustls::CertificateError::BadSignature.into()) - } - - // Read the DER-encoded certificate into a buffer - let mut buf = Vec::with_capacity(cert.len()); - for byte in cert.iter() { - buf.push(*byte); - } - - // Parse the certificate and extract the public key - let Ok((_, cert)) = parse_x509_certificate(&buf) else { - error!(target: "net::tls::verify_tls13_signature", "[net::tls] Failed parsing server TLS certificate"); - return Err(rustls::CertificateError::BadEncoding.into()) - }; - - let Ok(public_key) = ed25519_compact::PublicKey::from_der(cert.public_key().raw) else { - error!(target: "net::tls::verify_tls13_signature", "[net::tls] Failed parsing server public key"); - return Err(rustls::CertificateError::BadEncoding.into()) - }; - - // Verify the signature - let Ok(signature) = ed25519_compact::Signature::from_slice(dss.signature()) else { - error!(target: "net::tls::verify_tls13_signature", "[net::tls] Failed verifying server signature"); - return Err(rustls::CertificateError::BadSignature.into()) - }; - - if let Err(e) = public_key.verify(message, &signature) { - error!(target: "net::tls::verify_tls13_signature", "[net::tls] Failed verifying server signature: {e}"); - return Err(rustls::CertificateError::BadSignature.into()) - } - - Ok(HandshakeSignatureValid::assertion()) + verify_ed25519_signature(message, cert, dss) } fn supported_verify_schemes(&self) -> Vec { @@ -152,7 +156,8 @@ impl ServerCertVerifier for ServerCertificateVerifier { } #[derive(Debug)] -struct ClientCertificateVerifier; +pub(crate) struct ClientCertificateVerifier; + impl ClientCertVerifier for ClientCertificateVerifier { fn offer_client_auth(&self) -> bool { true @@ -173,13 +178,10 @@ impl ClientCertVerifier for ClientCertificateVerifier { _now: UnixTime, ) -> std::result::Result { // Read the DER-encoded certificate into a buffer - let mut cert = Vec::with_capacity(end_entity.len()); - for byte in end_entity.iter() { - cert.push(*byte); - } + let buf: Vec = end_entity.iter().copied().collect(); // Parse the certificate - let Ok((_, cert)) = parse_x509_certificate(&cert) else { + let Ok((_, cert)) = parse_x509_certificate(&buf) else { error!(target: "net::tls::verify_server_cert", "[net::tls] Failed parsing server TLS certificate"); return Err(rustls::CertificateError::BadEncoding.into()) }; @@ -205,40 +207,7 @@ impl ClientCertVerifier for ClientCertificateVerifier { cert: &CertificateDer, dss: &DigitallySignedStruct, ) -> std::result::Result { - // Verify we're using the correct signature scheme - if dss.scheme != SignatureScheme::ED25519 { - return Err(rustls::CertificateError::BadSignature.into()) - } - - // Read the DER-encoded certificate into a buffer - let mut buf = Vec::with_capacity(cert.len()); - for byte in cert.iter() { - buf.push(*byte); - } - - // Parse the certificate and extract the public key - let Ok((_, cert)) = parse_x509_certificate(&buf) else { - error!(target: "net::tls::verify_tls13_signature", "[net::tls] Failed parsing server TLS certificate"); - return Err(rustls::CertificateError::BadEncoding.into()) - }; - - let Ok(public_key) = ed25519_compact::PublicKey::from_der(cert.public_key().raw) else { - error!(target: "net::tls::verify_tls13_signature", "[net::tls] Failed parsing server public key"); - return Err(rustls::CertificateError::BadEncoding.into()) - }; - - // Verify the signature - let Ok(signature) = ed25519_compact::Signature::from_slice(dss.signature()) else { - error!(target: "net::tls::verify_tls13_signature", "[net::tls] Failed verifying server signature"); - return Err(rustls::CertificateError::BadSignature.into()) - }; - - if let Err(e) = public_key.verify(message, &signature) { - error!(target: "net::tls::verify_tls13_signature", "[net::tls] Failed verifying server signature: {e}"); - return Err(rustls::CertificateError::BadSignature.into()) - } - - Ok(HandshakeSignatureValid::assertion()) + verify_ed25519_signature(message, cert, dss) } fn supported_verify_schemes(&self) -> Vec { @@ -246,6 +215,39 @@ impl ClientCertVerifier for ClientCertificateVerifier { } } +/// Generate a self-signed Ed25519 certificate for TLS. +/// Returns the certificate and private key in DER format. +pub(crate) fn generate_certificate() -> io::Result<(CertificateDer<'static>, PrivateKeyDer<'static>)> +{ + let Ok(keypair) = rcgen::KeyPair::generate_for(&rcgen::PKCS_ED25519) else { + return Err(io::Error::other("Failed to generate TLS keypair")) + }; + + let Ok(mut cert_params) = rcgen::CertificateParams::new(&[]) else { + return Err(io::Error::other("Failed to generate TLS params")) + }; + + cert_params.subject_alt_names = + vec![rcgen::SanType::DnsName(Ia5String::try_from(TLS_DNS_NAME).unwrap())]; + cert_params.extended_key_usages = vec![ + rcgen::ExtendedKeyUsagePurpose::ClientAuth, + rcgen::ExtendedKeyUsagePurpose::ServerAuth, + ]; + + let Ok(certificate) = cert_params.self_signed(&keypair) else { + return Err(io::Error::other("Failed to sign TLS certificate")) + }; + + let certificate = certificate.der().clone(); + let keypair_der = keypair.serialize_der(); + + let Ok(secret_key_der) = PrivateKeyDer::try_from(keypair_der) else { + return Err(io::Error::other("Failed to deserialize DER TLS secret")) + }; + + Ok((certificate, secret_key_der)) +} + pub struct TlsUpgrade { /// TLS server configuration server_config: Arc, @@ -256,30 +258,7 @@ pub struct TlsUpgrade { impl TlsUpgrade { pub async fn new() -> io::Result { // On each instantiation, generate a new keypair and certificate - let Ok(keypair) = rcgen::KeyPair::generate_for(&rcgen::PKCS_ED25519) else { - return Err(io::Error::other("Failed to generate TLS keypair")) - }; - - let Ok(mut cert_params) = rcgen::CertificateParams::new(&[]) else { - return Err(io::Error::other("Failed to generate TLS params")) - }; - - cert_params.subject_alt_names = - vec![rcgen::SanType::DnsName(Ia5String::try_from("dark.fi").unwrap())]; - cert_params.extended_key_usages = vec![ - rcgen::ExtendedKeyUsagePurpose::ClientAuth, - rcgen::ExtendedKeyUsagePurpose::ServerAuth, - ]; - - let Ok(certificate) = cert_params.self_signed(&keypair) else { - return Err(io::Error::other("Failed to sign TLS certificate")) - }; - let certificate = certificate.der(); - - let keypair_der = keypair.serialize_der(); - let Ok(secret_key_der) = PrivateKeyDer::try_from(keypair_der) else { - return Err(io::Error::other("Failed to deserialize DER TLS secret")) - }; + let (certificate, secret_key_der) = generate_certificate()?; // Server-side config let client_cert_verifier = Arc::new(ClientCertificateVerifier {}); @@ -307,7 +286,7 @@ impl TlsUpgrade { where IO: super::PtStream, { - let server_name = ServerName::try_from("dark.fi").unwrap(); + let server_name = ServerName::try_from(TLS_DNS_NAME).unwrap(); let connector = TlsConnector::from(self.client_config); let stream = connector.connect(server_name, stream).await?; Ok(TlsStream::Client(stream)) diff --git a/tests/network_transports.rs b/tests/network_transports.rs index 2a0e84217..5d8fa06e3 100644 --- a/tests/network_transports.rs +++ b/tests/network_transports.rs @@ -88,6 +88,38 @@ fn tcp_tls_transport() { })); } +#[test] +fn quic_transport() { + let executor = LocalExecutor::new(); + + smol::block_on(executor.run(async { + let listener = std::net::UdpSocket::bind("127.0.0.1:0").unwrap(); + let port = listener.local_addr().unwrap().port(); + drop(listener); + let url = Url::parse(&format!("quic://127.0.0.1:{port}")).unwrap(); + + let listener = Listener::new(url.clone(), None).await.unwrap().listen().await.unwrap(); + + executor + .spawn(async move { + let (stream, _) = listener.next().await.unwrap(); + let (mut reader, mut writer) = smol::io::split(stream); + io::copy(&mut reader, &mut writer).await.unwrap(); + }) + .detach(); + + let payload = "ohai quic"; + + let dialer = Dialer::new(url, None, None).await.unwrap(); + let mut client = dialer.dial(None).await.unwrap(); + payload.encode_async(&mut client).await.unwrap(); + + let buf: String = AsyncDecodable::decode_async(&mut client).await.unwrap(); + + assert_eq!(buf, payload); + })); +} + #[test] fn unix_transport() { let executor = LocalExecutor::new();