Skip to content

feat: scored identify + decode of unknown BLOBs (timeglyph-for-blobs) - #1

Merged
h4x0r merged 9 commits into
mainfrom
feat/blob-decoder
Jul 11, 2026
Merged

feat: scored identify + decode of unknown BLOBs (timeglyph-for-blobs)#1
h4x0r merged 9 commits into
mainfrom
feat/blob-decoder

Conversation

@h4x0r

@h4x0r h4x0r commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

New fleet crate. identify(&[u8]) -> Vec<Candidate> returns scored, cited candidates best-first; wrapper candidates nest a DecodedChain so a base64→gzip→JSON blob reports the full chain. Decoding is delegated to the mature crates (plist/base64/hex/uuid/flate2/snap/serde_json) — this crate only orchestrates identify → dispatch → score → recursively unwrap. #![forbid(unsafe_code)], panic-free, depth-capped recursion + size-capped decompression against bombs.

Full local gate green (fmt/clippy/34 tests/deny/100% fn coverage/fuzz 300k no-crash). Validated tier-2 against independent producers (CPython plistlib/zlib, system gzip/base64/uuidgen). Honest MSRV 1.88 (set by plist→time, not our code).

Scoring heuristics flagged for review (all conservative/low-scored): base64 over-fires at Low on any len%4==0 charset text; zlib requires successful inflate (no magic); only framed snappy is detected; raw-16-byte inputs always carry a Uuid Low candidate; JSON claims only object/array roots.

🤖 Generated with Claude Code

h4x0r and others added 9 commits July 11, 2026 00:40
Failing tests define the engine: scored best-first candidates, magic
identification of bplist/gzip/zlib/snappy/plist/json against real
tool-produced inputs, recursive base64->gzip->json unwrap, honest
UUID scoring, and graceful degradation on adversarial input.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Implements the orchestration layer over plist/flate2/snap/base64/hex/
uuid/serde_json: magic detection (bplist/gzip/zlib/snappy/plist/json),
structural heuristics (base64/hex/uuid/utf16/utf8), honest scored
Confidence, and recursive wrapper unwrap with depth + decompressed-size
caps (decompression-bomb / infinite-nest DoS guards). 23 tests green;
clippy -D warnings and fmt clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
File/stdin/--string/--hex/--base64 input, human tree + --json output,
--top trimming, pipeline-safe exit codes (0 identified / 2 unknown /
1 error). 5 CLI tests green; clippy + fmt clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Single target over the sole entry point; 300k local runs clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds real python3-produced bplist/xml-plist fixtures (provenance in
tests/data/README.md), tests that exercise the plist paths and the
sort tiebreak everywhere, and the cov:unreachable gate script. One
defensive fallback arm is annotated; all other lib functions covered.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tandard)

ci.yml (test matrix, MSRV 1.88 lib job, lean-build, coverage gate,
gitleaks, cargo-deny, freshness), fuzz.yml, docs.yml + mkdocs; deny.toml,
.gitleaks.toml, .pre-commit-config.yaml, renovate.json; README, SECURITY,
CHANGELOG, docs/{index,privacy,terms,validation}.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
GitHub licensee could not match the previous paraphrased license text,
so the repo displayed 'Other' despite Cargo.toml declaring Apache-2.0.
Replace with the canonical apache.org Apache-2.0 text so the license is
reproduced verbatim (a condition of the license) and GitHub detects it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Local mkdocs build/gh-deploy emits site/; ephemeral build output (CI's
docs.yml rebuilds it), so keep it out of the tree.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@h4x0r
h4x0r merged commit 8205e66 into main Jul 11, 2026
12 checks passed
@h4x0r
h4x0r deleted the feat/blob-decoder branch August 9, 2026 15:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant