§7.9 specifies the tiled layout, the two stages of the detector step by step in integers, the bound over all 12 decodes and its check, the battery's additions (crops from each side, a crop of 25%, a rotation of 5 degrees, two simulated captures of a screen) and the measurement: both generated sets survive every attack; the claims are what the photographs survived too. §7.4, §7.6 to §7.8 and §13, §14 cover both registered schemes; §1 drops the crop-and-rotation exclusion. Registry, export, SPEC §5, CHANGELOG, READMEs and the CI step's description follow. _wai_mark.py gains the tiled scheme from the text (the autocorrelation by one integer product a frame, the fold, the phase and a bit-sliced agreement count); synthesis_verify.py recomputes and reruns either scheme; synthesis_mark_verify.py checks the tiled files, derives the frames they name, mutates them and weakens itself against them. Tests pin §7.9.1's definition and digest, §7.9.2's shuffle, §7.9.5's figures and §7.9.7's table and claims to the reference. Co-Authored-By: Claude Opus 5.5 <[email protected]>
105 lines
6.9 KiB
Markdown
105 lines
6.9 KiB
Markdown
# live-conformance/synthesis-mark — the watermark schemes `wai-mark:tent64` and `wai-mark:tent64s`
|
||
|
||
The corpus of the registered watermark schemes of
|
||
[`extensions/synthesis.md`](../../extensions/synthesis.md) §7.4 to §7.9, and of their measurement
|
||
(§7.5.7, §7.5.8, §7.9.6, §7.9.7). `wai-mark:tent64`'s files:
|
||
|
||
- `scheme.json`: the scheme's definition, the bytes whose SHA-256 is the scheme's digest (§7.4).
|
||
- `frames/<SHA-256>.rgb`: every set of frames a vector names, raw RGB8, frame after frame, each
|
||
file named by the SHA-256 of its bytes.
|
||
- `vectors.json`:
|
||
- `scheme`: the term, the digest, the generator polynomial, the shuffle's first and last 16
|
||
entries, the first 16 signs, the mask, and the false-positive bound of §7.5.6;
|
||
- `codewords`, each a payload and its codeword (`0` and `1`, bit 0 first); `decodes`, each a
|
||
received word, how many bits of a codeword it flips, and the payload and the bits corrected
|
||
it decodes to, or `null`;
|
||
- `embeds`, each unmarked frames (`unmarked`, a file's digest), their count and size, a
|
||
payload, the marked frames' digest (`marked`), each bit's amplitude per frame (a hexadecimal
|
||
digit each, bit 0 first), the bits left short of the margin per frame, and the SSE;
|
||
- `detects`, each stored frames (`samples`), their count and size, and what the detector reads:
|
||
the `payload`, the `orientation` and the `errors` corrected, or `null`;
|
||
- `battery_sample`, each a picture attack of §7.5.7 (`attack`, at its `seed`) applied to the
|
||
still's marked or unmarked frame (`frames`, `which`): the result's size and digest, and what
|
||
the detector reads from it;
|
||
- `cases`, each a case of §11.1 with its `policy`, its records as JSON texts, its `objects`,
|
||
its `decoded` and `unmarked` frames, each the content hash of an `object` and a file's
|
||
digest, and what a verifier gives it, as `live-conformance/synthesis/` states its vectors'.
|
||
- `battery.json`: the measurement of §7.5.8 over the measurement sets: the sets, the attacks, each
|
||
picture's size, payload, SSE, PSNR, floor, SSIM and bits left short, each attack's tallies per
|
||
set (`detected`, `missed`, `wrong`, the most `errors` corrected), the unmarked pictures'
|
||
readings, the words read from unmarked pictures (§7.5.6), the false-positive bound, and the
|
||
attacks every set survived.
|
||
|
||
`wai-mark:tent64s`'s files, which share the frames above:
|
||
|
||
- `scheme-tent64s.json`: the scheme's definition (§7.9.1).
|
||
- `vectors-tent64s.json`:
|
||
- `scheme`: the term, the digest, the tile's shuffle (first and last 16), its first 16 signs,
|
||
its mask, and the false-positive bound of §7.9.5;
|
||
- `embeds`, as `vectors.json`'s, under the tiled layout;
|
||
- `detects`, each stored frames (`samples`) or frames derived from stored ones (`base`, and
|
||
`derive`: the `attack` of §7.9.6 or `periodic`, its `seed`, and the base's size and count), and
|
||
what the detector reads: the `payload`, the `stage`, the `orientation`, the `errors`
|
||
corrected, and for stage 2 `resync`, the `lattice` in 1/64 of a sample, the `bins`, the
|
||
`phase`, the tile's `offset`, the `candidate`, the hypothesis's `rank` and its `agreement`;
|
||
- `battery_sample`, every picture attack of §7.9.6 applied to the still the scheme marked and to
|
||
the unmarked still;
|
||
- `cases`, as `vectors.json`'s, a `decoded` entry naming either a file or a derivation (`frames`,
|
||
the base's digest, and `derive`).
|
||
- `battery-tent64s.json`: the measurement of §7.9.7 over the measurement sets, as `battery.json`,
|
||
each row with the detections stage 2 gave (`resynced`) and the pictures missed.
|
||
|
||
No frame a crop, a rotation or a capture of a screen makes is stored: each implementation derives
|
||
it from the stored frames by the attack the vector names.
|
||
|
||
**Mark equivalence.** A conforming implementation gives every codeword, decoding, embedding,
|
||
detection and battery sample what the corpus states, and every case its outcome, reason, place
|
||
and statements. One that gives anything else does not conform.
|
||
|
||
**Provenance.** `wai_synthesis_mark_vectors gen` writes every file from fixed seeds: the
|
||
pictures are generated by the crate, the still and the measurement set `spectral` by
|
||
`wai.generate.spectral`'s generator with its committed model
|
||
(`wai-rs/tests/vectors/generate/generate_spectral_model.json`), the dead-leaves pictures and the
|
||
clips by `synthesis_mark::leaves` and `synthesis_mark::clips`; every key is SHA-256 of the
|
||
corpus's label and an index, every noise and every error pattern a word of a SHA-256 stream, and
|
||
Ed25519 signing is deterministic, so every file is the same bytes on every machine. No picture
|
||
comes from outside the repository.
|
||
|
||
The photographs' columns of §7.5.8 and §7.9.7 are `wai_synthesis_mark_vectors measure` (with
|
||
`tent64s` for §7.9.7) run over 24 lossless photographs of 768 × 512, a test suite of image coding that this repository does not hold or
|
||
redistribute, measured where they were held. Their files, by SHA-256:
|
||
|
||
| file |
|
||
|---|
|
||
| `a56e27cbf5f843c048b6af1d6e090760e9c92fadba88b7dee0205918a37523bd` |
|
||
| `4f4b74a79237e311d72cad958237b5f7088d8bce1c82305ebefe1a70e3022dfd` |
|
||
| `e25ca1ff2f0c0cb5fdfd5f9b0a0bb21ac4c3de3c84a67f35b09a85d3306249db` |
|
||
| `e3b946107c5d3441c022f678d0c3caf1e224d81b1604ba840a4f88e562de61aa` |
|
||
| `10349e963c5c813d327852f82c1795fa4148d69fedffc4c589bee458e3ac3d53` |
|
||
| `363510303b715d4cbc384e1ce227e466b613a09e1b71ae985882bf8e7fbd9b18` |
|
||
| `b77d3f006f42414bb242222e0482e750c0fb9e5ee8d4bed2f6f11c5605fe54a4` |
|
||
| `ba23983c76b4832ee0e8af0592664756841a16779acd69f792e268fb6d13d6e7` |
|
||
| `6a4361c2fc194feb4edaa9f9a4a0620fb9943e460ac7fdf037fb0f6dd6607a7d` |
|
||
| `9dfb70f5867c29ff9ed6313683f19b3d867849e40fbc0c4c54a4a89df341cf23` |
|
||
| `7936814b58b5387fce2e4e2488b4ec830dadd95fa9520f358ddb30990b50f2b6` |
|
||
| `d78c37c2f04f23761ed2367dd77e2db584ddd4c3950833fecf89f199a8126980` |
|
||
| `bc34a3ce58dea09dce1704c997171602de90cb34d0c8503a988b77f473d39b08` |
|
||
| `55a94550ff18f3246c4074fd32b77b0c74447c26b6ad274d564d999c0450ba6e` |
|
||
| `7538cbb80cb9103606c48b806eae57d56c885c7f90b9b3be70a41160f9cbb683` |
|
||
| `a89c7268ccd4718ba424a99fc4643c572cf692ca6eae887185ceb4e9f11d2e54` |
|
||
| `37afcc89fbdcb76d9518e04b2fc011027e2f4cd14b3b2f83cefd721641a47c5b` |
|
||
| `1a9258c365988961d87a0598725b609139c303ad48a5aad6c503c3b1a87849aa` |
|
||
| `b7450b264b1b0a411390d8931b112c27905a992520fc90569dc4b920aa32bbdc` |
|
||
| `3b46c71e3b92a563820ba32936be8330c586c41f938efd94be938386aae4328a` |
|
||
| `ac958597c82073f6bb65129c68f72b651db5b9efd82e11547d07350214bc268b` |
|
||
| `1cee58eb1f2d9c7ebb254d208a03c783ce6cf2c4d8c2cf45e235dd23b4ce1b29` |
|
||
| `e3111a2fd4da24af15d6459ef9eacfe54106b38e27b4a21821b75c3f5d2d5baf` |
|
||
| `1071c68372cc5a01435c2c225a5cf7d4bb803846ec08bb6b3d6721b156d7cb96` |
|
||
|
||
From `wai/wai-rs`, the reference regenerates and checks the corpus; from this directory, the
|
||
second implementation checks it:
|
||
|
||
```
|
||
cargo run --release --no-default-features --features synthesis_mark --bin wai_synthesis_mark_vectors -- verify ../live-conformance/synthesis-mark
|
||
python3 -I ../synthesis_mark_verify.py .
|
||
```
|