Skip to content
Figure 1The transformation stages an image passes through in a typical CMS, each a place a C2PA manifest can be lost
The transformation stages an image passes through in a typical CMS, each a place a C2PA manifest can be lostUploadoriginal fileScanvirus checkResizederivativesConvertWebP, AVIFOptimiseCDN, cropSharecards, emailvalidate the manifest after every stage, never only at the end
Six of the nine stages a signed image meets between upload and a reader's screen. Every stage that rewrites bytes must preserve, re-sign or honestly drop the manifest.

Testing a content provenance pipeline: does C2PA survive your CMS?

Testing a content provenance pipeline means feeding signed assets through every transformation your CMS applies and checking what comes out the other end. Content Credentials, the C2PA manifests that cameras and editing tools now attach, are metadata bound to the exact bytes of the file, and most image pipelines were built to rewrite bytes without a thought for what was attached. The useful questions are which stage loses the manifest and whether the page then tells the truth about it.

Quick answer

Build a fixture of signed images, push each through every transformation stage in isolation and then end to end, and validate the manifest after every stage. Each stage must preserve the manifest, re-sign it with the parent as an ingredient, or leave a clean no-credentials state. A manifest that fails validation yet is displayed as fine is a defect.

Key figures

Fixture
40 signed images, hashes recorded
Stages
9, tested in isolation then end to end
Outcomes
preserved, re-signed, stripped, broken
Oracle
validator state after every stage
Defect
a broken manifest shown as fine
Runs
every pipeline change, in CI

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.

Oracle in one line

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

Nine stages of a CMS image pipeline with the outcome your pass criteria should expect and the check that proves it
StageExpected outcomeWhat to checkCommon finding
Upload handlerPreservedOutput hash equals input hashSome frameworks re-save and drop unknown segments
Virus scanPreservedFile untouched after scanningA cleaner that rewrites headers strips the manifest
ResizeRe-signed, or stripped and reportedNew manifest names the original as ingredientImaging libraries discard the manifest store by default
WebP or AVIF conversionRe-signed, or stripped and reportedContainer supports manifests; converter copies or re-signsManifest silently absent in the converted file
Crop toolRe-signedPixels changed and a new manifest issuedManifest kept while pixels change: broken
CDN optimiserPreserved or re-signedServed bytes validate, not just the origin fileRe-encoding above a size cap strips it
Share card generatorStripped and reported, or re-signedComposite carries no false credentials claimCard shows the badge from the source image
Email image proxyStripped and reportedProxy output hashed and validatedProxy re-encodes every image
ScreenshotNo credentialsNothing claims otherwiseReader 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.

Figure 2Images with a valid manifest after each stage, from 40 signed originals (worked example)
Images with a valid manifest after each stage, from 40 signed originals (worked example)10203040End to end0Upload40Virus scan40Resize0WebP conversion0Crop tool12CDN optimiser31Share card0Email proxy0Screenshot0
Invented but realistic counts. Each stage received the 40 originals directly; the first bar is the end-to-end result, where no image reached the published page with a valid manifest.

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

  1. Coalition for Content Provenance and Authenticity, C2PA specifications index
  2. C2PA Technical Specification 2.2: manifests, content bindings, validation and trust lists
  3. IPTC Photo Metadata Standard (IPTC Core and IPTC Extension)
  4. 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.