From 1cc3351bef627c23f2c7e859ad22d236697486e2 Mon Sep 17 00:00:00 2001 From: yuyr Date: Wed, 25 Feb 2026 11:16:02 +0800 Subject: [PATCH] manifest decode & profile validate optimization --- .gitignore | 1 + Cargo.toml | 7 +- benchmark/ours_manifest_bench/Cargo.toml | 8 + benchmark/ours_manifest_bench/src/main.rs | 145 + scripts/manifest_perf_compare_m2.sh | 195 ++ scripts/manifest_perf_profile_m3.sh | 142 + specs/arch.excalidraw | 2348 ++++++++++++++++- src/data_model/manifest.rs | 823 ++++-- src/data_model/signed_object.rs | 6 +- src/fetch/http.rs | 49 + src/fetch/rsync.rs | 36 + src/fetch/rsync_system.rs | 64 + src/lib.rs | 13 +- src/sync/rrdp.rs | 194 ++ src/validation/manifest.rs | 20 +- tests/bench_manifest_decode_profile.rs | 320 +++ .../flamegraph_manifest_decode_profile.sh | 87 + tests/benchmark/selected_der/large-01.mft | Bin 0 -> 2250 bytes tests/benchmark/selected_der/large-02.mft | Bin 0 -> 10476 bytes tests/benchmark/selected_der/medium-01.mft | Bin 0 -> 2681 bytes tests/benchmark/selected_der/medium-02.mft | Bin 0 -> 2681 bytes tests/benchmark/selected_der/small-01.mft | Bin 0 -> 1875 bytes tests/benchmark/selected_der/small-02.mft | Bin 0 -> 1875 bytes tests/benchmark/selected_der/sources.tsv | 9 + tests/benchmark/selected_der/xlarge-01.mft | Bin 0 -> 144968 bytes tests/benchmark/selected_der/xlarge-02.mft | Bin 0 -> 150261 bytes tests/test_fetch_cache_pp_revalidation_m3.rs | 11 +- tests/test_manifest_cache_errors_more.rs | 11 +- tests/test_manifest_decode.rs | 11 +- tests/test_manifest_processor_m4.rs | 71 +- tests/test_manifest_rfc9286_section6_1.rs | 8 +- tests/test_model_print_real_fixtures.rs | 9 +- tests/test_objects_errors_more.rs | 11 +- tests/test_objects_policy_m8.rs | 11 +- tests/test_rpki_bin_coverage.rs | 33 + 35 files changed, 4418 insertions(+), 225 deletions(-) create mode 100644 benchmark/ours_manifest_bench/Cargo.toml create mode 100644 benchmark/ours_manifest_bench/src/main.rs create mode 100755 scripts/manifest_perf_compare_m2.sh create mode 100755 scripts/manifest_perf_profile_m3.sh create mode 100644 tests/bench_manifest_decode_profile.rs create mode 100755 tests/benchmark/flamegraph_manifest_decode_profile.sh create mode 100644 tests/benchmark/selected_der/large-01.mft create mode 100644 tests/benchmark/selected_der/large-02.mft create mode 100644 tests/benchmark/selected_der/medium-01.mft create mode 100644 tests/benchmark/selected_der/medium-02.mft create mode 100644 tests/benchmark/selected_der/small-01.mft create mode 100644 tests/benchmark/selected_der/small-02.mft create mode 100644 tests/benchmark/selected_der/sources.tsv create mode 100644 tests/benchmark/selected_der/xlarge-01.mft create mode 100644 tests/benchmark/selected_der/xlarge-02.mft create mode 100644 tests/test_rpki_bin_coverage.rs diff --git a/.gitignore b/.gitignore index 2c96eb1..3c96bf2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ target/ Cargo.lock +perf.* diff --git a/Cargo.toml b/Cargo.toml index ce89e51..e67c8c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,11 @@ name = "rpki" version = "0.1.0" edition = "2024" +[features] +default = ["full"] +# Full build used by the main RP implementation (includes RocksDB-backed storage). +full = ["dep:rocksdb"] + [dependencies] der-parser = { version = "10.0.0", features = ["serialize"] } hex = "0.4.3" @@ -16,7 +21,7 @@ url = "2.5.8" serde = { version = "1.0.218", features = ["derive"] } serde_json = "1.0.140" toml = "0.8.20" -rocksdb = { version = "0.22.0", default-features = false, features = ["lz4"] } +rocksdb = { version = "0.22.0", optional = true, default-features = false, features = ["lz4"] } serde_cbor = "0.11.2" roxmltree = "0.20.0" uuid = { version = "1.7.0", features = ["v4"] } diff --git a/benchmark/ours_manifest_bench/Cargo.toml b/benchmark/ours_manifest_bench/Cargo.toml new file mode 100644 index 0000000..a2f2def --- /dev/null +++ b/benchmark/ours_manifest_bench/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "ours-manifest-bench" +version = "0.1.0" +edition = "2024" + +[dependencies] +rpki = { path = "../..", default-features = false } + diff --git a/benchmark/ours_manifest_bench/src/main.rs b/benchmark/ours_manifest_bench/src/main.rs new file mode 100644 index 0000000..f0cded9 --- /dev/null +++ b/benchmark/ours_manifest_bench/src/main.rs @@ -0,0 +1,145 @@ +use rpki::data_model::manifest::ManifestObject; +use std::hint::black_box; +use std::path::PathBuf; +use std::time::Instant; + +#[derive(Debug, Clone)] +struct Config { + sample: Option, + manifest_path: Option, + iterations: u64, + warmup_iterations: u64, + repeats: u32, +} + +fn usage_and_exit() -> ! { + eprintln!( + "Usage:\n ours-manifest-bench (--sample | --manifest ) [--iterations N] [--warmup-iterations N] [--repeats N]\n\nExamples:\n cargo run --release -- --sample small-01 --iterations 20000 --warmup-iterations 2000 --repeats 3\n cargo run --release -- --manifest ../../tests/benchmark/selected_der/small-01.mft" + ); + std::process::exit(2); +} + +fn parse_args() -> Config { + let mut sample: Option = None; + let mut manifest_path: Option = None; + let mut iterations: u64 = 20_000; + let mut warmup_iterations: u64 = 2_000; + let mut repeats: u32 = 3; + + let mut args = std::env::args().skip(1); + while let Some(arg) = args.next() { + match arg.as_str() { + "--sample" => sample = Some(args.next().unwrap_or_else(|| usage_and_exit())), + "--manifest" => { + manifest_path = Some(PathBuf::from(args.next().unwrap_or_else(|| usage_and_exit()))) + } + "--iterations" => { + iterations = args + .next() + .unwrap_or_else(|| usage_and_exit()) + .parse() + .unwrap_or_else(|_| usage_and_exit()) + } + "--warmup-iterations" => { + warmup_iterations = args + .next() + .unwrap_or_else(|| usage_and_exit()) + .parse() + .unwrap_or_else(|_| usage_and_exit()) + } + "--repeats" => { + repeats = args + .next() + .unwrap_or_else(|| usage_and_exit()) + .parse() + .unwrap_or_else(|_| usage_and_exit()) + } + "-h" | "--help" => usage_and_exit(), + _ => usage_and_exit(), + } + } + + if sample.is_none() && manifest_path.is_none() { + usage_and_exit(); + } + if sample.is_some() && manifest_path.is_some() { + usage_and_exit(); + } + + Config { + sample, + manifest_path, + iterations, + warmup_iterations, + repeats, + } +} + +fn derive_manifest_path(sample: &str) -> PathBuf { + // Assumes current working directory is `rpki/benchmark/ours_manifest_bench`. + PathBuf::from(format!("../../tests/benchmark/selected_der/{sample}.mft")) +} + +fn main() { + let cfg = parse_args(); + let manifest_path = cfg + .manifest_path + .clone() + .unwrap_or_else(|| derive_manifest_path(cfg.sample.as_deref().unwrap())); + + let bytes = std::fs::read(&manifest_path).unwrap_or_else(|e| { + eprintln!("read manifest fixture failed: {e}; path={}", manifest_path.display()); + std::process::exit(1); + }); + + let decoded_once = ManifestObject::decode_der(&bytes).unwrap_or_else(|e| { + eprintln!("decode failed: {e}; path={}", manifest_path.display()); + std::process::exit(1); + }); + let file_count = decoded_once.manifest.file_count(); + + let mut round_ns_per_op: Vec = Vec::with_capacity(cfg.repeats as usize); + let mut round_ops_per_s: Vec = Vec::with_capacity(cfg.repeats as usize); + + for _round in 0..cfg.repeats { + for _ in 0..cfg.warmup_iterations { + let obj = ManifestObject::decode_der(black_box(&bytes)).expect("warmup decode"); + black_box(obj); + } + + let start = Instant::now(); + for _ in 0..cfg.iterations { + let obj = ManifestObject::decode_der(black_box(&bytes)).expect("timed decode"); + black_box(obj); + } + let elapsed = start.elapsed(); + + let ns_per_op = (elapsed.as_secs_f64() * 1e9) / (cfg.iterations as f64); + let ops_per_s = (cfg.iterations as f64) / elapsed.as_secs_f64(); + round_ns_per_op.push(ns_per_op); + round_ops_per_s.push(ops_per_s); + } + + let avg_ns_per_op = round_ns_per_op.iter().sum::() / (round_ns_per_op.len() as f64); + let avg_ops_per_s = round_ops_per_s.iter().sum::() / (round_ops_per_s.len() as f64); + + let sample_name = cfg.sample.clone().unwrap_or_else(|| { + manifest_path + .file_name() + .map(|s| s.to_string_lossy().to_string()) + .unwrap_or_else(|| manifest_path.display().to_string()) + }); + let sample_name = sample_name + .strip_suffix(".mft") + .unwrap_or(&sample_name) + .to_string(); + + println!("fixture: {}", manifest_path.display()); + println!(); + println!("| sample | avg ns/op | ops/s | file count |"); + println!("|---|---:|---:|---:|"); + println!( + "| {} | {:.2} | {:.2} | {} |", + sample_name, avg_ns_per_op, avg_ops_per_s, file_count + ); +} diff --git a/scripts/manifest_perf_compare_m2.sh b/scripts/manifest_perf_compare_m2.sh new file mode 100755 index 0000000..75983c4 --- /dev/null +++ b/scripts/manifest_perf_compare_m2.sh @@ -0,0 +1,195 @@ +#!/usr/bin/env bash +set -euo pipefail + +# M2: Run per-sample decode+profile benchmark (Ours vs Routinator) on selected_der fixtures. +# +# Outputs: +# - specs/develop/20260224/data/m2_manifest_decode_profile_compare.csv +# - specs/develop/20260224/data/m2_raw.log +# +# Note: This script assumes Routinator benchmark repo exists at: +# /home/yuyr/dev/rust_playground/routinator/benchmark +# +# It also assumes fixtures exist under: +# rpki/tests/benchmark/selected_der/*.mft +# routinator/benchmark/fixtures/selected_der/*.mft + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +RPKI_DIR="$ROOT_DIR" +OURS_BENCH_DIR="$RPKI_DIR/benchmark/ours_manifest_bench" + +ROUT_BENCH_DIR="${ROUT_BENCH_DIR:-/home/yuyr/dev/rust_playground/routinator/benchmark}" +ROUT_BIN="$ROUT_BENCH_DIR/target/release/routinator-manifest-benchmark" + +DATE_TAG="${DATE_TAG:-20260224}" +OUT_DIR="$RPKI_DIR/../specs/develop/${DATE_TAG}/data" +OUT_CSV="${OUT_CSV:-$OUT_DIR/m2_manifest_decode_profile_compare.csv}" +OUT_RAW="${OUT_RAW:-$OUT_DIR/m2_raw.log}" + +REPEATS="${REPEATS:-3}" + +# Iterations / warmups (kept moderate for interactive iteration). +ITER_SMALL="${ITER_SMALL:-20000}" +ITER_MEDIUM="${ITER_MEDIUM:-20000}" +ITER_LARGE="${ITER_LARGE:-20000}" +ITER_XLARGE="${ITER_XLARGE:-2000}" + +WARM_SMALL="${WARM_SMALL:-2000}" +WARM_MEDIUM="${WARM_MEDIUM:-2000}" +WARM_LARGE="${WARM_LARGE:-2000}" +WARM_XLARGE="${WARM_XLARGE:-200}" + +SAMPLES=( + small-01 + small-02 + medium-01 + medium-02 + large-01 + large-02 + xlarge-01 + xlarge-02 +) + +mkdir -p "$OUT_DIR" +: > "$OUT_RAW" + +echo "sample,bucket,manifest_file_count,ours_avg_ns_per_op,ours_ops_per_s,rout_avg_ns_per_op,rout_ops_per_s,ratio_ours_over_rout,iterations,repeats,warmup" > "$OUT_CSV" + +echo "[1/3] Build ours benchmark (release)..." | tee -a "$OUT_RAW" +(cd "$OURS_BENCH_DIR" && cargo build --release -q) +OURS_BIN="$OURS_BENCH_DIR/target/release/ours-manifest-bench" + +echo "[2/3] Build routinator benchmark (release)..." | tee -a "$OUT_RAW" +(cd "$ROUT_BENCH_DIR" && cargo build --release -q) + +taskset_prefix="" +if command -v taskset >/dev/null 2>&1; then + if [[ -n "${TASKSET_CPU:-}" ]]; then + taskset_prefix="taskset -c ${TASKSET_CPU}" + fi +fi + +bucket_for() { + local s="$1" + case "$s" in + small-*) echo "small" ;; + medium-*) echo "medium" ;; + large-*) echo "large" ;; + xlarge-*) echo "xlarge" ;; + *) echo "unknown" ;; + esac +} + +iters_for() { + local b="$1" + case "$b" in + small) echo "$ITER_SMALL" ;; + medium) echo "$ITER_MEDIUM" ;; + large) echo "$ITER_LARGE" ;; + xlarge) echo "$ITER_XLARGE" ;; + *) echo "$ITER_MEDIUM" ;; + esac +} + +warm_for() { + local b="$1" + case "$b" in + small) echo "$WARM_SMALL" ;; + medium) echo "$WARM_MEDIUM" ;; + large) echo "$WARM_LARGE" ;; + xlarge) echo "$WARM_XLARGE" ;; + *) echo "$WARM_MEDIUM" ;; + esac +} + +run_ours() { + local sample="$1" + local iters="$2" + local warm="$3" + local ours_fixture="$RPKI_DIR/tests/benchmark/selected_der/${sample}.mft" + if [[ ! -f "$ours_fixture" ]]; then + echo "ours fixture not found: $ours_fixture" >&2 + exit 1 + fi + + echo "### ours $sample" >> "$OUT_RAW" + local out + out=$($taskset_prefix "$OURS_BIN" --manifest "$ours_fixture" --iterations "$iters" --warmup-iterations "$warm" --repeats "$REPEATS") + echo "$out" >> "$OUT_RAW" + + local line + line=$(echo "$out" | rg "^\\| ${sample} \\|" | tail -n 1) + if [[ -z "${line:-}" ]]; then + echo "failed to parse ours output for $sample" >&2 + exit 1 + fi + # Expected final row: | sample | avg ns/op | ops/s | file count | + local avg ops cnt + avg=$(echo "$line" | awk -F'|' '{gsub(/^ +| +$/,"",$3); print $3}') + ops=$(echo "$line" | awk -F'|' '{gsub(/^ +| +$/,"",$4); print $4}') + cnt=$(echo "$line" | awk -F'|' '{gsub(/^ +| +$/,"",$5); print $5}') + echo "$avg,$ops,$cnt" +} + +run_rout() { + local sample="$1" + local iters="$2" + local warm="$3" + local rout_fixture="$ROUT_BENCH_DIR/fixtures/selected_der/${sample}.mft" + if [[ ! -f "$rout_fixture" ]]; then + echo "routinator fixture not found: $rout_fixture" >&2 + exit 1 + fi + + echo "### routinator $sample" >> "$OUT_RAW" + local out + out=$( + $taskset_prefix "$ROUT_BIN" \ + --target decode_only \ + --manifest "$rout_fixture" \ + --issuer "$ROUT_BENCH_DIR/fixtures/ta.cer" \ + --iterations "$iters" \ + --repeats "$REPEATS" \ + --warmup-iterations "$warm" \ + --strict false + ) + echo "$out" >> "$OUT_RAW" + + local avg_line cnt_line + avg_line=$(echo "$out" | rg "^ avg:") + cnt_line=$(echo "$out" | rg "^ manifest_file_count:") + + local avg_ns ops_s cnt + avg_ns=$(echo "$avg_line" | awk '{print $2}') + ops_s=$(echo "$avg_line" | awk '{gsub(/[()]/,"",$4); print $4}') + cnt=$(echo "$cnt_line" | awk '{print $2}') + echo "$avg_ns,$ops_s,$cnt" +} + +echo "[3/3] Run per-sample benchmarks..." | tee -a "$OUT_RAW" +for s in "${SAMPLES[@]}"; do + b=$(bucket_for "$s") + it=$(iters_for "$b") + warm=$(warm_for "$b") + + IFS=, read -r ours_avg ours_ops ours_cnt < <(run_ours "$s" "$it" "$warm") + IFS=, read -r rout_avg rout_ops rout_cnt < <(run_rout "$s" "$it" "$warm") + + if [[ "$ours_cnt" != "$rout_cnt" ]]; then + echo "WARNING: file count differs for $s (ours=$ours_cnt rout=$rout_cnt)" | tee -a "$OUT_RAW" + fi + + ratio=$(python3 - <> "$OUT_CSV" + echo >> "$OUT_RAW" +done + +echo "Done." +echo "- CSV: $OUT_CSV" +echo "- Raw: $OUT_RAW" diff --git a/scripts/manifest_perf_profile_m3.sh b/scripts/manifest_perf_profile_m3.sh new file mode 100755 index 0000000..ae28650 --- /dev/null +++ b/scripts/manifest_perf_profile_m3.sh @@ -0,0 +1,142 @@ +#!/usr/bin/env bash +set -euo pipefail + +# M3: Generate flamegraphs + top hotspots for Manifest decode+profile (Ours vs Routinator). +# +# Outputs under: +# specs/develop/20260224/flamegraph/ +# specs/develop/20260224/hotspots/ +# specs/develop/20260224/perf/ +# +# Notes: +# - On WSL2, /usr/bin/perf is often a wrapper that fails. This script uses a real perf binary +# from /usr/lib/linux-tools/*/perf (if present). +# - Ours profiling uses perf + flamegraph --perfdata to avoid rebuilding the whole crate graph +# with RocksDB. + +ROOT_REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +RPKI_DIR="$ROOT_REPO/rpki" + +DATE_TAG="${DATE_TAG:-20260224}" +OUT_BASE="$ROOT_REPO/specs/develop/${DATE_TAG}" +OUT_FLAME="$OUT_BASE/flamegraph" +OUT_HOT="$OUT_BASE/hotspots" +OUT_PERF="$OUT_BASE/perf" + +RUN_TAG="${RUN_TAG:-p2}" + +OURS_BENCH_DIR="$RPKI_DIR/benchmark/ours_manifest_bench" +OURS_BIN="$OURS_BENCH_DIR/target/release/ours-manifest-bench" + +ROUT_BENCH_DIR="${ROUT_BENCH_DIR:-/home/yuyr/dev/rust_playground/routinator/benchmark}" +ROUT_BIN="$ROUT_BENCH_DIR/target/release/routinator-manifest-benchmark" +ROUT_ISSUER="$ROUT_BENCH_DIR/fixtures/ta.cer" + +PROFILE_HZ="${PROFILE_HZ:-99}" + +mkdir -p "$OUT_FLAME" "$OUT_HOT" "$OUT_PERF" + +PERF_WRAPPER_OUT="$(perf --version 2>&1 || true)" +PERF_REAL="" +if echo "${PERF_WRAPPER_OUT}" | grep -q "WARNING: perf not found for kernel"; then + PERF_REAL="$(ls -1 /usr/lib/linux-tools/*/perf 2>/dev/null | head -n 1 || true)" +else + PERF_REAL="$(command -v perf || true)" +fi + +if [[ -z "${PERF_REAL}" ]]; then + echo "ERROR: usable perf binary not found (wrapper detected and no /usr/lib/linux-tools/*/perf)." >&2 + exit 2 +fi + +SHIM_DIR="$RPKI_DIR/target/bench/tools" +mkdir -p "$SHIM_DIR" +cat > "$SHIM_DIR/perf" </dev/null 2>&1; then + taskset_prefix="taskset -c 0" +fi + +profile_ours() { + local sample="$1" + local iters="$2" + local warm="$3" + local fixture="$RPKI_DIR/tests/benchmark/selected_der/${sample}.mft" + if [[ ! -f "$fixture" ]]; then + echo "ERROR: ours fixture not found: $fixture" >&2 + exit 1 + fi + + local perfdata="$OUT_PERF/ours_${sample}_${RUN_TAG}.perf.data" + local svg="$OUT_FLAME/ours_${sample}_${RUN_TAG}.svg" + local tsv="$OUT_HOT/ours_${sample}_${RUN_TAG}.tsv" + + echo "== ours $sample (iters=$iters warmup=$warm hz=$PROFILE_HZ)" + $taskset_prefix perf record -o "$perfdata" -F "$PROFILE_HZ" -g -- \ + "$OURS_BIN" --manifest "$fixture" --iterations "$iters" --warmup-iterations "$warm" --repeats 1 >/dev/null + + flamegraph --perfdata "$perfdata" --output "$svg" --title "ours ${sample} ManifestObject::decode_der" --deterministic >/dev/null + + perf report -i "$perfdata" --stdio --no-children --sort symbol --percent-limit 0.5 \ + | awk '/^[[:space:]]*[0-9.]+%/ {pct=$1; sub(/%/,"",pct); $1=""; sub(/^[[:space:]]+/,""); print pct "\t" $0}' \ + > "$tsv" +} + +profile_routinator() { + local sample="$1" + local iters="$2" + local warm="$3" + local fixture="$ROUT_BENCH_DIR/fixtures/selected_der/${sample}.mft" + if [[ ! -f "$fixture" ]]; then + echo "ERROR: routinator fixture not found: $fixture" >&2 + exit 1 + fi + + local svg="$OUT_FLAME/routinator_${sample}_${RUN_TAG}.svg" + local tsv="$OUT_HOT/routinator_${sample}_${RUN_TAG}.tsv" + + echo "== routinator $sample (iters=$iters warmup=$warm hz=$PROFILE_HZ)" + $taskset_prefix "$ROUT_BIN" \ + --target decode_only \ + --manifest "$fixture" \ + --issuer "$ROUT_ISSUER" \ + --iterations "$iters" \ + --repeats 1 \ + --warmup-iterations "$warm" \ + --strict false \ + --profile-hz "$PROFILE_HZ" \ + --flamegraph "$svg" \ + --hotspots "$tsv" \ + >/dev/null +} + +echo "[3/3] Profile samples..." + +# Choose iterations so each capture runs ~10-20s serially. +profile_ours small-01 200000 0 +profile_routinator small-01 200000 0 + +profile_ours large-02 50000 0 +profile_routinator large-02 50000 0 + +profile_ours xlarge-02 5000 0 +profile_routinator xlarge-02 5000 0 + +echo "Done." +echo "- Flamegraphs: $OUT_FLAME/" +echo "- Hotspots: $OUT_HOT/" +echo "- Perf data: $OUT_PERF/" diff --git a/specs/arch.excalidraw b/specs/arch.excalidraw index f282369..6dbed3f 100644 --- a/specs/arch.excalidraw +++ b/specs/arch.excalidraw @@ -131,7 +131,7 @@ "version": 61, "versionNonce": 1723253093, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770712989659, "link": null, "locked": false @@ -192,7 +192,7 @@ "version": 50, "versionNonce": 935935979, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770713011072, "link": null, "locked": false, @@ -229,7 +229,7 @@ "version": 64, "versionNonce": 664751051, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770713034384, "link": null, "locked": false, @@ -266,7 +266,7 @@ "version": 5, "versionNonce": 1052482507, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770713114585, "link": null, "locked": false, @@ -342,7 +342,7 @@ "version": 31, "versionNonce": 291819, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770713136745, "link": null, "locked": false, @@ -392,7 +392,7 @@ "version": 42, "versionNonce": 812442347, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770713145632, "link": null, "locked": false, @@ -437,10 +437,6 @@ "versionNonce": 1619895909, "isDeleted": false, "boundElements": [ - { - "id": "cktmBgzDHQVp__ThQSYj7", - "type": "arrow" - }, { "id": "t6L4IloEw2niv4WL5K7nm", "type": "arrow" @@ -1045,7 +1041,7 @@ "version": 8, "versionNonce": 742717515, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770714823157, "link": null, "locked": false, @@ -1334,7 +1330,7 @@ "version": 323, "versionNonce": 1467795045, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770715873720, "link": null, "locked": false, @@ -1445,7 +1441,7 @@ "version": 42, "versionNonce": 589361675, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770715099668, "link": null, "locked": false, @@ -1754,9 +1750,9 @@ { "id": "kX3rMNwDurF6i699O_SE8", "type": "text", - "x": 110.67323112589077, - "y": 157.70055147613942, - "width": 336.02783203125, + "x": 192.37925529581264, + "y": 159.70055147613942, + "width": 476.61578369140625, "height": 35, "angle": 0, "strokeColor": "#1e1e1e", @@ -1771,20 +1767,20 @@ "index": "ay", "roundness": null, "seed": 1264632357, - "version": 105, - "versionNonce": 933795019, + "version": 137, + "versionNonce": 1508339779, "isDeleted": false, - "boundElements": null, - "updated": 1770715475754, + "boundElements": [], + "updated": 1771988976926, "link": null, "locked": false, - "text": "V1. Sequential processing", + "text": "V1. Sequential processing, bulk sync", "fontSize": 28, "fontFamily": 5, "textAlign": "center", "verticalAlign": "top", "containerId": null, - "originalText": "V1. Sequential processing", + "originalText": "V1. Sequential processing, bulk sync", "autoResize": true, "lineHeight": 1.25 }, @@ -2167,7 +2163,7 @@ "version": 19, "versionNonce": 1674239947, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770715646534, "link": null, "locked": false, @@ -2221,7 +2217,7 @@ "version": 26, "versionNonce": 1969706949, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770715650828, "link": null, "locked": false, @@ -2275,7 +2271,7 @@ "version": 27, "versionNonce": 1392885893, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1770715655497, "link": null, "locked": false, @@ -2303,6 +2299,2308 @@ "startArrowhead": null, "endArrowhead": "arrow", "elbowed": false + }, + { + "id": "pK2KuweZmIqxZUBP39Lnu", + "type": "rectangle", + "x": 243.34645811055054, + "y": 1394.3305105830423, + "width": 142.66674804687503, + "height": 104, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0D", + "roundness": { + "type": 3 + }, + "seed": 379870445, + "version": 524, + "versionNonce": 618646115, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "n-FMilxfc2ZJiqYA-gFre" + } + ], + "updated": 1771989070180, + "link": null, + "locked": false + }, + { + "id": "n-FMilxfc2ZJiqYA-gFre", + "type": "text", + "x": 266.2098690602576, + "y": 1408.8305105830423, + "width": 96.93992614746094, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0E", + "roundness": null, + "seed": 222574413, + "version": 575, + "versionNonce": 1908134637, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997746, + "link": null, + "locked": false, + "text": "sync pp\n(rrdp :\nsnapshot)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pK2KuweZmIqxZUBP39Lnu", + "originalText": "sync pp\n(rrdp : snapshot)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "J6aT42Ttbxs8J8ICHMZij", + "type": "rectangle", + "x": 464.5129467580115, + "y": 1616.6639761592141, + "width": 273.0000305175781, + "height": 73.3333740234375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0F", + "roundness": null, + "seed": 733595053, + "version": 184, + "versionNonce": 1107094861, + "isDeleted": false, + "boundElements": [ + { + "id": "WbYpzvCWcQTPm1dKw9dBO", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "ly_KFmgXjNMaBuHpnswW-", + "type": "rectangle", + "x": 476.17963376973023, + "y": 1623.9973807002298, + "width": 34, + "height": 57.33331298828125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0G", + "roundness": null, + "seed": 1429112845, + "version": 111, + "versionNonce": 1873919501, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "eQw5MvT9qLYq7v6i1rrRg", + "type": "rectangle", + "x": 691.1796032521521, + "y": 1623.9973501826516, + "width": 34, + "height": 57.33331298828125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0H", + "roundness": null, + "seed": 1268514413, + "version": 181, + "versionNonce": 1548252269, + "isDeleted": false, + "boundElements": [ + { + "id": "dIV5isrknYEDYXx3LBF99", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "EhQ-Tz_NnRqlf9WPub5GX", + "type": "text", + "x": 578.8462902638709, + "y": 1638.6640066767923, + "width": 27.399978637695312, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0I", + "roundness": null, + "seed": 1439410381, + "version": 100, + "versionNonce": 31325485, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": ".....", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": ".....", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "kNxB8eKthsDCnAnPEDR1z", + "type": "text", + "x": 521.5129772755896, + "y": 1713.330693688511, + "width": 186.4598388671875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0J", + "roundness": null, + "seed": 626460461, + "version": 114, + "versionNonce": 1491062669, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "CA Instance Queue", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "CA Instance Queue", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "fHfTE7gQEL2I3VTo_yUVO", + "type": "text", + "x": 202.17963376973023, + "y": 1646.6640066767923, + "width": 38.319976806640625, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0K", + "roundness": null, + "seed": 2091358605, + "version": 55, + "versionNonce": 1756911085, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "TAL", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "TAL", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "fRP0vWEmoT9UFXnoJhPMF", + "type": "text", + "x": 329.0196148488318, + "y": 1644.1640066767923, + "width": 27.459991455078125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0L", + "roundness": null, + "seed": 351723501, + "version": 124, + "versionNonce": 1282478157, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "TA", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "TA", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "WbYpzvCWcQTPm1dKw9dBO", + "type": "arrow", + "x": 384.84629026387086, + "y": 1653.330693688511, + "width": 64, + "height": 0.66668701171875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0M", + "roundness": { + "type": 2 + }, + "seed": 1145985613, + "version": 129, + "versionNonce": 1156599075, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998065, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 64, + 0.66668701171875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "J6aT42Ttbxs8J8ICHMZij", + "focus": -0.05912097242544523, + "gap": 15.666656494140625 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "vrcsQGoaeLT58iWb5XWjr", + "type": "arrow", + "x": 258.8462292287146, + "y": 1653.9973196650735, + "width": 49.333343505859375, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0N", + "roundness": { + "type": 2 + }, + "seed": 1669826733, + "version": 92, + "versionNonce": 263790861, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 49.333343505859375, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "lvox0Kgsgp8drDMi8v5Gb", + "type": "rectangle", + "x": 802.5128552052771, + "y": 1565.9972891474954, + "width": 34, + "height": 57.33331298828125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0O", + "roundness": null, + "seed": 1951132429, + "version": 245, + "versionNonce": 1802205037, + "isDeleted": false, + "boundElements": [ + { + "id": "1KvGdx5_vzQ6QOksy3HUk", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "SVCRMaoPvBRF4vedZJJQS", + "type": "text", + "x": 800.9496227834021, + "y": 1638.8306326533548, + "width": 119.69989013671875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0P", + "roundness": null, + "seed": 118817133, + "version": 206, + "versionNonce": 811352109, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "CA Instance", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "CA Instance", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "dIV5isrknYEDYXx3LBF99", + "type": "arrow", + "x": 739.5128552052771, + "y": 1655.9973196650735, + "width": 46, + "height": 52.66668701171875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Q", + "roundness": { + "type": 2 + }, + "seed": 1630292941, + "version": 214, + "versionNonce": 944812227, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998066, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 46, + -52.66668701171875 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "eQw5MvT9qLYq7v6i1rrRg", + "focus": 0.8146120463303684, + "gap": 14.333251953125 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "rpCoFEagKz5ronj_Y5BUq", + "type": "rectangle", + "x": 214.17954221699586, + "y": 1362.663915124058, + "width": 859.3333129882814, + "height": 151.33331298828125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0R", + "roundness": null, + "seed": 1655392813, + "version": 339, + "versionNonce": 146921709, + "isDeleted": false, + "boundElements": [ + { + "id": "1KvGdx5_vzQ6QOksy3HUk", + "type": "arrow" + }, + { + "id": "NJwDfFdgKniyZWhIgv_vr", + "type": "arrow" + }, + { + "id": "c_GDr8W4M_Jdfd1LgGFO0", + "type": "arrow" + }, + { + "id": "1lEeEIZ16EByBIHWAUQX7", + "type": "arrow" + }, + { + "id": "cPzjO60brqLtWuPhVwRZv", + "type": "arrow" + }, + { + "id": "A7JxruZaup8zBIfc-BVzD", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "fGqhFkTaP9grj3IAzJNda", + "type": "text", + "x": 592.847771146741, + "y": 1520.3191041182754, + "width": 182.1998291015625, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0S", + "roundness": null, + "seed": 746290317, + "version": 427, + "versionNonce": 2047382925, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "Processing Pipeline", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Processing Pipeline", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "eZK49hSPN0iPNuxgjAnok", + "type": "rectangle", + "x": 408.84616819355836, + "y": 1390.663915124058, + "width": 142.66674804687503, + "height": 104, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0T", + "roundness": { + "type": 3 + }, + "seed": 106324717, + "version": 568, + "versionNonce": 1471614893, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "5_2yBI8uINsiAAyIkC5EN" + }, + { + "id": "p5gl0vDTNCCUrD00wcCXJ", + "type": "arrow" + } + ], + "updated": 1771989072429, + "link": null, + "locked": false + }, + { + "id": "5_2yBI8uINsiAAyIkC5EN", + "type": "text", + "x": 438.7895809743201, + "y": 1417.663915124058, + "width": 82.77992248535156, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0U", + "roundness": null, + "seed": 80051533, + "version": 644, + "versionNonce": 1654675021, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "process\nmanifest", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "eZK49hSPN0iPNuxgjAnok", + "originalText": "process\nmanifest", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "TYgM3ByZBpMnY7_KTXGu9", + "type": "rectangle", + "x": 580.1795422169959, + "y": 1387.3306021357766, + "width": 142.66674804687503, + "height": 104, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0V", + "roundness": { + "type": 3 + }, + "seed": 1864518573, + "version": 612, + "versionNonce": 1800333069, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "WjxbyyeHwaZOKpLD1SqD0" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "WjxbyyeHwaZOKpLD1SqD0", + "type": "text", + "x": 614.6529461476599, + "y": 1414.3306021357766, + "width": 73.71994018554688, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0W", + "roundness": null, + "seed": 1704349197, + "version": 710, + "versionNonce": 475561325, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "extract\nobjects", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TYgM3ByZBpMnY7_KTXGu9", + "originalText": "extract\nobjects", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "vsRffvKqgeTUVLJGF6SgH", + "type": "rectangle", + "x": 746.1794811818396, + "y": 1387.3306021357766, + "width": 142.66674804687503, + "height": 104, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0X", + "roundness": { + "type": 3 + }, + "seed": 1192952941, + "version": 672, + "versionNonce": 2023770061, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "BiCmk3W1fJS-KiMNptOfb" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "BiCmk3W1fJS-KiMNptOfb", + "type": "text", + "x": 764.7629009816443, + "y": 1414.3306021357766, + "width": 105.49990844726562, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Y", + "roundness": null, + "seed": 1467608781, + "version": 826, + "versionNonce": 1648346669, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "discover\nchildren CA", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "vsRffvKqgeTUVLJGF6SgH", + "originalText": "discover\nchildren CA", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "plwHn3tJhVGDQiWaZjQJs", + "type": "rectangle", + "x": 915.5128552052771, + "y": 1388.6640066767923, + "width": 142.66674804687503, + "height": 104, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Z", + "roundness": { + "type": 3 + }, + "seed": 625773869, + "version": 712, + "versionNonce": 1008760973, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "BCjZv_yoxP0ZOi0AajlqC" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "BCjZv_yoxP0ZOi0AajlqC", + "type": "text", + "x": 961.5862499806677, + "y": 1415.6640066767923, + "width": 50.51995849609375, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0a", + "roundness": null, + "seed": 805068685, + "version": 885, + "versionNonce": 1341906669, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "build\naudit", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "plwHn3tJhVGDQiWaZjQJs", + "originalText": "build\naudit", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1KvGdx5_vzQ6QOksy3HUk", + "type": "arrow", + "x": 786.6085487780363, + "y": 1571.6992603484082, + "width": 649.4359483818903, + "height": 129.18418959695612, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0b", + "roundness": { + "type": 2 + }, + "seed": 1304618477, + "version": 378, + "versionNonce": 624401411, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998067, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -606.3745786685331, + -3.515241767764792 + ], + [ + -649.4359483818903, + -108.09289990413765 + ], + [ + -601.9805465730485, + -129.18418959695612 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "lvox0Kgsgp8drDMi8v5Gb", + "focus": 0.7917180455874213, + "gap": 15.90430642724084 + }, + "endBinding": { + "elementId": "rpCoFEagKz5ronj_Y5BUq", + "focus": 0.74977596595825, + "gap": 29.551540012008104 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "3wxXo7q8NwFLF4zI6EdAm", + "type": "ellipse", + "x": 1161.8578116101708, + "y": 1240.390157557351, + "width": 124.79015750147141, + "height": 92.27443263452369, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0c", + "roundness": null, + "seed": 1370071117, + "version": 111, + "versionNonce": 1922615213, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "F42PrgyRRp1VpQIHqQpb-" + }, + { + "id": "NJwDfFdgKniyZWhIgv_vr", + "type": "arrow" + }, + { + "id": "A_-T50A5cJx9o4PFW1hld", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "F42PrgyRRp1VpQIHqQpb-", + "type": "text", + "x": 1197.6529265948425, + "y": 1273.9034353516063, + "width": 52.9599609375, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0d", + "roundness": null, + "seed": 1904873133, + "version": 59, + "versionNonce": 752699917, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "VRPS", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "3wxXo7q8NwFLF4zI6EdAm", + "originalText": "VRPS", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "dtqsOPIcBTuUhktIAX3zU", + "type": "ellipse", + "x": 1169.7670854734201, + "y": 1363.8621295672424, + "width": 124.79015750147141, + "height": 92.27443263452369, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0e", + "roundness": null, + "seed": 1812836621, + "version": 159, + "versionNonce": 732236077, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "_1PAF6snWphoSkwPbj7Hr" + }, + { + "id": "c_GDr8W4M_Jdfd1LgGFO0", + "type": "arrow" + }, + { + "id": "VROBhm8es3DMZ4ERxerTd", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "_1PAF6snWphoSkwPbj7Hr", + "type": "text", + "x": 1200.3022059512562, + "y": 1397.3754073614978, + "width": 63.479949951171875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0f", + "roundness": null, + "seed": 1856898925, + "version": 113, + "versionNonce": 1306876813, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "ASPAS", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "dtqsOPIcBTuUhktIAX3zU", + "originalText": "ASPAS", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "NJwDfFdgKniyZWhIgv_vr", + "type": "arrow", + "x": 1099.4627730878774, + "y": 1379.2411614445539, + "width": 54.48580488748621, + "height": 69.42552205782272, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0g", + "roundness": { + "type": 2 + }, + "seed": 1001689549, + "version": 178, + "versionNonce": 189577027, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998068, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 54.48580488748621, + -69.42552205782272 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "rpCoFEagKz5ronj_Y5BUq", + "focus": 0.8368105037552904, + "gap": 25.949917882600175 + }, + "endBinding": { + "elementId": "3wxXo7q8NwFLF4zI6EdAm", + "focus": 0.527640471343281, + "gap": 13.81162576334855 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "c_GDr8W4M_Jdfd1LgGFO0", + "type": "arrow", + "x": 1102.9780148556424, + "y": 1408.2416847721793, + "width": 50.97056311972142, + "height": 0.8788305561624838, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0h", + "roundness": { + "type": 2 + }, + "seed": 272289837, + "version": 185, + "versionNonce": 952369795, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998068, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 50.97056311972142, + -0.8788305561624838 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "rpCoFEagKz5ronj_Y5BUq", + "focus": -0.2668984433045746, + "gap": 29.465159650365194 + }, + "endBinding": { + "elementId": "dtqsOPIcBTuUhktIAX3zU", + "focus": 0.08440560920749281, + "gap": 15.888046773141392 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "qIDZwImSjvK9YRnTvRAxb", + "type": "diamond", + "x": 419.70807565833934, + "y": 1205.6773965284394, + "width": 178.39717206123768, + "height": 108.09285967569502, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0i", + "roundness": null, + "seed": 1244283533, + "version": 249, + "versionNonce": 1333363565, + "isDeleted": false, + "boundElements": [ + { + "id": "p5gl0vDTNCCUrD00wcCXJ", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "PbpWoahheVCEYC8KyPd32", + "type": "diamond", + "x": 194.73441280130749, + "y": 1207.4350576407644, + "width": 211.7915665705777, + "height": 108.09285967569502, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0j", + "roundness": null, + "seed": 1312581869, + "version": 258, + "versionNonce": 425151533, + "isDeleted": false, + "boundElements": [ + { + "id": "1lEeEIZ16EByBIHWAUQX7", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "bMKvhaEsFb8u8fqkxY6El", + "type": "text", + "x": 250.89138939228974, + "y": 1121.836476107175, + "width": 112.7799072265625, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "groupIds": [], + "frameId": null, + "index": "b0k", + "roundness": null, + "seed": 771408717, + "version": 373, + "versionNonce": 1600775405, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "Rocksdb\nRAW \nfile storage", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Rocksdb\nRAW \nfile storage", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "epi8aAp0JHXOw7yxmHi6s", + "type": "text", + "x": 472.7066642037241, + "y": 1118.27371551905, + "width": 81.51992797851562, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0l", + "roundness": null, + "seed": 230609325, + "version": 471, + "versionNonce": 874037069, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "Rocksdb\nCached \npp pack", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Rocksdb\nCached \npp pack", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "eQwsik-9JA9Z_2btqgmgB", + "type": "text", + "x": 230.59728791380635, + "y": 1249.8840734868252, + "width": 149.5598602294922, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0m", + "roundness": null, + "seed": 1253184525, + "version": 94, + "versionNonce": 1275252067, + "isDeleted": false, + "boundElements": [ + { + "id": "1lEeEIZ16EByBIHWAUQX7", + "type": "arrow" + } + ], + "updated": 1771988998069, + "link": null, + "locked": false, + "text": "roa/mft/crl/cer\n...", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "roa/mft/crl/cer\n...", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nq219_ONeC4LRyb3lRk-P", + "type": "text", + "x": 439.017849803279, + "y": 1246.541810536718, + "width": 138.01988220214844, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0n", + "roundness": null, + "seed": 1624115821, + "version": 92, + "versionNonce": 645992461, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "pp1/pp2/pp3...", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "pp1/pp2/pp3...", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1lEeEIZ16EByBIHWAUQX7", + "type": "arrow", + "x": 302.38775662781495, + "y": 1384.5139838677585, + "width": 0, + "height": 61.51624819457322, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0o", + "roundness": null, + "seed": 282866893, + "version": 183, + "versionNonce": 2127658435, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998069, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -61.51624819457322 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "rpCoFEagKz5ronj_Y5BUq", + "focus": -0.7947054697458892, + "gap": 21.850068743700604 + }, + "endBinding": { + "elementId": "eQwsik-9JA9Z_2btqgmgB", + "focus": 0.03997678783799776, + "gap": 14 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "p5gl0vDTNCCUrD00wcCXJ", + "type": "arrow", + "x": 512.4218229998379, + "y": 1376.6047502329516, + "width": 0.8788305561624838, + "height": 55.364635443648694, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0p", + "roundness": null, + "seed": 1182143277, + "version": 177, + "versionNonce": 893587619, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998070, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.8788305561624838, + -55.364635443648694 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "eZK49hSPN0iPNuxgjAnok", + "focus": 0.43229228206783404, + "gap": 14.05916489110632 + }, + "endBinding": { + "elementId": "qIDZwImSjvK9YRnTvRAxb", + "focus": -0.09936772335567425, + "gap": 8.288872253399507 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "hcIF4ls9aRuUJZE5l3Mxa", + "type": "ellipse", + "x": 1173.2823272411847, + "y": 1489.5309567111062, + "width": 124.79015750147141, + "height": 92.27443263452369, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0q", + "roundness": null, + "seed": 1040524685, + "version": 208, + "versionNonce": 1314295597, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "3vtKK2zY2XD1EnAxI7-r3" + }, + { + "id": "cPzjO60brqLtWuPhVwRZv", + "type": "arrow" + }, + { + "id": "ZuQqhKvXROaruvymuHTan", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "3vtKK2zY2XD1EnAxI7-r3", + "type": "text", + "x": 1199.5574532121848, + "y": 1510.5442345053616, + "width": 71.99993896484375, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0r", + "roundness": null, + "seed": 1791159277, + "version": 180, + "versionNonce": 1819681165, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "children\nCA", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "hcIF4ls9aRuUJZE5l3Mxa", + "originalText": "children\nCA", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "cPzjO60brqLtWuPhVwRZv", + "type": "arrow", + "x": 1100.341523187155, + "y": 1458.3334977926233, + "width": 57.12229655597366, + "height": 49.212982464281595, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0s", + "roundness": null, + "seed": 481879629, + "version": 203, + "versionNonce": 591102947, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998070, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 57.12229655597366, + 49.212982464281595 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "rpCoFEagKz5ronj_Y5BUq", + "focus": -0.8372608711722136, + "gap": 26.828667981877743 + }, + "endBinding": { + "elementId": "hcIF4ls9aRuUJZE5l3Mxa", + "focus": -0.39304316221230523, + "gap": 23.06591148313442 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ZuQqhKvXROaruvymuHTan", + "type": "arrow", + "x": 1227.7680919002287, + "y": 1602.4572838745885, + "width": 803.2266392680979, + "height": 166.97273688710857, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0t", + "roundness": { + "type": 2 + }, + "seed": 1723897005, + "version": 222, + "versionNonce": 2106003331, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998070, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -140.6086247710855, + 166.09390633094608 + ], + [ + -803.2266392680979, + 166.97273688710857 + ], + [ + -783.8929604020511, + 85.24398932743668 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "hcIF4ls9aRuUJZE5l3Mxa", + "focus": -0.479352215629856, + "gap": 20.94954853984769 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "voaHj166FgqKXTrD_cnHd", + "type": "text", + "x": 170.1101449975834, + "y": 1032.8892001973657, + "width": 922.4036254882812, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0u", + "roundness": null, + "seed": 1149466381, + "version": 292, + "versionNonce": 516034093, + "isDeleted": false, + "boundElements": [], + "updated": 1771989062577, + "link": null, + "locked": false, + "text": "V1.1 Sequential processing, bulk sync + incremental sync/cache usage", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "V1.1 Sequential processing, bulk sync + incremental sync/cache usage", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "WqzMgtVmOY9PC4VufdArQ", + "type": "ellipse", + "x": 1157.60360434743, + "y": 1131.6944584800729, + "width": 124.79015750147141, + "height": 92.27443263452369, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0v", + "roundness": null, + "seed": 8064365, + "version": 140, + "versionNonce": 376755149, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "efLu_RpIdM-39Pqv_4O70" + }, + { + "id": "A7JxruZaup8zBIfc-BVzD", + "type": "arrow" + }, + { + "id": "m-o2RdYKsDGYJi_JfuZlU", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "efLu_RpIdM-39Pqv_4O70", + "type": "text", + "x": 1189.1887278770237, + "y": 1165.2077362743282, + "width": 61.37994384765625, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0w", + "roundness": null, + "seed": 1508956109, + "version": 94, + "versionNonce": 1839387181, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "audits", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "WqzMgtVmOY9PC4VufdArQ", + "originalText": "audits", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "A7JxruZaup8zBIfc-BVzD", + "type": "arrow", + "x": 1084.850440216766, + "y": 1341.9026544272915, + "width": 69.41464522805859, + "height": 132.51886816265744, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0x", + "roundness": { + "type": 2 + }, + "seed": 1795053101, + "version": 185, + "versionNonce": 1307921091, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998071, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 69.41464522805859, + -132.51886816265744 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "rpCoFEagKz5ronj_Y5BUq", + "focus": 0.8320755854741431, + "gap": 23.65524845804479 + }, + "endBinding": { + "elementId": "WqzMgtVmOY9PC4VufdArQ", + "focus": 0.5684502667918756, + "gap": 14.443376509558366 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "UYqc90jYvsoncKtuEQ4vW", + "type": "ellipse", + "x": 1347.7181145697148, + "y": 1239.9974134420977, + "width": 124.79015750147141, + "height": 92.27443263452369, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0y", + "roundness": null, + "seed": 1317865613, + "version": 187, + "versionNonce": 504746925, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "sj5i7H1ZoOhoyR73YbA5w" + }, + { + "id": "A_-T50A5cJx9o4PFW1hld", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "sj5i7H1ZoOhoyR73YbA5w", + "type": "text", + "x": 1383.5132295543867, + "y": 1261.010691236353, + "width": 52.9599609375, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0z", + "roundness": null, + "seed": 106327789, + "version": 141, + "versionNonce": 2094585357, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "all\nVRPS", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "UYqc90jYvsoncKtuEQ4vW", + "originalText": "all\nVRPS", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "oZSidb5F1VSJh5S-DTAnF", + "type": "ellipse", + "x": 1355.6273884329646, + "y": 1363.4693854519894, + "width": 124.79015750147141, + "height": 92.27443263452369, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b10", + "roundness": null, + "seed": 551815501, + "version": 235, + "versionNonce": 1438283469, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "C9WUXgM_fsPV-JIZHcJx6" + }, + { + "id": "VROBhm8es3DMZ4ERxerTd", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "C9WUXgM_fsPV-JIZHcJx6", + "type": "text", + "x": 1386.1625089108006, + "y": 1384.4826632462448, + "width": 63.479949951171875, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b11", + "roundness": null, + "seed": 529487789, + "version": 194, + "versionNonce": 440145197, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "all\nASPAS", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "oZSidb5F1VSJh5S-DTAnF", + "originalText": "all\nASPAS", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "lEUdQD50ILVxuvfW0Uo6F", + "type": "ellipse", + "x": 1343.4639073069745, + "y": 1131.3017143648199, + "width": 124.79015750147141, + "height": 92.27443263452369, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b12", + "roundness": null, + "seed": 478272013, + "version": 216, + "versionNonce": 1651535341, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "_CqsX809p_C_S-Km-gjX2" + }, + { + "id": "m-o2RdYKsDGYJi_JfuZlU", + "type": "arrow" + } + ], + "updated": 1771988997747, + "link": null, + "locked": false + }, + { + "id": "_CqsX809p_C_S-Km-gjX2", + "type": "text", + "x": 1375.0490308365684, + "y": 1152.3149921590752, + "width": 61.37994384765625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b13", + "roundness": null, + "seed": 817172589, + "version": 186, + "versionNonce": 124135501, + "isDeleted": false, + "boundElements": [], + "updated": 1771988997747, + "link": null, + "locked": false, + "text": "all\naudits", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "lEUdQD50ILVxuvfW0Uo6F", + "originalText": "all\naudits", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "m-o2RdYKsDGYJi_JfuZlU", + "type": "arrow", + "x": 1289.413328326225, + "y": 1177.831674797335, + "width": 42.595350480853995, + "height": 1.0517691453775342, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b14", + "roundness": { + "type": 2 + }, + "seed": 435321549, + "version": 165, + "versionNonce": 972928515, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998071, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 42.595350480853995, + 1.0517691453775342 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "WqzMgtVmOY9PC4VufdArQ", + "focus": -0.03594946064605047, + "gap": 7.019566477323565 + }, + "endBinding": { + "elementId": "lEUdQD50ILVxuvfW0Uo6F", + "focus": -0.06854401054158754, + "gap": 11.478115061936741 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "A_-T50A5cJx9o4PFW1hld", + "type": "arrow", + "x": 1294.671981474307, + "y": 1286.1606229315303, + "width": 43.64711962623164, + "height": 1.0517691453775342, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b15", + "roundness": { + "type": 2 + }, + "seed": 550738221, + "version": 172, + "versionNonce": 1691636035, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998071, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 43.64711962623164, + -1.0517691453775342 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "3wxXo7q8NwFLF4zI6EdAm", + "focus": 0.027920319624342795, + "gap": 8.025608282862457 + }, + "endBinding": { + "elementId": "UYqc90jYvsoncKtuEQ4vW", + "focus": 0.05784554647967765, + "gap": 9.411101585368538 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "VROBhm8es3DMZ4ERxerTd", + "type": "arrow", + "x": 1303.0858457691193, + "y": 1401.8516662151605, + "width": 49.957541919691494, + "height": 1.0516728559748572, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b16", + "roundness": { + "type": 2 + }, + "seed": 1052896141, + "version": 173, + "versionNonce": 883760259, + "isDeleted": false, + "boundElements": [], + "updated": 1771988998071, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 49.957541919691494, + -1.0516728559748572 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "dtqsOPIcBTuUhktIAX3zU", + "focus": -0.14024322915764614, + "gap": 9.29755273930883 + }, + "endBinding": { + "elementId": "oZSidb5F1VSJh5S-DTAnF", + "focus": 0.21442257431549464, + "gap": 3.6200174208305973 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false } ], "appState": { diff --git a/src/data_model/manifest.rs b/src/data_model/manifest.rs index 2daf619..12459d5 100644 --- a/src/data_model/manifest.rs +++ b/src/data_model/manifest.rs @@ -4,8 +4,6 @@ use crate::data_model::rc::ResourceCertificate; use crate::data_model::signed_object::{ RpkiSignedObject, RpkiSignedObjectParsed, SignedObjectParseError, SignedObjectValidateError, }; -use der_parser::ber::BerObjectContent; -use der_parser::der::{DerObject, Tag, parse_der}; #[derive(Clone, Debug, PartialEq, Eq)] pub struct ManifestObject { @@ -28,7 +26,10 @@ pub struct ManifestEContent { pub this_update: UtcTime, pub next_update: UtcTime, pub file_hash_alg: String, - pub files: Vec, + /// DER-encoded content bytes of `Manifest.fileList` (SEQUENCE OF FileAndHash). + pub file_list_der: Vec, + /// Count of FileAndHash entries in `fileList`. + pub file_count: usize, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -39,7 +40,7 @@ pub struct ManifestEContentParsed { #[derive(Clone, Debug, PartialEq, Eq)] pub struct FileAndHash { pub file_name: String, - pub hash_bytes: Vec, + pub hash_bytes: [u8; 32], } #[derive(Debug, thiserror::Error)] @@ -246,7 +247,8 @@ impl ManifestObject { impl ManifestEContent { /// Parse step of scheme A (`parse → validate → verify`). pub fn parse_der(der: &[u8]) -> Result { - let (rem, _obj) = parse_der(der).map_err(|e| ManifestParseError::Parse(e.to_string()))?; + let (_tag, _value, rem) = + der_take_tlv(der).map_err(|e| ManifestParseError::Parse(e))?; if !rem.is_empty() { return Err(ManifestParseError::TrailingBytes(rem.len())); } @@ -265,6 +267,18 @@ impl ManifestEContent { pub fn decode_der(der: &[u8]) -> Result { Ok(Self::parse_der(der)?.validate_profile()?) } + + /// Parse and return the manifest fileList. + /// + /// Note: `ManifestEContent` is profile-validated when produced via `decode_der()`, so this + /// should only fail due to internal inconsistencies (or if constructed manually). + pub fn parse_files(&self) -> Result, ManifestProfileError> { + parse_file_list_sha256_fast(&self.file_list_der) + } + + pub fn file_count(&self) -> usize { + self.file_count + } } impl ManifestObjectParsed { @@ -292,111 +306,328 @@ impl ManifestObjectParsed { impl ManifestEContentParsed { pub fn validate_profile(self) -> Result { - let (_rem, obj) = - parse_der(&self.der).map_err(|e| ManifestProfileError::ProfileDecode(e.to_string()))?; - - let seq = obj - .as_sequence() - .map_err(|e| ManifestProfileError::ProfileDecode(e.to_string()))?; - if seq.len() != 5 && seq.len() != 6 { - return Err(ManifestProfileError::InvalidManifestSequenceLen(seq.len())); - } - - let mut idx = 0; - let mut version: u32 = 0; - if seq.len() == 6 { - let v_obj = &seq[0]; - if v_obj.class() != der_parser::ber::Class::ContextSpecific || v_obj.tag() != Tag(0) { - return Err(ManifestProfileError::ProfileDecode( - "Manifest.version must be [0] EXPLICIT INTEGER".into(), - )); - } - let inner_der = v_obj - .as_slice() - .map_err(|e| ManifestProfileError::ProfileDecode(e.to_string()))?; - let (rem, inner) = parse_der(inner_der) - .map_err(|e| ManifestProfileError::ProfileDecode(e.to_string()))?; - if !rem.is_empty() { - return Err(ManifestProfileError::ProfileDecode( - "trailing bytes inside Manifest.version".into(), - )); - } - let v = inner - .as_u64() - .map_err(|e| ManifestProfileError::ProfileDecode(e.to_string()))?; - if v != 0 { - return Err(ManifestProfileError::InvalidManifestVersion(v)); - } - version = 0; - idx = 1; - } - - let manifest_number = parse_manifest_number(&seq[idx])?; - idx += 1; - - let this_update = - parse_generalized_time(&seq[idx], ManifestProfileError::InvalidThisUpdate)?; - idx += 1; - let next_update = - parse_generalized_time(&seq[idx], ManifestProfileError::InvalidNextUpdate)?; - idx += 1; - if next_update <= this_update { - return Err(ManifestProfileError::NextUpdateNotLater); - } - - let file_hash_alg = oid_to_string(&seq[idx])?; - idx += 1; - if file_hash_alg != OID_SHA256 { - return Err(ManifestProfileError::InvalidFileHashAlg(file_hash_alg)); - } - - let files = parse_file_list_sha256(&seq[idx])?; - - Ok(ManifestEContent { - version, - manifest_number, - this_update, - next_update, - file_hash_alg: OID_SHA256.to_string(), - files, - }) + decode_manifest_econtent_fast(&self.der) } } -fn parse_manifest_number(obj: &DerObject<'_>) -> Result { - let n = obj - .as_biguint() - .map_err(|_e| ManifestProfileError::InvalidManifestNumber)?; - let out = BigUnsigned::from_biguint(&n); - if out.bytes_be.len() > 20 { - return Err(ManifestProfileError::ManifestNumberTooLong); - } - Ok(out) -} +fn validate_file_name_bytes(bytes: &[u8]) -> Result<(), ManifestProfileError> { + // RFC 9286 §4.2.2: + // 1+ chars from a-zA-Z0-9-_ , then '.', then 3-letter extension. + if bytes.len() < 5 { + return Err(ManifestProfileError::InvalidFileName( + String::from_utf8_lossy(bytes).into_owned(), + )); + }; -fn parse_generalized_time( - obj: &DerObject<'_>, - err: ManifestProfileError, -) -> Result { - match &obj.content { - BerObjectContent::GeneralizedTime(dt) => dt - .to_datetime() - .map_err(|e| ManifestProfileError::ProfileDecode(e.to_string())), - _ => Err(err), + // "followed by a single . (DOT), followed by a three letter extension" + // -> the dot must be exactly 4 bytes from the end. + let dot_pos = bytes.len() - 4; + if bytes[dot_pos] != b'.' { + return Err(ManifestProfileError::InvalidFileName( + String::from_utf8_lossy(bytes).into_owned(), + )); } -} -fn parse_file_list_sha256(obj: &DerObject<'_>) -> Result, ManifestProfileError> { - let seq = obj - .as_sequence() - .map_err(|_e| ManifestProfileError::InvalidFileList)?; - let mut out = Vec::with_capacity(seq.len()); - for entry in seq { - let (file_name, hash_bytes) = parse_file_and_hash(entry)?; - validate_file_name(&file_name)?; - if hash_bytes.len() != 32 { - return Err(ManifestProfileError::InvalidHashLength(hash_bytes.len())); + #[inline(always)] + fn valid_base_char(b: u8) -> bool { + // RFC 9286 allowed set: a-zA-Z0-9-_ + (b'0'..=b'9').contains(&b) + || (b'a'..=b'z').contains(&b) + || (b'A'..=b'Z').contains(&b) + || b == b'-' + || b == b'_' + } + + for &b in &bytes[..dot_pos] { + if (b & 0x80) != 0 || !valid_base_char(b) { + return Err(ManifestProfileError::InvalidFileName( + String::from_utf8_lossy(bytes).into_owned(), + )); } + } + + let e0 = bytes[dot_pos + 1]; + let e1 = bytes[dot_pos + 2]; + let e2 = bytes[dot_pos + 3]; + if (e0 & 0x80) != 0 || (e1 & 0x80) != 0 || (e2 & 0x80) != 0 { + return Err(ManifestProfileError::InvalidFileName( + String::from_utf8_lossy(bytes).into_owned(), + )); + } + + #[inline(always)] + fn lower_if_alpha(b: u8) -> Option { + match b { + b'a'..=b'z' => Some(b), + b'A'..=b'Z' => Some(b + 32), + _ => None, + } + } + + let Some(l0) = lower_if_alpha(e0) else { + return Err(ManifestProfileError::InvalidFileName( + String::from_utf8_lossy(bytes).into_owned(), + )); + }; + let Some(l1) = lower_if_alpha(e1) else { + return Err(ManifestProfileError::InvalidFileName( + String::from_utf8_lossy(bytes).into_owned(), + )); + }; + let Some(l2) = lower_if_alpha(e2) else { + return Err(ManifestProfileError::InvalidFileName( + String::from_utf8_lossy(bytes).into_owned(), + )); + }; + + match [l0, l1, l2] { + // Full IANA list (see `common.rs`). + [b'a', b's', b'a'] + | [b'c', b'e', b'r'] + | [b'c', b'r', b'l'] + | [b'g', b'b', b'r'] + | [b'm', b'f', b't'] + | [b'r', b'o', b'a'] + | [b's', b'i', b'g'] + | [b't', b'a', b'k'] => Ok(()), + _ => Err(ManifestProfileError::InvalidFileName( + String::from_utf8_lossy(bytes).into_owned(), + )), + } +} + +fn decode_manifest_econtent_fast(der: &[u8]) -> Result { + let (tag, mut seq_content, rem) = der_take_tlv(der) + .map_err(|e| ManifestProfileError::ProfileDecode(format!("DER decode error: {e}")))?; + if !rem.is_empty() { + return Err(ManifestProfileError::ProfileDecode(format!( + "trailing bytes after DER object: {} bytes", + rem.len() + ))); + } + if tag != 0x30 { + return Err(ManifestProfileError::ProfileDecode( + "Manifest eContent must be SEQUENCE".into(), + )); + } + + let seq_len = der_count_elements(seq_content) + .map_err(|e| ManifestProfileError::ProfileDecode(e))?; + if seq_len != 5 && seq_len != 6 { + return Err(ManifestProfileError::InvalidManifestSequenceLen(seq_len)); + } + + let mut version: u32 = 0; + if seq_len == 6 { + let Some(&first_tag) = seq_content.first() else { + return Err(ManifestProfileError::InvalidManifestSequenceLen(0)); + }; + if first_tag != 0xA0 { + return Err(ManifestProfileError::ProfileDecode( + "Manifest.version must be [0] EXPLICIT INTEGER".into(), + )); + } + + let (_cs_tag, cs_value, after) = der_take_tlv(seq_content).map_err(|e| { + ManifestProfileError::ProfileDecode(format!("Manifest.version decode error: {e}")) + })?; + seq_content = after; + + let (inner_tag, inner_value, inner_rem) = der_take_tlv(cs_value).map_err(|e| { + ManifestProfileError::ProfileDecode(format!("Manifest.version inner decode error: {e}")) + })?; + if !inner_rem.is_empty() { + return Err(ManifestProfileError::ProfileDecode( + "trailing bytes inside Manifest.version".into(), + )); + } + if inner_tag != 0x02 { + return Err(ManifestProfileError::ProfileDecode( + "Manifest.version must be [0] EXPLICIT INTEGER".into(), + )); + } + let v = der_integer_to_u64(inner_value).map_err(|e| { + ManifestProfileError::ProfileDecode(format!("Manifest.version decode error: {e}")) + })?; + if v != 0 { + return Err(ManifestProfileError::InvalidManifestVersion(v)); + } + version = 0; + } + + let (mn_tag, mn_value, after) = der_take_tlv(seq_content).map_err(|e| { + ManifestProfileError::ProfileDecode(format!("Manifest.manifestNumber decode error: {e}")) + })?; + seq_content = after; + if mn_tag != 0x02 { + return Err(ManifestProfileError::InvalidManifestNumber); + } + let manifest_number = der_integer_to_bigunsigned(mn_value)?; + + let (tu_tag, tu_value, after) = der_take_tlv(seq_content).map_err(|e| { + ManifestProfileError::ProfileDecode(format!("Manifest.thisUpdate decode error: {e}")) + })?; + seq_content = after; + if tu_tag != 0x18 { + return Err(ManifestProfileError::InvalidThisUpdate); + } + let this_update = parse_generalized_time_bytes(tu_value) + .map_err(|e| ManifestProfileError::ProfileDecode(e))?; + + let (nu_tag, nu_value, after) = der_take_tlv(seq_content).map_err(|e| { + ManifestProfileError::ProfileDecode(format!("Manifest.nextUpdate decode error: {e}")) + })?; + seq_content = after; + if nu_tag != 0x18 { + return Err(ManifestProfileError::InvalidNextUpdate); + } + let next_update = parse_generalized_time_bytes(nu_value) + .map_err(|e| ManifestProfileError::ProfileDecode(e))?; + if next_update <= this_update { + return Err(ManifestProfileError::NextUpdateNotLater); + } + + let (oid_tag, oid_value, after) = der_take_tlv(seq_content).map_err(|e| { + ManifestProfileError::ProfileDecode(format!("Manifest.fileHashAlg decode error: {e}")) + })?; + seq_content = after; + if oid_tag != 0x06 { + return Err(ManifestProfileError::ProfileDecode( + "Manifest.fileHashAlg must be OBJECT IDENTIFIER".into(), + )); + } + if !oid_content_is_sha256(oid_value) { + return Err(ManifestProfileError::InvalidFileHashAlg( + oid_content_to_string(oid_value), + )); + } + + let (fl_tag, fl_value, after) = der_take_tlv(seq_content).map_err(|e| { + ManifestProfileError::ProfileDecode(format!("Manifest.fileList decode error: {e}")) + })?; + seq_content = after; + if fl_tag != 0x30 { + return Err(ManifestProfileError::InvalidFileList); + } + let file_count = validate_file_list_sha256_fast(fl_value)?; + let file_list_der = fl_value.to_vec(); + + if !seq_content.is_empty() { + return Err(ManifestProfileError::InvalidManifestSequenceLen(seq_len)); + } + + Ok(ManifestEContent { + version, + manifest_number, + this_update, + next_update, + file_hash_alg: OID_SHA256.to_string(), + file_list_der, + file_count, + }) +} + +fn validate_file_list_sha256_fast(content: &[u8]) -> Result { + let mut cur = content; + let mut count: usize = 0; + while !cur.is_empty() { + let (tag, value, rem) = der_take_tlv(cur).map_err(|e| { + ManifestProfileError::ProfileDecode(format!("fileList entry decode error: {e}")) + })?; + cur = rem; + if tag != 0x30 { + return Err(ManifestProfileError::InvalidFileAndHash); + } + + let mut entry = value; + let (fn_tag, fn_value, entry_rem) = der_take_tlv(entry).map_err(|e| { + ManifestProfileError::ProfileDecode(format!("fileList fileName decode error: {e}")) + })?; + entry = entry_rem; + if fn_tag != 0x16 { + return Err(ManifestProfileError::InvalidFileAndHash); + } + if entry.is_empty() { + return Err(ManifestProfileError::InvalidFileAndHash); + } + validate_file_name_bytes(fn_value)?; + + let (hash_tag, hash_value, entry_rem) = der_take_tlv(entry).map_err(|_e| { + // Missing second element should map to "SEQUENCE of 2" shape error. + ManifestProfileError::InvalidFileAndHash + })?; + entry = entry_rem; + if !entry.is_empty() { + return Err(ManifestProfileError::InvalidFileAndHash); + } + if hash_tag != 0x03 { + return Err(ManifestProfileError::InvalidHashType); + } + if hash_value.is_empty() { + return Err(ManifestProfileError::InvalidHashLength(0)); + } + let unused_bits = hash_value[0]; + if unused_bits != 0 { + return Err(ManifestProfileError::HashNotOctetAligned); + } + let bits = &hash_value[1..]; + if bits.len() != 32 { + return Err(ManifestProfileError::InvalidHashLength(bits.len())); + } + count += 1; + } + Ok(count) +} + +fn parse_file_list_sha256_fast(content: &[u8]) -> Result, ManifestProfileError> { + // Heuristic initial capacity (avoid a full pre-scan, which is expensive for xlarge manifests). + // Each FileAndHash entry is typically tens of bytes; 80 is a conservative average. + let est = (content.len() / 80).clamp(16, 4096); + let mut cur = content; + let mut out: Vec = Vec::with_capacity(est); + while !cur.is_empty() { + let (tag, value, rem) = der_take_tlv(cur) + .map_err(|e| ManifestProfileError::ProfileDecode(format!("fileList entry decode error: {e}")))?; + cur = rem; + if tag != 0x30 { + return Err(ManifestProfileError::InvalidFileAndHash); + } + let mut entry = value; + let (fn_tag, fn_value, entry_rem) = der_take_tlv(entry) + .map_err(|e| ManifestProfileError::ProfileDecode(format!("fileList fileName decode error: {e}")))?; + entry = entry_rem; + if fn_tag != 0x16 { + return Err(ManifestProfileError::InvalidFileAndHash); + } + if entry.is_empty() { + return Err(ManifestProfileError::InvalidFileAndHash); + } + let file_name = validate_and_copy_file_name(fn_value)?; + + let (hash_tag, hash_value, entry_rem) = der_take_tlv(entry).map_err(|_e| { + // Missing second element should map to "SEQUENCE of 2" shape error. + ManifestProfileError::InvalidFileAndHash + })?; + entry = entry_rem; + if !entry.is_empty() { + return Err(ManifestProfileError::InvalidFileAndHash); + } + if hash_tag != 0x03 { + return Err(ManifestProfileError::InvalidHashType); + } + if hash_value.is_empty() { + return Err(ManifestProfileError::InvalidHashLength(0)); + } + let unused_bits = hash_value[0]; + if unused_bits != 0 { + return Err(ManifestProfileError::HashNotOctetAligned); + } + let bits = &hash_value[1..]; + if bits.len() != 32 { + return Err(ManifestProfileError::InvalidHashLength(bits.len())); + } + let mut hash_bytes = [0u8; 32]; + hash_bytes.copy_from_slice(bits); out.push(FileAndHash { file_name, hash_bytes, @@ -405,58 +636,346 @@ fn parse_file_list_sha256(obj: &DerObject<'_>) -> Result, Manif Ok(out) } -fn parse_file_and_hash(obj: &DerObject<'_>) -> Result<(String, Vec), ManifestProfileError> { - let seq = obj - .as_sequence() - .map_err(|e| ManifestProfileError::ProfileDecode(e.to_string()))?; - if seq.len() != 2 { - return Err(ManifestProfileError::InvalidFileAndHash); - } - let file_name = seq[0] - .as_str() - .map_err(|e| ManifestProfileError::ProfileDecode(e.to_string()))? - .to_string(); - let (unused_bits, bits) = match &seq[1].content { - BerObjectContent::BitString(unused, bso) => (*unused, bso.data.to_vec()), - _ => return Err(ManifestProfileError::InvalidHashType), - }; - if unused_bits != 0 { - return Err(ManifestProfileError::HashNotOctetAligned); - } - Ok((file_name, bits)) +fn validate_and_copy_file_name(bytes: &[u8]) -> Result { + validate_file_name_bytes(bytes)?; + Ok(unsafe { String::from_utf8_unchecked(bytes.to_vec()) }) } -fn validate_file_name(name: &str) -> Result<(), ManifestProfileError> { - // RFC 9286 §4.2.2: - // 1+ chars from a-zA-Z0-9-_ , then '.', then 3-letter extension. - let Some((base, ext)) = name.rsplit_once('.') else { - return Err(ManifestProfileError::InvalidFileName(name.to_string())); - }; - if base.is_empty() || ext.len() != 3 { - return Err(ManifestProfileError::InvalidFileName(name.to_string())); +fn der_count_elements(mut input: &[u8]) -> Result { + let mut count: usize = 0; + while !input.is_empty() { + let (_tag, _value, rem) = der_take_tlv(input)?; + input = rem; + count += 1; } - if !base - .bytes() - .all(|b| b.is_ascii_alphanumeric() || b == b'-' || b == b'_') - { - return Err(ManifestProfileError::InvalidFileName(name.to_string())); - } - if !ext.bytes().all(|b| b.is_ascii_alphabetic()) { - return Err(ManifestProfileError::InvalidFileName(name.to_string())); - } - let ext_lower = ext.to_ascii_lowercase(); - if !crate::data_model::common::IANA_RPKI_REPOSITORY_FILENAME_EXTENSIONS - .iter() - .any(|&e| e == ext_lower) - { - return Err(ManifestProfileError::InvalidFileName(name.to_string())); - } - Ok(()) + Ok(count) } -fn oid_to_string(obj: &DerObject<'_>) -> Result { - let oid = obj - .as_oid() - .map_err(|e| ManifestProfileError::ProfileDecode(e.to_string()))?; - Ok(oid.to_id_string()) +fn der_integer_to_u64(bytes: &[u8]) -> Result { + if bytes.is_empty() { + return Err("INTEGER empty".into()); + } + // Reject negative (two's complement). + if bytes[0] & 0x80 != 0 { + return Err("INTEGER is negative".into()); + } + if bytes.len() > 8 { + return Err("INTEGER too large".into()); + } + let mut v: u64 = 0; + for &b in bytes { + v = (v << 8) | (b as u64); + } + Ok(v) +} + +fn der_integer_to_bigunsigned(bytes: &[u8]) -> Result { + if bytes.is_empty() { + return Err(ManifestProfileError::InvalidManifestNumber); + } + // Two's complement: for non-negative values, a leading 0x00 may be present. + if bytes[0] & 0x80 != 0 { + return Err(ManifestProfileError::InvalidManifestNumber); + } + let mut start = 0usize; + while start + 1 < bytes.len() && bytes[start] == 0 { + start += 1; + } + let mut minimal = bytes[start..].to_vec(); + if minimal.is_empty() { + minimal.push(0); + } + if minimal.len() > 20 { + return Err(ManifestProfileError::ManifestNumberTooLong); + } + Ok(BigUnsigned { bytes_be: minimal }) +} + +fn parse_generalized_time_bytes(bytes: &[u8]) -> Result { + // Accept "YYYYMMDDHHMMSSZ" and also allow optional fractional seconds (".fff...Z"). + if !bytes.is_ascii() { + return Err("GeneralizedTime not ASCII".into()); + } + let s = std::str::from_utf8(bytes).map_err(|e| e.to_string())?; + if !s.ends_with('Z') { + return Err("GeneralizedTime must end with 'Z'".into()); + } + let core = &s[..s.len() - 1]; + let (main, frac) = core.split_once('.').map_or((core, None), |(a, b)| (a, Some(b))); + if main.len() != 14 || !main.bytes().all(|b| b.is_ascii_digit()) { + return Err("GeneralizedTime must be YYYYMMDDHHMMSS[.fff]Z".into()); + } + let year: i32 = main[0..4].parse().map_err(|_| "bad year")?; + let month: u8 = main[4..6].parse().map_err(|_| "bad month")?; + let day: u8 = main[6..8].parse().map_err(|_| "bad day")?; + let hour: u8 = main[8..10].parse().map_err(|_| "bad hour")?; + let minute: u8 = main[10..12].parse().map_err(|_| "bad minute")?; + let second: u8 = main[12..14].parse().map_err(|_| "bad second")?; + + let nanosecond: u32 = if let Some(frac) = frac { + if frac.is_empty() || !frac.bytes().all(|b| b.is_ascii_digit()) { + return Err("bad fractional seconds".into()); + } + let mut ns: u32 = 0; + let mut scale: u32 = 1_000_000_000; + for (i, ch) in frac.bytes().enumerate() { + if i >= 9 { + break; + } + scale /= 10; + ns += ((ch - b'0') as u32) * scale; + } + ns + } else { + 0 + }; + + let date = time::Date::from_calendar_date(year, time::Month::try_from(month).map_err(|_| "bad month")?, day) + .map_err(|e| e.to_string())?; + let t = time::Time::from_hms_nano(hour, minute, second, nanosecond).map_err(|e| e.to_string())?; + Ok(date.with_time(t).assume_utc()) +} + +fn oid_content_is_sha256(bytes: &[u8]) -> bool { + // 2.16.840.1.101.3.4.2.1 + let mut arcs = oid_content_iter(bytes); + const EXPECTED: &[u64] = &[2, 16, 840, 1, 101, 3, 4, 2, 1]; + for &e in EXPECTED { + match arcs.next() { + Some(v) if v == e => {} + _ => return false, + } + } + arcs.next().is_none() +} + +fn oid_content_to_string(bytes: &[u8]) -> String { + let arcs: Vec = oid_content_iter(bytes).collect(); + if arcs.is_empty() { + return "".to_string(); + } + let mut s = String::new(); + for (i, a) in arcs.iter().enumerate() { + if i > 0 { + s.push('.'); + } + s.push_str(&a.to_string()); + } + s +} + +fn oid_content_iter(bytes: &[u8]) -> impl Iterator + '_ { + struct It<'a> { + bytes: &'a [u8], + pos: usize, + first_done: bool, + first_a0: u64, + first_a1: u64, + emit_first_idx: u8, + } + impl<'a> Iterator for It<'a> { + type Item = u64; + fn next(&mut self) -> Option { + if !self.first_done { + if self.bytes.is_empty() { + self.first_done = true; + return None; + } + let first = self.bytes[0] as u64; + self.first_a0 = first / 40; + self.first_a1 = first % 40; + self.pos = 1; + self.first_done = true; + self.emit_first_idx = 0; + } + if self.emit_first_idx == 0 { + self.emit_first_idx = 1; + return Some(self.first_a0); + } + if self.emit_first_idx == 1 { + self.emit_first_idx = 2; + return Some(self.first_a1); + } + if self.pos >= self.bytes.len() { + return None; + } + let mut v: u64 = 0; + while self.pos < self.bytes.len() { + let b = self.bytes[self.pos]; + self.pos += 1; + v = (v << 7) | ((b & 0x7F) as u64); + if b & 0x80 == 0 { + return Some(v); + } + } + None + } + } + It { + bytes, + pos: 0, + first_done: false, + first_a0: 0, + first_a1: 0, + emit_first_idx: 0, + } +} + +fn der_take_tlv(input: &[u8]) -> Result<(u8, &[u8], &[u8]), String> { + if input.len() < 2 { + return Err("truncated DER (need tag+len)".into()); + } + let tag = input[0]; + if (tag & 0x1F) == 0x1F { + return Err("high-tag-number form not supported".into()); + } + let len0 = input[1]; + if len0 == 0x80 { + return Err("indefinite length not allowed in DER".into()); + } + let (len, hdr_len) = if len0 & 0x80 == 0 { + (len0 as usize, 2usize) + } else { + let n = (len0 & 0x7F) as usize; + if n == 0 || n > 8 { + return Err("invalid DER length".into()); + } + if input.len() < 2 + n { + return Err("truncated DER (length bytes)".into()); + } + let mut l: usize = 0; + for &b in &input[2..2 + n] { + l = (l << 8) | (b as usize); + } + (l, 2 + n) + }; + if input.len() < hdr_len + len { + return Err("truncated DER (value bytes)".into()); + } + let value = &input[hdr_len..hdr_len + len]; + let rem = &input[hdr_len + len..]; + Ok((tag, value, rem)) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn tlv(tag: u8, value: &[u8]) -> Vec { + assert!(value.len() < 128); + let mut out = Vec::with_capacity(2 + value.len()); + out.push(tag); + out.push(value.len() as u8); + out.extend_from_slice(value); + out + } + + fn tlv_long_len(tag: u8, len_bytes: &[u8], value: &[u8]) -> Vec { + let mut out = Vec::with_capacity(2 + len_bytes.len() + value.len()); + out.push(tag); + out.push(0x80 | (len_bytes.len() as u8)); + out.extend_from_slice(len_bytes); + out.extend_from_slice(value); + out + } + + #[test] + fn der_take_tlv_supports_short_and_long_form_lengths_and_errors() { + let v = b"abc"; + let der = tlv(0x04, v); + let (tag, val, rem) = der_take_tlv(&der).expect("short len"); + assert_eq!(tag, 0x04); + assert_eq!(val, v); + assert!(rem.is_empty()); + + // Long-form length with 1 length byte (130). + let v = vec![b'x'; 130]; + let der = tlv_long_len(0x04, &[0x82], &v); + let (tag, val, rem) = der_take_tlv(&der).expect("long len 1"); + assert_eq!(tag, 0x04); + assert_eq!(val.len(), 130); + assert!(rem.is_empty()); + + // Long-form length with 2 length bytes (256). + let v = vec![b'y'; 256]; + let der = tlv_long_len(0x04, &[0x01, 0x00], &v); + let (tag, val, rem) = der_take_tlv(&der).expect("long len 2"); + assert_eq!(tag, 0x04); + assert_eq!(val.len(), 256); + assert!(rem.is_empty()); + + assert!(der_take_tlv(&[]).is_err()); + assert!(der_take_tlv(&[0x04]).is_err()); + + // High-tag-number form not supported. + assert!(der_take_tlv(&[0x1F, 0x01, 0x00]).is_err()); + + // Indefinite length is not allowed in DER. + assert!(der_take_tlv(&[0x04, 0x80]).is_err()); + + // Invalid long-form length encoding. + assert!(der_take_tlv(&[0x04, 0x81]).is_err()); + assert!(der_take_tlv(&[0x04, 0x89]).is_err()); + } + + #[test] + fn parse_generalized_time_bytes_accepts_fraction_and_rejects_invalid() { + let t = parse_generalized_time_bytes(b"20260101000000Z").expect("basic time"); + assert_eq!(t.year(), 2026); + + let t = parse_generalized_time_bytes(b"20260101000000.1Z").expect("fractional"); + assert_eq!(t.nanosecond(), 100_000_000); + + assert!(parse_generalized_time_bytes(b"20260101000000").is_err()); + assert!(parse_generalized_time_bytes(b"20260101000000+00").is_err()); + assert!(parse_generalized_time_bytes(b"2026010100000Z").is_err()); + assert!(parse_generalized_time_bytes(b"20261301000000Z").is_err()); + assert!(parse_generalized_time_bytes(b"20260132000000Z").is_err()); + assert!(parse_generalized_time_bytes(&[0xFF]).is_err()); + } + + #[test] + fn oid_helpers_accept_sha256_and_format_invalid() { + // 2.16.840.1.101.3.4.2.1 + let sha256_oid_content = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01]; + assert!(oid_content_is_sha256(&sha256_oid_content)); + assert!(!oid_content_is_sha256(&[0x55, 0x04, 0x03])); // 2.5.4.3 + + assert_eq!(oid_content_to_string(&[]), "".to_string()); + } + + #[test] + fn validate_file_list_sha256_fast_counts_and_rejects_bad_hash() { + fn file_and_hash(file: &str, digest: u8) -> Vec { + let mut hash = vec![0u8; 33]; + hash[0] = 0; // unused bits + for b in &mut hash[1..] { + *b = digest; + } + let ia5 = tlv(0x16, file.as_bytes()); + let bit = tlv(0x03, &hash); + let mut entry = Vec::new(); + entry.extend_from_slice(&ia5); + entry.extend_from_slice(&bit); + tlv(0x30, &entry) + } + + let mut list = Vec::new(); + list.extend_from_slice(&file_and_hash("A.cer", 0xAA)); + list.extend_from_slice(&file_and_hash("B.roa", 0xBB)); + assert_eq!(validate_file_list_sha256_fast(&list).expect("count"), 2); + + // Wrong hash length. + let mut bad = Vec::new(); + let ia5 = tlv(0x16, b"A.cer"); + let bit = tlv(0x03, &[0u8; 2]); // too short + let mut entry = Vec::new(); + entry.extend_from_slice(&ia5); + entry.extend_from_slice(&bit); + bad.extend_from_slice(&tlv(0x30, &entry)); + assert!(matches!( + validate_file_list_sha256_fast(&bad), + Err(ManifestProfileError::InvalidHashLength(_)) + )); + } } diff --git a/src/data_model/signed_object.rs b/src/data_model/signed_object.rs index 8ea93de..cba2428 100644 --- a/src/data_model/signed_object.rs +++ b/src/data_model/signed_object.rs @@ -7,7 +7,7 @@ use crate::data_model::oid::{ use crate::data_model::rc::{ResourceCertificate, SubjectInfoAccess}; use der_parser::ber::Class; use der_parser::der::{DerObject, Tag, parse_der}; -use sha2::{Digest, Sha256}; +use ring::digest; use x509_parser::prelude::FromDer; use x509_parser::public_key::PublicKey; use x509_parser::x509::SubjectPublicKeyInfo; @@ -812,8 +812,8 @@ fn validate_signed_data_profile( }); } - let computed = Sha256::digest(&encap_content_info.econtent).to_vec(); - if computed != signed_attrs.message_digest { + let computed = digest::digest(&digest::SHA256, &encap_content_info.econtent); + if computed.as_ref() != signed_attrs.message_digest.as_slice() { return Err(SignedObjectValidateError::MessageDigestMismatch); } diff --git a/src/fetch/http.rs b/src/fetch/http.rs index db3da97..55ce3c7 100644 --- a/src/fetch/http.rs +++ b/src/fetch/http.rs @@ -62,3 +62,52 @@ impl Fetcher for BlockingHttpFetcher { self.fetch_bytes(uri) } } + +#[cfg(test)] +mod tests { + use super::*; + use std::io::{Read, Write}; + use std::net::TcpListener; + use std::thread; + + fn spawn_one_shot_http_server(status_line: &'static str, body: &'static [u8]) -> String { + let listener = TcpListener::bind(("127.0.0.1", 0)).expect("bind"); + let addr = listener.local_addr().expect("addr"); + thread::spawn(move || { + let (mut stream, _) = listener.accept().expect("accept"); + let mut buf = [0u8; 1024]; + let _ = stream.read(&mut buf); + let hdr = format!( + "{status_line}\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", + body.len() + ); + stream.write_all(hdr.as_bytes()).expect("write hdr"); + stream.write_all(body).expect("write body"); + }); + format!("http://{}/", addr) + } + + #[test] + fn fetch_bytes_returns_body_on_success() { + let url = spawn_one_shot_http_server("HTTP/1.1 200 OK", b"hello"); + let http = BlockingHttpFetcher::new(HttpFetcherConfig { + timeout: Duration::from_secs(2), + ..HttpFetcherConfig::default() + }) + .expect("http"); + let got = http.fetch_bytes(&url).expect("fetch"); + assert_eq!(got, b"hello"); + } + + #[test] + fn fetch_bytes_rejects_non_success_status() { + let url = spawn_one_shot_http_server("HTTP/1.1 404 Not Found", b""); + let http = BlockingHttpFetcher::new(HttpFetcherConfig { + timeout: Duration::from_secs(2), + ..HttpFetcherConfig::default() + }) + .expect("http"); + let err = http.fetch_bytes(&url).unwrap_err(); + assert!(err.contains("http status"), "{err}"); + } +} diff --git a/src/fetch/rsync.rs b/src/fetch/rsync.rs index 01bd177..1d85f3d 100644 --- a/src/fetch/rsync.rs +++ b/src/fetch/rsync.rs @@ -80,3 +80,39 @@ fn normalize_rsync_base_uri(s: &str) -> String { format!("{s}/") } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn local_dir_rsync_fetcher_collects_files_and_normalizes_base_uri() { + let tmp = tempfile::tempdir().expect("tempdir"); + std::fs::create_dir_all(tmp.path().join("nested")).expect("mkdir"); + std::fs::write(tmp.path().join("a.mft"), b"a").expect("write"); + std::fs::write(tmp.path().join("nested").join("b.roa"), b"b").expect("write"); + + let f = LocalDirRsyncFetcher::new(tmp.path()); + let mut objects = f + .fetch_objects("rsync://example.net/repo") + .expect("fetch_objects"); + objects.sort_by(|(a, _), (b, _)| a.cmp(b)); + + assert_eq!(objects.len(), 2); + assert_eq!(objects[0].0, "rsync://example.net/repo/a.mft"); + assert_eq!(objects[0].1, b"a"); + assert_eq!(objects[1].0, "rsync://example.net/repo/nested/b.roa"); + assert_eq!(objects[1].1, b"b"); + } + + #[test] + fn local_dir_rsync_fetcher_reports_read_dir_errors() { + let tmp = tempfile::tempdir().expect("tempdir"); + let missing = tmp.path().join("missing"); + let f = LocalDirRsyncFetcher::new(missing); + let err = f.fetch_objects("rsync://example.net/repo").unwrap_err(); + match err { + RsyncFetchError::Fetch(msg) => assert!(!msg.is_empty()), + } + } +} diff --git a/src/fetch/rsync_system.rs b/src/fetch/rsync_system.rs index 5245136..419e38d 100644 --- a/src/fetch/rsync_system.rs +++ b/src/fetch/rsync_system.rs @@ -142,3 +142,67 @@ fn walk_dir_collect( } Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn normalize_rsync_base_uri_appends_slash_when_missing() { + assert_eq!( + normalize_rsync_base_uri("rsync://example.net/repo"), + "rsync://example.net/repo/".to_string() + ); + assert_eq!( + normalize_rsync_base_uri("rsync://example.net/repo/"), + "rsync://example.net/repo/".to_string() + ); + } + + #[test] + fn walk_dir_collect_collects_files_and_normalizes_backslashes_in_uri() { + let temp = tempfile::tempdir().expect("tempdir"); + let root = temp.path(); + std::fs::create_dir_all(root.join("sub")).expect("mkdir"); + std::fs::write(root.join("sub").join("a.cer"), b"x").expect("write"); + std::fs::write(root.join("b\\c.mft"), b"y").expect("write backslash file"); + + let mut out: Vec<(String, Vec)> = Vec::new(); + walk_dir_collect(root, root, "rsync://example.net/repo/", &mut out).expect("walk"); + out.sort_by(|a, b| a.0.cmp(&b.0)); + + assert_eq!(out.len(), 2); + assert_eq!(out[0].0, "rsync://example.net/repo/b/c.mft"); + assert_eq!(out[0].1, b"y"); + assert_eq!(out[1].0, "rsync://example.net/repo/sub/a.cer"); + assert_eq!(out[1].1, b"x"); + } + + #[test] + fn system_rsync_fetcher_reports_spawn_and_exit_errors() { + let dst = tempfile::tempdir().expect("tempdir"); + + // 1) Spawn error. + let f = SystemRsyncFetcher::new(SystemRsyncConfig { + rsync_bin: PathBuf::from("/this/does/not/exist/rsync"), + timeout: Duration::from_secs(1), + extra_args: Vec::new(), + }); + let e = f + .run_rsync("rsync://example.net/repo/", dst.path()) + .expect_err("spawn must fail"); + assert!(e.contains("rsync spawn failed:"), "{e}"); + + // 2) Non-zero exit status. + let f = SystemRsyncFetcher::new(SystemRsyncConfig { + rsync_bin: PathBuf::from("false"), + timeout: Duration::from_secs(1), + extra_args: Vec::new(), + }); + let e = f + .run_rsync("rsync://example.net/repo/", dst.path()) + .expect_err("false must fail"); + assert!(e.contains("rsync failed:"), "{e}"); + assert!(e.contains("status="), "{e}"); + } +} diff --git a/src/lib.rs b/src/lib.rs index 3d9f247..147024b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,18 @@ -pub mod audit; -pub mod cli; pub mod data_model; + +#[cfg(feature = "full")] +pub mod audit; +#[cfg(feature = "full")] +pub mod cli; +#[cfg(feature = "full")] pub mod fetch; +#[cfg(feature = "full")] pub mod policy; +#[cfg(feature = "full")] pub mod report; +#[cfg(feature = "full")] pub mod storage; +#[cfg(feature = "full")] pub mod sync; +#[cfg(feature = "full")] pub mod validation; diff --git a/src/sync/rrdp.rs b/src/sync/rrdp.rs index f3e8f9a..dc1f8c4 100644 --- a/src/sync/rrdp.rs +++ b/src/sync/rrdp.rs @@ -288,3 +288,197 @@ fn collect_element_text(node: &roxmltree::Node<'_, '_>) -> Option { fn strip_all_ascii_whitespace(s: &str) -> String { s.chars().filter(|c| !c.is_ascii_whitespace()).collect() } + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashMap; + + struct MapFetcher { + map: HashMap>, + } + + impl Fetcher for MapFetcher { + fn fetch(&self, uri: &str) -> Result, String> { + self.map + .get(uri) + .cloned() + .ok_or_else(|| format!("not found: {uri}")) + } + } + + fn notification_xml(session_id: &str, serial: u64, snapshot_uri: &str, snapshot_hash: &str) -> Vec { + format!( + r#""# + ) + .into_bytes() + } + + fn snapshot_xml(session_id: &str, serial: u64, published: &[(&str, &[u8])]) -> Vec { + let mut out = format!( + r#""# + ); + for (uri, bytes) in published { + let b64 = base64::engine::general_purpose::STANDARD.encode(bytes); + out.push_str(&format!(r#"{b64}"#)); + } + out.push_str(""); + out.into_bytes() + } + + #[test] + fn parse_notification_snapshot_rejects_non_ascii() { + let mut xml = b"".to_vec(); + xml.push(0x80); + let err = parse_notification_snapshot(&xml).unwrap_err(); + assert!(matches!(err, RrdpError::NotAscii)); + } + + #[test] + fn parse_notification_snapshot_parses_valid_minimal_notification() { + let sid = "550e8400-e29b-41d4-a716-446655440000"; + let snapshot_uri = "https://example.net/snapshot.xml"; + let hash = "00".repeat(32); + let xml = notification_xml(sid, 7, snapshot_uri, &hash); + let n = parse_notification_snapshot(&xml).expect("parse"); + assert_eq!(n.session_id, Uuid::parse_str(sid).unwrap()); + assert_eq!(n.serial, 7); + assert_eq!(n.snapshot_uri, snapshot_uri); + assert_eq!(hex::encode(n.snapshot_hash_sha256), hash); + } + + #[test] + fn sync_from_notification_snapshot_applies_snapshot_and_stores_state() { + let tmp = tempfile::tempdir().expect("tempdir"); + let store = RocksStore::open(tmp.path()).expect("open rocksdb"); + + let sid = "550e8400-e29b-41d4-a716-446655440000"; + let serial = 9u64; + let notif_uri = "https://example.net/notification.xml"; + let snapshot_uri = "https://example.net/snapshot.xml"; + + let snapshot = snapshot_xml( + sid, + serial, + &[ + ("rsync://example.net/repo/a.mft", b"mft-bytes"), + ("rsync://example.net/repo/b.roa", b"roa-bytes"), + ], + ); + let snapshot_hash = hex::encode(sha2::Sha256::digest(&snapshot)); + let notif = notification_xml(sid, serial, snapshot_uri, &snapshot_hash); + + let fetcher = MapFetcher { + map: HashMap::from([(snapshot_uri.to_string(), snapshot.clone())]), + }; + + let published = sync_from_notification_snapshot(&store, notif_uri, ¬if, &fetcher) + .expect("sync"); + assert_eq!(published, 2); + + let a = store + .get_raw("rsync://example.net/repo/a.mft") + .expect("get_raw") + .expect("a present"); + assert_eq!(a, b"mft-bytes"); + + let b = store + .get_raw("rsync://example.net/repo/b.roa") + .expect("get_raw") + .expect("b present"); + assert_eq!(b, b"roa-bytes"); + + let state_bytes = store + .get_rrdp_state(notif_uri) + .expect("get_rrdp_state") + .expect("state present"); + let state = RrdpState::decode(&state_bytes).expect("decode state"); + assert_eq!(state.session_id, sid); + assert_eq!(state.serial, serial); + } + + #[test] + fn sync_from_notification_snapshot_rejects_snapshot_hash_mismatch() { + let tmp = tempfile::tempdir().expect("tempdir"); + let store = RocksStore::open(tmp.path()).expect("open rocksdb"); + + let sid = "550e8400-e29b-41d4-a716-446655440000"; + let serial = 1u64; + let notif_uri = "https://example.net/notification.xml"; + let snapshot_uri = "https://example.net/snapshot.xml"; + + let snapshot = snapshot_xml(sid, serial, &[("rsync://example.net/repo/a.mft", b"x")]); + let notif = notification_xml(sid, serial, snapshot_uri, &"00".repeat(32)); + + let fetcher = MapFetcher { + map: HashMap::from([(snapshot_uri.to_string(), snapshot)]), + }; + let err = sync_from_notification_snapshot(&store, notif_uri, ¬if, &fetcher).unwrap_err(); + assert!(matches!(err, RrdpSyncError::Rrdp(RrdpError::SnapshotHashMismatch))); + } + + #[test] + fn apply_snapshot_rejects_session_id_and_serial_mismatch() { + let tmp = tempfile::tempdir().expect("tempdir"); + let store = RocksStore::open(tmp.path()).expect("open rocksdb"); + + let expected_sid = Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000").unwrap(); + let got_sid = "550e8400-e29b-41d4-a716-446655440001"; + + let snapshot = snapshot_xml(got_sid, 2, &[("rsync://example.net/repo/a.mft", b"x")]); + let err = apply_snapshot(&store, &snapshot, expected_sid, 2).unwrap_err(); + assert!(matches!( + err, + RrdpSyncError::Rrdp(RrdpError::SnapshotSessionIdMismatch { .. }) + )); + + let snapshot = snapshot_xml(expected_sid.to_string().as_str(), 3, &[("rsync://example.net/repo/a.mft", b"x")]); + let err = apply_snapshot(&store, &snapshot, expected_sid, 2).unwrap_err(); + assert!(matches!( + err, + RrdpSyncError::Rrdp(RrdpError::SnapshotSerialMismatch { .. }) + )); + } + + #[test] + fn strip_all_ascii_whitespace_removes_newlines_and_spaces() { + assert_eq!(strip_all_ascii_whitespace(" a \n b\tc "), "abc"); + } + + #[test] + fn apply_snapshot_reports_publish_errors() { + let tmp = tempfile::tempdir().expect("tempdir"); + let store = RocksStore::open(tmp.path()).expect("open rocksdb"); + let sid = Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000").unwrap(); + + // Missing publish/@uri + let xml = format!( + r#"AA=="# + ) + .into_bytes(); + let err = apply_snapshot(&store, &xml, sid, 1).unwrap_err(); + assert!(matches!(err, RrdpSyncError::Rrdp(RrdpError::PublishUriMissing))); + + // Missing base64 content (no text nodes). + let xml = format!( + r#""# + ) + .into_bytes(); + let err = apply_snapshot(&store, &xml, sid, 1).unwrap_err(); + assert!(matches!( + err, + RrdpSyncError::Rrdp(RrdpError::PublishContentMissing) + )); + + // Invalid base64 content. + let xml = format!( + r#"!!!"# + ) + .into_bytes(); + let err = apply_snapshot(&store, &xml, sid, 1).unwrap_err(); + assert!(matches!( + err, + RrdpSyncError::Rrdp(RrdpError::PublishBase64(_)) + )); + } +} diff --git a/src/validation/manifest.rs b/src/validation/manifest.rs index ff832e3..81b4030 100644 --- a/src/validation/manifest.rs +++ b/src/validation/manifest.rs @@ -260,13 +260,17 @@ fn revalidate_cached_pack_with_current_time( .map(|f| (f.rsync_uri.as_str(), f)) .collect(); - for entry in &manifest.manifest.files { + let entries = manifest + .manifest + .parse_files() + .map_err(|e| ManifestFreshError::Decode(ManifestDecodeError::Validate(e)))?; + for entry in &entries { let rsync_uri = - join_rsync_dir_and_file(&pack.publication_point_rsync_uri, &entry.file_name); + join_rsync_dir_and_file(&pack.publication_point_rsync_uri, entry.file_name.as_str()); let Some(file) = by_uri.get(rsync_uri.as_str()) else { return Err(ManifestCachedError::CachedMissingFile { rsync_uri }); }; - if file.sha256.as_slice() != entry.hash_bytes.as_slice() { + if file.sha256.as_slice() != entry.hash_bytes.as_ref() { return Err(ManifestCachedError::CachedHashMismatch { rsync_uri }); } } @@ -388,9 +392,11 @@ fn try_build_fresh_pack( } } - let mut files = Vec::with_capacity(manifest.manifest.files.len()); - for entry in &manifest.manifest.files { - let rsync_uri = join_rsync_dir_and_file(publication_point_rsync_uri, &entry.file_name); + let entries = manifest.manifest.parse_files().map_err(ManifestDecodeError::Validate)?; + let mut files = Vec::with_capacity(manifest.manifest.file_count()); + for entry in &entries { + let rsync_uri = + join_rsync_dir_and_file(publication_point_rsync_uri, entry.file_name.as_str()); let bytes = store .get_raw(&rsync_uri) .map_err(|_e| ManifestFreshError::MissingFile { @@ -401,7 +407,7 @@ fn try_build_fresh_pack( })?; let computed = sha2::Sha256::digest(&bytes); - if computed.as_slice() != entry.hash_bytes.as_slice() { + if computed.as_slice() != entry.hash_bytes.as_ref() { return Err(ManifestFreshError::HashMismatch { rsync_uri }); } diff --git a/tests/bench_manifest_decode_profile.rs b/tests/bench_manifest_decode_profile.rs new file mode 100644 index 0000000..ff972df --- /dev/null +++ b/tests/bench_manifest_decode_profile.rs @@ -0,0 +1,320 @@ +use rpki::data_model::manifest::ManifestObject; +use std::path::{Path, PathBuf}; +use std::time::Instant; + +fn default_samples_dir() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("tests/benchmark/selected_der") +} + +fn read_samples(dir: &Path) -> Vec { + let mut out = Vec::new(); + let rd = std::fs::read_dir(dir).unwrap_or_else(|e| panic!("read_dir {}: {e}", dir.display())); + for ent in rd.flatten() { + let path = ent.path(); + if path.extension().and_then(|s| s.to_str()) != Some("mft") { + continue; + } + let name = path + .file_stem() + .and_then(|s| s.to_str()) + .unwrap_or("unknown") + .to_string(); + out.push(Sample { name, path }); + } + out.sort_by(|a, b| a.name.cmp(&b.name)); + out +} + +#[derive(Clone, Debug)] +struct Sample { + name: String, + path: PathBuf, +} + +fn env_u64(name: &str, default: u64) -> u64 { + std::env::var(name) + .ok() + .and_then(|s| s.parse::().ok()) + .unwrap_or(default) +} + +fn env_u64_opt(name: &str) -> Option { + std::env::var(name) + .ok() + .and_then(|s| s.parse::().ok()) +} + +fn env_bool(name: &str) -> bool { + matches!( + std::env::var(name).as_deref(), + Ok("1") | Ok("true") | Ok("TRUE") | Ok("yes") | Ok("YES") + ) +} + +fn env_string(name: &str) -> Option { + std::env::var(name).ok().filter(|s| !s.trim().is_empty()) +} + +fn escape_md(s: &str) -> String { + s.replace('|', "\\|").replace('\n', " ") +} + +fn create_parent_dirs(path: &Path) { + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent).unwrap_or_else(|e| { + panic!("create_dir_all {}: {e}", parent.display()); + }); + } +} + +#[test] +#[ignore = "manual performance benchmark; prints Markdown table"] +fn manifest_decode_profile_benchmark_selected_der() { + let dir = env_string("BENCH_DIR") + .map(PathBuf::from) + .unwrap_or_else(default_samples_dir); + + let sample_filter = env_string("BENCH_SAMPLE"); + let fixed_iters = env_u64_opt("BENCH_ITERS"); + let warmup_iters = env_u64("BENCH_WARMUP_ITERS", 100); + let rounds = env_u64("BENCH_ROUNDS", 5); + let min_round_ms = env_u64("BENCH_MIN_ROUND_MS", 200); + let max_adaptive_iters = env_u64("BENCH_MAX_ITERS", 1_000_000); + let verbose = env_bool("BENCH_VERBOSE"); + let out_md = env_string("BENCH_OUT_MD").map(|p| PathBuf::from(p)); + let out_json = env_string("BENCH_OUT_JSON").map(|p| PathBuf::from(p)); + + if let Some(n) = fixed_iters { + assert!(n >= 1, "BENCH_ITERS must be >= 1"); + } + assert!(rounds >= 1, "BENCH_ROUNDS must be >= 1"); + assert!(min_round_ms >= 1, "BENCH_MIN_ROUND_MS must be >= 1"); + assert!(max_adaptive_iters >= 1, "BENCH_MAX_ITERS must be >= 1"); + + let mut samples = read_samples(&dir); + assert!( + !samples.is_empty(), + "no .mft files found under: {}", + dir.display() + ); + + if let Some(filter) = sample_filter.as_deref() { + samples.retain(|s| s.name == filter); + assert!(!samples.is_empty(), "no sample matched BENCH_SAMPLE={filter}"); + } + + println!("# Manifest decode + profile validate benchmark (debug build)"); + println!(); + println!("- dir: {}", dir.display()); + if let Some(n) = fixed_iters { + println!("- iters: {} (fixed)", n); + } else { + println!( + "- warmup: {} iters, rounds: {}, min_round: {}ms (adaptive iters, max {})", + warmup_iters, rounds, min_round_ms, max_adaptive_iters + ); + } + if let Some(filter) = sample_filter.as_deref() { + println!("- sample: {}", filter); + } + if verbose { + println!("- verbose: true"); + } + if let Some(p) = out_md.as_ref() { + println!("- out_md: {}", p.display()); + } + if let Some(p) = out_json.as_ref() { + println!("- out_json: {}", p.display()); + } + println!(); + + println!("Samples:"); + for s in &samples { + println!("- {}", s.name); + } + println!(); + + println!("| sample | file_count | avg ns/op | ops/s |"); + println!("|---|---:|---:|---:|"); + + let mut rows: Vec = Vec::with_capacity(samples.len()); + + for s in samples { + let bytes = + std::fs::read(&s.path).unwrap_or_else(|e| panic!("read {}: {e}", s.path.display())); + + let file_count = ManifestObject::decode_der(bytes.as_slice()) + .unwrap_or_else(|e| panic!("decode {}: {e}", s.name)) + .manifest + .file_count(); + + // Warm-up: exercise the exact decode path but don't time it. + for _ in 0..warmup_iters { + let input = std::hint::black_box(bytes.as_slice()); + let decoded = ManifestObject::decode_der(input).expect("decode"); + std::hint::black_box(decoded); + } + + let mut per_round_ns_per_op = Vec::with_capacity(rounds as usize); + for round in 0..rounds { + let iters = if let Some(n) = fixed_iters { + n + } else { + choose_iters_adaptive( + bytes.as_slice(), + min_round_ms, + max_adaptive_iters, + ) + }; + + let start = Instant::now(); + for _ in 0..iters { + let input = std::hint::black_box(bytes.as_slice()); + let decoded = ManifestObject::decode_der(input).expect("decode"); + std::hint::black_box(decoded); + } + let elapsed = start.elapsed(); + let total_ns = elapsed.as_secs_f64() * 1e9; + let ns_per_op = total_ns / (iters as f64); + per_round_ns_per_op.push(ns_per_op); + + if verbose { + println!( + "# {} round {}: iters={} total_ms={:.2} ns/op={:.2}", + s.name, + round + 1, + iters, + elapsed.as_secs_f64() * 1e3, + ns_per_op + ); + } + } + + let avg_ns = per_round_ns_per_op.iter().sum::() / (per_round_ns_per_op.len() as f64); + let ops_per_sec = 1e9_f64 / avg_ns; + + println!( + "| {} | {} | {:.2} | {:.2} |", + s.name, file_count, avg_ns, ops_per_sec + ); + + rows.push(ResultRow { + sample: s.name, + file_count, + avg_ns_per_op: avg_ns, + ops_per_sec, + }); + } + + if out_md.is_some() || out_json.is_some() { + let timestamp_utc = + time::OffsetDateTime::now_utc().format(&time::format_description::well_known::Rfc3339) + .unwrap_or_else(|_| "unknown".to_string()); + let cfg = RunConfig { + dir: dir.display().to_string(), + sample: sample_filter, + fixed_iters, + warmup_iters, + rounds, + min_round_ms, + max_adaptive_iters, + timestamp_utc, + }; + + if let Some(path) = out_md { + let md = render_markdown(&cfg, &rows); + write_text_file(&path, &md); + eprintln!("Wrote {}", path.display()); + } + if let Some(path) = out_json { + let json = serde_json::to_string_pretty(&BenchmarkOutput { config: cfg, rows }) + .expect("serialize json"); + write_text_file(&path, &json); + eprintln!("Wrote {}", path.display()); + } + } +} + +fn choose_iters_adaptive(bytes: &[u8], min_round_ms: u64, max_iters: u64) -> u64 { + let min_secs = (min_round_ms as f64) / 1e3; + let mut iters: u64 = 1; + loop { + let start = Instant::now(); + for _ in 0..iters { + let input = std::hint::black_box(bytes); + let decoded = ManifestObject::decode_der(input).expect("decode"); + std::hint::black_box(decoded); + } + let elapsed = start.elapsed().as_secs_f64(); + if elapsed >= min_secs { + return iters; + } + if iters >= max_iters { + return iters; + } + iters = (iters.saturating_mul(2)).min(max_iters); + } +} + +fn render_markdown(cfg: &RunConfig, rows: &[ResultRow]) -> String { + let mut out = String::new(); + out.push_str("# Manifest decode + profile validate benchmark (debug build)\n\n"); + out.push_str(&format!("- timestamp_utc: {}\n", cfg.timestamp_utc)); + out.push_str(&format!("- dir: `{}`\n", cfg.dir)); + if let Some(s) = cfg.sample.as_deref() { + out.push_str(&format!("- sample: `{}`\n", s)); + } + if let Some(n) = cfg.fixed_iters { + out.push_str(&format!("- iters: {} (fixed)\n", n)); + } else { + out.push_str(&format!( + "- warmup: {} iters, rounds: {}, min_round: {}ms (adaptive iters, max {})\n", + cfg.warmup_iters, cfg.rounds, cfg.min_round_ms, cfg.max_adaptive_iters + )); + } + out.push('\n'); + out.push_str("| sample | file_count | avg ns/op | ops/s |\n"); + out.push_str("|---|---:|---:|---:|\n"); + for r in rows { + out.push_str(&format!( + "| {} | {} | {:.2} | {:.2} |\n", + escape_md(&r.sample), + r.file_count, + r.avg_ns_per_op, + r.ops_per_sec + )); + } + out +} + +fn write_text_file(path: &Path, content: &str) { + create_parent_dirs(path); + std::fs::write(path, content).unwrap_or_else(|e| panic!("write {}: {e}", path.display())); +} + +#[derive(Clone, Debug, serde::Serialize)] +struct RunConfig { + dir: String, + sample: Option, + fixed_iters: Option, + warmup_iters: u64, + rounds: u64, + min_round_ms: u64, + max_adaptive_iters: u64, + timestamp_utc: String, +} + +#[derive(Clone, Debug, serde::Serialize)] +struct ResultRow { + sample: String, + file_count: usize, + avg_ns_per_op: f64, + ops_per_sec: f64, +} + +#[derive(Clone, Debug, serde::Serialize)] +struct BenchmarkOutput { + config: RunConfig, + rows: Vec, +} diff --git a/tests/benchmark/flamegraph_manifest_decode_profile.sh b/tests/benchmark/flamegraph_manifest_decode_profile.sh new file mode 100755 index 0000000..f03b77c --- /dev/null +++ b/tests/benchmark/flamegraph_manifest_decode_profile.sh @@ -0,0 +1,87 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Generates a flamegraph SVG for Manifest decode+profile validate. +# +# Prereqs: +# - `perf` installed and usable by current user +# - `cargo flamegraph` installed (`cargo install flamegraph`) +# +# Usage examples: +# BENCH_SAMPLE=large-02 ./tests/benchmark/flamegraph_manifest_decode_profile.sh +# BENCH_SAMPLE=large-02 BENCH_ITERS=5000 FLAMEGRAPH_PROFILE=dev ./tests/benchmark/flamegraph_manifest_decode_profile.sh +# BENCH_SAMPLE=large-02 BENCH_ITERS=2000 FLAMEGRAPH_PROFILE=release ./tests/benchmark/flamegraph_manifest_decode_profile.sh + +PROFILE="${FLAMEGRAPH_PROFILE:-dev}" # dev|release +SAMPLE="${BENCH_SAMPLE:-large-02}" + +ITERS="${BENCH_ITERS:-2000}" +FREQ="${FLAMEGRAPH_FREQ:-99}" +WARMUP="${BENCH_WARMUP_ITERS:-1}" +ROUNDS="${BENCH_ROUNDS:-1}" +MIN_ROUND_MS="${BENCH_MIN_ROUND_MS:-1}" +MAX_ITERS="${BENCH_MAX_ITERS:-100000}" + +if ! command -v perf >/dev/null 2>&1; then + echo "ERROR: perf not found. Install linux-tools/perf first (may require sudo)." >&2 + exit 2 +fi + +if ! command -v cargo-flamegraph >/dev/null 2>&1 && ! command -v flamegraph >/dev/null 2>&1; then + # cargo installs as `cargo flamegraph`, but the binary is `cargo-flamegraph`. + if ! command -v cargo-flamegraph >/dev/null 2>&1; then + echo "ERROR: cargo-flamegraph not found. Install with: cargo install flamegraph" >&2 + exit 2 + fi +fi + +OUT="target/bench/flamegraph_mft_decode_profile_${SAMPLE}_${PROFILE}.svg" + +echo "profile=${PROFILE} sample=${SAMPLE} iters=${ITERS} freq=${FREQ} out=${OUT}" + +FLAGS=() +if [[ "${PROFILE}" == "release" ]]; then + FLAGS+=(--release) +else + FLAGS+=(--dev) +fi + +# On WSL2, /usr/bin/perf is often a wrapper that exits 2 because there is no +# kernel-matched perf binary. In that case, prefer a real perf binary under +# /usr/lib/linux-tools/*/perf by putting a shim earlier in PATH. +PERF_WRAPPER_OK=1 +PERF_VERSION_OUT="$(perf --version 2>&1 || true)" +if echo "${PERF_VERSION_OUT}" | grep -q "WARNING: perf not found for kernel"; then + PERF_WRAPPER_OK=0 +fi + +if [[ "${PERF_WRAPPER_OK}" == "0" ]]; then + PERF_REAL="$(ls -1 /usr/lib/linux-tools/*/perf 2>/dev/null | head -n 1 || true)" + if [[ -z "${PERF_REAL}" ]]; then + echo "ERROR: perf wrapper found, but no real perf binary under /usr/lib/linux-tools/*/perf" >&2 + exit 2 + fi + + SHIM_DIR="target/bench/tools" + mkdir -p "${SHIM_DIR}" + cat > "${SHIM_DIR}/perf" < ${PERF_REAL}" +fi + +BENCH_SAMPLE="${SAMPLE}" \ +BENCH_ITERS="${ITERS}" \ +BENCH_WARMUP_ITERS="${WARMUP}" \ +BENCH_ROUNDS="${ROUNDS}" \ +BENCH_MIN_ROUND_MS="${MIN_ROUND_MS}" \ +BENCH_MAX_ITERS="${MAX_ITERS}" \ +cargo flamegraph "${FLAGS[@]}" \ + -F "${FREQ}" \ + --output "${OUT}" \ + --test bench_manifest_decode_profile -- --ignored --nocapture + +echo "Wrote ${OUT}" diff --git a/tests/benchmark/selected_der/large-01.mft b/tests/benchmark/selected_der/large-01.mft new file mode 100644 index 0000000000000000000000000000000000000000..a433200e1e319ca8038f0ce1cc7e36e922deecbd GIT binary patch literal 2250 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 literal 0 HcmV?d00001 diff --git a/tests/benchmark/selected_der/small-01.mft b/tests/benchmark/selected_der/small-01.mft new file mode 100644 index 0000000000000000000000000000000000000000..f0741e189f7dc57a670ecfc4a81c6ec75edf8efc GIT binary patch literal 1875 zcmXqLV)tj`)N1o+`_9YA&a|M3-NB%V-G+&g*^t+On~gJ}&4V$OnT3hbps|OI8>)^| zfKh5eElagQB@+|xG6{Yo10yp7BLhPtBNGclqbRt5F;oEA7&ikKG5N5dtdPV^kNm)- z_>x2)Bggd097Dep!}84XP`%`$9A-s^2Y4ZUYGP*MYG7jE=w@ip#HfVqI7U_m z<|amd27@L>E~X|%Muw+OR}_B+-#(;h_@r9AgPU*W9X7L`vz|vnO)Psg6qj{WwYV&1&M?l{#`Sn zT4&#nqmyE4qm|4SUw>T|y>##L$vaa|nk35YJykb-O7J8*nY$}8D}#6V2)D1YZGCdL`_lBst+Su6 zU-_WL{fFngl10K5JUu`4UfM-1>-`f9y`+@-2-ihE0sC44N31F)=bXV9yfBCG~=A11Wep$jNNTi&AbI z$ROlc4f(;P8=~ko&_~F!7%H(SXll=84qqyFcf*^U?I-7E3g|4BO{=~8^!JHHHw*s$ z{8)=ts8g9u-`O;{Vh|T z$&_{IRu|V;ig8_kHg&dS+v^qEpOmk@^|Y_N|?j<*m{GWb_DPYxxc01p1Zc}E6b^kQ!Vc+Djm-F+_tq0=|a=0H~wMa9wzPQ}G YVN%M)6%*Me9Q>BRksNg)rG`@i0Q1_biU0rr literal 0 HcmV?d00001 diff --git a/tests/benchmark/selected_der/small-02.mft b/tests/benchmark/selected_der/small-02.mft new file mode 100644 index 0000000000000000000000000000000000000000..7db285dd28adf630ac4a8219fd39de9bc58a227c GIT binary patch literal 1875 zcmXqLV)tj`)N1o+`_9YA&a|M3-NB%V-G+&g*^t+On~gJ}&4V$OnT3hbps|OI8>)^| zfKh5eElagQB@+{Gp#;B?fsvVkk%6I+k%^_TQ50Oj7%G5ljGKXrn7ntMWtnHTvw=@= zsfA0LxkZjqWs#?shih7KvR-mg4znTyONtYxkCo~935_@QpPp%UMCI7a&Mry2)%%xC z(yYCE!(l-a%S(eMmZt_y%x4!cGchuOTw=fr_X;C7D}#Ztp`n338*?ZNv#^Gdqq&=z zn~{-;fs=`mi;xtX)0laYa?p|gp(tFyU*oH#FvZ@^p&BO?O~LlYy5 zC=^32EZv-pjLlq)-P|lJ%`J_Mj7&{k+)T_YOh&tTBR$i>ve$jGqbfcQUeWmbN^&Clj$3co$(d?2Z>jpK*lpFD%In;RD0oBJ#= zeS5u;-I|(;jYk5qY!!6N*SfxndJ`&m?!U_RwGq7a&)-XHi$3i-+NrTb^;Vt9$Be*@ zYvWnB_ZEoSGnz#9)hhq5_1x+&loI*6^U7qnH_p+md#e#2Zd$No^KVJ?CRrp;LR%i#g}=^{^TY_UU`yq ze}jFnz&pQtr=vG}Y!*_g)|#_;lj0T+w%sp&oL>8Evia9Fj&Y~be!cHg_1pUO2lv#; zC&PbgSY3H{N|W#4`Tq0=ayQtRy02~1)n;O5WMEv}#KdUO#Q4`hmW?@7mXAe@MWpk$ za-RK<>64X0@4HRCBKkM#ldvdcd|?0ifHksuj)mLP)w1HT163%uGqii#`qlCAXhiwd$c zlN0qy%JVXl^-9XYeEpDcKTl_8M|~&%5Pbq^)*u094I?8rHPLSP~W+*I;fZd!?fA>35nHr0%hl7eDT zfEA?_AO%-ZN`Zb}eo1CprCvpDj)5pl3nK@}!E6RB3z%3L3>4wQ>>yzw0|5gz7A6Kp zRt7K)Qi7U?nL)WjN~C$AgLHI~w}OAIS%Kl=5nHUFS>xZAm1^JDcniL8)$ zUCgZZ{k}$91CL$bWAow3gXIFeTc*V|-A+7Qp09D5>Ar$)*57^3OLBF-e6SY|oUZXM z_MpAecSi0_TWg-Ib|_9t`d%s_=k|4*c8Q%;mu2yc)s-s)zTH-HF^X!vW610m!0gf+ zqr;h*bYp6RlH)7EF18!T;~pI1o?7$jmd+`ifIHz&W)wd*Km9*mcK_1gdk>cT?!D+N z`>1r$vFRxSOYAB*gU>L^UDFixd$>09i;Sl4cL{x_ONs(46V@B}m>pgBwkRye{G8YB z6ru0$YaV7edtOm`w^Xs$;lt)|!zRX622G61m>8KGuxAP6l6pb5ffT$PVj`R2ns6T|$Ib&s0WbtQA=E#%#C;0rjCV~Zm-^XBb&bvt{SZ)Mb{ z{Q6~6xLLGOG`o%kM0laz`R1 z_l8bb@syrO#s>|v;#_?r6psJwENV8LylKKO&%6+}bSwLXbE;xQq9&RBR?Vo8neE`m zmDLq{*5m-&7p8f|F%u>oFtwX${rvK;q>V|BW}Uz1$s}^+>4UP2oV|u0I^VI|`gOUV zI`;9xvNYi(UON}3sx+z`PxtXF3U`^5wrWqLQ{nB+0^1k5Tw(9B8qWkaO3v7Mc Xs^hTZZP)yt?h!vl1vgGP^imN3H{Y3B literal 0 HcmV?d00001 diff --git a/tests/benchmark/selected_der/sources.tsv b/tests/benchmark/selected_der/sources.tsv new file mode 100644 index 0000000..c0bdb7f --- /dev/null +++ b/tests/benchmark/selected_der/sources.tsv @@ -0,0 +1,9 @@ +name input_path der_path input_size der_size source_format +large-01 benchmark/fixtures/selected/large-01.mft benchmark/fixtures/selected_der/large-01.mft 262869 2250 stored_point_container +large-02 benchmark/fixtures/selected/large-02.mft benchmark/fixtures/selected_der/large-02.mft 264331 10476 stored_point_container +medium-01 benchmark/fixtures/selected/medium-01.mft benchmark/fixtures/selected_der/medium-01.mft 16384 2681 stored_point_container +medium-02 benchmark/fixtures/selected/medium-02.mft benchmark/fixtures/selected_der/medium-02.mft 16384 2681 stored_point_container +small-01 benchmark/fixtures/selected/small-01.mft benchmark/fixtures/selected_der/small-01.mft 3160 1875 stored_point_container +small-02 benchmark/fixtures/selected/small-02.mft benchmark/fixtures/selected_der/small-02.mft 3160 1875 stored_point_container +xlarge-01 benchmark/fixtures/selected/xlarge-01.mft benchmark/fixtures/selected_der/xlarge-01.mft 4522145 144968 stored_point_container +xlarge-02 benchmark/fixtures/selected/xlarge-02.mft benchmark/fixtures/selected_der/xlarge-02.mft 4615094 150261 stored_point_container diff --git a/tests/benchmark/selected_der/xlarge-01.mft b/tests/benchmark/selected_der/xlarge-01.mft new file mode 100644 index 0000000000000000000000000000000000000000..402cdc3d5e009eae2a9cefa1123b362c4622147a GIT binary patch literal 144968 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

gzj$7rCYxCV@_ZNYOP6-tUY=g?Ke&l) zaRiI-f}2y`KHb;Ig@SmzRuOOZUEdfk4)=e@29l&mEXsQdkxk}gA#K_RtB01IA z96oil*SbOTpbS*3mk`fb>4J=J8VWZkM>+~K@X}#v~;^gyf?fcsH#fu23dOPS`_Sm^r zZbHdo@O(v@VOom0xmg-$g`6d*PX-!F1zk^)nq*>_mSSvaoCa%DDDt@WDlPo|Xhk9tNPg z!oU!;?$gXz*DTRI$-vy$#5@^37I1>c%>L!w8V;qo3yhv8{!%Up*r2v#m*>HjX-in% zwOfF1*GMxmHcB)AkL{$GfVOK`>RKe4B(H%`RSkq&$Fh~6FZU)ObY+{zS^PN!b_aH!vH+A zkY<#Y2EOVv5mezA8-Z?5Gc*MSps7WYaf*SV8T{x~*P>ANy$8P3I=L8K&dqLC*;rQ* z5H_K>VQ))~AGciOYOw1-CugP^nCPZh8mH)j#{YDaK&LN*4oNcvofn;!25a)1c=thU z`I)v!=@Wl#$QMg8?{PmZae8Wvi)*F-ZiC5~Ub`mbVz18-q?dHrKVZ zG%!ywNHsA?fnV0ad+L8NV}pM8$!`Z)-E-!g@(!4AZI-)T%$NB5P&2O#@DkiKW0O>) zG!tXp6eG~>X@;Oa0Qd;YBnvYGGYd15H25jFcl0^WR_QP0UiqVKonj1Ub%TgugW1Qf zl%@|0lFeS2gV&>^8JijyrX_)Lg&F7|Yzt%EB*Vl+-8AErG;=dE19J;=*u>UjbG@jQ z(v!>gWS)DxLYH0OldcC-SNg8NeKG%!oO8Yd-gua1oS1A1x|2N_RAU<_n}UwlO)}O6 z)xAlU#)*lB#!1k^eg1~!KUi$!KVAFl{_^LeS8vNY*1x-Z*2vf8fY0yBJsjY3$kL2K z8wEkj=959E85o%)>RK9@n&_G&gLXuwq?j4P*Hm2Ju_0>fOOC&L@14_Bs9*fOrF8rJ zPj;TR)tbSXi!bDX57kWr4aQm+n(LaF8G#lqfjZitJ7Yl2*i-{kBavVno2t^v3~W(L|cV*%Q&mX>H> zXkn0?ikO^P;3i|9HI@729rvWYuf2n0I#+6C+$>W*vg+7VA?34gAmyEjL9$V@u_@^A zdQ)9v3nL5NBm;Bs#FlxIL86(t8GJ9E*W;|8|Ewjto|o`A@zlm_Z(4X*$J63jNMHJo z)oNP~fj8o$nHVLd8mCz5nwxRP0kSR|SlfCdU+EhsbZH$SEt+;tF%4nFc|{%7qeY8>0otNoO#KWAPz zc}sFE#C4{r7Rf1Ty2)mi2B3qm4Rw=17qX;U8Yi2AZtOCIkA2qNuapuIusJNV8WmspjUErY5Eq zrtm8Y-ScBtzkhw0xA#I`!ZMi^&vzT1IZ+()ZQ-k*$0is!C4rBZN;9!ANi$D2*0nGJ z9Y0`_W(s1N>ZTbR7+Y8x8K)Y+M|q;7B|Anm?B#j)b2rmN9JJqqU^v zpW+*E2NV=UW=WQ5x`yCGh|G;mbrVg~EOjl+lTtv7NG&amU=s{kw@i2ayXGe>C|vv_ zV2=8J-)rj?r!M+aH}h})R#(2e(6F;iGBHds&^1j3)fM1VAwd%a7UrM>byJd!5Xtzl zsmG;f$D(sBkN*0t7aq#MQoL6oLuC%1z~^mwtFQZk&%#eLNi;MzN=ni-0}VtOgVugn zrWzUOCMKnV4kj>7N`lw3>}7VVT4S_Wo!r7@-hLDFxT7=u$;z2~TDQd*mL@ZbdqH9r zv|7eAQP&VOHEV2Sn5b)EV3w+z0_w4tn3;lZPlA>xj&JsEKJ68<(O<}YO0cJ*n_jLN zmp0Q*Ly-UlxgN6x;N5O%pvxUW9SIX-BXeD2Q*#qt%VZ-XT|-mDq-4VsBjeN*SSw)P z3Ep{1r8kbheDa6G^h!Qgv(_$^Gev8zT5K}g|M+tfcw{!s)Y#G@F*yaa1Q*nTG6F48 zPqx%eO-@Wqv@kbLHGn6St26Gm)rbCeY3qBjeS7HDsdw3KO=ed0zV@_W%HCUS+RMZwnq#u9$gMG&MXPEL|)e{*&jB=XYH4nF)ABZ@f82TU921r6%d@!;xq3!|d)sNIiKdC5bAyu-L33~Bpy>|- z0|Q-y)MR6$6yqe&sT0tsn9p0&@^AU0NVoR+l3I3qBWAX{|NF*gys%McbGM1OF!+M( zG}E*sL(rtVA!zj8*aS2Imy`(VlbKjrSeP4Hn!}I1INpEcjQhin$pLSbmZ`JP3Rg&U zTyAdon0IdQmV5)}yBENoH8V^}PBloKIGK+7qNbS+I1Et5^mEe*}!tF$u8 z*!NE>dGr70Jhl}HrQ$2T+PfG8yt4gg^8dHTcK=u4(_7NajM9=p*Xo#?gLWN(&TmLe zG)mP4%~)C{nIu{y!WUQjD7;AFZt6My*zo`4UpI6c7QNZ#_;J&Wv?Y@=JYSTjfKLrd zGcz_wH8Hi+HM0a20iX+AEKE#Hbd3y6lFbs+5)BMYVDlBtB4v+QN|F~VcH}v5xLuff zWM0wTT}>{}a{0Gx)w=2v0`aV|rHOf>sjiVha+0pGQEHNIqB-bXgA`NCL^IGmTkvzW z*V^UXW)#{mL+v(O>C=Y`T(h=2747n$;b*nFZ=T7kx8Sq1(#%YaEG$4bh=HcHjS~|S zbuCOy%s>ZhCL5~kL#0|nj0G$nkE^-hqU@ng&nRuJAIDd$_tN#g_d_cT*Fs5z0A3Quhi>^Rq=92 z7tbsu4Rl~ScEiuUeG(wi5YheM}1(s}NZl0EAVq^wy zkSX@gm>8^_?iH(+et*aAX}_6XUp;*}YeKY1=eaB~p$Qe>gko-BX$Y#ejX~q7#-^zj zpoN+ipcOb4X(k4seFCtkn01yfYp#o3ScSY{-df(y)n20FOMm5V*Xo*X^|qs>0(|mK znz>Pud6EUFS!`woIv(C!H__D8KsV9UAT`Ov$TATzKWl0~bC2_?RA2YzdW&CgHOsop zA8>gEDoNgd|NU6+)OKHp>x_-kEYp&7%|Nvycvrb4Xo0YaacYW@33xvzY_8`(Ja1W3 zg_C4W_SdBh3=7{lh)>Bpd!^=OiqfWi8`{Jn)wa25DrjC;*UZ$!0JPO58FbF9iEfgy zQCgazaiWn0e1hTkoy%9+j`>E&B)`~lDe%eW9VF zPh5AeWQNO+xlu(jcTWXwyT@yrkW?28Ji^D#BpQN_G6Z=R)bF+cox7N3VQK=t zjL8^QqF7G&ZD4!wu0+&wW7AYl*DdmK9u2cPS9aHAw|nSCcrJz*muP5^Y5=-?(gJiU zB&fFy;u@w{CYz<2StKS}z!FOASD{3g5`LANvK+BIInKU^cHf$;&7WAY<9wa$#d7DP z5aUu!ERxcabd%GJK!?Gkfo`5lPSXW#956L8FfvMk@0>Z+Fk#vLi4QX`n*KE9u4qmS z;rf^B{Ve8ee3j;fU2E^RfsL~;G)zo2GSf9n1&z#_fEH>Rq#5g4BqgSpCR-+&rozVp zIudQ$ly)6`Wc4>(I_Pis&52(EmOgl?|IdRZZa00mqii0RAM>iT7ZA^ynxueEHMRup!7&ESy;)co7=U_=7Kvu2X(pEDur`YP z!!@1WPKVqWPuXSfyZ@mletPwn&A?rgVTi2YYh%Z&Nm_E(mG zU1w=vmTY32s%v0o0NSx-0Y3c_w8SDU$)z@8 z(asz_k~vCNS+OC;j_bhNgwiZQcTc9I=_Z2K1{<5FCh1xjnI(f3&!nW7L5|shHY#>n ztU7NzJAL7X9hquTTef@>2`TcNS=kwIO|CiQ$ZU4-3b!;%bK_J)GZWoZ&>Br+Qwu{~ zOHln|k_4IpGD|i{PJwyW`E+D_>?cq8l`9)IOt~}vQ*8hFPuqE}o__f2ep*hBa6Q8NtfCPV+m5IA*m+uU*>UyEN$Bv*&9AyBA$QGvPaTjr{SXWbkzu zX^BY|NuZ_Q<`&5oppA#1CXXd}%seqA(Im~#6uvr8tDr1;pWLhPNw**F-}aViV#Kw& z=AFdZ=FKn>NL*Xw@fbeo0jWj*h^j( zWblbMm8gFMHZI8|%`DB_OgF{Uz+4yHvPc9i5H>MNH8x4HG_o)^hNZg`r*BPNQvdw+ zVVAQ)Q}!ADI2*V1_xjhf)r;ht*%#Mr0$;F`mShULWGhwIC=s+!6EvS^nFv~#ZeeI_ zl5Cu0X$If7-JaKPhRX{zC(n9w@549$Ej{xtuYdh?$q7g+APIE2xn-(u zqB&>{nXxhGV)nFTU6Vx6Rp6#6$p$7c*M+9%w@#XNpX27m=&&P~oo!zmu}^Qw49>Z+ z!j|dY*%-*kY?4`;X)^;4VZuhSvJ@k&_@HZLoogX&<0K0U&<;7>G-D&sITaw+S%8KHQc{d84K0if z&5~gQAMYnES+=FUl27sc%P)UQ*+g;IkIIRG@&G$o27zRW`fQ}1D%0wnU-v>Ym{VSl4Ou*X=w_t zwhum(pOt5S-uTewMh(VQ$|w6fS3hZ5afWBz6TLZ|zyE?aZKfq9n}hDe(KRy!WqcFR z#Fm+HqHdxE_%bn2UjSAFoOyfm-=Wpg>02M4Nw&HAsyX&StSn>o5ByKZFeQ zCL0+ig0HPIF|mL&7ZVc=jC4T-NGRrR0U>ep@8N#7}H8 zTrO?9ot-tyAyyK+U@k4$IN37M+)&rZ5_DX$nHgxz-4MLq*ep5O*ucmPzRWPru;nb^80b%!>`hk6G7J+n&?_2gE~=0pgw?!v4yUg zL9$Vjd77npvH>hAA~{*t8y;C%LdCMTsNTNospB$^n*jQeQb_*AOG z=hwSg(~6a|-!jQRXxVs5_oJlSoZDwaj<-QNQORj3DP|UFx@Lx;BmTf6fhMMgx`sw( zrfF%(#)fHWu#t+z7Dq~_A6LH{@O<5UpX)4Rr$oF_{kM4wg?l401i zX!>7Sf$f{uczZ$$s1)PGBnuNW-4yT)XewxK0W>sVmXv0Z3OeRF(HvH7pL)3Pal%GZ z{iw6kCQs;W>;26v(la$%%VJ}dU}1t$2lxm~&^%PCfsp}dl^1B;r+Kn&l6f*{xWe4n zGR-svbPfZw$@Bi!BN^R`|9=@sTwZWXXWg}m3*Q%~D4Sfp($>f#dRJ%`xHL|&ut-ia zG1E;o1Rbq!WNN6J2y$l{c#161*vtsN7cchDj;*tr8Cs5o?di}poaDN1?yKJh=X<_N zwe<5b{H})dD^e_t%?v=Z6rh{Vj7=?*KzCV!j&Mm!N=ZpcF)@H|#PK>`J}YX6tgeR6 z^`~94C-tm3_Az<&zoXfb{ZGZWUVu)hrdXyJnwTZ(TAG43S{tUC>RN)fsiqjEq#C6r zrGVB4Ks{T*c7`O@|I+S#6-iyG}9yt_)*ilq_-=sT6uqe$%Q1*cYc~%?}T_wSfF;}XTaP= zpBSAlfcN#JrKFl9nxvZQrlc7e=^C3R8iB4-1a!Ru}m{C)=joFGB8Ln z0-Z$&>(7?`-M(9fi|Ii_oD_3Lz0KTI-?GyVr%%LcNJf4roox$^*|cO60}IfpL!cvn zL5qwmK%3{xjX>Mi%`HsK;fIKex654Ae!sB3^lx26rRE0Zn#lhRG7iBuH;$x4^JT7d z1t*kL15m+fsGDRCn%FW-H3p6HnCKdsCmVrg9uiXwU~QDmm*=P~o+;CQ{9!!1^JPZo z+fMvXH6HQ3*T40J;^H0&-h zZ+~-U_UC`;{Hu%3%qsNE-@55YL-P?umQ|;=nkFBFG{{m-EX+Y$gp3F_jRr5Ty(8iUp^Sf-^Wfp1kdGqgxGNlSr6g`9fcy0WEr79N?Dcu82|^aYo^ z6J>Kl=RB0<)|ugSEEv)XNKH0K1Z^cVOa>iJtMsj-1>iY2J^nU)B0m}!!(A!wK)F~uy=0^UYBu;BX6&gqVUy4xFt_C7LX7JFp) z zUeEIC-L2x4j!I9?+JDw#bMp!Qo#+-g?duB9bGs_Tz_*m9rJ1KDTbifpnnJeY8X4(Y zn59|jTAG+9f~w3kV++_F3^N~_>U0}ct@i29d+D0^$5*MO?3sZ`MTy%z4$&)5{(yH1 zrllns8>A$e>n5gvqQWvMRo4P^mR7P^N}7dPvZ?l9{eCXi7iHz!-G5n}KCgs$r6eK{Bib zbxTuQQ2ANY_LwbSs}ISqdA*_b_CdD!ZyA3(8ae%6wHAC|Pg+`Hin*DksjdNNqSDyR zI9WFdbg4)xs8^9-r?-Gs;hUKorJ0(Tm|4PF0T-ngu5Xg8ue@BctRZRn zCB>sx>np3+?-XAVpDXlk*&fIQLt1j0u>olKDK!;z%eJA3E@*6A*W5hS%reo?z&H^e zcJlw6XFDda|5&2tswvl9DZ20Z?q6}+4!3+*5_kXqOeshkB`w9mDAn9j*UT8y+fGXX zT?K5Os%xH-WSEp_3K}|wEjDD!KfBv|j%~P$iqD#focDe!UN)+9HriP$GBfxu>$cnA zEmmo1sVS*x#>TovX`t1f$;qJA8K7HP%u`d-43aI)4dExIt0eskn%u=>U+;1~?ap2u z-X#}~A1IuYveNrz#3RGb_eU2ru_YKZvBelPvAQf^W@2Pw5@F=!neVI-;j>@-#jjq; zr(H+gvK$O}**LY@JlekVGBR?rG8pI^>KbUXF^94+3#%j>8JHV@W?@0MndzFOS(@r5 zC4(CN2B`*Srm5ij$PDDfd5z2rKznhF42%pcqM%$e12Bj}F)-EKAO*6z+aSe4*93Il zKjBg3g67r~qL4WHLsX4&?_ zwfoi6XZzDP8aXS-1YEIs?4Pl;W}n%gD>fS4t`8h^A0Kf%%p;I+?yhk7#rWBKN-ybu z=Ps}+tI5fGn$WNNDOvfYQsk8HVd@4<>}^ZZZ5NAqs@ZhSQC_h4d!(|@HOH?@O`Zw- z`}?QDydwC^3iiTvzizR}-ZQ#voBrv7kVL>&&###m4vNmd)G_NU^I=Ef6*nDJet*9? z-%KlNi@W4k-C6siE8`Rtvs!mPm3g%7wW4Zh?0FI6<|VF9=coL+ReztmBgv(cN54t$ z@AMUa^L_-MeQdYa?~zbT(W}K$!4n-tjw}fb{v|!@YT_GZi7obid}?ghRyBJwF*7nS zE^cDZGiYMYGLU6s4wdC&5n~Z?H~v}t%m3B%#wj&Rj0%If=d#JaHE4Xw#-Yu|$jZvj z$j#Dt!=Ul1LE|NukO6mF>`cAHqRc$Kywno?qSS)?;>?o#qDp;` zm@Y_Gw0$T&4oH`T%*QP;!(bkw7PMY67up}Ap7qLHDgd5W=qS_G#V9>Z0CS<_W*0^9W$Gcu~YLS5=%(;y0Ab$xN2pF)j zFflN)GJt6&Rt5u6xDpPK5;g;t1t8%NP+%y4M7#_<4BTLf_?Qf=3@l(gCPp!xjFOUq zVk>?9^73-zq+gt0T9lkx49*hz$pyuF86~+n$Yl~YxJ+VXh}ic{x9O+p36o_6CGtL>RGn{`ta+e;$X z^Q*I_^KPEPu$t$uuGYC3S~GL157ZvHF{AL@srarG-3vE(Q|GNuJw2JPxyk2_q9oJl z%E;YyWw(n`W8T?BGR8BuE||&1?RH~_Crg&~y-$b3N{+NywmyHjb5@b{9Vh!ZfMQJDZnUYAcK%&HROj@BPIrr zTE##gAYCI*p|vU>GEUF zns;9xMwu@9x4W2-#Q%-J7zYF*Q+GCr3lO84#-E;bC>Rrl`g{3q+=E=eu8*&x4I zuzSIA+tk0}@r(aE%{l$?m(Q|m=F2x4)RcA3c>I6H(vJ+U0%qn~-4PJ;$`RXLxH2I> zQrF%|N;tYyXXn4vGlCpnrd(Kg?Y!Z?{4)~XCA*4jgbys=f2*+0-bq1jRmF&CNWVe>V31T%#+EJ#XSSO`XD*RPZoH NLh}A@#i(GL8UWt$FY*8Y literal 0 HcmV?d00001 diff --git a/tests/benchmark/selected_der/xlarge-02.mft b/tests/benchmark/selected_der/xlarge-02.mft new file mode 100644 index 0000000000000000000000000000000000000000..499b50fda3c58cfd006fadab6eb2bc779b3e2f25 GIT binary patch literal 150261 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

2L8w`;M+A!Qq9v6L6_Q_B!h0(NCX|S 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 R|JCCo`{V4%f|X*stN= mft.manifest.this_update); - assert!(!mft.manifest.files.is_empty()); + assert!(mft.manifest.file_count() > 0); // The manifest file MUST NOT be listed in its own fileList. + let entries = mft + .manifest + .parse_files() + .expect("parse validated manifest fileList"); assert!( - mft.manifest - .files + entries .iter() - .all(|f| !f.file_name.to_ascii_lowercase().ends_with(".mft")) + .all(|f| !f.file_name.as_str().to_ascii_lowercase().ends_with(".mft")) ); } diff --git a/tests/test_manifest_processor_m4.rs b/tests/test_manifest_processor_m4.rs index fb06d15..bd5e500 100644 --- a/tests/test_manifest_processor_m4.rs +++ b/tests/test_manifest_processor_m4.rs @@ -57,8 +57,15 @@ fn manifest_success_writes_fetch_cache_pp_pack() { store .put_raw(&manifest_rsync_uri, &manifest_bytes) .expect("store manifest"); - for entry in &manifest.manifest.files { - let file_path = manifest_path.parent().unwrap().join(&entry.file_name); + let entries = manifest + .manifest + .parse_files() + .expect("parse validated manifest fileList"); + for entry in &entries { + let file_path = manifest_path + .parent() + .unwrap() + .join(entry.file_name.as_str()); let bytes = std::fs::read(&file_path) .unwrap_or_else(|_| panic!("read fixture file referenced by manifest: {file_path:?}")); let rsync_uri = format!("{publication_point_rsync_uri}{}", entry.file_name); @@ -111,8 +118,15 @@ fn manifest_hash_mismatch_falls_back_to_fetch_cache_pp_when_enabled() { store .put_raw(&manifest_rsync_uri, &manifest_bytes) .expect("store manifest"); - for entry in &manifest.manifest.files { - let file_path = manifest_path.parent().unwrap().join(&entry.file_name); + let entries = manifest + .manifest + .parse_files() + .expect("parse validated manifest fileList"); + for entry in &entries { + let file_path = manifest_path + .parent() + .unwrap() + .join(entry.file_name.as_str()); let bytes = std::fs::read(&file_path) .unwrap_or_else(|_| panic!("read fixture file referenced by manifest: {file_path:?}")); let rsync_uri = format!("{publication_point_rsync_uri}{}", entry.file_name); @@ -140,11 +154,11 @@ fn manifest_hash_mismatch_falls_back_to_fetch_cache_pp_when_enabled() { .expect("fetch_cache_pp pack exists"); let cached_pack = FetchCachePpPack::decode(&cached_bytes).expect("decode cached"); - let victim = manifest + let entries = manifest .manifest - .files - .first() - .expect("non-empty file list"); + .parse_files() + .expect("parse validated manifest fileList"); + let victim = entries.first().expect("non-empty file list"); let victim_uri = format!("{publication_point_rsync_uri}{}", victim.file_name); let mut tampered = store .get_raw(&victim_uri) @@ -186,8 +200,15 @@ fn manifest_failed_fetch_stop_all_output() { store .put_raw(&manifest_rsync_uri, &manifest_bytes) .expect("store manifest"); - for entry in &manifest.manifest.files { - let file_path = manifest_path.parent().unwrap().join(&entry.file_name); + let entries = manifest + .manifest + .parse_files() + .expect("parse validated manifest fileList"); + for entry in &entries { + let file_path = manifest_path + .parent() + .unwrap() + .join(entry.file_name.as_str()); let bytes = std::fs::read(&file_path) .unwrap_or_else(|_| panic!("read fixture file referenced by manifest: {file_path:?}")); let rsync_uri = format!("{publication_point_rsync_uri}{}", entry.file_name); @@ -208,11 +229,11 @@ fn manifest_failed_fetch_stop_all_output() { ) .expect("first run stores fetch_cache_pp pack"); - let victim = manifest + let entries = manifest .manifest - .files - .first() - .expect("non-empty file list"); + .parse_files() + .expect("parse validated manifest fileList"); + let victim = entries.first().expect("non-empty file list"); let victim_uri = format!("{publication_point_rsync_uri}{}", victim.file_name); let mut tampered = store .get_raw(&victim_uri) @@ -255,8 +276,15 @@ fn manifest_fallback_pack_is_revalidated_and_rejected_if_stale() { store .put_raw(&manifest_rsync_uri, &manifest_bytes) .expect("store manifest"); - for entry in &manifest.manifest.files { - let file_path = manifest_path.parent().unwrap().join(&entry.file_name); + let entries = manifest + .manifest + .parse_files() + .expect("parse validated manifest fileList"); + for entry in &entries { + let file_path = manifest_path + .parent() + .unwrap() + .join(entry.file_name.as_str()); let bytes = std::fs::read(&file_path) .unwrap_or_else(|_| panic!("read fixture file referenced by manifest: {file_path:?}")); let rsync_uri = format!("{publication_point_rsync_uri}{}", entry.file_name); @@ -314,8 +342,15 @@ fn manifest_replay_is_treated_as_failed_fetch_and_uses_fetch_cache_pp() { store .put_raw(&manifest_rsync_uri, &manifest_bytes) .expect("store manifest"); - for entry in &manifest.manifest.files { - let file_path = manifest_path.parent().unwrap().join(&entry.file_name); + let entries = manifest + .manifest + .parse_files() + .expect("parse validated manifest fileList"); + for entry in &entries { + let file_path = manifest_path + .parent() + .unwrap() + .join(entry.file_name.as_str()); let bytes = std::fs::read(&file_path) .unwrap_or_else(|_| panic!("read fixture file referenced by manifest: {file_path:?}")); let rsync_uri = format!("{publication_point_rsync_uri}{}", entry.file_name); diff --git a/tests/test_manifest_rfc9286_section6_1.rs b/tests/test_manifest_rfc9286_section6_1.rs index 9bbaefc..819d95a 100644 --- a/tests/test_manifest_rfc9286_section6_1.rs +++ b/tests/test_manifest_rfc9286_section6_1.rs @@ -41,8 +41,12 @@ fn manifest_outside_publication_point_is_failed_fetch_rfc9286_section6_1() { // Store all referenced files under the (different) publication point so that §6.4/§6.5 // would otherwise succeed if §6.1 was not enforced. - for entry in &manifest.manifest.files { - let file_path = fixture_dir.join(&entry.file_name); + let entries = manifest + .manifest + .parse_files() + .expect("parse validated manifest fileList"); + for entry in &entries { + let file_path = fixture_dir.join(entry.file_name.as_str()); let bytes = std::fs::read(&file_path) .unwrap_or_else(|_| panic!("read fixture file referenced by manifest: {file_path:?}")); let rsync_uri = format!("{publication_point_rsync_uri}{}", entry.file_name); diff --git a/tests/test_model_print_real_fixtures.rs b/tests/test_model_print_real_fixtures.rs index 8d22384..ca19e3e 100644 --- a/tests/test_model_print_real_fixtures.rs +++ b/tests/test_model_print_real_fixtures.rs @@ -319,13 +319,16 @@ struct ManifestEContentPretty { impl From<&ManifestEContent> for ManifestEContentPretty { fn from(v: &ManifestEContent) -> Self { + let entries = v + .parse_files() + .expect("parse validated manifest fileList"); Self { version: v.version, manifest_number: v.manifest_number.to_hex_upper(), this_update: v.this_update, next_update: v.next_update, file_hash_alg: v.file_hash_alg.clone(), - files: v.files.iter().map(FileAndHashPretty::from).collect(), + files: entries.iter().map(FileAndHashPretty::from).collect(), } } } @@ -339,8 +342,8 @@ struct FileAndHashPretty { impl From<&FileAndHash> for FileAndHashPretty { fn from(v: &FileAndHash) -> Self { Self { - file_name: v.file_name.clone(), - hash_hex: hex::encode(&v.hash_bytes), + file_name: v.file_name.as_str().to_string(), + hash_hex: hex::encode(v.hash_bytes.as_ref()), } } } diff --git a/tests/test_objects_errors_more.rs b/tests/test_objects_errors_more.rs index 73bfe87..c5aec50 100644 --- a/tests/test_objects_errors_more.rs +++ b/tests/test_objects_errors_more.rs @@ -51,8 +51,15 @@ fn build_cernet_pack_and_validation_time() -> ( store .put_raw(&manifest_rsync_uri, &manifest_bytes) .expect("store manifest"); - for entry in &manifest.manifest.files { - let file_path = manifest_path.parent().unwrap().join(&entry.file_name); + let entries = manifest + .manifest + .parse_files() + .expect("parse validated manifest fileList"); + for entry in &entries { + let file_path = manifest_path + .parent() + .unwrap() + .join(entry.file_name.as_str()); let bytes = std::fs::read(&file_path) .unwrap_or_else(|_| panic!("read fixture file referenced by manifest: {file_path:?}")); let rsync_uri = format!("{publication_point_rsync_uri}{}", entry.file_name); diff --git a/tests/test_objects_policy_m8.rs b/tests/test_objects_policy_m8.rs index 3128611..5b34548 100644 --- a/tests/test_objects_policy_m8.rs +++ b/tests/test_objects_policy_m8.rs @@ -51,8 +51,15 @@ fn build_cernet_pack_and_validation_time() -> ( store .put_raw(&manifest_rsync_uri, &manifest_bytes) .expect("store manifest"); - for entry in &manifest.manifest.files { - let file_path = manifest_path.parent().unwrap().join(&entry.file_name); + let entries = manifest + .manifest + .parse_files() + .expect("parse validated manifest fileList"); + for entry in &entries { + let file_path = manifest_path + .parent() + .unwrap() + .join(entry.file_name.as_str()); let bytes = std::fs::read(&file_path) .unwrap_or_else(|_| panic!("read fixture file referenced by manifest: {file_path:?}")); let rsync_uri = format!("{publication_point_rsync_uri}{}", entry.file_name); diff --git a/tests/test_rpki_bin_coverage.rs b/tests/test_rpki_bin_coverage.rs new file mode 100644 index 0000000..829e35f --- /dev/null +++ b/tests/test_rpki_bin_coverage.rs @@ -0,0 +1,33 @@ +use std::process::Command; + +#[test] +fn rpki_bin_help_exits_success_and_prints_usage() { + // This also increases coverage for `src/bin/rpki.rs` because it executes the binary. + let exe = env!("CARGO_BIN_EXE_rpki"); + let out = Command::new(exe) + .arg("--help") + .output() + .expect("run rpki --help"); + + assert!(out.status.success(), "status={}", out.status); + let stdout = String::from_utf8_lossy(&out.stdout); + // `cli::usage()` contains "Usage:". + assert!( + stdout.contains("Usage:") || stdout.contains("USAGE:"), + "stdout={stdout}" + ); +} + +#[test] +fn rpki_bin_without_args_exits_2_and_prints_error() { + let exe = env!("CARGO_BIN_EXE_rpki"); + let out = Command::new(exe).output().expect("run rpki"); + + assert_eq!(out.status.code(), Some(2), "status={}", out.status); + let stderr = String::from_utf8_lossy(&out.stderr); + assert!( + !stderr.trim().is_empty(), + "expected non-empty stderr, got empty" + ); +} +