Guides

How to verify a picture's Content Credentials

Four ways to read and verify a C2PA manifest, from a browser drop zone to the command line, and what each one can and cannot show you.

Option 1: online tools

Drop the picture on the AuditImage home page and within seconds you see the manifest's generator, signer certificate, actions and ingredients. AuditImage parses the full JUMBF structure including CBOR-encoded assertions, verifies the signature, the content hash binding, the assertion hashes and the certificate chain against the C2PA trust list, and cross-checks C2PA against EXIF and XMP. The timestamp token is reported as present but not verified.

For strict signature verification use verify.contentauthenticity.org, the official CAI site. It checks the signature, certificate chain and content hash and shows trust list status.

Option 2: browser extension

The Chrome Web Store has a "C2PA Content Credentials" extension that inspects any web image from the right-click menu. Chrome itself is building C2PA verification into the browser and Google Search, where credentialed pictures get a label.

Option 3: command line

c2patool is the C2PA reference implementation, written in Rust and cross-platform:

c2patool photo.jpg              # manifest summary as JSON
c2patool photo.jpg --detailed   # assertions, ingredients, hash bindings, signature result
c2patool photo.jpg --tree       # manifest tree

exiftool reads JUMBF too:

exiftool -a -G1 -s -JUMBF:all photo.jpg
exiftool -v3 photo.jpg | grep APP11   # confirm APP11 exists and whether it is split

Option 4: read the bytes yourself

In a JPEG the manifest lives in APP11 segments (marker FF EB). The payload starts with JP, then a 2-byte box instance number, a 4-byte packet sequence number, then the JUMBF box length and type jumb. Manifests over 64 KB are split across several APP11 segments and reassembled by sequence number. In a PNG, read the caBX chunk directly.

What to look at when verifying

  1. Who signed. A certificate subject of Adobe Inc. and one of "C2PA Test Signing Cert" are very different things. A manifest signed with a test certificate is structurally valid but nobody vouches for it.
  2. The trust list. CAI maintains a list of known signers. A certificate outside the list is not necessarily fake, but you have to judge it yourself.
  3. Whether the content hash matches. Only when c2pa.hash.data matches the actual image content do you know the picture was not changed after signing.
  4. What the active manifest says. Several rounds of editing produce several manifests; the last one is active. Its c2pa.actions states whether this was c2pa.created or c2pa.edited, and whether the source type is digitalCapture or trainedAlgorithmicMedia.

Typical outcomes

  • Valid signature, camera manufacturer as signer, source type digitalCapture: straight from the camera.
  • Valid signature, OpenAI or Adobe as signer, source type trainedAlgorithmicMedia: AI-generated, and the generator said so.
  • Valid signature, but an ingredient is AI-generated: a composite; look at the specific actions.
  • Manifest present but signature invalid: the picture was modified after signing, or the manifest was transplanted from another picture.