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
- 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.
- 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.
- Whether the content hash matches. Only when
c2pa.hash.datamatches the actual image content do you know the picture was not changed after signing. - What the active manifest says. Several rounds of editing produce several manifests; the last one is active. Its
c2pa.actionsstates whether this wasc2pa.createdorc2pa.edited, and whether the source type isdigitalCaptureortrainedAlgorithmicMedia.
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.