| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .. | ||
| ai-disclosure-missing | ||
| assertion-altered | ||
| avatar-manifests | ||
| bytes-changed-manifests | ||
| bytes-changed-vsi | ||
| camera-failover | ||
| camera-manifests | ||
| camera-registered | ||
| camera-vsi | ||
| cert-expired | ||
| cert-untrusted | ||
| cert-wrong-eku | ||
| claim-signature | ||
| composite-manifests | ||
| composite-source-type | ||
| continuity-method | ||
| init-mdat | ||
| manifest-id-not-derived | ||
| manifest-malformed | ||
| object-receipt | ||
| provenance-missing | ||
| receipt-forged | ||
| receipt-missing | ||
| receipt-other-objects | ||
| receipt-signer | ||
| repository-receipt-forged | ||
| segment-truncated | ||
| sequence-mismatch | ||
| session-key-binding | ||
| session-key-superseded | ||
| session-key-unknown | ||
| stream-assertion-room | ||
| stream-id-mismatch | ||
| take-both | ||
| update-ingredient | ||
| vsi-manifest-id | ||
| vsi-signature | ||
| wrong-receipt | ||
| anchor.der | ||
| README.md | ||
| vectors.json | ||
live-conformance/c2pa-live — live provenance
The corpus of extensions/live-provenance.md §13: C2PA
2.4 §19 live video streams, each an initialization segment and its segments in the order a
verifier receives them, with, for a room track, the JWP group and object receipts of its
groups; the trust anchor every vector is verified under; and what a verifier states of each.
Files. vectors.json lists the vectors, each its name, kind (track or take),
init, segments (each a file and, for a track, the group it came in), receipts (a JSON
file of groups and objects in jwp-receipts §2.4's forms, or null for a take) and
expect. A file whose bytes another vector already wrote is named by that vector's path, so a
negative that changes one segment holds one file of its own. anchor.der is the trust anchor
for c2pa-kp-claimSigning, and time the instant T (§11.1).
Equivalence. A conforming verifier given a vector's files, the anchor and T reaches the
outcome expect states (§11):
refuse: thereasonof §12,at(init,segment kcounting received segments from 0, orgroup g), and the two C2PA codes §12 gives the reason,c2pa(§15's) andlivevideo(§19.7's), eachnullwhere §12 gives none;accept: thestreamId, thesourceType, theregistration(therepository, thetreeSizeand theleafIndexof the receipt of inclusion) ornull, and for each segment (§11.6) itssequenceNumber, itsgroup(a track) orchunk(a take), itsmethods(manifest,vsiormanifest+vsi), the activemanifestId, its number ofchunks, and its group'srootor its take chunk'schunkHash, in lowercase hexadecimal.
The vectors.
- Good:
camera-manifests(the per-segment method),camera-vsi(the Verifiable Segment Info method from group 10, the session key rotated at the third segment by a manifest in it, the receipts' chain restarting under the new key),avatar-manifests(a track labelled machine-made, with its AI disclosure),composite-manifests(a compositor's output of the camera and the avatar:compositeSyntheticand the avatar's disclosure),take-both(a take under both methods at once, the device's key as its session key),camera-failover(the camera track, a second packager under its own claim signer taking over at the third segment, the continuity chain holding across it because the identifiers are derived) andcamera-registered(the camera track's initialization segment with its update manifest and repository receipt;repositoriesinvectors.jsonnames the repository and its key). - One negative for each reason of §12, and for some reasons more than one; each name says its defect.
Provenance. wai_live_provenance_vectors gen writes every file but this one from fixed
seeds: every key is SHA-256 of a label and no key is one anyone holds; the certificates are
issued under the corpus's own test anchor; the media are the AV1 floor of
pack-conformance/packs/video-base-01, its samples cut into chunks of at most 15 frames, each
group one of the floor's pieces, renumbered and retimed across the stream.
Checked by. wai_live_provenance_vectors verify and tests/live_provenance.rs in
wai-rs (every file regenerates byte for byte and no other is here; every vector gets its
outcome; every reason refuses one; §12 lists the reference's codes), and
../c2pa_live_verify.py, the second implementation, written from the extension's text, which
also requires every mutated copy of a good vector to be refused.
An independent C2PA validator. The corpus's files were also read with the C2PA
command-line tool, version 0.27.22, given anchor.der as its trust anchor, on 2026-10-21:
- every good vector's initialization segment validates: state
Trusted, withassertion.bmffHash.match,assertion.hashedURI.match,claimSignature.validated,claimSignature.insideValidityandsigningCredential.trusted. The manifest store, the claim, its signature, the certificate chain and the BMFF hash over themoovare therefore read the same way by an implementation that shares nothing with this one; camera-registered/init.mp4validates too, stateTrusted, its active manifest the update manifest: the tool reads the ingredient (ingredient.manifest.validated) and its validation results. Before the ingredient carried them it reportedassertion.ingredient.malformed, which C2PA 2.4 §18.16.12.4.3 requires;update-ingredient/init.mp4is reportedingredient.manifest.mismatch, where this corpus statesupdate_manifest_invalid;repository-receipt-forged/init.mp4is reportedTrusted: the receipt's proof is the repository's form (§18.27), which the tool does not check;cert-untrusted/init.mp4is reportedsigningCredential.untrusted, as here;cert-expired/init.mp4is reportedsigningCredential.expired, a code C2PA 2.4 does not list; §15.8 names this failureclaimSignature.outsideValidity, which this corpus states;cert-wrong-eku/init.mp4, whose end entity is valid forid-kp-timeStampingalone, is reportedTrusted: the tool's default list of accepted extended key usages includes time-stamping and OCSP signing. C2PA 2.4 §14.5.1.1 makes a certificate valid for either of those purposes valid for no other, and §14.5.1.2 requires a claim signer's to hold an EKU of the validator's configuration, so this corpus refuses itcredential_invalid;- the tool reads no media segment: a file that does not begin with
ftypis not one it opens, so it does not verify §19 per-segment manifests, segment-info maps or session keys. The segments are checked by the two implementations above alone.
The tool reports a claim signature as failed when the end-entity certificate's subject holds no organization name, which C2PA does not require; the corpus's names all hold one (§4.4).