Skip to content

+ PowerISO DAA images (format 0x100) - #512

Open
Hawkynt wants to merge 6 commits into
mainfrom
feat/daa
Open

Hawkynt wants to merge 6 commits into
mainfrom
feat/daa

Conversation

@Hawkynt

@Hawkynt Hawkynt commented Oct 23, 2026 •

Copy link
Copy Markdown
Owner

Adds Daa (R/W for format 0x100): image.iso + metadata.ini. 0x110, split, password and gBurner GBI refused (no verifiable samples).

Verification

  • PowerISO-written fixture (Compression.Tests/Daa/ReferenceVectors, provenance README) decodes to the pinned source-ISO hash.
  • Oracle (new CI step DAA oracle, hard gate): PowerISO for Linux 1.3 (sha256-pinned freeware, black box) converts our DAA to the identical ISO, and we read PowerISO's DAA output. Passed locally under WSL.
  • Unit tests: round trips across chunk boundaries, header CRC, 0x110/GBI/VOL refusal, split detection, corrupt chunk (per-chunk CRC), List fallback, replace.

Finding: every 0x100 chunk carries a little-endian CRC-32 of its deflate bytes; PowerISO rejects images without it (not documented by daa2iso).

Sourcing: rung 2 (daa2iso, GPL) + measurement; docs/DAA-ON-DISK.md.

DAA requires its logical ISO image, so the descriptor declares CanPurgeToEmpty=false: purge is omitted from maintenance discovery and refused before mutation, while image replacement remains supported. Regression cases cover empty and populated payloads and verify the archive and decoded image remain unchanged.

Integration validation: Release solution build; full local required suite, 34,130 passed / 1,561 skipped / 0 failed; 71 refreshed format, architecture and documentation checks passed with 15 tool-dependent skips. The support matrix and API reference were regenerated from the built descriptor.

Hawkynt and others added 6 commits October 23, 2026 15:02
DAA was missing. The new descriptor reads and writes format 0x100: the
76-byte header (CRC-32 checked), descriptors (password and multi-volume
refused), the 3-byte chunk-length table (high, low, middle byte) and the
raw-deflate chunks, each followed by a little-endian CRC-32 of its deflate
bytes. image.iso is returned to the ISO size; replacing it rewrites the
container with the same chunk size.

The per-chunk CRC was found by measurement: PowerISO 1.3 writes it on every
chunk and refuses images without it ("file format is invalid"); daa2iso
never reads it.

Oracle: PowerISO for Linux 1.3 (freeware, sha256-pinned, black box).
It converts our DAA images back to identical ISOs (1, 147 and 489 sectors)
and we read the DAA images it writes; a PowerISO-written fixture with its
source ISO hash is checked in with provenance. New CI gate downloads and
verifies the binary.

Format 0x110 (bit-packed/obfuscated table, LZMA+BCJ chunks), split images
and gBurner GBI stay refused: no tool available here writes them, so
nothing could be verified.

Sourcing: rung 2 for the layout (daa2iso 0.1.7e, GPL-2.0, read for
behaviour only) plus measurement of PowerISO output; recorded in
docs/DAA-ON-DISK.md.
DAA inherited the default purge-to-empty capability while its modifier and creator require the logical ISO image. The fallback therefore failed with ArgumentException after a removal refusal. Declare CanPurgeToEmpty=false so maintenance discovery omits purge and the shared guard refuses before any mutation; keep replacement supported and regenerate the support matrix and API reference.

Verified: both new purge regressions failed before the fix and now pass for zero-length and populated images, preserving archive and payload bytes. Release solution build; full required suite: 34,130 passed, 1,561 skipped, zero failures; 64 focused checks passed with 14 tool-dependent skips.
Retain the validated mandatory-image purge restriction and regression cases while incorporating current main and regenerating the combined FileSystems API count and reference.

Verified: Release solution build, 71 refreshed format/architecture/documentation checks passed with 15 tool-dependent skips; documentation generation completed without errors. Before this main refresh the required suite passed 34,130 tests with 1,561 skipped and zero failures.
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