diff --git a/.claude/commands/fuzz-check.md b/.claude/commands/fuzz-check.md index 1e8e53c..3338bc3 100644 --- a/.claude/commands/fuzz-check.md +++ b/.claude/commands/fuzz-check.md @@ -18,7 +18,7 @@ if [ ! -d "fuzz" ]; then echo "Run Sprint 5.7 setup to initialize fuzzing." echo "" echo "Quick setup:" - echo " cargo install cargo-fuzz" + echo " cargo install cargo-fuzz --version 0.13.2 --locked" echo " cargo +nightly fuzz init" exit 1 fi diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index 8a94ab1..ecb14fc 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -35,7 +35,7 @@ jobs: fetch-depth: 0 # Full history for baseline comparison - name: Setup Rust toolchain - uses: actions-rust-lang/setup-rust-toolchain@v1 + uses: actions-rust-lang/setup-rust-toolchain@v2 with: cache: true diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 0e64433..79679eb 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -34,7 +34,7 @@ jobs: uses: actions/checkout@v7 - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: 'rust' # Note: CodeQL Rust extractor has known limitations: @@ -66,7 +66,7 @@ jobs: # These do not indicate code issues (verified by cargo check/clippy) and do not impact security coverage. - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 # Analysis uploads results to GitHub Security tab. # Coverage: ~97% of Rust files successfully extracted (excellent for Rust projects) # Unparsed files: Test code only (assertions, utilities), no production logic affected diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml index 97776ae..c5b8212 100644 --- a/.github/workflows/fuzz.yml +++ b/.github/workflows/fuzz.yml @@ -19,6 +19,11 @@ on: env: RUST_BACKTRACE: 1 + # cargo-fuzz defaults `--target` to the triple its own binary was built + # for. The prebuilt release binary installed below is a static musl build, + # and the address sanitizer cannot link against static musl libc, so the + # target is named explicitly on every build and run. + FUZZ_TARGET_TRIPLE: x86_64-unknown-linux-gnu CARGO_TERM_COLOR: always jobs: @@ -64,21 +69,61 @@ jobs: ${{ runner.os }}-fuzz-target-${{ matrix.target }}- ${{ runner.os }}-fuzz-target- + # Install the prebuilt release binary rather than compiling cargo-fuzz. + # `cargo install cargo-fuzz --version 0.13.1` (no --locked) resolved a + # fresh dependency graph on every run and compiled it with the nightly + # toolchain selected above. From 2026-09 that picked up a `rustix` whose + # nightly-only build path uses `rustc_*` attributes current nightly + # rejects ("attributes starting with `rustc` are reserved"), so every + # scheduled run died in this step before fuzzing anything. A prebuilt + # binary cannot be broken by a nightly compiler change. The version is + # pinned so a cargo-fuzz release is adopted deliberately. - name: Install cargo-fuzz - run: cargo install cargo-fuzz --version 0.13.1 + uses: taiki-e/install-action@v2 + with: + tool: cargo-fuzz@0.13.2 + + - name: Validate duration input + env: + DURATION_INPUT: ${{ github.event.inputs.duration || '600' }} + run: | + # Zero is rejected too: libFuzzer reads -max_total_time=0 as "no + # limit", so the run would only end at the outer timeout backstop. + case "$DURATION_INPUT" in + ''|*[!0-9]*|0|0*) + echo "::error::duration must be a positive whole number of seconds without leading zeros, got: $DURATION_INPUT" + exit 1 ;; + esac - name: Build fuzz target - run: cargo +nightly fuzz build ${{ matrix.target }} + run: cargo +nightly fuzz build --target "$FUZZ_TARGET_TRIPLE" ${{ matrix.target }} - name: Run fuzzer id: fuzz_run + # The dispatch input reaches the script through the environment, not + # by template expansion into the script text, so it cannot inject + # shell. Its format is checked by "Validate duration input" above, + # which (unlike this step) is not continue-on-error. + env: + DURATION_INPUT: ${{ github.event.inputs.duration || '600' }} run: | - DURATION="${{ github.event.inputs.duration || '600' }}" + DURATION="$DURATION_INPUT" echo "Running ${{ matrix.target }} for ${DURATION} seconds..." + # libFuzzer refuses to start when the -artifact_prefix directory is + # missing ("The required directory ... does not exist"). Before this + # mkdir the fuzzer exited 1 at once on every run, and the job still + # went green -- see "Fail job if the fuzzer did not run" below. + mkdir -p /tmp/fuzzing-artifacts + # Run fuzzer and capture output set +e # Don't fail on fuzzer crashes (we want to capture them) - timeout ${DURATION}s cargo +nightly fuzz run ${{ matrix.target }} -- \ + # pipefail: without it $? is tee's status, always 0, so the fuzzer's + # own exit code was never observed. The outer timeout is a backstop + # with headroom over -max_total_time, so it cannot cut a run that + # libFuzzer is about to finish on its own. + set -o pipefail + timeout "$((DURATION + 300))s" cargo +nightly fuzz run --target "$FUZZ_TARGET_TRIPLE" ${{ matrix.target }} -- \ -max_total_time=${DURATION} \ -print_final_stats=1 \ -print_corpus_stats=1 \ @@ -86,7 +131,17 @@ jobs: -verbosity=1 \ 2>&1 | tee /tmp/fuzz_output.txt EXIT_CODE=$? + set +o pipefail set -e + echo "fuzzer_exit=${EXIT_CODE}" >> "$GITHUB_OUTPUT" + + # -print_final_stats=1 prints these only when libFuzzer ran to + # completion (or crashed). Their absence means it never fuzzed. + if grep -q "stat::number_of_executed_units" /tmp/fuzz_output.txt; then + echo "fuzzer_ran=true" >> "$GITHUB_OUTPUT" + else + echo "fuzzer_ran=false" >> "$GITHUB_OUTPUT" + fi # Parse fuzzing statistics echo "## Fuzzing Statistics for ${{ matrix.target }}" > /tmp/fuzz_stats.txt @@ -155,6 +210,19 @@ jobs: echo "::error::Fuzzing discovered crashes in ${{ matrix.target }}" exit 1 + # "Run fuzzer" is continue-on-error so that a crash still reaches the + # artifact upload above, which also meant a fuzzer that never started + # passed silently. A clean run must have printed its final stats and + # exited 0; anything else that is not a recorded crash fails here. + - name: Fail job if the fuzzer did not run + if: steps.fuzz_run.outputs.crash_found != 'true' && (steps.fuzz_run.outputs.fuzzer_ran != 'true' || steps.fuzz_run.outputs.fuzzer_exit != '0') + env: + FUZZER_RAN: ${{ steps.fuzz_run.outputs.fuzzer_ran }} + FUZZER_EXIT: ${{ steps.fuzz_run.outputs.fuzzer_exit }} + run: | + echo "::error::${{ matrix.target }} did not complete a fuzzing run (stats printed: ${FUZZER_RAN:-unknown}, exit code: ${FUZZER_EXIT:-unknown})" + exit 1 + summary: name: Fuzzing Summary runs-on: ubuntu-latest @@ -163,11 +231,13 @@ jobs: steps: - name: Generate summary + env: + DURATION_INPUT: ${{ github.event.inputs.duration || '600' }} run: | echo "## Fuzzing Run Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Date:** $(date -u +'%Y-%m-%d %H:%M:%S UTC')" >> $GITHUB_STEP_SUMMARY - echo "**Duration:** ${{ github.event.inputs.duration || '600' }} seconds per target" >> $GITHUB_STEP_SUMMARY + echo "**Duration:** ${DURATION_INPUT} seconds per target" >> $GITHUB_STEP_SUMMARY echo "**Trigger:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "All fuzz targets executed. Check individual job outputs for statistics." >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/gemini-dispatch.yml b/.github/workflows/gemini-dispatch.yml index b10bf19..c316055 100644 --- a/.github/workflows/gemini-dispatch.yml +++ b/.github/workflows/gemini-dispatch.yml @@ -73,7 +73,7 @@ jobs: id: 'mint_identity_token' if: |- ${{ vars.APP_ID }} - uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v2 + uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v3.2.0 with: app-id: '${{ vars.APP_ID }}' private-key: '${{ secrets.APP_PRIVATE_KEY }}' @@ -83,7 +83,7 @@ jobs: - name: 'Extract command' id: 'extract_command' - uses: 'actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3' # ratchet:actions/github-script@v7 + uses: 'actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3' # ratchet:actions/github-script@v9.0.0 env: EVENT_TYPE: '${{ github.event_name }}.${{ github.event.action }}' REQUEST: '${{ github.event.comment.body || github.event.review.body || github.event.issue.body }}' @@ -183,7 +183,7 @@ jobs: id: 'mint_identity_token' if: |- ${{ vars.APP_ID }} - uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v2 + uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v3.2.0 with: app-id: '${{ vars.APP_ID }}' private-key: '${{ secrets.APP_PRIVATE_KEY }}' diff --git a/.github/workflows/gemini-invoke.yml b/.github/workflows/gemini-invoke.yml index 518c07e..db224c2 100644 --- a/.github/workflows/gemini-invoke.yml +++ b/.github/workflows/gemini-invoke.yml @@ -29,7 +29,7 @@ jobs: id: 'mint_identity_token' if: |- ${{ vars.APP_ID }} - uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v2 + uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v3.2.0 with: app-id: '${{ vars.APP_ID }}' private-key: '${{ secrets.APP_PRIVATE_KEY }}' diff --git a/.github/workflows/gemini-review.yml b/.github/workflows/gemini-review.yml index 4dfaf4a..4d86038 100644 --- a/.github/workflows/gemini-review.yml +++ b/.github/workflows/gemini-review.yml @@ -30,7 +30,7 @@ jobs: id: 'mint_identity_token' if: |- ${{ vars.APP_ID }} - uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v2 + uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v3.2.0 with: app-id: '${{ vars.APP_ID }}' private-key: '${{ secrets.APP_PRIVATE_KEY }}' @@ -39,7 +39,7 @@ jobs: permission-pull-requests: 'write' - name: 'Checkout repository' - uses: 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1' # ratchet:actions/checkout@v5 + uses: 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1' # ratchet:actions/checkout@v7.0.1 - name: 'Run Gemini pull request review' uses: 'google-github-actions/run-gemini-cli@v0' # ratchet:exclude diff --git a/.github/workflows/gemini-scheduled-triage.yml b/.github/workflows/gemini-scheduled-triage.yml index e09f0d0..1666672 100644 --- a/.github/workflows/gemini-scheduled-triage.yml +++ b/.github/workflows/gemini-scheduled-triage.yml @@ -250,7 +250,7 @@ jobs: id: 'mint_identity_token' if: |- ${{ vars.APP_ID }} - uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v2 + uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v3.2.0 with: app-id: '${{ vars.APP_ID }}' private-key: '${{ secrets.APP_PRIVATE_KEY }}' diff --git a/.github/workflows/gemini-triage.yml b/.github/workflows/gemini-triage.yml index 535b7cf..9d07127 100644 --- a/.github/workflows/gemini-triage.yml +++ b/.github/workflows/gemini-triage.yml @@ -158,7 +158,7 @@ jobs: id: 'mint_identity_token' if: |- ${{ vars.APP_ID }} - uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v2 + uses: 'actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1' # ratchet:actions/create-github-app-token@v3.2.0 with: app-id: '${{ vars.APP_ID }}' private-key: '${{ secrets.APP_PRIVATE_KEY }}' diff --git a/CHANGELOG.md b/CHANGELOG.md index b3df4a8..d1dcb03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -146,6 +146,73 @@ along with every unmaintained/unsound warning. `cargo audit` and valid. Nine tests cover it, including a negative control that walks every byte value and asserts the output contains no illegal code point. +### Fixed (nightly fuzzing) + +- **The scheduled fuzz workflow had failed every night since at least + 2026-09-21 without fuzzing anything.** All five matrix jobs died about 20 s + in, at `cargo install cargo-fuzz --version 0.13.1`. Without `--locked` that + resolved a fresh dependency graph on every run and compiled it with the + nightly toolchain the job selects; from September it picked up a `rustix` + whose nightly-only build path uses `rustc_*` attributes that current nightly + rejects (`attributes starting with rustc are reserved`). Reproduced locally + with nightly 2026-09-23: 0.13.1 unlocked fails exactly so, 0.13.2 `--locked` + builds. CI now installs the prebuilt cargo-fuzz 0.13.2 release binary through + `taiki-e/install-action`, which no compiler change can break; every + maintained manual install line in `docs/` now reads + `cargo install cargo-fuzz --version 0.13.2 --locked`. That binary is a static musl + build, and cargo-fuzz defaults `--target` to its own build triple, where the + address sanitizer cannot link ("sanitizer is incompatible with statically + linked libc"), so the workflow names `x86_64-unknown-linux-gnu` explicitly. + Both the failure and the fix were reproduced locally with the release binary. +- **Even with cargo-fuzz installed, the fuzzers never actually ran, and the job + still went green.** libFuzzer refuses to start when the `-artifact_prefix` + directory is missing, and `/tmp/fuzzing-artifacts/` was never created, so + every target exited 1 immediately. That was invisible because the exit code + was read after `| tee` without `pipefail` (always tee's 0), the step is + `continue-on-error`, and the only failing gate looked for crash files. The + directory is now created, the fuzzer's real exit code and whether it printed + its final stats are step outputs, and a new "Fail job if the fuzzer did not + run" step fails any target that neither completed cleanly nor recorded a + crash. The outer `timeout` gets 300 s of headroom over `-max_total_time` so it + cannot cut a run libFuzzer is about to end itself. +- The `duration` dispatch input reached the fuzz script by template expansion + into the script text. It now arrives through the environment and is + validated as a positive whole number of seconds (zero would mean "no + limit" to libFuzzer) in a step that is not `continue-on-error`. + +### Changed (dependency consolidation, 2026-09) + +Supersedes Dependabot #9, #12 and #13. + +- **`rustls` 0.23.43 -> 0.23.45** (lockfile) resolves RUSTSEC-2026-0285 (TLS 1.3 + handshake messages accepted across encryption-level boundaries), which was + failing `cargo deny` and the fuzz-lockfile `cargo audit` on `main`. +- **`rand` 0.9 -> 0.10.** The convenience methods (`random`, `random_range`) + moved from `Rng` to the new `RngExt` trait; eleven `use rand::Rng;` imports + became `use rand::RngExt;`. No call site changed. +- **`criterion` 0.5 -> 0.8** (dev-dependency). `criterion::black_box` is + deprecated in favour of `std::hint::black_box`; the five benchmark files + switch over. +- **`dirs` 6 -> 7**, drop-in. **`x509-parser` 0.16 -> 0.18 in `fuzz/`**, matching + the workspace, which removes a second `asn1-rs`/`der-parser` stack from the + fuzz build. +- Lockfile refresh of both `Cargo.lock` and `fuzz/Cargo.lock` to the newest + semver-compatible releases (68 and 52 packages respectively). +- **Held back: `sysinfo` 0.39 (needs Rust 1.95) and `sqlx` 0.9 (needs Rust + 1.94).** Both are normal dependencies reachable from the published crates, + and the workspace MSRV is 1.88. They move when the MSRV does. Verified + afterwards: 0 of 502 resolved workspace packages and 0 of 362 fuzz packages + declare a `rust-version` above 1.88. +- **Container images move from Debian bookworm to trixie** (`rust:1.88-trixie` + builder, `debian:trixie-slim` runtime). trixie renamed the runtime library + package to `libpcap0.8t64`. The user guide's Docker example had the same + bookworm pin and a `rust:1.85` builder below the MSRV; both are corrected. +- **Actions:** `actions-rust-lang/setup-rust-toolchain` v1 -> v2 (benchmarks), + `github/codeql-action` v3 -> v4. The SHA-pinned actions in the Gemini + workflows were already at the latest releases; their `ratchet:` comments + named older versions (checkout v5, create-github-app-token v2, github-script + v7) and now name the versions the SHAs actually are. + ### Changed (dependency majors) Supersedes Dependabot #3 and #4, which proposed the same wave from two diff --git a/CLAUDE.md b/CLAUDE.md index 9b143b2..d8ea147 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -44,10 +44,10 @@ ProRT-IP project guidance for Claude Code. ```toml tokio = "1.35" # Async runtime -pnet = "0.34" # Packets -clap = "4.4" # CLI -sqlx = "0.7" # Async SQL -ratatui = "0.29" # TUI +pnet = "0.35" # Packets +clap = "4.5" # CLI +sqlx = "0.8" # Async SQL (0.9 needs Rust 1.94, above the 1.88 MSRV) +ratatui = "0.30" # TUI ``` **System**: Linux 4.15+, Windows 10+, macOS 11.0+ | Memory 4GB min (16GB rec) diff --git a/Cargo.lock b/Cargo.lock index f191a3e..0248633 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -121,7 +130,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror 2.0.20", + "thiserror 2.0.21", "time", ] @@ -134,7 +143,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.119", - "synstructure", + "synstructure 0.13.2", ] [[package]] @@ -189,9 +198,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.18.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2b2dcc879c3bae0d371e77c99f2238400ef24ec001394befa67b6e543add9e" +checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e" dependencies = [ "aws-lc-sys", "zeroize", @@ -199,9 +208,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.44.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09fae7be8bb3174e05c6afdb34199e6dc0c7c04ba9fa237b1967adfbde27483" +checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27" dependencies = [ "cc", "cmake", @@ -245,9 +254,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.1" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" dependencies = [ "serde_core", ] @@ -304,7 +313,7 @@ checksum = "46d07918caa9eeaaf06b7873925c53a61daac173539b4f7715090745e44e4e69" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -351,9 +360,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.4" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" +checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313" dependencies = [ "find-msvc-tools", "jobserver", @@ -363,9 +372,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "cfg_aliases" @@ -373,6 +382,17 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "rand_core 0.10.1", +] + [[package]] name = "chrono" version = "0.4.45" @@ -416,9 +436,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" dependencies = [ "clap_builder", "clap_derive", @@ -426,9 +446,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" dependencies = [ "anstream", "anstyle", @@ -438,21 +458,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.4" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" dependencies = [ "heck", "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] name = "clap_lex" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" [[package]] name = "cmake" @@ -494,9 +514,9 @@ dependencies = [ [[package]] name = "console" -version = "0.16.4" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" +checksum = "e96a4956774c13c126a8b5af4daa79384f4d826534c95a02d76afb39e2ab64e3" dependencies = [ "encode_unicode", "libc", @@ -544,6 +564,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + [[package]] name = "crc" version = "3.4.0" @@ -561,35 +590,33 @@ checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc32fast" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" dependencies = [ "cfg-if", ] [[package]] name = "criterion" -version = "0.5.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" dependencies = [ + "alloca", "anes", "cast", "ciborium", "clap", "criterion-plot", - "futures", - "is-terminal", - "itertools 0.10.5", + "itertools 0.13.0", "num-traits", - "once_cell", "oorandom", + "page_size", "plotters", "rayon", "regex", "serde", - "serde_derive", "serde_json", "tinytemplate", "tokio", @@ -598,12 +625,12 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.5.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" dependencies = [ "cast", - "itertools 0.10.5", + "itertools 0.13.0", ] [[package]] @@ -614,9 +641,9 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crossbeam" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +checksum = "e71406cd8807725f7ac2f999a4cdd32e98f829fdf65f528343cebf945e41df1e" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -627,18 +654,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.16" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -646,27 +673,27 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.20" +version = "0.9.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" +checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" [[package]] name = "crossterm" @@ -674,7 +701,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "crossterm_winapi", "derive_more", "document-features", @@ -763,7 +790,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -774,7 +801,7 @@ checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" dependencies = [ "darling_core", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -888,9 +915,9 @@ dependencies = [ [[package]] name = "dirs" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +checksum = "8d57d423b3c82e89b9a24ca3091fee61f456a26edbd28d26c65906f4bc1dcd8f" dependencies = [ "dirs-sys", ] @@ -915,7 +942,7 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -1039,15 +1066,15 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" +checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b" [[package]] name = "finl_unicode" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9844ddc3a6e533d62bba727eb6c28b5d360921d5175e9ff0f1e621a5c590a4d5" +checksum = "80bb028c8b4148c9ee0cca68fcd9add6044e81d3619f48577ddf13a263d047a2" [[package]] name = "fixedbitset" @@ -1201,7 +1228,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -1283,6 +1310,7 @@ dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", + "rand_core 0.10.1", ] [[package]] @@ -1381,9 +1409,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" [[package]] name = "hex" @@ -1425,13 +1453,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c2e65a48d3b300843ac84a2fe8e166bb5a5b00f30054593bcee8157e4b465fd" dependencies = [ "arrayvec", - "bitflags 2.13.1", + "bitflags 2.13.2", "derive_more", "errno", "hwlocality-sys", "libc", "strum", - "thiserror 2.0.20", + "thiserror 2.0.21", "windows-sys 0.61.2", ] @@ -1582,9 +1610,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.14.0" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -1614,15 +1642,15 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf84e73fa6f27f299dec58e13223cf70db80da872eb921d4f6138342a0eabc8" +checksum = "4c3b5acc1e2fd9375041a388da33d1eb8aed5f7a8c0dd3543e3ea2805adfbe20" dependencies = [ "darling", "indoc", "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -1643,17 +1671,6 @@ dependencies = [ "serde", ] -[[package]] -name = "is-terminal" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -1662,9 +1679,9 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" -version = "0.10.5" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] @@ -1696,9 +1713,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" dependencies = [ "cfg-if", "futures-util", @@ -1713,7 +1730,7 @@ checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" dependencies = [ "hashbrown 0.16.1", "portable-atomic", - "thiserror 2.0.20", + "thiserror 2.0.21", ] [[package]] @@ -1745,14 +1762,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.21" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7955dfc218a8afb29dfeffd540e3a6e96baeb94fe7138228dd7cc6937fbbf96" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "libc", "plain", - "redox_syscall 0.9.3", + "redox_syscall 0.9.4", ] [[package]] @@ -1772,7 +1789,7 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -1810,27 +1827,27 @@ checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "lru" -version = "0.18.3" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d317b4b9eb398e6acce275758ec6125535505e7a146fb1a9b8bda2451b0ff4c" +checksum = "ef9ac18847474e638e3702b76c65d4eb93428471a74778ef0f1be711717f89b5" dependencies = [ "hashbrown 0.17.1", ] [[package]] name = "lua-src" -version = "550.1.1" +version = "551.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c110c2fa33f34e0de05448e1f3eb2e0631e7a69e2d8ae1586cffc9fc9f9949" +checksum = "d400ffef0e3d4d29287092bdc5a276d0bf468b2c69709d5bab0d469312d9f947" dependencies = [ "cc", ] [[package]] name = "luajit-src" -version = "210.7.2+b925b3e" +version = "210.7.3+1ee778a" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "920cf654b23d217c550ceea57c32cd2a413ea27b6d47ed77b5ee0cf655adefa6" +checksum = "869665372263eb337b14f480cfb864b89f12eade4eb42cb415f71517b4a67572" dependencies = [ "cc", "which", @@ -1913,9 +1930,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "log", @@ -1925,9 +1942,9 @@ dependencies = [ [[package]] name = "mlua" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad72ffa037cf5970c9860674f32f703fda25d86cf217475fe7a79c5f9961bcaa" +checksum = "d96e5d00f19d8c46c71ceaced99593b90c31c57aa1fe2cb3e93a8b1698eedba9" dependencies = [ "bstr", "either", @@ -1940,9 +1957,9 @@ dependencies = [ [[package]] name = "mlua-sys" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92136787b906d4e55cfe96cd6c62e010bb1a56889d0d6cf83eb016dbad07576b" +checksum = "b806d7ade031f5d6607eae3e283fb034cb795a76247dd0d1ba753c8c42debccf" dependencies = [ "cc", "cfg-if", @@ -1995,7 +2012,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "cfg-if", "cfg_aliases", "libc", @@ -2008,7 +2025,7 @@ version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "cfg-if", "cfg_aliases", "libc", @@ -2157,7 +2174,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -2203,7 +2220,7 @@ version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "cfg-if", "foreign-types", "libc", @@ -2265,6 +2282,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "palette" version = "0.7.7" @@ -2355,9 +2382,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.9.0" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" +checksum = "45d3aca230fad2e6f6317ca0a72724338c4960cb97168a85cdee66df4a9a21a8" dependencies = [ "memchr", "ucd-trie", @@ -2365,9 +2392,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.9.0" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a83744a5c8455b8b3e0dc5031362780a347c878bdd11584d1a8984228cc88d" +checksum = "284b60557f2c4a2e72ad3f2d34d42685a2fa4a6a61d0d2a10c0ae2a5e916c2cf" dependencies = [ "pest", "pest_generator", @@ -2375,9 +2402,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.9.0" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd3451aa3de60d4b9a1e736885e4dea6b31617598026f12256ad566d63304a" +checksum = "1d9d1f08a115309ee99268cf85e5228e0e56aa9caf8841ec12866b6be07c3109" dependencies = [ "pest", "pest_meta", @@ -2388,9 +2415,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.9.0" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d3a0849e241d7dfce834c83b1c5edc8622009e8dd51a12ba1927c32f05496" +checksum = "ed93ba1a9ffcca32130a5188701c81c0c49cf00d4b7c5007d5148951d743adcb" dependencies = [ "pest", ] @@ -2700,7 +2727,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror 2.0.20", + "thiserror 2.0.21", "tokio", "toml", "tracing", @@ -2721,7 +2748,7 @@ dependencies = [ "indicatif", "ipnetwork 0.21.1", "parking_lot", - "rand 0.9.5", + "rand 0.10.3", "regex", "rkyv", "rlimit", @@ -2729,7 +2756,7 @@ dependencies = [ "serde_json", "sysinfo", "tempfile", - "thiserror 2.0.20", + "thiserror 2.0.21", "tokio", "toml", "tracing", @@ -2751,8 +2778,8 @@ dependencies = [ "pnet_datalink", "pnet_packet", "prtip-core", - "rand 0.9.5", - "thiserror 2.0.20", + "rand 0.10.3", + "thiserror 2.0.21", "tokio", "tracing", "windows", @@ -2781,7 +2808,7 @@ dependencies = [ "pnet_packet", "prtip-core", "prtip-network", - "rand 0.9.5", + "rand 0.10.3", "regex", "rkyv", "rustls", @@ -2789,7 +2816,7 @@ dependencies = [ "serde_json", "sqlx", "tempfile", - "thiserror 2.0.20", + "thiserror 2.0.21", "tokio", "tokio-native-tls", "tokio-rustls", @@ -2813,7 +2840,7 @@ dependencies = [ "prtip-core", "ratatui", "tempfile", - "thiserror 2.0.20", + "thiserror 2.0.21", "tokio", "uuid", ] @@ -2835,7 +2862,7 @@ checksum = "1c8d9ca532f185d5d4db7a7c9d51420b452168ea1c2b913953281bd6fe1fcbd0" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -2904,6 +2931,17 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "rand" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -2942,6 +2980,12 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "ratatui" version = "0.30.2" @@ -2964,7 +3008,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "compact_str", "critical-section", "hashbrown 0.17.1", @@ -2974,7 +3018,7 @@ dependencies = [ "palette", "serde", "strum", - "thiserror 2.0.20", + "thiserror 2.0.21", "unicode-segmentation", "unicode-truncate", "unicode-width", @@ -3029,7 +3073,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "hashbrown 0.17.1", "indoc", "instability", @@ -3049,7 +3093,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -3078,27 +3122,26 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] name = "redox_syscall" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d678d17679829e73d371e96880897e98fee2ded7acc0a50bdf8af2affa4b2fe5" +checksum = "737970939a87c6fa31e7acad13307bccbb017a073b695b6089a2c484f929e20e" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] name = "redox_users" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" dependencies = [ - "getrandom 0.2.17", "libredox", - "thiserror 2.0.20", + "thiserror 2.0.21", ] [[package]] @@ -3180,7 +3223,7 @@ checksum = "1c25ef604ac7dd839d44d64648952ea23c97866f124ff671b0ed2cf3ad9bb06e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -3238,11 +3281,11 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "errno", "libc", "linux-raw-sys", @@ -3251,9 +3294,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.43" +version = "0.23.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" dependencies = [ "aws-lc-rs", "log", @@ -3327,7 +3370,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "core-foundation", "core-foundation-sys", "libc", @@ -3377,7 +3420,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -3421,7 +3464,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -3432,7 +3475,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -3518,9 +3561,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.2" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" dependencies = [ "serde", ] @@ -3604,7 +3647,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror 2.0.20", + "thiserror 2.0.21", "tokio", "tokio-stream", "tracing", @@ -3657,7 +3700,7 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64", - "bitflags 2.13.1", + "bitflags 2.13.2", "byteorder", "bytes", "chrono", @@ -3687,7 +3730,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.20", + "thiserror 2.0.21", "tracing", "whoami", ] @@ -3700,7 +3743,7 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64", - "bitflags 2.13.1", + "bitflags 2.13.2", "byteorder", "chrono", "crc", @@ -3725,7 +3768,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.20", + "thiserror 2.0.21", "tracing", "whoami", ] @@ -3750,7 +3793,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.20", + "thiserror 2.0.21", "tracing", "url", ] @@ -3835,9 +3878,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", @@ -3855,6 +3898,17 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + [[package]] name = "sysinfo" version = "0.38.4" @@ -3888,7 +3942,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9048a889effe34a5cddee0af7f53285198b16dca3be510858d38dfdb3e62a04e" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "parking_lot", "rustix", "signal-hook", @@ -3930,7 +3984,7 @@ checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7" dependencies = [ "anyhow", "base64", - "bitflags 2.13.1", + "bitflags 2.13.2", "fancy-regex", "filedescriptor", "finl_unicode", @@ -3975,11 +4029,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.20" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "thiserror-impl 2.0.20", + "thiserror-impl 2.0.21", ] [[package]] @@ -3995,13 +4049,13 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.20" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -4067,18 +4121,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" [[package]] name = "tokio" @@ -4105,7 +4150,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] @@ -4120,9 +4165,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.4" +version = "0.26.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" dependencies = [ "rustls", "tokio", @@ -4141,9 +4186,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.4+spec-1.1.0" +version = "1.1.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" dependencies = [ "indexmap", "serde_core", @@ -4260,9 +4305,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "unicode-normalization" @@ -4346,9 +4391,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.26.0" +version = "1.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" +checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" dependencies = [ "atomic", "getrandom 0.4.3", @@ -4426,9 +4471,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" dependencies = [ "cfg-if", "once_cell", @@ -4439,9 +4484,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4449,31 +4494,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" dependencies = [ "js-sys", "wasm-bindgen", @@ -4900,7 +4945,7 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror 2.0.20", + "thiserror 2.0.21", "time", ] @@ -4917,30 +4962,30 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", - "synstructure", + "syn 3.0.6", + "synstructure 0.14.0", ] [[package]] name = "zerocopy" -version = "0.8.56" +version = "0.8.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +checksum = "c17e8fafad82b542ff3717217ecdc736231b59e387768c9630123b4ce4d2db44" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.56" +version = "0.8.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +checksum = "595f56e044df4f46a0c9a626f65c3d99eb8488f7e8a8baa12dd76326d9710bf2" dependencies = [ "proc-macro2", "quote", @@ -4958,14 +5003,14 @@ dependencies = [ [[package]] name = "zerofrom-derive" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", - "synstructure", + "syn 3.0.6", + "synstructure 0.14.0", ] [[package]] @@ -5004,14 +5049,14 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.6", ] [[package]] name = "zlib-rs" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" [[package]] name = "zmij" diff --git a/Cargo.toml b/Cargo.toml index 528aba0..74b6b83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,7 +55,7 @@ tera = "1.19" printpdf = "0.6" # Home directory detection -dirs = "6.0" +dirs = "7.0" # Packet capture pcap-file = "2.0" @@ -75,7 +75,7 @@ governor = "0.10" # serde support moved behind a feature flag in 0.21; ScanTarget derives # Serialize/Deserialize over IpNetwork, so it must be enabled explicitly. ipnetwork = { version = "0.21", features = ["serde"] } -rand = "0.9" +rand = "0.10" chrono = { version = "0.4", features = ["serde"] } uuid = { version = "1.7", features = ["v4", "serde"] } num_cpus = "1.16" diff --git a/crates/prtip-cli/Cargo.toml b/crates/prtip-cli/Cargo.toml index d2bebac..29745cb 100644 --- a/crates/prtip-cli/Cargo.toml +++ b/crates/prtip-cli/Cargo.toml @@ -75,7 +75,7 @@ libc = { workspace = true } tempfile = "3.8" assert_cmd = "2.0" predicates = "3.0" -criterion = { version = "0.5", features = ["html_reports"] } +criterion = { version = "0.8", features = ["html_reports"] } uuid = { workspace = true } [[bench]] diff --git a/crates/prtip-core/Cargo.toml b/crates/prtip-core/Cargo.toml index f8611a1..4e8d458 100644 --- a/crates/prtip-core/Cargo.toml +++ b/crates/prtip-core/Cargo.toml @@ -34,7 +34,7 @@ rkyv = { workspace = true } [dev-dependencies] tokio = { workspace = true } -criterion = { version = "0.5", features = ["html_reports", "async_tokio"] } +criterion = { version = "0.8", features = ["html_reports", "async_tokio"] } tempfile = "3.8" filetime = "0.2" diff --git a/crates/prtip-core/benches/event_system.rs b/crates/prtip-core/benches/event_system.rs index eaa9b51..b6185c9 100644 --- a/crates/prtip-core/benches/event_system.rs +++ b/crates/prtip-core/benches/event_system.rs @@ -6,12 +6,13 @@ //! - Concurrent overhead: <5% vs single-threaded //! - History query: <100μs for 100 events -use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; use prtip_core::event_bus::{EventBus, EventFilter}; use prtip_core::events::{ DiscoveryMethod, MetricType, ScanEvent, ScanEventType, ScanStage, Throughput, }; use prtip_core::types::ScanType; +use std::hint::black_box; use std::sync::Arc; use std::time::SystemTime; use tokio::sync::mpsc; diff --git a/crates/prtip-core/src/retry.rs b/crates/prtip-core/src/retry.rs index 3e8f37d..fb37045 100644 --- a/crates/prtip-core/src/retry.rs +++ b/crates/prtip-core/src/retry.rs @@ -228,8 +228,9 @@ where /// This prevents thundering herd problems where many clients retry simultaneously. /// The jitter factor is randomly chosen between 0.75 and 1.25, giving a ±25% variation. fn add_jitter(delay: Duration) -> Duration { - use rand::Rng; - // rand 0.9 renamed `thread_rng` to `rng` and `gen_range` to `random_range`. + use rand::RngExt; + // rand 0.9 renamed `thread_rng` to `rng` and `gen_range` to `random_range`; + // rand 0.10 moved those convenience methods from `Rng` to `RngExt`. let jitter_factor = rand::rng().random_range(0.75..=1.25); Duration::from_secs_f64(delay.as_secs_f64() * jitter_factor) } diff --git a/crates/prtip-network/Cargo.toml b/crates/prtip-network/Cargo.toml index 08efc4c..c05c94a 100644 --- a/crates/prtip-network/Cargo.toml +++ b/crates/prtip-network/Cargo.toml @@ -38,7 +38,7 @@ windows = { workspace = true } [dev-dependencies] tokio = { workspace = true } -criterion = { version = "0.5", features = ["html_reports"] } +criterion = { version = "0.8", features = ["html_reports"] } [[bench]] name = "batch_io" diff --git a/crates/prtip-network/benches/batch_io.rs b/crates/prtip-network/benches/batch_io.rs index eb05e68..556acb0 100644 --- a/crates/prtip-network/benches/batch_io.rs +++ b/crates/prtip-network/benches/batch_io.rs @@ -24,8 +24,9 @@ //! - **Throughput**: Packets per second at various batch sizes //! - **Latency**: Per-packet processing time -use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; use prtip_network::{BatchSender, PacketBatch}; +use std::hint::black_box; use std::time::Duration; /// Benchmark packet batch creation and management diff --git a/crates/prtip-network/benches/packet_crafting.rs b/crates/prtip-network/benches/packet_crafting.rs index ac8fdf9..740670a 100644 --- a/crates/prtip-network/benches/packet_crafting.rs +++ b/crates/prtip-network/benches/packet_crafting.rs @@ -21,8 +21,9 @@ //! cargo bench --bench packet_crafting -- --save-baseline phase3 //! ``` -use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; use prtip_network::{packet_buffer::with_buffer, TcpFlags, TcpOption, TcpPacketBuilder}; +use std::hint::black_box; use std::net::Ipv4Addr; /// Benchmark OLD API (with allocations) diff --git a/crates/prtip-network/src/fragmentation.rs b/crates/prtip-network/src/fragmentation.rs index 33b3763..77f059a 100644 --- a/crates/prtip-network/src/fragmentation.rs +++ b/crates/prtip-network/src/fragmentation.rs @@ -130,7 +130,7 @@ pub fn fragment_tcp_packet(packet: &[u8], mtu: usize) -> Result>> { } // Generate unique fragment ID - use rand::Rng; + use rand::RngExt; let fragment_id = rand::rng().random::(); let mut fragments = Vec::new(); diff --git a/crates/prtip-network/src/ipv6_packet.rs b/crates/prtip-network/src/ipv6_packet.rs index 4338c8f..ca3fbc1 100644 --- a/crates/prtip-network/src/ipv6_packet.rs +++ b/crates/prtip-network/src/ipv6_packet.rs @@ -307,7 +307,7 @@ impl Ipv6PacketBuilder { let fragment_payload_size = (mtu - 48) & !7; // Round down to multiple of 8 let mut fragments = Vec::new(); let mut offset = 0; - use rand::Rng; + use rand::RngExt; let fragment_id: u32 = rand::rng().random(); while offset < self.payload.len() { diff --git a/crates/prtip-network/src/packet_builder.rs b/crates/prtip-network/src/packet_builder.rs index 436702b..b84723e 100644 --- a/crates/prtip-network/src/packet_builder.rs +++ b/crates/prtip-network/src/packet_builder.rs @@ -186,7 +186,7 @@ impl Default for TcpPacketBuilder { impl TcpPacketBuilder { /// Create a new TCP packet builder with default values pub fn new() -> Self { - use rand::Rng; + use rand::RngExt; let mut rng = rand::rng(); Self { @@ -897,7 +897,7 @@ impl Default for UdpPacketBuilder { impl UdpPacketBuilder { /// Create a new UDP packet builder with default values pub fn new() -> Self { - use rand::Rng; + use rand::RngExt; let mut rng = rand::rng(); Self { diff --git a/crates/prtip-scanner/Cargo.toml b/crates/prtip-scanner/Cargo.toml index 28ee4ad..5a6ab94 100644 --- a/crates/prtip-scanner/Cargo.toml +++ b/crates/prtip-scanner/Cargo.toml @@ -89,7 +89,7 @@ rkyv = { workspace = true } [dev-dependencies] tokio = { workspace = true } tempfile = "3.8" -criterion = { version = "0.5", features = ["html_reports"] } +criterion = { version = "0.8", features = ["html_reports"] } [[bench]] name = "tls_performance" diff --git a/crates/prtip-scanner/benches/tls_performance.rs b/crates/prtip-scanner/benches/tls_performance.rs index 68a5c02..341a793 100644 --- a/crates/prtip-scanner/benches/tls_performance.rs +++ b/crates/prtip-scanner/benches/tls_performance.rs @@ -37,7 +37,8 @@ //! benchmarking. This represents the **lower bound** of parsing time - real certificates //! with extensions, longer keys, and chain validation will take longer. -use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; +use std::hint::black_box; use std::time::Duration; use x509_parser::prelude::*; diff --git a/crates/prtip-scanner/src/decoy_scanner.rs b/crates/prtip-scanner/src/decoy_scanner.rs index 7203e08..e3f9ba0 100644 --- a/crates/prtip-scanner/src/decoy_scanner.rs +++ b/crates/prtip-scanner/src/decoy_scanner.rs @@ -56,7 +56,7 @@ use dashmap::DashMap; use pnet::packet::Packet; // For eth_packet.payload() use prtip_core::{Config, Error, PortState, Result, ScanResult, ScanTarget}; use prtip_network::{BatchReceiver, BatchSender, TcpFlags, TcpPacketBuilder}; -use rand::Rng; +use rand::RngExt; use std::collections::HashSet; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; use std::sync::Arc; @@ -305,7 +305,7 @@ impl DecoyScanner { count: usize, exclude: &[Ipv6Addr], ) -> Vec { - use rand::Rng; + use rand::RngExt; // Extract /64 prefix (first 64 bits) let target_segments = target.segments(); diff --git a/crates/prtip-scanner/src/idle/idle_scanner.rs b/crates/prtip-scanner/src/idle/idle_scanner.rs index 38b2a81..0d7d32b 100644 --- a/crates/prtip-scanner/src/idle/idle_scanner.rs +++ b/crates/prtip-scanner/src/idle/idle_scanner.rs @@ -30,7 +30,7 @@ use pnet::packet::ipv4::MutableIpv4Packet; use pnet::packet::tcp::{MutableTcpPacket, TcpFlags}; use pnet::transport::{transport_channel, TransportChannelType, TransportProtocol}; use prtip_core::{Error, EventBus, PortState, Protocol, Result, ScanEvent, ScanType}; -use rand::Rng; +use rand::RngExt; use std::net::IpAddr; use std::sync::Arc; use std::time::{Duration, SystemTime}; diff --git a/crates/prtip-scanner/src/stealth_scanner.rs b/crates/prtip-scanner/src/stealth_scanner.rs index 31e325a..5ba582e 100644 --- a/crates/prtip-scanner/src/stealth_scanner.rs +++ b/crates/prtip-scanner/src/stealth_scanner.rs @@ -418,7 +418,7 @@ impl StealthScanner { let start_time = Instant::now(); // Use configured source port or generate random - use rand::Rng; + use rand::RngExt; let src_port: u16 = self .config .network @@ -526,7 +526,7 @@ impl StealthScanner { scan_type: StealthScanType, pcapng_writer: Option>>, ) -> Result<()> { - use rand::Rng; + use rand::RngExt; let mut rng = rand::rng(); let sequence: u32 = rng.random(); @@ -990,7 +990,7 @@ impl StealthScanner { for &port in ports { // Generate random source port let src_port = { - use rand::Rng; + use rand::RngExt; rand::rng().random_range(32768..=61000) }; diff --git a/crates/prtip-scanner/src/syn_scanner.rs b/crates/prtip-scanner/src/syn_scanner.rs index ba19f0e..27b0d79 100644 --- a/crates/prtip-scanner/src/syn_scanner.rs +++ b/crates/prtip-scanner/src/syn_scanner.rs @@ -213,7 +213,7 @@ impl SynScanner { let start_time = Instant::now(); // Use configured source port or generate random - use rand::Rng; + use rand::RngExt; let src_port: u16 = self .config .network @@ -348,7 +348,7 @@ impl SynScanner { retry: u8, pcapng_writer: Option>>, ) -> Result { - use rand::Rng; + use rand::RngExt; let mut rng = rand::rng(); // Generate sequence number (for stateless, could use SipHash) @@ -561,7 +561,7 @@ impl SynScanner { /// # } /// ``` fn build_syn_packet(&self, target: IpAddr, port: u16, src_port: u16) -> Result> { - use rand::Rng; + use rand::RngExt; let mut rng = rand::rng(); let sequence: u32 = rng.random(); @@ -979,7 +979,7 @@ impl SynScanner { ports: &[u16], batch_size: usize, ) -> Result>> { - use rand::Rng; + use rand::RngExt; let mut rng = rand::rng(); let mut packets = Vec::with_capacity(batch_size.min(ports.len())); diff --git a/crates/prtip-scanner/src/timing.rs b/crates/prtip-scanner/src/timing.rs index fd765c3..32ed281 100644 --- a/crates/prtip-scanner/src/timing.rs +++ b/crates/prtip-scanner/src/timing.rs @@ -148,7 +148,7 @@ impl TimingConfig { return duration; } - use rand::Rng; + use rand::RngExt; let mut rng = rand::rng(); // Jitter range: [duration * (1 - factor), duration * (1 + factor)] diff --git a/crates/prtip-scanner/src/udp_scanner.rs b/crates/prtip-scanner/src/udp_scanner.rs index ca2ce18..c072ac9 100644 --- a/crates/prtip-scanner/src/udp_scanner.rs +++ b/crates/prtip-scanner/src/udp_scanner.rs @@ -406,7 +406,7 @@ impl UdpScanner { let start_time = Instant::now(); // Use configured source port or generate random - use rand::Rng; + use rand::RngExt; let src_port: u16 = self .config .network @@ -915,7 +915,7 @@ impl UdpScanner { ports: &[u16], batch_size: usize, ) -> Result>> { - use rand::Rng; + use rand::RngExt; let mut packets = Vec::with_capacity(batch_size.min(ports.len())); for &port in ports.iter().take(batch_size) { diff --git a/crates/prtip-scanner/tests/common/error_injection.rs b/crates/prtip-scanner/tests/common/error_injection.rs index 6efccb7..fa7f33a 100644 --- a/crates/prtip-scanner/tests/common/error_injection.rs +++ b/crates/prtip-scanner/tests/common/error_injection.rs @@ -135,7 +135,7 @@ impl ErrorInjector { } } FailureMode::Probabilistic { rate } => { - use rand::Rng; + use rand::RngExt; if rand::rng().random::() < *rate { Err(io::Error::new(io::ErrorKind::ConnectionRefused, "probabilistic failure")) } else { diff --git a/docker/Dockerfile b/docker/Dockerfile index 1f4fa1d..a2ff3d1 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -18,7 +18,7 @@ ARG VERSION=1.0.0 # ============================================================================== # Stage 1: Build (Debian-based for maximum compatibility) # ============================================================================== -FROM rust:${RUST_VERSION}-bookworm AS builder +FROM rust:${RUST_VERSION}-trixie AS builder WORKDIR /build @@ -65,7 +65,7 @@ RUN strip /build/target/release/prtip # ============================================================================== # Stage 2: Runtime (Debian slim for libpcap compatibility) # ============================================================================== -FROM debian:bookworm-slim AS runtime +FROM debian:trixie-slim AS runtime ARG VERSION LABEL maintainer="ProRT-IP Contributors " @@ -76,7 +76,7 @@ LABEL org.opencontainers.image.license="GPL-3.0" # Install runtime dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ - libpcap0.8 \ + libpcap0.8t64 \ ca-certificates \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean diff --git a/docs/06-TESTING.md b/docs/06-TESTING.md index 8d190c8..448a1b4 100644 --- a/docs/06-TESTING.md +++ b/docs/06-TESTING.md @@ -367,7 +367,7 @@ cargo bench --bench packet_crafting -- --profile-time=5 **Setup:** ```bash -cargo install cargo-fuzz +cargo install cargo-fuzz --version 0.13.2 --locked cargo fuzz init ``` diff --git a/docs/29-FUZZING-GUIDE.md b/docs/29-FUZZING-GUIDE.md index add58b0..8c0d030 100644 --- a/docs/29-FUZZING-GUIDE.md +++ b/docs/29-FUZZING-GUIDE.md @@ -60,8 +60,11 @@ ProRT-IP has **5 fuzzing targets** covering critical parsers: rustup install nightly rustup default nightly -# Install cargo-fuzz -cargo install cargo-fuzz --version 0.13.1 +# Install cargo-fuzz. --locked matters: without it cargo resolves fresh +# dependency versions, and under a nightly default toolchain 0.13.1 pulled a +# `rustix` that current nightly refuses to compile. CI installs the prebuilt +# release binary instead (see .github/workflows/fuzz.yml). +cargo install cargo-fuzz --version 0.13.2 --locked # Verify installation cargo +nightly fuzz --version diff --git a/docs/32-USER-GUIDE.md b/docs/32-USER-GUIDE.md index 7afffef..850fd6f 100644 --- a/docs/32-USER-GUIDE.md +++ b/docs/32-USER-GUIDE.md @@ -315,13 +315,14 @@ cd ProRT-IP # Create Dockerfile (example) cat > Dockerfile <