What a C2PA manifest is, in tester terms
A C2PA manifest is a set of assertions about an asset (the actions taken on it, the ingredients it was made from, a hash of its content) wrapped into a claim, signed by the claim generator, which is the hardware or software that produced it, using an X.509 credential. Manifests live in a manifest store embedded in the file or referenced remotely, and an edited asset can carry a chain of them, each naming its predecessor as an ingredient. The specification calls the arrangement Content Credentials.
Two kinds of binding tie the manifest to the content. A hard binding is a cryptographic hash of the asset's bytes or of a defined region of them; change one pixel and the hash no longer matches. A soft binding is a fingerprint or invisible watermark that can help a validator find a manifest again after the metadata was stripped, and it is weaker by design. The manifest is data your pipeline can discard like any other metadata block. The hard binding means the manifest is valid only for the exact bytes it was computed over, so a resize invalidates it unless the resizer writes a new manifest naming the original as an ingredient.
The test oracle: a valid chain or an honest absence
The oracle is the result a C2PA validator returns for the asset after each stage. The specification defines three manifest states: well-formed (structurally correct), valid (well-formed, unmodified since signing, signature verified and inside its validity period) and trusted (valid, with a signer on the validator's trust list). It also says an asset is valid only when the content bindings still match the bytes. Your oracle accepts three results after a stage: a valid or trusted active manifest whose hash matches the output file; a new manifest signed by the stage itself with the previous manifest as an ingredient; or no manifest at all, reported as such.
Your oracle rejects one result: a manifest that is still embedded but no longer validates, because the bytes changed or the signature fails, while the page or the API reports the asset as carrying credentials. That is the silent broken chain: it looks like provenance, proves nothing, and is the state most likely to mislead a reader or a court. Write this oracle into the plan before the first run.
After every stage the validator must say valid, re-signed or absent. Broken is a failure whatever the user interface shows, and broken shown as fine is a severity one defect.
Inventory every transformation stage
Walk the path with the engineers and list every process that reads and writes the bytes, including the ones outside your codebase. A typical CMS has nine: the upload handler, a virus scanner that may re-save the file, a resizer that produces derivatives, a format converter to WebP or AVIF, an in-browser crop tool, a CDN image optimiser, a social share card generator, an email image proxy and the screenshots people take of the published page. The CDN and the email proxy are where credentials most often vanish without anyone on the team writing a line of code, and which metadata blocks survive which tools is the subject of the guide to metadata survival testing.
Testing a content provenance pipeline: the protocol
Build the fixture
Collect 40 images with valid manifests from at least two claim generators, in JPEG, PNG and WebP, from 200 KB to 12 MB, some with a chain of two or more manifests. Record the SHA-256 of every file, store the set read-only and confirm every file validates as trusted before you start.
Fix the pass criteria
Write the criteria from the oracle above, with the number of images and stages, and time-stamp the document. Criteria written after the run are opinions.
Run each stage in isolation
Feed the 40 originals directly into one stage, capture its output, hash it and run the validator. Classify each result as preserved, re-signed, stripped or broken. Isolation tells you which stage did what.
Run end to end
Push the same 40 through the whole pipeline as an editor would, including publishing, and validate every rendition: page image, responsive variants, share card, email version.
Check the display layer
For every rendition, compare what the page shows (a badge, a provenance panel, nothing) with the validator's state for the bytes actually served. A mismatch is a defect whatever stage caused it.
Record the run
Store the fixture hashes, every output hash, the validator name and version, its trust list version, the pipeline component versions and the time of each step, in the form described in evidence-grade test records.
Automate and gate
Turn steps 3 to 5 into a job that runs on every change to the image library, the CDN configuration or the list of output formats, with the fixture versioned alongside the code.
| Stage | Expected outcome | What to check | Common finding |
|---|---|---|---|
| Upload handler | Preserved | Output hash equals input hash | Some frameworks re-save and drop unknown segments |
| Virus scan | Preserved | File untouched after scanning | A cleaner that rewrites headers strips the manifest |
| Resize | Re-signed, or stripped and reported | New manifest names the original as ingredient | Imaging libraries discard the manifest store by default |
| WebP or AVIF conversion | Re-signed, or stripped and reported | Container supports manifests; converter copies or re-signs | Manifest silently absent in the converted file |
| Crop tool | Re-signed | Pixels changed and a new manifest issued | Manifest kept while pixels change: broken |
| CDN optimiser | Preserved or re-signed | Served bytes validate, not just the origin file | Re-encoding above a size cap strips it |
| Share card generator | Stripped and reported, or re-signed | Composite carries no false credentials claim | Card shows the badge from the source image |
| Email image proxy | Stripped and reported | Proxy output hashed and validated | Proxy re-encodes every image |
| Screenshot | No credentials | Nothing claims otherwise | Reader assumes a screenshot inherits the badge |
Worked example: 40 images through 9 stages
A publisher's team ran the protocol on their CMS with a fixture of 40 signed images, each stage in isolation and then the full chain end to end. The counts are invented but realistic.
Upload and scanning preserved all 40. Resize and conversion stripped all 40, as the library's documentation predicted, and the validator reported no credentials. The crop tool produced the finding that mattered: 12 images passed through untouched because no crop was applied, 22 were stripped, and 6 PNG files kept their manifest store while the pixels changed. Those 6 validated as invalid, and the article template showed a credentials badge on all 6. The CDN optimiser preserved 31 and stripped the 9 files above its 400 KB re-encoding threshold. Share card, email proxy and screenshot produced no credentials, as the criteria allowed. End to end, 0 of 40 reached the page with a valid manifest, because resize sits ahead of everything else.
Against the criteria written before the run, the pipeline failed twice: the crop tool created broken manifests, and the display layer showed a badge for assets whose bytes did not validate. The stripping at resize went to the product owner as a decision, since no stage re-signed derivatives, and a manifest that never reaches the reader protects nobody.
Regression, reporting and what to publish
A provenance pipeline breaks silently. A library upgrade, a CDN setting or a new output format can remove or corrupt manifests with every functional test green, because nothing in a functional suite looks at the manifest store. The fixture run therefore belongs in the pipeline itself, alongside the checks described in continuous testing: version the fixture with its hashes, pin the validator version and trust list, and fail the build when any stage moves from preserved or re-signed to broken, or when the display layer disagrees with the validator.
Report per stage: counts out of the fixture size, the four-way classification, component versions and validator version. State which stages drop credentials by design so that editors know what readers will see. How a reader or a fact checker should then interpret the served file is covered in how to verify content credentials, and the rest of the testing AI systems hub covers the detection side of the same problem.
Common questions
Does C2PA survive image resizing?
Usually not by default. Most imaging libraries discard the manifest store when they write a new file, and a copied manifest would fail its hard binding because the pixels changed. A resize stage must issue a new manifest naming the original as an ingredient, or drop credentials and say so.
What is the difference between a stripped and a broken manifest?
Stripped means the manifest is gone and a validator reports no credentials, which is honest. Broken means a manifest is present but its hash or signature no longer validates. Broken shown as valid is the defect this test catches.
How many images do I need in the fixture?
Enough to cover formats, sizes and manifest chains: 40 is a workable start, with two claim generators and a few multi-manifest files. Add every real image that has failed.
Can a CDN preserve Content Credentials?
Some optimisers pass manifests through or re-sign derivatives; many re-encode and strip them, often only above a size threshold. Test the bytes served from the edge, never only the origin file.
How often should the provenance test run?
On every change to the image library, CDN configuration, output formats or editing tools, and on a schedule to catch upstream changes.
Sources
- Coalition for Content Provenance and Authenticity, C2PA specifications index
- C2PA Technical Specification 2.2: manifests, content bindings, validation and trust lists
- IPTC Photo Metadata Standard (IPTC Core and IPTC Extension)
- NIST AI 100-4, Reducing Risks Posed by Synthetic Content: An Overview of Technical Approaches to Digital Content Transparency (2024)
Further reading named in the text
- Coalition for Content Provenance and Authenticity, C2PA Technical Specification, version 2.2, sections on manifest states, content bindings and validation
- International Press Telecommunications Council, IPTC Photo Metadata Standard (IPTC Core and IPTC Extension schemas)
- Chandra, Dunietz, Roberts, Lee, Fontana and Awad, Reducing Risks Posed by Synthetic Content: An Overview of Technical Approaches to Digital Content Transparency, NIST AI 100-4 (2024)
This guide is part of the testing AI systems hub. It is best read alongside how to verify content credentials and metadata survival testing, which cover the neighbouring questions.