wai: live provenance, C2PA 2.4 §19 for room tracks and takes, tied to the JWP receipts #381
Loading…
Reference in a new issue
No description provided.
Delete branch "wai/c2pa-live"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What this is
C2 of the live family: the live video provenance of C2PA 2.4 §19, end to end, for a room's CMAF tracks and a device's CMAF take, tied to WAI's per-object receipts. It registers the record
wai.live.provenance.wai/extensions/live-provenance.md, with numbered sections, normative text and a reasons table of 33 codes. Each code carries the C2PA 2.4 §15 and §19.7 codes a C2PA validator reports for the same defect, where C2PA checks it.wai-rsfeaturelive_provenance(src/live_provenance.rs, plusbmff,jumbf,cose,x509,logandcorpus). It writes and verifies everything with no C2PA library and no new dependency.wai/live-conformance/c2pa-live/, written from fixed seeds bywai_live_provenance_vectors: 7 good streams and 38 negatives (612 KB).wai/live-conformance/c2pa_live_verify.py, standard library only.Design decisions, and why
draft-ietf-moq-cmsf-01. Each MoQ group is one segment and each object one CMAF chunk; CMSF allows several chunks per object, and this profile requires one.c2pa.hash.bmff.v3and the group receipt's Merkle root commit to the same chunks. The spec states the exact correspondence (§8.1).science.transaction.wai.groupassertion.0x84, a group payloadmoq-jwp:.mfhd; a segment's number is its first chunk's.mfhdand never decreases.<layer>_c2pa,packagingwai-c2pa, named inwai_c2pa_track), not an object property:origin(1 human, 2 machine, 3 machine-reviewed), and disclosures are written exactly as timed-text §10.3 writes them.compositeCapture,compositeorcompositeSyntheticfrom its inputs' labels.emsgexclusion offset as 0, where every box holds its size. Offsets count from a box's first byte (§18.6.2), so the exclusion that works is 12, wherescheme_id_uribegins. This profile writes 12.signerBindingpayload ash''. §13.2.3 reservesnilfor detached content, so this profile writesnil.camera-failovervector shows this. ISO/IEC 23009-9 could not be read; it is cited only as C2PA names it.replicate-tier capability. It needs the source and an encoder that is a pure function of it. This is stated in §1 and §10.3.originaland ends with anupdatebox, per Appendix A.5.3. No offset moves.c2pa.ingredient.v3naming the parent by hashed URIs, with the parent'svalidationResults(required by §18.16.12.4.3).c2pa.repository-receipt. Its repository-specific proof is an RFC 9942 receipt of inclusion of the parent manifest's hash in the repository's RFC 9162 log, verified against the repository's key.parentOfingredient. This PR's update manifest usesparentOffor its parent, and §10.3 now says a packager that re-segments or re-encodes a stream makes a new stream naming the source manifests asparentOfingredients (c2pa.repackaged/c2pa.transcoded), as deriving-edge §6.1 has it. Packaging the same objects derives nothing.wai/synthesis, unpushed, read in its worktree) keeps §9's mapping where the two overlap: digitalCapture/screenCapture; trainedAlgorithmicMedia for machine, compositeWithTrainedAlgorithmicMedia for reviewed; and compositeCapture/compositeSynthetic/composite for a compositor, by the same rule.c2pa.livevideo.segment, no session keys, no Verifiable Segment Info. The needed parts are implemented directly.c2pa-kp-claimSigningandid-kp-documentSigning. Names carry an organization, because the independent validator fails a claim signature whose subject has none.video-base-01) into chunks of at most 15 frames, one group per piece, so every segment starts at a key frame. The library takes the media as input, so nothing outside the crate is compiled in.Checks (all on the build host through
rbunless marked local)cargo test --locked --no-default-features --features live_provenance --lib live_provenance::cargo test --locked --no-default-features --features live_provenance --test live_provenanceReason::ALLand both code columns)wai_live_provenance_vectors verify ../live-conformance/c2pa-livecargo test --locked --no-default-features --features capture_take --test capture_takecargo test --locked --no-default-features --lib codecs::registry;wai registry export --checkcargo clippy --locked --no-default-features --features live_provenance --all-targetscargo metadata --locked --offlinepython3 -I live-conformance/c2pa_live_verify.py live-conformance/c2pa-livecheck-tests-in-ci.py,check-workflow-concurrency.sh,check-spec-refs.py,check-wai-section-refs.py,check-no-vanity-metrics.sh,test-public-text-checks.sh,check-comparative-prose.sh,check-orphan-sources.pycheck-public-names.shneeds the private denylist, which is not set locally; CI runs it.Independent C2PA validator
The C2PA command-line tool 0.27.22 (MIT OR Apache-2.0; licence read) was installed on the build host and run with the corpus anchor.
Trusted;bmffHash.match,hashedURI.match,claimSignature.validated,signingCredential.trustedcert-untrustedsigningCredential.untrustedcert-expiredsigningCredential.expired, a code C2PA 2.4 does not listclaimSignature.outsideValidity(§15.8's name)cert-wrong-eku(time-stamping EKU only)Trusted: the tool's default EKU list includes time-stamping and OCSP signingcredential_invalid(§14.5.1.1–2)update-ingredientingredient.manifest.mismatchrepository-receipt-forgedTrusted: the tool does not check the repository's own proofmanifest-malformedftypfirst)So the tool independently confirms the JUMBF store, the claim, the COSE signature, the X.509 chain and the BMFF hash over the
moov. It cannot verify §19 media segments, segment-info maps or session keys; those are checked by the two implementations here.Falsifications (each committed first, then broken, then restored)
cargo test --test live_provenanceexit 101 (bytes-changed-manifestsgotreceipt_mismatch)receipt-other-objectsgotobject_receipt_invalid. This falsification first passed silently, which is why the vector was added.repository-receipt-forgedaccepted → FAILEDWhat is NOT done
manifestUri; the Merkle form of the BMFF hash.replicatetier): stated as a follow-up.commitagainst the room'stake_commitevents stays capture-binding §9's.🤖 Generated with Claude Code