diff --git a/Cargo.lock b/Cargo.lock index 6bf76738d..730dfac0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -99,12 +99,56 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + [[package]] name = "anstyle" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + [[package]] name = "anyhow" version = "1.0.104" @@ -639,6 +683,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" dependencies = [ "clap_builder", + "clap_derive", ] [[package]] @@ -647,8 +692,22 @@ version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" dependencies = [ + "anstream", "anstyle", "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.3", ] [[package]] @@ -681,6 +740,12 @@ dependencies = [ "thiserror 2.0.20", ] +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + [[package]] name = "colored" version = "3.1.1" @@ -1775,6 +1840,18 @@ dependencies = [ "wasi", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + [[package]] name = "getrandom" version = "0.4.3" @@ -1783,7 +1860,7 @@ checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", "rand_core 0.10.1", ] @@ -2277,6 +2354,12 @@ version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + [[package]] name = "itertools" version = "0.13.0" @@ -2770,6 +2853,12 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + [[package]] name = "oorandom" version = "11.1.5" @@ -3118,6 +3207,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + [[package]] name = "pretty_assertions" version = "1.4.1" @@ -3316,7 +3414,7 @@ dependencies = [ "pumpkin-protocol", "pumpkin-util", "pumpkin-world", - "rand", + "rand 0.10.2", "rayon", "rsa", "rustc-hash", @@ -3338,8 +3436,8 @@ dependencies = [ "tracing-subscriber", "ureq", "uuid", - "wasm-encoder 0.255.0", - "wasmparser 0.255.0", + "wasm-encoder 0.256.0", + "wasmparser 0.256.0", "wasmtime", "wasmtime-wasi", "wasmtime-wasi-http", @@ -3405,10 +3503,23 @@ dependencies = [ "phf", "pumpkin-nbt", "pumpkin-util", - "rand", + "rand 0.10.2", "serde", ] +[[package]] +name = "pumpkin-fuzzer" +version = "0.1.0-dev+26.2-26.40" +dependencies = [ + "bytes", + "clap", + "colored", + "pumpkin-protocol", + "pumpkin-util", + "rand 0.9.5", + "tokio", +] + [[package]] name = "pumpkin-inventory" version = "0.1.0-dev+26.2-26.40" @@ -3417,7 +3528,7 @@ dependencies = [ "pumpkin-protocol", "pumpkin-util", "pumpkin-world", - "rand", + "rand 0.10.2", "thiserror 2.0.20", "tokio", "tracing", @@ -3458,7 +3569,7 @@ dependencies = [ "serde_json", "tracing", "tracing-serde-structured", - "wit-bindgen", + "wit-bindgen 0.60.0", ] [[package]] @@ -3532,7 +3643,7 @@ dependencies = [ "pumpkin-data", "pumpkin-nbt", "pumpkin-util", - "rand", + "rand 0.10.2", "rayon", "rustc-hash", "ruzstd", @@ -3578,6 +3689,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "r-efi" version = "6.0.0" @@ -3593,6 +3710,16 @@ dependencies = [ "ptr_meta", ] +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha", + "rand_core 0.9.5", +] + [[package]] name = "rand" version = "0.10.2" @@ -3604,6 +3731,16 @@ dependencies = [ "rand_core 0.10.1", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + [[package]] name = "rand_core" version = "0.6.4" @@ -3613,6 +3750,15 @@ dependencies = [ "getrandom 0.2.17", ] +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + [[package]] name = "rand_core" version = "0.10.1" @@ -3817,7 +3963,7 @@ dependencies = [ "bytes", "hex", "log", - "rand", + "rand 0.10.2", "rcgen", "ring", "rtc-datachannel", @@ -3874,7 +4020,7 @@ dependencies = [ "log", "p256", "p384 0.13.1", - "rand", + "rand 0.10.2", "rand_core 0.6.4", "rcgen", "ring", @@ -3898,7 +4044,7 @@ dependencies = [ "bytes", "crc", "log", - "rand", + "rand 0.10.2", "rtc-mdns", "rtc-shared", "rtc-stun", @@ -3915,7 +4061,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f66ea5650a91773d10e4d98729f6fe256681ec1314c7ded5839fa34867305f79" dependencies = [ "log", - "rand", + "rand 0.10.2", "rtc-interceptor-derive", "rtc-rtcp", "rtc-rtp", @@ -3955,7 +4101,7 @@ checksum = "4fbc2f460a321eccdc0907819f8fc7027036edcbd94620c3328c1aefb070dfe5" dependencies = [ "byteorder", "bytes", - "rand", + "rand 0.10.2", "rtc-rtp", "rtc-shared", "thiserror 2.0.20", @@ -3979,7 +4125,7 @@ checksum = "aac1a05add837d45d562f48bc769c9b264440741aab319fed48ce6a696e6aa0c" dependencies = [ "bytes", "memchr", - "rand", + "rand 0.10.2", "rtc-shared", "serde", ] @@ -3993,7 +4139,7 @@ dependencies = [ "bytes", "crc32c", "log", - "rand", + "rand 0.10.2", "rtc-shared", "rustc-hash", "slab", @@ -4006,7 +4152,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0379bb552d4813e042d376db99f2005038017fc7864676fc835334b810db015" dependencies = [ - "rand", + "rand 0.10.2", "rtc-shared", "url", ] @@ -4023,7 +4169,7 @@ dependencies = [ "bytes", "nix", "p256", - "rand", + "rand 0.10.2", "rcgen", "sec1 0.7.3", "serde", @@ -4063,7 +4209,7 @@ dependencies = [ "crc", "lazy_static", "md-5", - "rand", + "rand 0.10.2", "ring", "rtc-shared", "sansio", @@ -4545,6 +4691,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "substring" version = "1.4.5" @@ -4765,6 +4917,7 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", @@ -5193,6 +5346,15 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen 0.57.1", +] + [[package]] name = "wasm-bindgen" version = "0.2.127" @@ -5260,12 +5422,12 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.255.0" +version = "0.256.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b524283fb5df62eec102ed0574838961bdd7ba5ac9c50d38e2756c51c971a42" +checksum = "ec1492381bfd5ea51c2a99a919b676662559925cb8d7490547ec2e14c1ad3eb1" dependencies = [ "leb128fmt", - "wasmparser 0.255.0", + "wasmparser 0.256.0", ] [[package]] @@ -5310,6 +5472,17 @@ name = "wasmparser" version = "0.255.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8e329ef4b5d46e73b91d3ac6924417cad55a8cbbf869c199283383427c3320b" +dependencies = [ + "bitflags 2.13.1", + "indexmap", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.256.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60bd825ffedc6cba8a642924ba7ae424afbc47811cffbcb7b92031ec24e59b4c" dependencies = [ "bitflags 2.13.1", "hashbrown 0.17.1", @@ -5570,7 +5743,7 @@ dependencies = [ "cfg-if", "futures", "io-lifetimes 3.0.1", - "rand", + "rand 0.10.2", "rustix", "thiserror 2.0.20", "tokio", @@ -5972,6 +6145,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen" version = "0.60.0" diff --git a/Cargo.toml b/Cargo.toml index ee2e96697..ead507f5b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ members = [ "crates/pumpkin-util", "crates/pumpkin-world", "tools/pumpkin-codegen", + "tools/pumpkin-fuzzer", ] # [workspace.lints.rust] diff --git a/crates/pumpkin-inventory/src/screen_handler.rs b/crates/pumpkin-inventory/src/screen_handler.rs index 3be6ed9ad..8b32fc231 100644 --- a/crates/pumpkin-inventory/src/screen_handler.rs +++ b/crates/pumpkin-inventory/src/screen_handler.rs @@ -940,15 +940,20 @@ pub trait ScreenHandler: Send + Sync { let mut cursor_stack = behaviour.cursor_stack.lock().await; let initial_count = cursor_stack.item_count; + let slots_count = behaviour.drag_slots.len(); for slot_index in &behaviour.drag_slots { - let slot = behaviour.slots[*slot_index as usize].clone(); + let Some(slot) = behaviour.slots.get(*slot_index as usize).cloned() else { + continue; + }; let stack = slot.get_stack().await; if (stack.are_items_and_components_equal(&cursor_stack) || stack.is_empty()) && slot.can_insert(&cursor_stack).await { let mut inserting_count = match drag_button { - 0 => initial_count / behaviour.drag_slots.len() as u8, + 0 => (initial_count as usize) + .checked_div(slots_count) + .map_or(0, |c| c as u8), 1 => 1, 2 => { cursor_stack.item_count = cursor_stack.get_max_stack_size(); diff --git a/crates/pumpkin-nbt/fuzz/Cargo.lock b/crates/pumpkin-nbt/fuzz/Cargo.lock index ef9fa3b91..b81aca2bd 100644 --- a/crates/pumpkin-nbt/fuzz/Cargo.lock +++ b/crates/pumpkin-nbt/fuzz/Cargo.lock @@ -17,6 +17,21 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + [[package]] name = "bytes" version = "1.12.0" @@ -56,6 +71,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "derive_arbitrary" version = "1.4.2" @@ -68,10 +93,14 @@ dependencies = [ ] [[package]] -name = "either" -version = "1.16.0" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] [[package]] name = "find-msvc-tools" @@ -89,6 +118,40 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.3.4" @@ -97,10 +160,21 @@ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", ] +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + [[package]] name = "itoa" version = "1.0.18" @@ -113,10 +187,21 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom", + "getrandom 0.3.4", "libc", ] +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.186" @@ -133,6 +218,16 @@ dependencies = [ "cc", ] +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.8.0" @@ -172,24 +267,23 @@ dependencies = [ [[package]] name = "pumpkin-codecs" -version = "0.1.0-dev+26.1" +version = "0.1.0-dev+26.2-26.40" dependencies = [ - "either", "serde_json", "tracing", ] [[package]] name = "pumpkin-nbt" -version = "0.1.0-dev+26.1" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "bytes", "cesu8", "flate2", "pumpkin-codecs", - "serde", "thiserror", "tracing", + "uuid", ] [[package]] @@ -199,7 +293,6 @@ dependencies = [ "arbitrary", "libfuzzer-sys", "pumpkin-nbt", - "serde", ] [[package]] @@ -217,6 +310,18 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + [[package]] name = "serde" version = "1.0.228" @@ -224,7 +329,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", - "serde_derive", ] [[package]] @@ -272,6 +376,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + [[package]] name = "syn" version = "2.0.117" @@ -334,12 +444,37 @@ dependencies = [ "once_cell", ] +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "uuid" +version = "1.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cefc03fd367c0c6d4305de1b312cf00248c4114f4a0418ce6a6af769e3b0bd9" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "md-5", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "wasip2" version = "1.0.3+wasi-0.2.9" @@ -349,6 +484,51 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +dependencies = [ + "unicode-ident", +] + [[package]] name = "wit-bindgen" version = "0.57.1" diff --git a/crates/pumpkin-nbt/src/compound.rs b/crates/pumpkin-nbt/src/compound.rs index 6bc3a6572..f1f3a77b7 100644 --- a/crates/pumpkin-nbt/src/compound.rs +++ b/crates/pumpkin-nbt/src/compound.rs @@ -51,6 +51,18 @@ impl NbtCompound { /// Advances a reader past a compound's payload without allocating its tags. pub fn skip_content<'a, R: NbtReadHelper<'a>>(reader: &mut R) -> Result<(), Error> { + Self::skip_content_depth(reader, 0) + } + + /// Advances a reader past a compound's payload with depth tracking. + pub fn skip_content_depth<'a, R: NbtReadHelper<'a>>( + reader: &mut R, + depth: usize, + ) -> Result<(), Error> { + if depth > crate::MAX_NBT_DEPTH { + return Err(Error::MaxDepthExceeded); + } + loop { let tag_id = match reader.get_u8() { Ok(id) => id, @@ -65,7 +77,7 @@ impl NbtCompound { reader.skip_string()?; // Skip Value - NbtTag::skip_data(reader, tag_id)?; + NbtTag::skip_data_depth(reader, tag_id, depth + 1)?; } Ok(()) @@ -73,6 +85,18 @@ impl NbtCompound { /// Deserializes a compound payload, starting after the compound's name. pub fn deserialize_content<'a, R: NbtReadHelper<'a>>(reader: &mut R) -> Result { + Self::deserialize_content_depth(reader, 0) + } + + /// Deserializes a compound payload with depth tracking. + pub fn deserialize_content_depth<'a, R: NbtReadHelper<'a>>( + reader: &mut R, + depth: usize, + ) -> Result { + if depth > crate::MAX_NBT_DEPTH { + return Err(Error::MaxDepthExceeded); + } + let mut compound = Self::new(); loop { @@ -87,7 +111,7 @@ impl NbtCompound { } let name = reader.get_string()?; - let tag = NbtTag::deserialize_data(reader, tag_id)?; + let tag = NbtTag::deserialize_data_depth(reader, tag_id, depth + 1)?; compound.child_tags.insert(name.into(), tag); } diff --git a/crates/pumpkin-nbt/src/lib.rs b/crates/pumpkin-nbt/src/lib.rs index 4c4c5f76d..8122ea265 100644 --- a/crates/pumpkin-nbt/src/lib.rs +++ b/crates/pumpkin-nbt/src/lib.rs @@ -63,7 +63,9 @@ pub const INT_ARRAY_ID: u8 = 0x0B; pub const LONG_ARRAY_ID: u8 = 0x0C; /// Maximum number of elements accepted when decoding a list or array. -pub const MAX_ARRAY_LENGTH: usize = 2_000_000; +pub const MAX_ARRAY_LENGTH: usize = 512_000; +/// Maximum nesting depth allowed when decoding NBT compound or list tags. +pub const MAX_NBT_DEPTH: usize = 512; /// Errors produced while reading, writing, or converting NBT data. #[derive(Error, Debug)] @@ -101,6 +103,12 @@ pub enum Error { /// A Bedrock variable-length long exceeded its maximum encoded size. #[error("Failed to decode varlong - value too large")] VarLongTooLarge, + /// NBT nesting depth exceeded the maximum allowed limit. + #[error("NBT depth exceeded maximum allowed limit")] + MaxDepthExceeded, + /// A list tag specified an invalid element tag type. + #[error("Invalid element tag type for list: {0}")] + InvalidListTag(u8), } /// A complete NBT document containing a named root compound. diff --git a/crates/pumpkin-nbt/src/tag.rs b/crates/pumpkin-nbt/src/tag.rs index 3de53c66b..d9de84265 100644 --- a/crates/pumpkin-nbt/src/tag.rs +++ b/crates/pumpkin-nbt/src/tag.rs @@ -6,8 +6,7 @@ use serializer::NbtWriteHelper; use crate::{ BYTE_ARRAY_ID, BYTE_ID, COMPOUND_ID, DOUBLE_ID, END_ID, Error, FLOAT_ID, INT_ARRAY_ID, INT_ID, - LIST_ID, LONG_ARRAY_ID, LONG_ID, MAX_ARRAY_LENGTH, SHORT_ID, STRING_ID, compound, deserializer, - serializer, + LIST_ID, LONG_ARRAY_ID, LONG_ID, SHORT_ID, STRING_ID, compound, deserializer, serializer, }; /// A value represented by one of the tag types defined by the NBT format. @@ -203,6 +202,19 @@ impl NbtTag { /// Advances a reader past the payload belonging to `tag_id`. pub fn skip_data<'a, R: NbtReadHelper<'a>>(reader: &mut R, tag_id: u8) -> Result<(), Error> { + Self::skip_data_depth(reader, tag_id, 0) + } + + /// Advances a reader past the payload belonging to `tag_id` with depth tracking. + pub fn skip_data_depth<'a, R: NbtReadHelper<'a>>( + reader: &mut R, + tag_id: u8, + depth: usize, + ) -> Result<(), Error> { + if depth > crate::MAX_NBT_DEPTH { + return Err(Error::MaxDepthExceeded); + } + match tag_id { END_ID => Ok(()), BYTE_ID => reader.skip_i8(), @@ -216,7 +228,11 @@ impl NbtTag { if len < 0 { return Err(Error::NegativeLength(len)); } - reader.skip_bytes(i64::from(len)) + let len = len as usize; + if len > crate::MAX_ARRAY_LENGTH { + return Err(Error::LargeLength(len)); + } + reader.skip_bytes(len as i64) } STRING_ID => reader.skip_string(), LIST_ID => { @@ -225,20 +241,33 @@ impl NbtTag { if len < 0 { return Err(Error::NegativeLength(len)); } + if tag_type_id == END_ID && len > 0 { + return Err(Error::InvalidListTag(tag_type_id)); + } + + let len = len as usize; + if len > crate::MAX_ARRAY_LENGTH { + return Err(Error::LargeLength(len)); + } for _ in 0..len { - Self::skip_data(reader, tag_type_id)?; + Self::skip_data_depth(reader, tag_type_id, depth + 1)?; } Ok(()) } - COMPOUND_ID => NbtCompound::skip_content(reader), + COMPOUND_ID => NbtCompound::skip_content_depth(reader, depth + 1), INT_ARRAY_ID => { let len = reader.get_i32()?; if len < 0 { return Err(Error::NegativeLength(len)); } + let len = len as usize; + if len > crate::MAX_ARRAY_LENGTH { + return Err(Error::LargeLength(len)); + } + for _ in 0..len { reader.skip_i32()?; } @@ -251,6 +280,11 @@ impl NbtTag { return Err(Error::NegativeLength(len)); } + let len = len as usize; + if len > crate::MAX_ARRAY_LENGTH { + return Err(Error::LargeLength(len)); + } + for _ in 0..len { reader.skip_i64()?; } @@ -266,6 +300,20 @@ impl NbtTag { reader: &mut R, tag_id: u8, ) -> Result { + Self::deserialize_data_depth(reader, tag_id, 0) + } + + /// Deserializes a payload whose type is identified by `tag_id` with depth tracking. + #[allow(clippy::too_many_lines)] + pub fn deserialize_data_depth<'a, R: NbtReadHelper<'a>>( + reader: &mut R, + tag_id: u8, + depth: usize, + ) -> Result { + if depth > crate::MAX_NBT_DEPTH { + return Err(Error::MaxDepthExceeded); + } + match tag_id { END_ID => Ok(Self::End), BYTE_ID => { @@ -299,10 +347,10 @@ impl NbtTag { } let len = len as usize; - if len > MAX_ARRAY_LENGTH { + if len > crate::MAX_ARRAY_LENGTH { return Err(Error::LargeLength(len)); } - let mut byte_array = Vec::with_capacity(len); + let mut byte_array = Vec::with_capacity(len.min(4096)); for _ in 0..len { let byte = reader.get_i8()?; byte_array.push(byte); @@ -316,22 +364,30 @@ impl NbtTag { if len < 0 { return Err(Error::NegativeLength(len)); } + if tag_type_id == END_ID && len > 0 { + return Err(Error::InvalidListTag(tag_type_id)); + } let len = len as usize; - if len > MAX_ARRAY_LENGTH { + if len > crate::MAX_ARRAY_LENGTH { return Err(Error::LargeLength(len)); } - let mut list = Vec::with_capacity(len); + let mut list = Vec::with_capacity(len.min(4096)); for _ in 0..len { - let tag = Self::deserialize_data(reader, tag_type_id)?; - assert_eq!(tag.get_type_id(), tag_type_id); + let tag = Self::deserialize_data_depth(reader, tag_type_id, depth + 1)?; + if tag.get_type_id() != tag_type_id { + return Err(Error::InvalidListTag(tag.get_type_id())); + } // Try unwrapping the tag. list.push(Self::flatten(tag)); } Ok(Self::List(list)) } - COMPOUND_ID => Ok(Self::Compound(NbtCompound::deserialize_content(reader)?)), + COMPOUND_ID => Ok(Self::Compound(NbtCompound::deserialize_content_depth( + reader, + depth + 1, + )?)), INT_ARRAY_ID => { let len = reader.get_i32()?; if len < 0 { @@ -339,10 +395,11 @@ impl NbtTag { } let len = len as usize; - if len > MAX_ARRAY_LENGTH { + if len > crate::MAX_ARRAY_LENGTH { return Err(Error::LargeLength(len)); } - let mut int_array = Vec::with_capacity(len); + + let mut int_array = Vec::with_capacity(len.min(4096)); for _ in 0..len { let int = reader.get_i32()?; int_array.push(int); @@ -356,10 +413,11 @@ impl NbtTag { } let len = len as usize; - if len > MAX_ARRAY_LENGTH { + if len > crate::MAX_ARRAY_LENGTH { return Err(Error::LargeLength(len)); } - let mut long_array = Vec::with_capacity(len); + + let mut long_array = Vec::with_capacity(len.min(4096)); for _ in 0..len { let long = reader.get_i64()?; long_array.push(long); diff --git a/crates/pumpkin-protocol/fuzz/Cargo.lock b/crates/pumpkin-protocol/fuzz/Cargo.lock index da64ffe56..c6a1d21aa 100644 --- a/crates/pumpkin-protocol/fuzz/Cargo.lock +++ b/crates/pumpkin-protocol/fuzz/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59317f77929f0e679d39364702289274de2f0f0b22cbf50b2b8cff2169a0b27a" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.1" @@ -25,44 +16,14 @@ checksum = "66bd29a732b644c0431c6140f370d097879203d79b80c94a6747ba0872adaef8" dependencies = [ "cipher", "cpubits", - "cpufeatures 0.3.0", -] - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "ambient-authority" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", + "cpufeatures", ] [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "arbitrary" @@ -81,9 +42,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" +checksum = "3976abdc8fe7d1133d43d304afd42abdf5bc3e1319d263d223bde07b5efc4be8" dependencies = [ "compression-codecs", "compression-core", @@ -91,44 +52,12 @@ dependencies = [ "tokio", ] -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "atomic-polyfill" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" -dependencies = [ - "critical-section", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - [[package]] name = "base16ct" version = "1.0.0" @@ -137,9 +66,9 @@ checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" [[package]] name = "base64" -version = "0.22.1" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" [[package]] name = "base64ct" @@ -149,15 +78,9 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "block-buffer" @@ -182,27 +105,6 @@ name = "bumpalo" version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" -dependencies = [ - "allocator-api2", -] - -[[package]] -name = "bytemuck" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" @@ -210,74 +112,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" -[[package]] -name = "cap-fs-ext" -version = "3.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5528f85b1e134ae811704e41ef80930f56e795923f866813255bc342cc20654" -dependencies = [ - "cap-primitives", - "cap-std", - "io-lifetimes", - "windows-sys 0.59.0", -] - -[[package]] -name = "cap-net-ext" -version = "3.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20a158160765c6a7d0d8c072a53d772e4cb243f38b04bfcf6b4939cfbe7482e7" -dependencies = [ - "cap-primitives", - "cap-std", - "rustix", - "smallvec", -] - -[[package]] -name = "cap-primitives" -version = "3.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6cf3aea8a5081171859ef57bc1606b1df6999df4f1110f8eef68b30098d1d3a" -dependencies = [ - "ambient-authority", - "fs-set-times", - "io-extras", - "io-lifetimes", - "ipnet", - "maybe-owned", - "rustix", - "rustix-linux-procfs", - "windows-sys 0.59.0", - "winx", -] - -[[package]] -name = "cap-std" -version = "3.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6dc3090992a735d23219de5c204927163d922f42f575a0189b005c62d37549a" -dependencies = [ - "cap-primitives", - "io-extras", - "io-lifetimes", - "rustix", -] - -[[package]] -name = "cap-time-ext" -version = "3.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def102506ce40c11710a9b16e614af0cde8e76ae51b1f48c04b8d79f4b671a80" -dependencies = [ - "ambient-authority", - "cap-primitives", - "iana-time-zone", - "once_cell", - "rustix", - "winx", -] - [[package]] name = "cc" version = "1.2.60" @@ -311,12 +145,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - [[package]] name = "chacha20" version = "0.10.0" @@ -324,8 +152,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", - "rand_core 0.10.1", + "cpufeatures", + "rand_core", ] [[package]] @@ -338,30 +166,12 @@ dependencies = [ "inout", ] -[[package]] -name = "clipboard-win" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" -dependencies = [ - "error-code", -] - [[package]] name = "cmov" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" -[[package]] -name = "cobs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" -dependencies = [ - "thiserror 2.0.18", -] - [[package]] name = "colored" version = "3.1.1" @@ -387,77 +197,18 @@ version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - [[package]] name = "const-oid" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" -[[package]] -name = "cookie" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - -[[package]] -name = "cookie_store" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" -dependencies = [ - "cookie", - "document-features", - "idna", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "time", - "url", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpp_demangle" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" -dependencies = [ - "cfg-if", -] - [[package]] name = "cpubits" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ef0c543070d296ea414df2dd7625d1b24866ce206709d8a4a424f28377f5861" -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - [[package]] name = "cpufeatures" version = "0.3.0" @@ -467,148 +218,6 @@ dependencies = [ "libc", ] -[[package]] -name = "cranelift-assembler-x64" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bc293b86236abcc45f2f72e2d18e2bd636f2a08b75eb286bae31e71e1430c91" -dependencies = [ - "cranelift-assembler-x64-meta", -] - -[[package]] -name = "cranelift-assembler-x64-meta" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b954c826eddaf1b001402cb8aecf1764c6f6d637ba69fb9e3311f1ebac965be6" -dependencies = [ - "cranelift-srcgen", -] - -[[package]] -name = "cranelift-bforest" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4053fa2575ef4a5c35d2708533df2200400ae979226cea9cc92a578b811bd4e7" -dependencies = [ - "cranelift-entity", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-bitset" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d216663191014aa63e1d2cffd058e609eaf207646d40b739d88250f65b2c4f69" -dependencies = [ - "serde", - "serde_derive", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-codegen" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a5e7e7aad6a425a51da1ad7ab9e5d280ea97eb7c7c4545fafb567915a75aadb" -dependencies = [ - "bumpalo", - "cranelift-assembler-x64", - "cranelift-bforest", - "cranelift-bitset", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-control", - "cranelift-entity", - "cranelift-isle", - "gimli", - "hashbrown 0.17.0", - "libm", - "log", - "pulley-interpreter", - "regalloc2", - "rustc-hash", - "serde", - "smallvec", - "target-lexicon", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-codegen-meta" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c421d80a9a85f806cb02a2983b5b5368a335c319795b1f1b4b771a24479af5b0" -dependencies = [ - "cranelift-assembler-x64-meta", - "cranelift-codegen-shared", - "cranelift-srcgen", - "heck", - "pulley-interpreter", -] - -[[package]] -name = "cranelift-codegen-shared" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78fdb83ab012d0ee6a44ced7ca8788a444f17cf821c62f95d6ef87c9f0262518" - -[[package]] -name = "cranelift-control" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b75adc6eb7bb4ac6365106afb6cac4f12fe1ddfa02ddc9fd7015ca1469b471b" -dependencies = [ - "arbitrary", -] - -[[package]] -name = "cranelift-entity" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668e56db75a54816cbdd7c7b7bfc558b08bf7b2cda9d0846491517e92f3b393b" -dependencies = [ - "cranelift-bitset", - "serde", - "serde_derive", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-frontend" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c63892dc1cc3ae48680183fa66997f60ffe7f1e200c8d390f8ee66edff4aef5a" -dependencies = [ - "cranelift-codegen", - "log", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-isle" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94eaf429c32a12715429c7c6ddfdd43c170f4cdd7e97bfa507bd68a652091087" - -[[package]] -name = "cranelift-native" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd77674904ae9be11c1e1efdba54788b59f3d6658d747b97534bfbba2909aacc" -dependencies = [ - "cranelift-codegen", - "libc", - "target-lexicon", -] - -[[package]] -name = "cranelift-srcgen" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cba7c0ff5941842c36653da155580ce41e675c204a67ac1b4e1c478a9347bbb7" - [[package]] name = "crc-fast" version = "1.10.0" @@ -616,7 +225,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e75b2483e97a5a7da73ac68a05b629f9c53cff58d8ed1c77866079e18b00dba5" dependencies = [ "digest 0.10.7", - "spin 0.10.0", + "spin", ] [[package]] @@ -628,12 +237,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - [[package]] name = "crossbeam" version = "0.8.4" @@ -692,40 +295,31 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crossfire" -version = "3.1.16" +version = "3.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d8c4de3db833e7ef74050bae09d5f3fa8f9d1507d3c2689c6e8c50b71208b18" +checksum = "111ce8f7abfbac38b4bc4f32a3a2dda1a8034b873c90c7899f302cc9dbbc05ec" dependencies = [ "crossbeam-utils", - "embed-collections", "futures-core", "parking_lot", + "pointers", "smallvec", ] [[package]] name = "crypto-bigint" -version = "0.5.5" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-bigint" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97bb4a855e3b10f84c4e7e895a7de01db7f9a7b7eb7f73ed9773fd52ac686451" +checksum = "1a52aa3fcda4e6302a9f48734f234d35d4721b96f8fe07d073f07ce9df4f0271" dependencies = [ "cpubits", "ctutils", + "getrandom 0.4.2", + "hybrid-array", "num-traits", - "rand_core 0.10.1", + "rand_core", "serdect", + "subtle", "zeroize", ] @@ -745,7 +339,9 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" dependencies = [ + "getrandom 0.4.2", "hybrid-array", + "rand_core", ] [[package]] @@ -754,9 +350,9 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21f41f23de7d24cdbda7f0c4d9c0351f99a4ceb258ef30e5c1927af8987ffe5a" dependencies = [ - "crypto-bigint 0.7.4", + "crypto-bigint", "libm", - "rand_core 0.10.1", + "rand_core", ] [[package]] @@ -766,6 +362,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" dependencies = [ "cmov", + "subtle", ] [[package]] @@ -782,36 +379,17 @@ dependencies = [ "parking_lot_core", ] -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid 0.9.6", - "zeroize", -] - [[package]] name = "der" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" dependencies = [ - "const-oid 0.10.2", + "const-oid", "pem-rfc7468", "zeroize", ] -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "powerfmt", -] - [[package]] name = "digest" version = "0.10.7" @@ -819,9 +397,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid 0.9.6", "crypto-common 0.1.6", - "subtle", ] [[package]] @@ -831,64 +407,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" dependencies = [ "block-buffer 0.12.0", - "const-oid 0.10.2", + "const-oid", "crypto-common 0.2.1", "ctutils", ] -[[package]] -name = "directories-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - [[package]] name = "ecdsa" -version = "0.16.9" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +checksum = "c0681a4fc24c767085329728d8dfba959af91228aa4610cca4f8ce317ba46ae0" dependencies = [ - "der 0.7.10", - "digest 0.10.7", + "der", + "digest 0.11.2", "elliptic-curve", "rfc6979", - "signature 2.2.0", - "spki 0.7.3", + "signature", + "spki", + "zeroize", ] [[package]] @@ -899,62 +435,24 @@ checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "elliptic-curve" -version = "0.13.8" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +checksum = "9d65aa39b3a5c1c9c1b745c9a019234bb7a21b77abcb4f4d266d706e2d577d65" dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.5", - "digest 0.10.7", + "base16ct", + "crypto-bigint", + "crypto-common 0.2.1", + "digest 0.11.2", "ff", - "generic-array", "group", - "pkcs8 0.10.2", - "rand_core 0.6.4", + "hybrid-array", + "pkcs8", + "rand_core", "sec1", "subtle", "zeroize", ] -[[package]] -name = "embed-collections" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9ac53891f56267deec18b66e7775be60318278a33217268bd42bfe9ef48eb8" - -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enum_dispatch" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" -dependencies = [ - "once_cell", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -971,12 +469,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "error-code" -version = "3.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" - [[package]] name = "fastrand" version = "2.4.1" @@ -984,23 +476,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] -name = "fdeflate" -version = "0.3.7" +name = "ff" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +checksum = "a1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489f" dependencies = [ - "simd-adler32", + "rand_core", + "subtle", ] [[package]] -name = "ff" -version = "0.13.1" +name = "fiat-crypto" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" [[package]] name = "find-msvc-tools" @@ -1018,53 +507,12 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "foldhash" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs-set-times" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" -dependencies = [ - "io-lifetimes", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "fsevent-sys" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] - [[package]] name = "futures" version = "0.3.32" @@ -1121,7 +569,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1161,7 +609,6 @@ checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", - "zeroize", ] [[package]] @@ -1196,62 +643,22 @@ dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", - "rand_core 0.10.1", + "rand_core", "wasip2", "wasip3", ] -[[package]] -name = "gimli" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7f043f89559805f8c7cacc432749b2fa0d0a0a9ee46ce47164ed5ba7f126c" -dependencies = [ - "fnv", - "hashbrown 0.16.1", - "indexmap", - "stable_deref_trait", -] - [[package]] name = "group" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4" dependencies = [ "ff", - "rand_core 0.6.4", + "rand_core", "subtle", ] -[[package]] -name = "h2" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - [[package]] name = "hashbrown" version = "0.14.5" @@ -1264,39 +671,14 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash 0.1.5", + "foldhash", ] -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - [[package]] name = "hashbrown" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" -dependencies = [ - "foldhash 0.2.0", - "serde", - "serde_core", -] - -[[package]] -name = "heapless" -version = "0.7.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" -dependencies = [ - "atomic-polyfill", - "hash32", - "rustc_version", - "serde", - "spin 0.9.8", - "stable_deref_trait", -] [[package]] name = "heck" @@ -1304,15 +686,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - [[package]] name = "hmac" version = "0.13.0" @@ -1332,176 +705,21 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - [[package]] name = "httparse" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hybrid-array" -version = "0.4.10" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" dependencies = [ + "subtle", "typenum", -] - -[[package]] -name = "hyper" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" - -[[package]] -name = "icu_properties" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" - -[[package]] -name = "icu_provider" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", + "zeroize", ] [[package]] @@ -1510,40 +728,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "image" -version = "0.25.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" -dependencies = [ - "bytemuck", - "byteorder-lite", - "moxcms", - "num-traits", - "png", -] - [[package]] name = "indexmap" version = "2.14.0" @@ -1556,26 +740,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "inotify" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" -dependencies = [ - "bitflags 2.13.0", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - [[package]] name = "inout" version = "0.2.2" @@ -1585,37 +749,6 @@ dependencies = [ "hybrid-array", ] -[[package]] -name = "io-extras" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65" -dependencies = [ - "io-lifetimes", - "windows-sys 0.59.0", -] - -[[package]] -name = "io-lifetimes" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" - -[[package]] -name = "ipnet" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.15.0" @@ -1651,32 +784,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "kqueue" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" -dependencies = [ - "kqueue-sys", - "libc", -] - -[[package]] -name = "kqueue-sys" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" -dependencies = [ - "bitflags 1.3.2", - "libc", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - [[package]] name = "leb128fmt" version = "0.1.0" @@ -1699,49 +806,12 @@ dependencies = [ "cc", ] -[[package]] -name = "libloading" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" -dependencies = [ - "cfg-if", - "windows-link", -] - [[package]] name = "libm" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" -[[package]] -name = "libredox" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" -dependencies = [ - "libc", -] - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" - -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - [[package]] name = "lock_api" version = "0.4.14" @@ -1753,9 +823,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "lz4-java-wrc" @@ -1773,30 +843,6 @@ version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a" -[[package]] -name = "mach2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" -dependencies = [ - "libc", -] - -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "maybe-owned" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" - [[package]] name = "md-5" version = "0.10.6" @@ -1819,15 +865,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" -[[package]] -name = "memfd" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" -dependencies = [ - "rustix", -] - [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1845,112 +882,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", - "log", "wasi", "windows-sys 0.61.2", ] -[[package]] -name = "moxcms" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" -dependencies = [ - "num-traits", - "pxfm", -] - -[[package]] -name = "nix" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" -dependencies = [ - "bitflags 2.13.0", - "cfg-if", - "cfg_aliases", - "libc", -] - -[[package]] -name = "notify" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" -dependencies = [ - "bitflags 2.13.0", - "fsevent-sys", - "inotify", - "kqueue", - "libc", - "log", - "mio", - "notify-types", - "walkdir", - "windows-sys 0.60.2", -] - -[[package]] -name = "notify-types" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" -dependencies = [ - "bitflags 2.13.0", -] - -[[package]] -name = "ntapi" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" -dependencies = [ - "winapi", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" - [[package]] name = "num-derive" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +checksum = "e4e98dc3b890f6c23a0f9d3d491a2823d0dea0fa656302a13dd225fa924112a8" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", + "syn 3.0.3", ] [[package]] @@ -1962,71 +906,24 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.13.0", -] - -[[package]] -name = "objc2-io-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" -dependencies = [ - "libc", - "objc2-core-foundation", -] - -[[package]] -name = "object" -version = "0.39.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" -dependencies = [ - "crc32fast", - "hashbrown 0.17.0", - "indexmap", - "memchr", -] - [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" -[[package]] -name = "ordered-float" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" -dependencies = [ - "num-traits", -] - [[package]] name = "p384" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +checksum = "d17b851e6b3e378ab4ecb07fa2ed23f4d15f075735f8fec9fa1e7bdce5f8301f" dependencies = [ "ecdsa", "elliptic-curve", + "fiat-crypto", + "primefield", "primeorder", - "sha2 0.10.9", + "sha2", ] [[package]] @@ -2069,9 +966,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +checksum = "010378780309880b08997fae13be7834dba947d36393bd372f2b1556deb2a2f6" dependencies = [ "phf_macros", "phf_shared", @@ -2080,9 +977,9 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" dependencies = [ "fastrand", "phf_shared", @@ -2090,22 +987,22 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +checksum = "5fa8d0ca26d424d27630da600c6624696e7dec8bf7b3b492b383c5dc49e5e085" dependencies = [ "phf_generator", "phf_shared", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] name = "phf_shared" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" dependencies = [ "siphasher", ] @@ -2122,18 +1019,8 @@ version = "0.8.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "986d2e952779af96ea048f160fd9194e1751b4faea78bcf3ceb456efe008088e" dependencies = [ - "der 0.8.0", - "spki 0.8.0", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.10", - "spki 0.7.3", + "der", + "spki", ] [[package]] @@ -2142,55 +1029,15 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" dependencies = [ - "der 0.8.0", - "spki 0.8.0", + "der", + "spki", ] [[package]] -name = "pkg-config" -version = "0.3.33" +name = "pointers" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[package]] -name = "png" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" -dependencies = [ - "bitflags 2.13.0", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "postcard" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "serde", -] - -[[package]] -name = "potential_utf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "5dcdc93847ad24990939cce6e1804361e903efcb5f99daa5abd87943a9d6d7ba" [[package]] name = "prettyplease" @@ -2199,16 +1046,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.117", +] + +[[package]] +name = "primefield" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c555a6e4eb7d4e158fcb028c835c3b8642206ddc279b5c6b202ef9a8bdb592f4" +dependencies = [ + "crypto-bigint", + "crypto-common 0.2.1", + "ff", + "rand_core", + "subtle", + "zeroize", ] [[package]] name = "primeorder" -version = "0.13.6" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +checksum = "5c9f42978c78a00e3d68f69fc03e57a234debae69da4020a4fb588fcdcd07b06" dependencies = [ "elliptic-curve", + "once_cell", + "primefield", + "serdect", + "wnaf", ] [[package]] @@ -2241,109 +1106,28 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "pulley-interpreter" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d9880c1985ccccaed3646b0ef793dc39a4b117403ed4afc6fa3ef6027c5200f" -dependencies = [ - "cranelift-bitset", - "log", - "pulley-macros", - "wasmtime-internal-core", -] - -[[package]] -name = "pulley-macros" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee249346855ad102580e474da5463f86f8a7d449e6d49e00fefb304e448e2983" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pumpkin" -version = "0.1.0-dev+26.1" -dependencies = [ - "arc-swap", - "base64", - "bitflags 2.13.0", - "bytes", - "colored", - "crossbeam", - "dashmap", - "flate2", - "futures", - "hmac 0.13.0", - "hyper", - "image", - "indexmap", - "libloading", - "notify", - "num-bigint", - "ordered-float", - "postcard", - "pumpkin-codecs", - "pumpkin-config", - "pumpkin-data", - "pumpkin-inventory", - "pumpkin-macros", - "pumpkin-nbt", - "pumpkin-protocol", - "pumpkin-util", - "pumpkin-world", - "rand", - "rayon", - "rsa", - "rustc-hash", - "rustc_version_runtime", - "rustyline", - "serde", - "serde_json", - "serde_repr", - "sha1", - "sha2 0.11.0", - "sysinfo", - "thiserror 2.0.18", - "time", - "tokio", - "tokio-util", - "tracing", - "tracing-serde-structured", - "tracing-subscriber", - "ureq", - "uuid", - "wasmtime", - "wasmtime-wasi", - "wasmtime-wasi-http", -] - [[package]] name = "pumpkin-codecs" -version = "0.1.0-dev+26.1" +version = "0.1.0-dev+26.2-26.40" dependencies = [ - "either", "serde_json", "tracing", ] [[package]] name = "pumpkin-config" -version = "0.1.0-dev+26.1" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "pumpkin-util", "serde", - "toml 1.1.2+spec-1.1.0", + "toml", "tracing", "uuid", ] [[package]] name = "pumpkin-data" -version = "0.1.0-dev+26.1" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "crc-fast", "phf", @@ -2353,50 +1137,38 @@ dependencies = [ "serde", ] -[[package]] -name = "pumpkin-inventory" -version = "0.1.0-dev+26.1" -dependencies = [ - "pumpkin-data", - "pumpkin-protocol", - "pumpkin-util", - "pumpkin-world", - "rand", - "thiserror 2.0.18", - "tokio", - "tracing", -] - [[package]] name = "pumpkin-macros" -version = "0.1.0-dev+26.1" +version = "0.1.0-dev+26.2-26.40" dependencies = [ + "heck", "proc-macro-error2", + "proc-macro2", "pumpkin-data", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "pumpkin-nbt" -version = "0.1.0-dev+26.1" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "bytes", "cesu8", "flate2", "pumpkin-codecs", - "serde", - "thiserror 2.0.18", + "thiserror", "tracing", + "uuid", ] [[package]] name = "pumpkin-protocol" -version = "0.1.0-dev+26.1" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "aes", "async-compression", - "bitflags 2.13.0", + "bitflags", "bytes", "cfb8", "flate2", @@ -2407,9 +1179,10 @@ dependencies = [ "pumpkin-util", "pumpkin-world", "serde", - "thiserror 2.0.18", + "thiserror", "tokio", "uuid", + "xxhash-rust", ] [[package]] @@ -2417,7 +1190,6 @@ name = "pumpkin-protocol-fuzz" version = "0.0.0" dependencies = [ "libfuzzer-sys", - "pumpkin", "pumpkin-protocol", "pumpkin-util", "tokio", @@ -2425,14 +1197,13 @@ dependencies = [ [[package]] name = "pumpkin-util" -version = "0.1.0-dev+26.1" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "base64", "bytes", "colored", - "crypto-bigint 0.7.4", + "crypto-bigint", "ecdsa", - "enum_dispatch", "md5", "num-derive", "num-traits", @@ -2442,8 +1213,8 @@ dependencies = [ "rsa", "serde", "serde_json", - "sha2 0.11.0", - "thiserror 2.0.18", + "sha2", + "thiserror", "tokio", "ureq", "uuid", @@ -2451,18 +1222,17 @@ dependencies = [ [[package]] name = "pumpkin-world" -version = "0.1.0-dev+26.1" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "arc-swap", - "bitflags 2.13.0", + "bitflags", "bytes", "crossbeam", "crossfire", "dashmap", - "enum_dispatch", "flate2", "futures", - "itertools 0.15.0", + "itertools", "lz4-java-wrc", "pumpkin-config", "pumpkin-data", @@ -2473,9 +1243,10 @@ dependencies = [ "rustc-hash", "ruzstd", "serde", - "sha2 0.11.0", + "serde_json", + "sha2", "slotmap", - "thiserror 2.0.18", + "thiserror", "tokio", "tokio-util", "tracing", @@ -2483,12 +1254,6 @@ dependencies = [ "xxhash-rust", ] -[[package]] -name = "pxfm" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" - [[package]] name = "quote" version = "1.0.45" @@ -2512,22 +1277,13 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20", "getrandom 0.4.2", - "rand_core 0.10.1", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", + "rand_core", ] [[package]] @@ -2562,59 +1318,17 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.0", + "bitflags", ] -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "regalloc2" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de2c52737737f8609e94f975dee22854a2d5c125772d4b1cf292120f4d45c186" -dependencies = [ - "allocator-api2", - "bumpalo", - "hashbrown 0.17.0", - "log", - "rustc-hash", - "smallvec", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" - [[package]] name = "rfc6979" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +checksum = "b4a459cddafb3fe76b31fd8f1108007566c40301feb64dc7b54656eb7388172b" dependencies = [ - "hmac 0.12.1", - "subtle", + "crypto-bigint", + "hmac", ] [[package]] @@ -2637,71 +1351,23 @@ version = "0.10.0-rc.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30b2aa4ba0d89f73d1e332df05be0eeab8840351c36ca5654341dfdb57bb3caf" dependencies = [ - "const-oid 0.10.2", - "crypto-bigint 0.7.4", + "const-oid", + "crypto-bigint", "crypto-primes", "digest 0.11.2", "pkcs1", - "pkcs8 0.11.0", - "rand_core 0.10.1", - "signature 3.0.0-rc.10", - "spki 0.8.0", + "pkcs8", + "rand_core", + "signature", + "spki", "zeroize", ] -[[package]] -name = "rustc-demangle" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" - [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustc_version_runtime" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" -dependencies = [ - "rustc_version", - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags 2.13.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustix-linux-procfs" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" -dependencies = [ - "once_cell", - "rustix", -] +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustls" @@ -2744,39 +1410,11 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" -[[package]] -name = "rustyline" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a990b25f351b25139ddc7f21ee3f6f56f86d6846b74ac8fad3a719a287cd4a0" -dependencies = [ - "bitflags 2.13.0", - "cfg-if", - "clipboard-win", - "libc", - "log", - "memchr", - "nix", - "unicode-segmentation", - "unicode-width", - "utf8parse", - "windows-sys 0.61.2", -] - [[package]] name = "ruzstd" -version = "0.8.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c1c839d570d835527c9a5e4db7cb2198683a988cb9d7293fc8674e6bd58fc8" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] +checksum = "a252f5e20f038fe7b4ea53e073e65398d652c864cc162fc77c56c2f13717b888" [[package]] name = "scopeguard" @@ -2786,14 +1424,14 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sec1" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d" dependencies = [ - "base16ct 0.2.0", - "der 0.7.10", - "generic-array", - "pkcs8 0.10.2", + "base16ct", + "ctutils", + "der", + "hybrid-array", "subtle", "zeroize", ] @@ -2803,10 +1441,6 @@ name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" -dependencies = [ - "serde", - "serde_core", -] [[package]] name = "serde" @@ -2835,7 +1469,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2851,17 +1485,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "serde_spanned" version = "1.1.1" @@ -2877,32 +1500,10 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9af4a3e75ebd5599b30d4de5768e00b5095d518a79fefc3ecbaf77e665d1ec06" dependencies = [ - "base16ct 1.0.0", + "base16ct", "serde", ] -[[package]] -name = "sha1" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "digest 0.11.2", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", -] - [[package]] name = "sha2" version = "0.11.0" @@ -2910,19 +1511,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures", "digest 0.11.2", ] -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - [[package]] name = "shlex" version = "1.3.0" @@ -2941,22 +1533,12 @@ dependencies = [ [[package]] name = "signature" -version = "2.2.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "signature" -version = "3.0.0-rc.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3" +checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" dependencies = [ "digest 0.11.2", - "rand_core 0.10.1", + "rand_core", ] [[package]] @@ -2991,9 +1573,6 @@ name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -dependencies = [ - "serde", -] [[package]] name = "socket2" @@ -3005,31 +1584,12 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "spin" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der 0.7.10", -] - [[package]] name = "spki" version = "0.8.0" @@ -3037,15 +1597,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f" dependencies = [ "base64ct", - "der 0.8.0", + "der", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - [[package]] name = "static_assertions" version = "1.1.0" @@ -3070,52 +1624,14 @@ dependencies = [ ] [[package]] -name = "synstructure" -version = "0.13.2" +name = "syn" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "sysinfo" -version = "0.39.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4deba334e1190ba7cb498327affa11e5ece10d26a30ab2f27fcf09504b8d8b6" -dependencies = [ - "libc", - "memchr", - "ntapi", - "objc2-core-foundation", - "objc2-io-kit", - "windows", -] - -[[package]] -name = "target-lexicon" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", + "unicode-ident", ] [[package]] @@ -3124,18 +1640,7 @@ version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "thiserror-impl", ] [[package]] @@ -3146,66 +1651,14 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "time" -version = "0.3.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" - -[[package]] -name = "time-macros" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" -dependencies = [ - "displaydoc", - "zerovec", + "syn 2.0.117", ] [[package]] name = "tokio" -version = "1.52.0" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91135f59b1cbf38c91e73cf3386fca9bb77915c45ce2771460c9d92f0f3d776" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -3226,24 +1679,14 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", + "syn 2.0.117", ] [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", @@ -3253,21 +1696,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.9.12+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" -dependencies = [ - "indexmap", - "serde_core", - "serde_spanned", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 0.7.15", -] - [[package]] name = "toml" version = "1.1.2+spec-1.1.0" @@ -3276,19 +1704,10 @@ checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ "serde_core", "serde_spanned", - "toml_datetime 1.1.1+spec-1.1.0", + "toml_datetime", "toml_parser", "toml_writer", - "winnow 1.0.1", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", + "winnow", ] [[package]] @@ -3306,7 +1725,7 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.1", + "winnow", ] [[package]] @@ -3334,7 +1753,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3346,41 +1765,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "tracing-serde-structured" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0832510e9838a4ff7e45e278602ab0533686f9507bc6189e024e488602f29820" -dependencies = [ - "hash32", - "heapless", - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex-automata", - "sharded-slab", - "thread_local", - "time", - "tracing", - "tracing-core", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "twox-hash" version = "1.6.3" @@ -3393,9 +1777,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "unicode-ident" @@ -3403,18 +1787,6 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "unicode-segmentation" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - [[package]] name = "unicode-xid" version = "0.2.6" @@ -3429,28 +1801,25 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" +checksum = "972d7902c8735f2695410b8aed7df6ed12a47394aa1c8d7af49f0497b731a94d" dependencies = [ "base64", - "cookie_store", "log", "percent-encoding", "rustls", "rustls-pki-types", - "serde", - "serde_json", "ureq-proto", "utf8-zero", - "webpki-roots 1.0.7", + "webpki-roots", ] [[package]] name = "ureq-proto" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" +checksum = "da5f78b09e6941e1a0f2e30e695e4b120377b54d5e0aec11b594bb57b3971613" dependencies = [ "base64", "http", @@ -3458,41 +1827,17 @@ dependencies = [ "log", ] -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - [[package]] name = "utf8-zero" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - [[package]] name = "uuid" -version = "1.23.1" +version = "1.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +checksum = "2cefc03fd367c0c6d4305de1b312cf00248c4114f4a0418ce6a6af769e3b0bd9" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -3507,25 +1852,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -3582,7 +1908,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "wasm-bindgen-shared", ] @@ -3602,17 +1928,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" dependencies = [ "leb128fmt", - "wasmparser 0.244.0", -] - -[[package]] -name = "wasm-encoder" -version = "0.248.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac92cf547bc18d27ecc521015c08c353b4f18b84ab388bb6d1b6b682c620d9b6" -dependencies = [ - "leb128fmt", - "wasmparser 0.248.0", + "wasmparser", ] [[package]] @@ -3623,8 +1939,8 @@ checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", "indexmap", - "wasm-encoder 0.244.0", - "wasmparser 0.244.0", + "wasm-encoder", + "wasmparser", ] [[package]] @@ -3633,354 +1949,12 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.13.0", + "bitflags", "hashbrown 0.15.5", "indexmap", "semver", ] -[[package]] -name = "wasmparser" -version = "0.248.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4439c5eee9df71ee0c6efb37f63b1fcb1fec38f85f5142c54e7ed05d33091a" -dependencies = [ - "bitflags 2.13.0", - "hashbrown 0.17.0", - "indexmap", - "semver", - "serde", -] - -[[package]] -name = "wasmprinter" -version = "0.248.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b264a5410b008d4d199a92bf536eae703cbd614482fc1ec53831cf19e1c183" -dependencies = [ - "anyhow", - "termcolor", - "wasmparser 0.248.0", -] - -[[package]] -name = "wasmtime" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ce9aa2c67f75fadcfdc6aa9097d03e7c39485dfe316f2ed6a7c0fd186c527" -dependencies = [ - "addr2line", - "async-trait", - "bitflags 2.13.0", - "bumpalo", - "cc", - "cfg-if", - "encoding_rs", - "libc", - "log", - "mach2", - "memfd", - "object", - "once_cell", - "postcard", - "pulley-interpreter", - "rustix", - "semver", - "serde", - "serde_derive", - "smallvec", - "target-lexicon", - "wasmparser 0.248.0", - "wasmtime-environ", - "wasmtime-internal-cache", - "wasmtime-internal-component-macro", - "wasmtime-internal-component-util", - "wasmtime-internal-core", - "wasmtime-internal-cranelift", - "wasmtime-internal-fiber", - "wasmtime-internal-jit-debug", - "wasmtime-internal-jit-icache-coherence", - "wasmtime-internal-unwinder", - "wasmtime-internal-versioned-export-macros", - "wasmtime-internal-winch", - "windows-sys 0.61.2", -] - -[[package]] -name = "wasmtime-environ" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8fb157bd1fbf689ac89d570433a700db6f33bdfcb5ffc30e3f1c49e4c70de71" -dependencies = [ - "anyhow", - "cpp_demangle", - "cranelift-bforest", - "cranelift-bitset", - "cranelift-entity", - "gimli", - "hashbrown 0.17.0", - "indexmap", - "log", - "object", - "postcard", - "rustc-demangle", - "semver", - "serde", - "serde_derive", - "sha2 0.10.9", - "smallvec", - "target-lexicon", - "wasm-encoder 0.248.0", - "wasmparser 0.248.0", - "wasmprinter", - "wasmtime-internal-component-util", - "wasmtime-internal-core", -] - -[[package]] -name = "wasmtime-internal-cache" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0d1a46c4a2360186b59c6ed7a74a1121ac97925ae9a18db1b2f146cc27ac0b7" -dependencies = [ - "base64", - "directories-next", - "log", - "postcard", - "rustix", - "serde", - "serde_derive", - "sha2 0.10.9", - "toml 0.9.12+spec-1.1.0", - "wasmtime-environ", - "windows-sys 0.61.2", - "zstd", -] - -[[package]] -name = "wasmtime-internal-component-macro" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96c17f35fae2ab574667aba0c58fd56349a6f788ac42541a2e543116d5cfb91" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "syn", - "wasmtime-internal-component-util", - "wasmtime-internal-wit-bindgen", - "wit-parser 0.248.0", -] - -[[package]] -name = "wasmtime-internal-component-util" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2eeb9b53222859e6f5dc73d2ccfb33254d672469cac11b693a71912e2f3817" - -[[package]] -name = "wasmtime-internal-core" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1deaf6bc3430abd7497b00c64f06ca2b97ca0fe41af87836446ca30949965c" -dependencies = [ - "hashbrown 0.17.0", - "libm", - "serde", -] - -[[package]] -name = "wasmtime-internal-cranelift" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b845f83b5b04b11bc48329b53eb4fa8cf9f28a43c71ed8e1203f68ffa9806d1b" -dependencies = [ - "cfg-if", - "cranelift-codegen", - "cranelift-control", - "cranelift-entity", - "cranelift-frontend", - "cranelift-native", - "gimli", - "itertools 0.14.0", - "log", - "object", - "pulley-interpreter", - "smallvec", - "target-lexicon", - "thiserror 2.0.18", - "wasmparser 0.248.0", - "wasmtime-environ", - "wasmtime-internal-core", - "wasmtime-internal-unwinder", - "wasmtime-internal-versioned-export-macros", -] - -[[package]] -name = "wasmtime-internal-fiber" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10c8466f72965ae85c250f90aaa7992c089a2f8502009bd0d2c9e7d6409174a" -dependencies = [ - "cc", - "cfg-if", - "libc", - "rustix", - "wasmtime-environ", - "wasmtime-internal-versioned-export-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "wasmtime-internal-jit-debug" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3adfecf5621b14d8f8871f4cb4ed9f844197b1ddefc702ef4c859552cd9551" -dependencies = [ - "cc", - "wasmtime-internal-versioned-export-macros", -] - -[[package]] -name = "wasmtime-internal-jit-icache-coherence" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d3c1e9fb618ec45c9b3477ea683cd37bee427273d7b13bba5c66a1caaf1dd6" -dependencies = [ - "cfg-if", - "libc", - "wasmtime-internal-core", - "windows-sys 0.61.2", -] - -[[package]] -name = "wasmtime-internal-unwinder" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aa91132b81f1e172ec7e7c3c114ac34209ee6b3524b3a8d6943af99803f66c5" -dependencies = [ - "cfg-if", - "cranelift-codegen", - "log", - "object", - "wasmtime-environ", -] - -[[package]] -name = "wasmtime-internal-versioned-export-macros" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea811ffe23f597cc7708327ea25d9eb018dcf760ffe15ccb7d0b27ad635de61" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "wasmtime-internal-winch" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "828b66175c54a0d00b4c1c1c76658d8aa73aeb9fa3553575c5eee56d40f2eb18" -dependencies = [ - "cranelift-codegen", - "gimli", - "log", - "object", - "target-lexicon", - "wasmparser 0.248.0", - "wasmtime-environ", - "wasmtime-internal-cranelift", - "winch-codegen", -] - -[[package]] -name = "wasmtime-internal-wit-bindgen" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae00896ad9bef1b3ca6401ae9a841daa6f357dd91541b6baf87082946d1bde1" -dependencies = [ - "anyhow", - "bitflags 2.13.0", - "heck", - "indexmap", - "wit-parser 0.248.0", -] - -[[package]] -name = "wasmtime-wasi" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032ceffcb74cf30a2cdac298a4d6ce219058f08479ce1ab38434aadc044000b" -dependencies = [ - "async-trait", - "bitflags 2.13.0", - "bytes", - "cap-fs-ext", - "cap-net-ext", - "cap-std", - "cap-time-ext", - "cfg-if", - "fs-set-times", - "futures", - "io-extras", - "io-lifetimes", - "rand", - "rustix", - "thiserror 2.0.18", - "tokio", - "tracing", - "url", - "wasmtime", - "wasmtime-wasi-io", - "windows-sys 0.61.2", -] - -[[package]] -name = "wasmtime-wasi-http" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb570dc29e051beeb016aa62839871fde20d9b305b3809655d09461c304d71b2" -dependencies = [ - "async-trait", - "bytes", - "futures", - "http", - "http-body", - "http-body-util", - "hyper", - "rustls", - "tokio", - "tokio-rustls", - "tracing", - "wasmtime", - "wasmtime-wasi", - "wasmtime-wasi-io", - "webpki-roots 0.26.11", -] - -[[package]] -name = "wasmtime-wasi-io" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b6e6868e5b93e1e10983a17afb631b39c236d8b6b4abe9faffe78f1ee0c6e7" -dependencies = [ - "async-trait", - "bytes", - "futures", - "tracing", - "wasmtime", -] - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.7", -] - [[package]] name = "webpki-roots" version = "1.0.7" @@ -3990,182 +1964,19 @@ dependencies = [ "rustls-pki-types", ] -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "winch-codegen" -version = "45.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89c09acfdfa281b3340e1e94ef3cf6618d69eab975280f881e154c29f49419c1" -dependencies = [ - "cranelift-assembler-x64", - "cranelift-codegen", - "gimli", - "regalloc2", - "smallvec", - "target-lexicon", - "thiserror 2.0.18", - "wasmparser 0.248.0", - "wasmtime-environ", - "wasmtime-internal-core", - "wasmtime-internal-cranelift", -] - -[[package]] -name = "windows" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" -dependencies = [ - "windows-collections", - "windows-core", - "windows-future", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" -dependencies = [ - "windows-core", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-future" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" -dependencies = [ - "windows-core", - "windows-link", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-numerics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" -dependencies = [ - "windows-core", - "windows-link", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - [[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -4183,40 +1994,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows-threading" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" -dependencies = [ - "windows-link", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -4225,118 +2010,54 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" - [[package]] name = "winnow" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" -[[package]] -name = "winx" -version = "0.36.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" -dependencies = [ - "bitflags 2.13.0", - "windows-sys 0.59.0", -] - [[package]] name = "wit-bindgen" version = "0.51.0" @@ -4354,7 +2075,7 @@ checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" dependencies = [ "anyhow", "heck", - "wit-parser 0.244.0", + "wit-parser", ] [[package]] @@ -4367,7 +2088,7 @@ dependencies = [ "heck", "indexmap", "prettyplease", - "syn", + "syn 2.0.117", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -4383,7 +2104,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -4395,16 +2116,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.13.0", + "bitflags", "indexmap", "log", "serde", "serde_derive", "serde_json", - "wasm-encoder 0.244.0", + "wasm-encoder", "wasm-metadata", - "wasmparser 0.244.0", - "wit-parser 0.244.0", + "wasmparser", + "wit-parser", ] [[package]] @@ -4422,153 +2143,34 @@ dependencies = [ "serde_derive", "serde_json", "unicode-xid", - "wasmparser 0.244.0", + "wasmparser", ] [[package]] -name = "wit-parser" -version = "0.248.0" +name = "wnaf" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "247ad505da2915a082fe13204c5ba8788425aea1de54f43b284818cf82637856" +checksum = "ab12e7090f27e2ffd9322651492942d50c2926094af30601e1964337db39daf1" dependencies = [ - "anyhow", - "hashbrown 0.17.0", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser 0.248.0", + "ff", + "group", + "hybrid-array", ] -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - [[package]] name = "xxhash-rust" version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" -[[package]] -name = "yoke" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerofrom" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - [[package]] name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -[[package]] -name = "zerotrie" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/crates/pumpkin-protocol/fuzz/Cargo.toml b/crates/pumpkin-protocol/fuzz/Cargo.toml index 213a74ec5..74c15794a 100644 --- a/crates/pumpkin-protocol/fuzz/Cargo.toml +++ b/crates/pumpkin-protocol/fuzz/Cargo.toml @@ -19,9 +19,6 @@ libfuzzer-sys = "0.4" [dependencies.pumpkin-protocol] path = ".." -[dependencies.pumpkin] -path = "../../pumpkin" - [dependencies.pumpkin-util] path = "../../pumpkin-util" diff --git a/crates/pumpkin-protocol/fuzz/fuzz_targets/decoder_bedrock.rs b/crates/pumpkin-protocol/fuzz/fuzz_targets/decoder_bedrock.rs index 66525c458..6500ccdf5 100644 --- a/crates/pumpkin-protocol/fuzz/fuzz_targets/decoder_bedrock.rs +++ b/crates/pumpkin-protocol/fuzz/fuzz_targets/decoder_bedrock.rs @@ -2,18 +2,14 @@ use libfuzzer_sys::fuzz_target; use pumpkin_protocol::bedrock::packet_decoder::BedrockBatchDecoder; use pumpkin_protocol::bedrock::server::{ - client_cache_status::SClientCacheStatus, - command_request::SCommandRequest, - container_close::SContainerClose, - interaction::SInteraction, - loading_screen::SLoadingScreen, - login::SLogin, - player_auth_input::SPlayerAuthInput, - request_chunk_radius::SRequestChunkRadius, - request_network_settings::SRequestNetworkSettings, - text::SText, + SAnimate, SBlockPickRequest, SClientCacheBlobStatus, SClientCacheStatus, SCommandRequest, + SContainerClose, SEmote, SEmoteList, SInteraction, SInventoryTransaction, SItemStackRequest, + SLoadingScreen, SLogin, SMobEquipment, SModalFormResponse, SPacketViolationWarning, + SPlayerAction, SPlayerAuthInput, SPlayerHotbar, SRequestAbility, SRequestChunkRadius, + SRequestNetworkSettings, SResourcePackResponse, SRespawn, SSetLocalPlayerAsInitialized, + SSetPlayerInventoryOptions, SText, }; -use pumpkin_protocol::serial::PacketRead; +use pumpkin_protocol::serial::{PacketRead, PacketReadSlice}; use std::io::Cursor; // --------------------------------------------------------------------------- @@ -26,25 +22,53 @@ fn fuzz_serverbound_packets(payload: &[u8]) { ($($packet:ty),* $(,)?) => { $( cursor.set_position(0); - // Attempt to read as a standard Game Packet (with version) let _ = <$packet>::read(&mut cursor); )* }; } - // Standard Bedrock Serverbound Packets + macro_rules! run_read_slice { + ($($packet:ty),* $(,)?) => { + $( + let mut slice = payload; + let _ = <$packet>::read_slice(&mut slice); + )* + }; + } + + // Standard Bedrock Serverbound Packets (PacketRead) run_read!( + SAnimate, + SBlockPickRequest, + SClientCacheBlobStatus, SClientCacheStatus, SCommandRequest, SContainerClose, + SEmote, + SEmoteList, SInteraction, + SInventoryTransaction, + SItemStackRequest, SLoadingScreen, SLogin, + SMobEquipment, + SModalFormResponse, + SPacketViolationWarning, + SPlayerAction, SPlayerAuthInput, + SPlayerHotbar, + SRequestAbility, SRequestChunkRadius, SRequestNetworkSettings, + SResourcePackResponse, + SRespawn, + SSetLocalPlayerAsInitialized, + SSetPlayerInventoryOptions, SText, ); + + // Bedrock Serverbound Packets supporting zero-copy PacketReadSlice + run_read_slice!(SCommandRequest, SEmote, SModalFormResponse, SText,); } // --------------------------------------------------------------------------- @@ -67,8 +91,8 @@ fuzz_target!(|data: &[u8]| { decoder.set_compression((threshold_raw as u32).try_into().unwrap()); } // 1. Fuzz the Decoder (Framing/VarInts/Bitmasks) - let decoder_cursor = Cursor::new(stream_data.to_vec()); - if let Ok(raw_packet) = decoder.get_game_packet(decoder_cursor) { + let mut decoder_cursor = Cursor::new(stream_data.to_vec()); + if let Ok(raw_packet) = decoder.get_game_packet(&mut decoder_cursor) { // If framed correctly, fuzz the internal payload fuzz_serverbound_packets(&raw_packet.payload); } diff --git a/crates/pumpkin-protocol/fuzz/fuzz_targets/decoder_java.rs b/crates/pumpkin-protocol/fuzz/fuzz_targets/decoder_java.rs index e8f78d618..edc5037cb 100644 --- a/crates/pumpkin-protocol/fuzz/fuzz_targets/decoder_java.rs +++ b/crates/pumpkin-protocol/fuzz/fuzz_targets/decoder_java.rs @@ -2,25 +2,40 @@ use libfuzzer_sys::fuzz_target; use pumpkin_protocol::ServerPacket; use pumpkin_protocol::java::{ + client::{ + config::CFinishConfig, + login::CLoginDisconnect, + play::CPlayerPosition, + status::{CPingResponse, CStatusResponse}, + }, packet_decoder::TCPNetworkDecoder, server::{ config::{ - SClientInformationConfig, SConfigCookieResponse, SConfigResourcePack, SKnownPacks, - SPluginMessage, + SAcknowledgeFinishConfig, SClientInformationConfig, SConfigCookieResponse, + SConfigResourcePack, SCustomClickAction as SConfigCustomClickAction, + SKeepAlive as SConfigKeepAlive, SKnownPacks, SPluginMessage, }, handshake::SHandShake, - login::{SEncryptionResponse, SLoginCookieResponse, SLoginPluginResponse, SLoginStart}, + login::{ + SEncryptionResponse, SLoginAcknowledged, SLoginCookieResponse, SLoginPluginResponse, + SLoginStart, + }, play::{ - SChangeGameMode, SChatCommand, SChatMessage, SChunkBatch, SClickSlot, SClientCommand, - SClientInformationPlay, SCloseContainer, SCommandSuggestion, SConfirmTeleport, - SContainerButtonClick, SCookieResponse, SCustomPayload, SInteract, SKeepAlive, - SMoveVehicle, SPaddleBoat, SPickItemFromBlock, SPlayPingRequest, SPlayerAbilities, - SPlayerAction, SPlayerCommand, SPlayerInput, SPlayerLoaded, SPlayerPosition, - SPlayerPositionRotation, SPlayerRotation, SPlayerSession, SSetCommandBlock, - SSetCreativeSlot, SSetHeldItem, SSetPlayerGround, SSwingArm, SUpdateSign, SUseItem, + SAttack, SBundleItemSelected, SChangeGameMode, SChatCommand, SChatMessage, SChunkBatch, + SClickSlot, SClientCommand, SClientInformationPlay, SClientTickEnd, SCloseContainer, + SCommandSuggestion, SConfirmTeleport, SContainerButtonClick, SCookieResponse, + SCustomClickAction as SPlayCustomClickAction, SCustomPayload, SDebugSampleSubscription, + SDebugSubscriptionRequest, SEditBook, SInteract, SJigsawGenerate, + SKeepAlive as SPlayKeepAlive, SMoveVehicle, SPaddleBoat, SPickItemFromBlock, + SPickItemFromEntity, SPlaceRecipe, SPlayPingRequest, SPlayerAbilities, SPlayerAction, + SPlayerCommand, SPlayerInput, SPlayerLoaded, SPlayerPosition, SPlayerPositionRotation, + SPlayerRotation, SPlayerSession, SRecipeBookChangeSettings, SRecipeBookSeenRecipe, + SRenameItem, SSeenAdvancement, SSelectTrade, SSetBeacon, SSetCommandBlock, + SSetCreativeSlot, SSetHeldItem, SSetJigsawBlock, SSetPlayerGround, SSetTestBlock, + SSwingArm, STeleportToEntity, STestInstanceBlockAction, SUpdateSign, SUseItem, SUseItemOn, }, - status::SStatusPingRequest, + status::{SStatusPingRequest, SStatusRequest}, }, }; use pumpkin_util::version::JavaMinecraftVersion; @@ -31,16 +46,14 @@ const TARGET_VERSION: JavaMinecraftVersion = JavaMinecraftVersion::V_26_1; // --------------------------------------------------------------------------- // Helper: run every known ServerPacket::read against the same payload. -// Uses a Cursor and the Version enum as required by the new signature. +// Uses a slice and the Version enum as required by the ServerPacket signature. // --------------------------------------------------------------------------- fn fuzz_all_deserializers(payload: &[u8]) { - let mut cursor = Cursor::new(payload); - macro_rules! run_read { ($($packet:ty),* $(,)?) => { $( - cursor.set_position(0); - let _ = <$packet>::read(&mut cursor, &TARGET_VERSION); + let mut slice = payload; + let _ = <$packet>::read(&mut slice, &TARGET_VERSION); )* }; } @@ -50,54 +63,85 @@ fn fuzz_all_deserializers(payload: &[u8]) { SHandShake, // Status SStatusPingRequest, + SStatusRequest, // Login SLoginStart, SEncryptionResponse, SLoginPluginResponse, SLoginCookieResponse, + SLoginAcknowledged, // Config + SAcknowledgeFinishConfig, SClientInformationConfig, - SPluginMessage, - SKnownPacks, SConfigCookieResponse, + SConfigCustomClickAction, + SConfigKeepAlive, + SKnownPacks, + SPluginMessage, SConfigResourcePack, // Play - SConfirmTeleport, + SAttack, + SBundleItemSelected, SChangeGameMode, SChatCommand, SChatMessage, - SClientInformationPlay, + SChunkBatch, + SClickSlot, SClientCommand, - SPlayerInput, + SClientInformationPlay, + SClientTickEnd, + SCloseContainer, + SCommandSuggestion, + SConfirmTeleport, + SContainerButtonClick, + SCookieResponse, + SPlayCustomClickAction, + SCustomPayload, + SDebugSampleSubscription, + SDebugSubscriptionRequest, + SEditBook, + SInteract, + SJigsawGenerate, + SPlayKeepAlive, SMoveVehicle, SPaddleBoat, - SInteract, - SKeepAlive, + SPickItemFromBlock, + SPickItemFromEntity, + SPlayPingRequest, + SPlaceRecipe, + SPlayerAbilities, + SPlayerAction, + SPlayerCommand, + SPlayerInput, + SPlayerLoaded, SPlayerPosition, SPlayerPositionRotation, SPlayerRotation, - SSetPlayerGround, - SPickItemFromBlock, - SPlayerAbilities, - SPlayerAction, - SSetCommandBlock, - SPlayerCommand, - SPlayerLoaded, - SPlayPingRequest, - SClickSlot, - SContainerButtonClick, - SSetHeldItem, - SSetCreativeSlot, - SSwingArm, - SUpdateSign, - SUseItemOn, - SUseItem, - SCommandSuggestion, - SCookieResponse, - SCloseContainer, - SChunkBatch, SPlayerSession, - SCustomPayload, + SRecipeBookChangeSettings, + SRecipeBookSeenRecipe, + SRenameItem, + SSeenAdvancement, + SSelectTrade, + SSetBeacon, + SSetCommandBlock, + SSetCreativeSlot, + SSetHeldItem, + SSetJigsawBlock, + SSetPlayerGround, + SSetTestBlock, + SSwingArm, + STeleportToEntity, + STestInstanceBlockAction, + SUpdateSign, + SUseItem, + SUseItemOn, + // Clientbound packets implementing ServerPacket + CFinishConfig, + CLoginDisconnect, + CPlayerPosition, + CPingResponse, + CStatusResponse, ); } @@ -131,13 +175,13 @@ fuzz_target!(|data: &[u8]| { 2 => { let mut aes_key = [0u8; 16]; aes_key.copy_from_slice(key); - decoder.set_encryption(&aes_key); + let _ = decoder.set_encryption(&aes_key); } 3 => { decoder.set_compression(256); let mut aes_key = [0u8; 16]; aes_key.copy_from_slice(key); - decoder.set_encryption(&aes_key); + let _ = decoder.set_encryption(&aes_key); } _ => {} } diff --git a/crates/pumpkin-protocol/fuzz/fuzz_targets/encoder_bedrock.rs b/crates/pumpkin-protocol/fuzz/fuzz_targets/encoder_bedrock.rs index b35292f1f..46e98e2a6 100644 --- a/crates/pumpkin-protocol/fuzz/fuzz_targets/encoder_bedrock.rs +++ b/crates/pumpkin-protocol/fuzz/fuzz_targets/encoder_bedrock.rs @@ -1,7 +1,7 @@ #![no_main] use libfuzzer_sys::fuzz_target; -use pumpkin_protocol::bedrock::packet_encoder::BedrockBatchEncoder; use pumpkin_protocol::bedrock::SubClient; +use pumpkin_protocol::bedrock::packet_encoder::BedrockBatchEncoder; fuzz_target!(|data: &[u8]| { if data.len() < 10 { @@ -33,11 +33,5 @@ fuzz_target!(|data: &[u8]| { } let mut out = Vec::new(); - let _ = encoder.write_game_packet( - packet_id, - sender, - target, - packet_payload, - &mut out - ); + let _ = encoder.write_game_packet(packet_id, sender, target, packet_payload, &mut out); }); diff --git a/crates/pumpkin-protocol/fuzz/fuzz_targets/encoder_java.rs b/crates/pumpkin-protocol/fuzz/fuzz_targets/encoder_java.rs index fd4242bee..62ae13447 100644 --- a/crates/pumpkin-protocol/fuzz/fuzz_targets/encoder_java.rs +++ b/crates/pumpkin-protocol/fuzz/fuzz_targets/encoder_java.rs @@ -1,14 +1,13 @@ #![no_main] use libfuzzer_sys::fuzz_target; -use pumpkin_protocol::java::packet_encoder::TCPNetworkEncoder; -use pumpkin_protocol::codec::var_int::VarInt; -use pumpkin_protocol::ser::NetworkWriteExt; -use pumpkin_protocol::ServerPacket; -use pumpkin_protocol::java::client::play::CPlayerPosition; -use pumpkin_protocol::packet::MultiVersionJavaPacket; use pumpkin_protocol::ClientPacket; +use pumpkin_protocol::ServerPacket; +use pumpkin_protocol::codec::var_int::VarInt; +use pumpkin_protocol::java::client::play::CPlayerPosition; +use pumpkin_protocol::java::packet_encoder::TCPNetworkEncoder; +use pumpkin_protocol::packet::MultiVersionJavaPacket; +use pumpkin_protocol::ser::NetworkWriteExt; use pumpkin_util::version::JavaMinecraftVersion; -use std::io::Cursor; use tokio::runtime::Runtime; const TARGET_VERSION: JavaMinecraftVersion = JavaMinecraftVersion::V_1_21_4; @@ -34,24 +33,28 @@ fuzz_target!(|data: &[u8]| { encoder.set_compression((compression_threshold, compression_level)); } if use_encryption { - encoder.set_encryption(&encryption_key); + let _ = encoder.set_encryption(&encryption_key); } // 1. Fuzz with raw bytes (simulating various packet payloads) let mut buf = Vec::new(); - let packet_id = if packet_data.is_empty() { 0 } else { packet_data[0] as i32 }; + let packet_id = if packet_data.is_empty() { + 0 + } else { + packet_data[0] as i32 + }; let _ = buf.write_var_int(&VarInt(packet_id)); buf.extend_from_slice(packet_data); let _ = encoder.write_packet(buf.into()).await; // 2. Fuzz with actual packets if they can be partially read - let mut cursor = Cursor::new(packet_data); - if let Ok(packet) = CPlayerPosition::read(&mut cursor, &TARGET_VERSION) { - let mut packet_buf = Vec::new(); - let id = CPlayerPosition::to_id(TARGET_VERSION); - let _ = packet_buf.write_var_int(&VarInt(id)); - let _ = packet.write_packet_data(&mut packet_buf, &TARGET_VERSION); - let _ = encoder.write_packet(packet_buf.into()).await; + let mut slice = packet_data; + if let Ok(packet) = CPlayerPosition::read(&mut slice, &TARGET_VERSION) { + let mut packet_buf = Vec::new(); + let id = CPlayerPosition::to_id(TARGET_VERSION); + let _ = packet_buf.write_var_int(&VarInt(id)); + let _ = packet.write_packet_data(&mut packet_buf, &TARGET_VERSION); + let _ = encoder.write_packet(packet_buf.into()).await; } let _ = encoder.flush().await; diff --git a/crates/pumpkin-protocol/fuzz/fuzz_targets/rcon_decoder.rs b/crates/pumpkin-protocol/fuzz/fuzz_targets/rcon_decoder.rs index d733471ad..290ce7a3a 100644 --- a/crates/pumpkin-protocol/fuzz/fuzz_targets/rcon_decoder.rs +++ b/crates/pumpkin-protocol/fuzz/fuzz_targets/rcon_decoder.rs @@ -1,6 +1,6 @@ #![no_main] use libfuzzer_sys::fuzz_target; -use pumpkin::net::rcon::packet::Packet; +use pumpkin_protocol::rcon::Packet; fuzz_target!(|data: &[u8]| { let mut incoming = data.to_vec(); diff --git a/crates/pumpkin-protocol/src/bedrock/network_item.rs b/crates/pumpkin-protocol/src/bedrock/network_item.rs index 8d4478e49..0a8c09101 100644 --- a/crates/pumpkin-protocol/src/bedrock/network_item.rs +++ b/crates/pumpkin-protocol/src/bedrock/network_item.rs @@ -1,4 +1,4 @@ -use std::io::{Error, Read, Write}; +use std::io::{Error, ErrorKind, Read, Write}; use std::num::NonZeroI32; use pumpkin_data::item::{BedrockItem, JavaToBedrockItemMapping}; @@ -47,8 +47,14 @@ impl PacketRead for NetworkItemDescriptor { let block_runtime_id = VarInt(VarUInt::read(buf)?.0 as i32); - let user_data_len = VarUInt::read(buf)?.0; - let mut user_data = vec![0u8; user_data_len as usize]; + let user_data_len = VarUInt::read(buf)?.0 as usize; + if user_data_len > 1_048_576 { + return Err(Error::new( + ErrorKind::InvalidData, + "user_data_len exceeds 1MB limit", + )); + } + let mut user_data = vec![0u8; user_data_len]; buf.read_exact(&mut user_data)?; let (nbt_data, place_on_blocks, destroy_blocks, shield_blocking_tick) = @@ -193,8 +199,14 @@ impl PacketRead for ItemStackWrapper { let block_runtime_id = VarInt(VarUInt::read(buf)?.0 as i32); - let user_data_len = VarUInt::read(buf)?.0; - let mut user_data = vec![0u8; user_data_len as usize]; + let user_data_len = VarUInt::read(buf)?.0 as usize; + if user_data_len > 1_048_576 { + return Err(Error::new( + ErrorKind::InvalidData, + "user_data_len exceeds 1MB limit", + )); + } + let mut user_data = vec![0u8; user_data_len]; buf.read_exact(&mut user_data)?; let (nbt_data, place_on_blocks, destroy_blocks, shield_blocking_tick) = @@ -285,8 +297,14 @@ impl PacketRead for NetworkItemStackDescriptor { let block_runtime_id = VarUInt::read(buf)?; - let extra_data_len = VarUInt::read(buf)?.0; - let mut extra_data = vec![0u8; extra_data_len as usize]; + let extra_data_len = VarUInt::read(buf)?.0 as usize; + if extra_data_len > 1_048_576 { + return Err(Error::new( + ErrorKind::InvalidData, + "extra_data_len exceeds 1MB limit", + )); + } + let mut extra_data = vec![0u8; extra_data_len]; buf.read_exact(&mut extra_data)?; Ok(Self { @@ -513,8 +531,14 @@ impl PacketRead for NetworkItemStack { let aux_value = VarUInt::read(buf)?; let block_runtime_id = VarInt::read(buf)?; - let extra_data_len = VarUInt::read(buf)?.0; - let mut extra_data = vec![0u8; extra_data_len as usize]; + let extra_data_len = VarUInt::read(buf)?.0 as usize; + if extra_data_len > 1_048_576 { + return Err(Error::new( + ErrorKind::InvalidData, + "extra_data_len exceeds 1MB limit", + )); + } + let mut extra_data = vec![0u8; extra_data_len]; buf.read_exact(&mut extra_data)?; Ok(Self { @@ -541,17 +565,24 @@ fn write_user_data_strings(writer: &mut W, values: &[String]) -> Resul fn read_user_data_strings(reader: &mut R) -> Result, Error> { let len = i32::read(reader)?; - if len < 0 { + if !(0..=1024).contains(&len) { return Err(Error::new( std::io::ErrorKind::InvalidData, - "negative item string array length", + "item string array length out of bounds", )); } - let mut values = Vec::with_capacity(len as usize); + let mut values = Vec::with_capacity((len as usize).min(32)); for _ in 0..len { let mut length = [0; 2]; reader.read_exact(&mut length)?; - let mut bytes = vec![0; usize::from(u16::from_be_bytes(length))]; + let str_len = usize::from(u16::from_be_bytes(length)); + if str_len > 32767 { + return Err(Error::new( + std::io::ErrorKind::InvalidData, + "item string too long", + )); + } + let mut bytes = vec![0; str_len]; reader.read_exact(&mut bytes)?; values.push( String::from_utf8(bytes) diff --git a/crates/pumpkin-protocol/src/bedrock/server/client_cache_blob_status.rs b/crates/pumpkin-protocol/src/bedrock/server/client_cache_blob_status.rs index 32d00b417..344807501 100644 --- a/crates/pumpkin-protocol/src/bedrock/server/client_cache_blob_status.rs +++ b/crates/pumpkin-protocol/src/bedrock/server/client_cache_blob_status.rs @@ -13,7 +13,13 @@ pub struct SClientCacheBlobStatus { impl PacketRead for SClientCacheBlobStatus { fn read(reader: &mut R) -> Result { let miss_count = VarUInt::read(reader)?.0 as usize; - let mut miss_hashes = Vec::with_capacity(miss_count); + if miss_count > 4096 { + return Err(Error::new( + std::io::ErrorKind::InvalidData, + "miss_count exceeds limit", + )); + } + let mut miss_hashes = Vec::with_capacity(miss_count.min(256)); for _ in 0..miss_count { let mut bytes = [0u8; 8]; reader.read_exact(&mut bytes)?; @@ -21,7 +27,13 @@ impl PacketRead for SClientCacheBlobStatus { } let hit_count = VarUInt::read(reader)?.0 as usize; - let mut hit_hashes = Vec::with_capacity(hit_count); + if hit_count > 4096 { + return Err(Error::new( + std::io::ErrorKind::InvalidData, + "hit_count exceeds limit", + )); + } + let mut hit_hashes = Vec::with_capacity(hit_count.min(256)); for _ in 0..hit_count { let mut bytes = [0u8; 8]; reader.read_exact(&mut bytes)?; diff --git a/crates/pumpkin-protocol/src/bedrock/server/item_stack_request.rs b/crates/pumpkin-protocol/src/bedrock/server/item_stack_request.rs index d0ff018cf..3af74a2a2 100644 --- a/crates/pumpkin-protocol/src/bedrock/server/item_stack_request.rs +++ b/crates/pumpkin-protocol/src/bedrock/server/item_stack_request.rs @@ -53,6 +53,12 @@ impl PacketRead for StackRequestItem { let count = i16::read(reader)? as u16; let block_runtime_id = VarUInt::read(reader)?; let data_len = VarUInt::read(reader)?.0 as usize; + if data_len > 1_048_576 { + return Err(Error::new( + ErrorKind::InvalidData, + "extra_data length exceeds limit", + )); + } let mut extra_data = vec![0; data_len]; reader.read_exact(&mut extra_data)?; Ok(Self { diff --git a/crates/pumpkin-protocol/src/bedrock/server/player_auth_input.rs b/crates/pumpkin-protocol/src/bedrock/server/player_auth_input.rs index 4d06838e7..aeaecb48c 100644 --- a/crates/pumpkin-protocol/src/bedrock/server/player_auth_input.rs +++ b/crates/pumpkin-protocol/src/bedrock/server/player_auth_input.rs @@ -94,7 +94,13 @@ impl PacketRead for SPlayerAuthInput { // 3. Block Actions let block_actions = if bool::read(reader)? && bool::read(reader)? { let count = VarUInt::read(reader)?.0 as usize; - let mut actions = Vec::with_capacity(count); + if count > 1024 { + return Err(Error::new( + ErrorKind::InvalidData, + "block_actions count exceeds limit", + )); + } + let mut actions = Vec::with_capacity(count.min(64)); for _ in 0..count { actions.push(PlayerBlockAction::read(reader)?); } @@ -155,7 +161,14 @@ impl PacketRead for PlayerInventoryAction { let legacy_request_id = VarInt::read(buf)?; let mut legacy_slots = Vec::new(); if bool::read(buf)? && legacy_request_id.0 < -1 && (legacy_request_id.0 & 1) == 0 { - let slots_len = VarUInt::read(buf)?.0; + let slots_len = VarUInt::read(buf)?.0 as usize; + if slots_len > 1024 { + return Err(Error::new( + ErrorKind::InvalidData, + "slots_len exceeds limit", + )); + } + legacy_slots.reserve(slots_len.min(64)); for _ in 0..slots_len { legacy_slots.push( crate::bedrock::server::inventory_transaction::LegacySetItemSlot::read(buf)?, @@ -164,8 +177,14 @@ impl PacketRead for PlayerInventoryAction { } let mut actions = Vec::new(); if bool::read(buf)? && bool::read(buf)? { - let actions_len = VarUInt::read(buf)?.0; - actions.reserve(actions_len as usize); + let actions_len = VarUInt::read(buf)?.0 as usize; + if actions_len > 1024 { + return Err(Error::new( + ErrorKind::InvalidData, + "actions_len exceeds limit", + )); + } + actions.reserve(actions_len.min(64)); for _ in 0..actions_len { actions.push( crate::bedrock::server::inventory_transaction::InventoryAction::read(buf)?, diff --git a/crates/pumpkin-protocol/src/bedrock/server/resource_pack_response.rs b/crates/pumpkin-protocol/src/bedrock/server/resource_pack_response.rs index df81c4eae..6b009a4a2 100644 --- a/crates/pumpkin-protocol/src/bedrock/server/resource_pack_response.rs +++ b/crates/pumpkin-protocol/src/bedrock/server/resource_pack_response.rs @@ -13,12 +13,22 @@ pub struct SResourcePackResponse { impl PacketRead for SResourcePackResponse { fn read(reader: &mut R) -> Result { let encoded_status = VarUInt::read(reader)?.0; - let response = u8::try_from(encoded_status + 1) - .map_err(|_| Error::new(ErrorKind::InvalidData, "resource pack status is too large"))?; + let response = encoded_status + .checked_add(1) + .and_then(|v| u8::try_from(v).ok()) + .ok_or_else(|| { + Error::new(ErrorKind::InvalidData, "resource pack status is too large") + })?; let _status_name = String::read(reader)?; let pack_ids = if response == Self::STATUS_SEND_PACKS { let count = VarUInt::read(reader)?.0; + if count > 1024 { + return Err(Error::new( + ErrorKind::InvalidData, + "too many resource pack identifiers", + )); + } (0..count) .map(|_| String::read(reader)) .collect::, _>>()? diff --git a/crates/pumpkin-protocol/src/codec/data_component.rs b/crates/pumpkin-protocol/src/codec/data_component.rs index d49137878..9f0e65343 100644 --- a/crates/pumpkin-protocol/src/codec/data_component.rs +++ b/crates/pumpkin-protocol/src/codec/data_component.rs @@ -578,22 +578,32 @@ impl DataComponentCodec for PotionContentsImpl { } } -/// Helper to skip hidden effect parameters recursively +/// Helper to skip hidden effect parameters iteratively with a depth cap fn skip_effect_parameters(seq: &mut impl NetworkReadExt) -> Result<(), ReadingError> { - // amplifier - seq.get_var_int()?; - // duration - seq.get_var_int()?; - // ambient - seq.get_bool()?; - // show_particles - seq.get_bool()?; - // show_icon - seq.get_bool()?; - // has_hidden (recursive) - let has_hidden = seq.get_bool()?; - if has_hidden { - skip_effect_parameters(seq)?; + const MAX_EFFECT_DEPTH: usize = 32; + let mut depth = 0; + loop { + // amplifier + seq.get_var_int()?; + // duration + seq.get_var_int()?; + // ambient + seq.get_bool()?; + // show_particles + seq.get_bool()?; + // show_icon + seq.get_bool()?; + // has_hidden + let has_hidden = seq.get_bool()?; + if !has_hidden { + break; + } + depth += 1; + if depth > MAX_EFFECT_DEPTH { + return Err(ReadingError::TooLarge( + "Potion effect hidden depth exceeded".into(), + )); + } } Ok(()) } diff --git a/crates/pumpkin-protocol/src/codec/item_stack_seralizer.rs b/crates/pumpkin-protocol/src/codec/item_stack_seralizer.rs index 67102aa4c..72bee4f04 100644 --- a/crates/pumpkin-protocol/src/codec/item_stack_seralizer.rs +++ b/crates/pumpkin-protocol/src/codec/item_stack_seralizer.rs @@ -109,6 +109,9 @@ fn read_length_prefixed_component( let byte_len: usize = byte_len .try_into() .map_err(|_| ReadingError::Message("Negative component data length".into()))?; + if byte_len > crate::MAX_PACKET_DATA_SIZE { + return Err(ReadingError::TooLarge("Component data too large".into())); + } let component_impl = if byte_len <= 256 { let mut stack_buf = [0u8; 256]; diff --git a/crates/pumpkin-protocol/src/java/server/play/client_tick_end.rs b/crates/pumpkin-protocol/src/java/server/play/client_tick_end.rs index 6a122c2f1..3d757f176 100644 --- a/crates/pumpkin-protocol/src/java/server/play/client_tick_end.rs +++ b/crates/pumpkin-protocol/src/java/server/play/client_tick_end.rs @@ -1,5 +1,16 @@ +use crate::{ServerPacket, ser::ReadingError}; use pumpkin_data::packet::serverbound::PLAY_CLIENT_TICK_END; use pumpkin_macros::java_packet; +use pumpkin_util::version::JavaMinecraftVersion; #[java_packet(PLAY_CLIENT_TICK_END)] pub struct SClientTickEnd; + +impl<'a> ServerPacket<'a> for SClientTickEnd { + fn read( + _bytebuf: &mut &'a [u8], + _protocol_version: &JavaMinecraftVersion, + ) -> Result { + Ok(Self) + } +} diff --git a/crates/pumpkin-protocol/src/java/server/play/player_session.rs b/crates/pumpkin-protocol/src/java/server/play/player_session.rs index 13ab4169e..469d3d007 100644 --- a/crates/pumpkin-protocol/src/java/server/play/player_session.rs +++ b/crates/pumpkin-protocol/src/java/server/play/player_session.rs @@ -21,11 +21,19 @@ impl<'a> ServerPacket<'a> for SPlayerSession { let session_id = read.get_uuid()?; let expires_at = read.get_i64_be()?; - let public_key_length = read.get_var_int()?.0 as usize; + let public_key_length = usize::try_from(read.get_var_int()?.0) + .map_err(|_| ReadingError::Message("Negative public key length".into()))?; + if public_key_length > 2048 { + return Err(ReadingError::TooLarge("Public key too long".into())); + } let mut public_key = vec![0u8; public_key_length]; read.read_bytes_to_buf(&mut public_key)?; - let key_signature_length = read.get_var_int()?.0 as usize; + let key_signature_length = usize::try_from(read.get_var_int()?.0) + .map_err(|_| ReadingError::Message("Negative key signature length".into()))?; + if key_signature_length > 4096 { + return Err(ReadingError::TooLarge("Key signature too long".into())); + } let mut key_signature = vec![0u8; key_signature_length]; read.read_bytes_to_buf(&mut key_signature)?; diff --git a/crates/pumpkin-protocol/src/lib.rs b/crates/pumpkin-protocol/src/lib.rs index bc6703a52..c6c9f071e 100644 --- a/crates/pumpkin-protocol/src/lib.rs +++ b/crates/pumpkin-protocol/src/lib.rs @@ -29,6 +29,7 @@ pub mod java; pub mod packet; #[cfg(feature = "query")] pub mod query; +pub mod rcon; pub mod ser; pub mod serial; diff --git a/crates/pumpkin/src/net/rcon/packet.rs b/crates/pumpkin-protocol/src/rcon.rs similarity index 97% rename from crates/pumpkin/src/net/rcon/packet.rs rename to crates/pumpkin-protocol/src/rcon.rs index 1fdea79a7..0a54e96ba 100644 --- a/crates/pumpkin/src/net/rcon/packet.rs +++ b/crates/pumpkin-protocol/src/rcon.rs @@ -35,7 +35,6 @@ pub enum ClientboundPacket { impl ClientboundPacket { #[must_use] pub fn write_buf(self, id: i32, body: &str) -> BytesMut { - // let len = outgoing.len() as u64; let mut buf = BytesMut::new(); // 10 is for 4 bytes ty, 4 bytes id, and 2 terminating nul bytes. buf.put_i32_le(10 + body.len() as i32); @@ -53,9 +52,9 @@ impl ClientboundPacket { pub enum PacketError { #[error("Invalid length")] InvalidLength, - #[error("Dailed to send packet")] + #[error("Failed to send packet")] FailedSend(std::io::Error), - #[error("Missing packet lull terminator")] + #[error("Missing packet null terminator")] MissingNullTerminator, #[error("Invalid packet string body")] InvalidBody(std::str::Utf8Error), diff --git a/crates/pumpkin-protocol/src/ser/mod.rs b/crates/pumpkin-protocol/src/ser/mod.rs index 5c7b24c9d..3f9c46208 100644 --- a/crates/pumpkin-protocol/src/ser/mod.rs +++ b/crates/pumpkin-protocol/src/ser/mod.rs @@ -105,7 +105,7 @@ pub trait NetworkReadExt { fn get_str_bounded(&mut self, bound: usize) -> Result, ReadingError>; #[inline] fn get_str(&mut self) -> Result, ReadingError> { - self.get_str_bounded(i32::MAX as usize) + self.get_str_bounded(32767) } fn get_uuid(&mut self) -> Result; fn get_fixed_bitset(&mut self, bits: usize) -> Result; @@ -164,7 +164,7 @@ pub trait NetworkReadSliceExt<'a> { #[inline] fn get_cow_str_borrowed(&mut self) -> Result, ReadingError> { - self.get_cow_str_bounded_borrowed(i32::MAX as usize) + self.get_cow_str_bounded_borrowed(32767) } #[inline] @@ -203,7 +203,7 @@ impl<'a> NetworkReadSliceExt<'a> for &'a [u8] { fn get_str_bounded_borrowed(&mut self, bound: usize) -> Result<&'a str, ReadingError> { let bytes_len = self.get_var_uint()?.0 as usize; - let maximum_utf8_bytes = bound.saturating_mul(3); + let maximum_utf8_bytes = bound.saturating_mul(3).min(crate::MAX_PACKET_DATA_SIZE); if bytes_len > maximum_utf8_bytes { return Err(ReadingError::TooLarge(format!( "string has too many bytes ({bytes_len} > {maximum_utf8_bytes})" @@ -225,7 +225,7 @@ impl<'a> NetworkReadSliceExt<'a> for &'a [u8] { #[inline] fn get_str_borrowed(&mut self) -> Result<&'a str, ReadingError> { - self.get_str_bounded_borrowed(i32::MAX as usize) + self.get_str_bounded_borrowed(32767) } } @@ -314,7 +314,7 @@ impl NetworkReadExt for R { // First, check if there are too many bytes to even fit in the UTF-16 bound. // 1 Java `char` takes a maximum of 3 bytes in UTF-8: - let maximum_utf8_bytes = bound.saturating_mul(3); + let maximum_utf8_bytes = bound.saturating_mul(3).min(crate::MAX_PACKET_DATA_SIZE); if bytes_len > maximum_utf8_bytes { return Err(ReadingError::TooLarge(format!( "string has too many bytes ({bytes_len} > {maximum_utf8_bytes})" diff --git a/crates/pumpkin-protocol/src/serial/deserializer.rs b/crates/pumpkin-protocol/src/serial/deserializer.rs index 0702479d4..2ad29d0d0 100644 --- a/crates/pumpkin-protocol/src/serial/deserializer.rs +++ b/crates/pumpkin-protocol/src/serial/deserializer.rs @@ -172,8 +172,14 @@ impl PacketRead for String { impl PacketRead for Vec { fn read(reader: &mut R) -> Result { - let len = VarUInt::read(reader)?.0 as _; - let mut buf = Self::with_capacity(len); + let len = VarUInt::read(reader)?.0 as usize; + if len > 65536 { + return Err(Error::new( + ErrorKind::InvalidData, + format!("Vector length {len} exceeds limit of 65536"), + )); + } + let mut buf = Self::with_capacity(len.min(1024)); for _ in 0..len { buf.push(T::read(reader)?); } diff --git a/crates/pumpkin/Cargo.toml b/crates/pumpkin/Cargo.toml index 8c1e941e4..ccda31dfb 100644 --- a/crates/pumpkin/Cargo.toml +++ b/crates/pumpkin/Cargo.toml @@ -72,8 +72,8 @@ rsa.workspace = true # verification & WASM parsing ed25519-dalek.workspace = true hex.workspace = true -wasmparser = "0.255" -wasm-encoder = "0.255" +wasmparser = "0.256" +wasm-encoder = "0.256" # authentication ureq = { workspace = true, features = ["json"] } diff --git a/crates/pumpkin/src/net/authentication.rs b/crates/pumpkin/src/net/authentication.rs index d8b65b21b..4c10765d4 100644 --- a/crates/pumpkin/src/net/authentication.rs +++ b/crates/pumpkin/src/net/authentication.rs @@ -47,7 +47,7 @@ pub struct MojangPublicKeys { } const MOJANG_AUTHENTICATION_URL: &str = "https://sessionserver.mojang.com/session/minecraft/hasJoined?username={username}&serverId={server_hash}"; -const MOJANG_PREVENT_PROXY_AUTHENTICATION_URL: &str = "https://sessionserver.mojang.com/session/minecraft/hasJoined?username={username}&serverId={server_hash}"; +const MOJANG_PREVENT_PROXY_AUTHENTICATION_URL: &str = "https://sessionserver.mojang.com/session/minecraft/hasJoined?username={username}&serverId={server_hash}&ip={ip}"; const MOJANG_SERVICES_URL: &str = "https://api.minecraftservices.com/"; const MOJANG_PROFILE_BY_NAME_URL: &str = "https://api.mojang.com/users/profiles/minecraft/{username}"; diff --git a/crates/pumpkin/src/net/bedrock/mod.rs b/crates/pumpkin/src/net/bedrock/mod.rs index 7987e0ba9..a268f70f5 100644 --- a/crates/pumpkin/src/net/bedrock/mod.rs +++ b/crates/pumpkin/src/net/bedrock/mod.rs @@ -811,7 +811,7 @@ impl BedrockClient { Ok(packet) => Some(packet), Err(err) => { if !matches!(err, PacketDecodeError::ConnectionClosed) { - warn!("Failed to decode packet from client: {err}"); + debug!("Failed to decode packet from client: {err}"); let text = format!("Error while reading incoming packet {err}"); self.kick(DisconnectReason::BadPacket, text).await; } diff --git a/crates/pumpkin/src/net/java/mod.rs b/crates/pumpkin/src/net/java/mod.rs index c55f20e11..a69d41167 100644 --- a/crates/pumpkin/src/net/java/mod.rs +++ b/crates/pumpkin/src/net/java/mod.rs @@ -411,7 +411,7 @@ impl JavaClient { Ok(packet) => Some(packet), Err(err) => { if !matches!(err, PacketDecodeError::ConnectionClosed) { - warn!("Failed to decode packet from client {}: {}", self.id, err); + debug!("Failed to decode packet from client {}: {}", self.id, err); let text = format!("Error while reading incoming packet {err}"); self.kick(TextComponent::text(text)).await; } diff --git a/crates/pumpkin/src/net/java/pending.rs b/crates/pumpkin/src/net/java/pending.rs index f050b704f..e3b05b114 100644 --- a/crates/pumpkin/src/net/java/pending.rs +++ b/crates/pumpkin/src/net/java/pending.rs @@ -125,7 +125,7 @@ impl PendingConnection { Ok(packet) => Some(packet), Err(err) => { if !matches!(err, PacketDecodeError::ConnectionClosed) { - warn!("Failed to decode packet from client {}: {}", self.id, err); + debug!("Failed to decode packet from client {}: {}", self.id, err); let text = format!("Error while reading incoming packet {err}"); self.kick(TextComponent::text(text)).await; } diff --git a/crates/pumpkin/src/net/proxy/velocity.rs b/crates/pumpkin/src/net/proxy/velocity.rs index ba9f5e998..e63d9eac4 100644 --- a/crates/pumpkin/src/net/proxy/velocity.rs +++ b/crates/pumpkin/src/net/proxy/velocity.rs @@ -65,6 +65,9 @@ pub async fn velocity_login(connection: &mut PendingConnection) { #[must_use] pub fn check_integrity(data: (&[u8], &[u8]), secret: &str) -> bool { + if secret.is_empty() { + return false; + } let (signature, data_without_signature) = data; // Our fault, we can panic/expect? let Ok(mut mac) = HmacSha256::new_from_slice(secret.as_bytes()) else { diff --git a/crates/pumpkin/src/net/rcon/mod.rs b/crates/pumpkin/src/net/rcon/mod.rs index d64fdf087..fdec1b578 100644 --- a/crates/pumpkin/src/net/rcon/mod.rs +++ b/crates/pumpkin/src/net/rcon/mod.rs @@ -12,12 +12,19 @@ use tracing::{debug, error, info}; use crate::command::CommandSender; use crate::{SHOULD_STOP, STOP_INTERRUPT, server::Server}; -pub mod packet; +pub use pumpkin_protocol::rcon as packet; pub struct RCONServer; impl RCONServer { pub async fn run(config: &RCONConfig, server: Arc) { + if config.password.trim().is_empty() { + error!( + "RCON is enabled but password is empty! Refusing to start RCON server for security." + ); + return; + } + let listener = match tokio::net::TcpListener::bind(config.address).await { Ok(l) => l, Err(e) => { @@ -109,7 +116,7 @@ impl RCONClient { let config = &server.advanced_config.networking.rcon; match packet.get_type() { ServerboundPacket::Auth => { - if packet.get_body() == password { + if !password.is_empty() && packet.get_body() == password { self.send(ClientboundPacket::AuthResponse, packet.get_id(), "") .await?; if config.logging.logged_successfully { diff --git a/tools/pumpkin-fuzzer/Cargo.toml b/tools/pumpkin-fuzzer/Cargo.toml new file mode 100644 index 000000000..4e32f5adc --- /dev/null +++ b/tools/pumpkin-fuzzer/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "pumpkin-fuzzer" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true + +[dependencies] +pumpkin-protocol.workspace = true +pumpkin-util.workspace = true +tokio = { workspace = true, features = ["full"] } +clap = { version = "4", features = ["derive"] } +colored.workspace = true +bytes.workspace = true +rand = "0.9" + +[lints.clippy] +expect_used = "allow" +unwrap_used = "allow" +panic = "allow" +pedantic = { level = "allow", priority = -1 } +all = { level = "allow", priority = -1 } diff --git a/tools/pumpkin-fuzzer/src/main.rs b/tools/pumpkin-fuzzer/src/main.rs new file mode 100644 index 000000000..7cd3c9c9b --- /dev/null +++ b/tools/pumpkin-fuzzer/src/main.rs @@ -0,0 +1,385 @@ +use clap::{Parser, ValueEnum}; +use colored::Colorize; +use rand::Rng; +use std::{ + net::SocketAddr, + sync::{ + Arc, + atomic::{AtomicBool, AtomicU64, Ordering}, + }, + time::{Duration, Instant}, +}; +use tokio::{ + io::{AsyncReadExt, AsyncWriteExt}, + net::TcpStream, + time::timeout, +}; + +#[derive(ValueEnum, Clone, Copy, Debug, PartialEq, Eq)] +enum FuzzMode { + All, + Raw, + Framed, + Stateful, + CorruptVarint, +} + +#[derive(Parser, Debug)] +#[command(author, version, about = "Pumpkin Server Network Packet Fuzzer & Stress Tool", long_about = None)] +struct Args { + /// Target server host + #[arg(long, default_value = "127.0.0.1")] + host: String, + + /// Target server port + #[arg(short, long, default_value_t = 25565)] + port: u16, + + /// Number of concurrent async fuzz worker tasks + #[arg(short, long, default_value_t = 8)] + concurrency: usize, + + /// Duration to fuzz in seconds + #[arg(short, long, default_value_t = 30)] + duration: u64, + + /// Fuzzing mode + #[arg(short, long, value_enum, default_value_t = FuzzMode::All)] + mode: FuzzMode, +} + +#[derive(Default)] +struct Stats { + connections: AtomicU64, + packets_sent: AtomicU64, + bytes_sent: AtomicU64, + server_closes: AtomicU64, + errors: AtomicU64, +} + +fn encode_var_int(val: i32, buf: &mut Vec) { + let mut uval = val as u32; + loop { + let mut byte = (uval & 0x7F) as u8; + uval >>= 7; + if uval != 0 { + byte |= 0x80; + } + buf.push(byte); + if uval == 0 { + break; + } + } +} + +fn encode_packet(packet_id: i32, payload: &[u8]) -> Vec { + let mut id_buf = Vec::new(); + encode_var_int(packet_id, &mut id_buf); + let total_len = id_buf.len() + payload.len(); + let mut out = Vec::new(); + encode_var_int(total_len as i32, &mut out); + out.extend_from_slice(&id_buf); + out.extend_from_slice(payload); + out +} + +fn make_handshake_packet(next_state: i32) -> Vec { + let mut payload = Vec::new(); + encode_var_int(769, &mut payload); // Protocol version 769 (1.21.4) + let addr = b"127.0.0.1"; + encode_var_int(addr.len() as i32, &mut payload); + payload.extend_from_slice(addr); + payload.extend_from_slice(&25565u16.to_be_bytes()); + encode_var_int(next_state, &mut payload); + encode_packet(0x00, &payload) +} + +async fn check_server_alive(addr: SocketAddr) -> bool { + let Ok(Ok(mut stream)) = timeout(Duration::from_millis(1500), TcpStream::connect(addr)).await + else { + return false; + }; + + let handshake = make_handshake_packet(1); // Status state + if stream.write_all(&handshake).await.is_err() { + return false; + } + + let status_req = encode_packet(0x00, &[]); + if stream.write_all(&status_req).await.is_err() { + return false; + } + + let mut buf = [0u8; 1024]; + matches!( + timeout(Duration::from_millis(1500), stream.read(&mut buf)).await, + Ok(Ok(n)) if n > 0 + ) +} + +async fn fuzz_worker( + target_addr: SocketAddr, + mode: FuzzMode, + stop: Arc, + stats: Arc, +) { + while !stop.load(Ordering::Relaxed) { + let stream_result = + timeout(Duration::from_millis(1500), TcpStream::connect(target_addr)).await; + let mut stream = match stream_result { + Ok(Ok(s)) => { + stats.connections.fetch_add(1, Ordering::Relaxed); + s + } + _ => { + stats.errors.fetch_add(1, Ordering::Relaxed); + tokio::time::sleep(Duration::from_millis(10)).await; + continue; + } + }; + + let selected_mode = match mode { + FuzzMode::All => match rand::rng().random_range(0..4) { + 0 => FuzzMode::Stateful, + 1 => FuzzMode::Framed, + 2 => FuzzMode::CorruptVarint, + _ => FuzzMode::Raw, + }, + other => other, + }; + + let res: Result<(), tokio::io::Error> = async { + match selected_mode { + FuzzMode::Stateful => { + let next_state = match rand::rng().random_range(0..3) { + 0 => 1, // Status + 1 => 2, // Login + _ => 7, // Config + }; + let handshake = make_handshake_packet(next_state); + stream.write_all(&handshake).await?; + stats.packets_sent.fetch_add(1, Ordering::Relaxed); + stats + .bytes_sent + .fetch_add(handshake.len() as u64, Ordering::Relaxed); + + let count = rand::rng().random_range(10..40); + for _ in 0..count { + if stop.load(Ordering::Relaxed) { + break; + } + let (frame, sleep_ms) = { + let mut rng = rand::rng(); + let pkt_id = rng.random_range(0..0x60); + let pkt_len = rng.random_range(0..512); + let mut payload = vec![0u8; pkt_len]; + rng.fill(&mut payload[..]); + (encode_packet(pkt_id, &payload), rng.random_range(1..5)) + }; + stream.write_all(&frame).await?; + stats.packets_sent.fetch_add(1, Ordering::Relaxed); + stats + .bytes_sent + .fetch_add(frame.len() as u64, Ordering::Relaxed); + tokio::time::sleep(Duration::from_millis(sleep_ms)).await; + } + } + FuzzMode::Framed => { + let count = rand::rng().random_range(5..30); + for _ in 0..count { + if stop.load(Ordering::Relaxed) { + break; + } + let (frame, sleep_ms) = { + let mut rng = rand::rng(); + let pkt_id = rng.random_range(0..255); + let pkt_len = rng.random_range(0..2048); + let mut payload = vec![0u8; pkt_len]; + rng.fill(&mut payload[..]); + (encode_packet(pkt_id, &payload), rng.random_range(1..4)) + }; + stream.write_all(&frame).await?; + stats.packets_sent.fetch_add(1, Ordering::Relaxed); + stats + .bytes_sent + .fetch_add(frame.len() as u64, Ordering::Relaxed); + tokio::time::sleep(Duration::from_millis(sleep_ms)).await; + } + } + FuzzMode::CorruptVarint => { + let count = rand::rng().random_range(5..20); + for _ in 0..count { + if stop.load(Ordering::Relaxed) { + break; + } + let bad_varint = { + let mut rng = rand::rng(); + let byte_count = rng.random_range(5..10); + let mut v = Vec::with_capacity(byte_count + 64); + for _ in 0..byte_count { + v.push(0x80 | rng.random_range(0..128)); + } + let extra_len = rng.random_range(10..100); + let mut extra = vec![0u8; extra_len]; + rng.fill(&mut extra[..]); + v.extend_from_slice(&extra); + v + }; + + stream.write_all(&bad_varint).await?; + stats.packets_sent.fetch_add(1, Ordering::Relaxed); + stats + .bytes_sent + .fetch_add(bad_varint.len() as u64, Ordering::Relaxed); + } + } + FuzzMode::Raw | FuzzMode::All => { + let count = rand::rng().random_range(5..20); + for _ in 0..count { + if stop.load(Ordering::Relaxed) { + break; + } + let (chunk, sleep_ms) = { + let mut rng = rand::rng(); + let chunk_len = rng.random_range(1..4096); + let mut c = vec![0u8; chunk_len]; + rng.fill(&mut c[..]); + (c, rng.random_range(1..5)) + }; + stream.write_all(&chunk).await?; + stats.packets_sent.fetch_add(1, Ordering::Relaxed); + stats + .bytes_sent + .fetch_add(chunk.len() as u64, Ordering::Relaxed); + tokio::time::sleep(Duration::from_millis(sleep_ms)).await; + } + } + } + Ok(()) + } + .await; + + if res.is_ok() { + stats.server_closes.fetch_add(1, Ordering::Relaxed); + } else { + stats.errors.fetch_add(1, Ordering::Relaxed); + } + + let sleep_ms = rand::rng().random_range(5..30); + tokio::time::sleep(Duration::from_millis(sleep_ms)).await; + } +} + +#[tokio::main] +async fn main() { + let args = Args::parse(); + let addr_str = format!("{}:{}", args.host, args.port); + let target_addr: SocketAddr = match addr_str.parse() { + Ok(a) => a, + Err(e) => { + eprintln!( + "{} Failed to parse address '{}': {}", + "Error:".red().bold(), + addr_str, + e + ); + std::process::exit(1); + } + }; + + println!( + "{}", + "=== Pumpkin Server Network Packet Fuzzer ===".cyan().bold() + ); + println!("{:<15} {}", "Target:".bold(), addr_str.yellow()); + println!("{:<15} {}", "Concurrency:".bold(), args.concurrency); + println!("{:<15} {}s", "Duration:".bold(), args.duration); + println!("{:<15} {:?}", "Mode:".bold(), args.mode); + println!( + "{}", + "-------------------------------------------------".dimmed() + ); + + print!("Probing target server... "); + if check_server_alive(target_addr).await { + println!("{}", "ONLINE (Responding to status pings)".green().bold()); + } else { + println!( + "{}", + "UNRESPONSIVE / OFFLINE (will proceed with test)" + .yellow() + .bold() + ); + } + + let stats = Arc::new(Stats::default()); + let stop = Arc::new(AtomicBool::new(false)); + + let mut handles = Vec::new(); + for _ in 0..args.concurrency { + let handle = tokio::spawn(fuzz_worker( + target_addr, + args.mode, + stop.clone(), + stats.clone(), + )); + handles.push(handle); + } + + let start = Instant::now(); + let duration = Duration::from_secs(args.duration); + + while start.elapsed() < duration { + tokio::time::sleep(Duration::from_secs(1)).await; + let elapsed = start.elapsed().as_secs(); + let conns = stats.connections.load(Ordering::Relaxed); + let pkts = stats.packets_sent.load(Ordering::Relaxed); + let bytes = stats.bytes_sent.load(Ordering::Relaxed); + let closes = stats.server_closes.load(Ordering::Relaxed); + let errs = stats.errors.load(Ordering::Relaxed); + let rate_kb = (bytes as f64 / elapsed.max(1) as f64) / 1024.0; + + println!( + "[{:3}s] Conns: {:5} | Packets: {:6} | Data: {:7.1} KB ({:6.1} KB/s) | Closes: {:4} | Resets/Timeouts: {:4}", + elapsed, + conns, + pkts, + bytes as f64 / 1024.0, + rate_kb, + closes, + errs + ); + } + + stop.store(true, Ordering::Relaxed); + for h in handles { + let _ = h.await; + } + + println!( + "{}", + "-------------------------------------------------".dimmed() + ); + let conns = stats.connections.load(Ordering::Relaxed); + let pkts = stats.packets_sent.load(Ordering::Relaxed); + let bytes = stats.bytes_sent.load(Ordering::Relaxed); + let closes = stats.server_closes.load(Ordering::Relaxed); + let errs = stats.errors.load(Ordering::Relaxed); + + println!("{}", "Fuzzing Session Complete:".green().bold()); + println!(" Total Connections: {}", conns); + println!(" Total Packets Sent: {}", pkts); + println!(" Total Data Sent: {:.2} KB", bytes as f64 / 1024.0); + println!(" Server Normal Drops: {}", closes); + println!(" Connection Resets: {}", errs); + + print!("\nVerifying server health post-fuzzing... "); + if check_server_alive(target_addr).await { + println!( + "{}", + "SUCCESS: Server is alive and responsive!".green().bold() + ); + } else { + println!("{}", "WARNING: Server did not respond to post-fuzz query. Check server logs for any crash or hang.".red().bold()); + } +}