Skip to content
C2PA Inspector

content credentials · c2pa · private by construction

Who made this file, and has it changed since?

If a file carries Content Credentials, you'll see what made it — including whether that was AI — who signed it, and whether a single byte has moved since.

The image and video are c2pa-rs test fixtures signed with test certificates, so you can watch the trust check fail honestly while the signatures and hashes pass. The PDF is a real ChatGPT-generated document, and it verifies.

Drop a file here

or click to choose — up to 10 at once

  • JPEG
  • PNG
  • WebP
  • GIF
  • HEIC
  • MP4
  • MOV
  • MP3
  • PDF
  • +6 more

Your file stays on your device

what it checks

The whole C2PA validation algorithm, in your browser.

Most viewers show you what a manifest says. This one checks whether the manifest is telling the truth.

COSE signature

Verifies the COSE_Sign1 over the claim — ES256/384/512, PS256/384/512, and EdDSA.

Certificate chain

Chains the signer to the official C2PA trust list and enforces the certificate profile — EKU, key usage, no weak algorithms.

Hash bindings

Recomputes the hard-binding content hash — c2pa.hash.data for most carriers, c2pa.hash.bmff.v2/.v3 for HEIC and MP4 — and every assertion's hashed_uri, so edits after signing show up.

RFC 3161 timestamp

Full CMS verification of the timestamp token, the TSA chain, and that it covers this signature.

Ingredients

Recursively validates nested manifests from earlier edits, with cycle detection.

Private by construction

The validator is WebAssembly running in your tab. No upload, no server, no analytics on your files — and the shareable link carries the result, never the file.

questions

What people ask.

Can this tell me if an image is AI-generated?

If the file carries Content Credentials that say so, yes — this reports it prominently, along with the model that made it where the manifest names one. But the absence of a credential is not evidence that something is real. Most files on the internet carry no manifest at all, and metadata can be stripped by any tool that re-saves the image. A credential is proof of provenance when it is present; silence proves nothing either way.

What is C2PA?

C2PA (Coalition for Content Provenance and Authenticity) is the open standard behind "Content Credentials". A camera, editor or generative model signs a manifest into the file describing what made it and what was done to it. Because the manifest is cryptographically signed and bound to the file's bytes, both the claim and any subsequent tampering are detectable.

Why does it say the signature is valid but the signer is untrusted?

Those are two separate questions. The signature check asks whether the bytes were signed by whoever holds the key. The trust check asks whether that key belongs to anyone recognised — it chains the signer's certificate to the official C2PA trust list. A file signed with a test or self-issued certificate passes the first and fails the second, which is the correct and honest outcome rather than a bug.

What does a failed hash binding mean?

The manifest records a hash of the file's own bytes at signing time. If that hash no longer matches, the content has changed since it was signed — a crop, a re-compression, or a deliberate edit. The credential still tells you truthfully who signed the original; it simply no longer describes the file you have.

Are my files uploaded anywhere?

No. The validator is compiled from Go to WebAssembly and runs inside this page, so your file is read by your own browser and never sent over the network. There is no server to upload to. The shareable link encodes the result in the URL, never the file.

Which file types can it read?

JPEG, PNG, WebP, GIF, TIFF, DNG, HEIC, HEIF, AVIF, SVG, MP4, MOV, M4A, AVI, WAV, MP3 and PDF. If a format is not listed, the page will say so rather than silently reporting "no credentials".

for developers

Powered by a pure-Go C2PA implementation.

This page is a thin WebAssembly wrapper around richardwooding/c2pa — a small, no-cgo Go library with a fast unverified reader and a full validator. The same code that runs here runs server-side in file-search-on and the c2pa-mcp MCP server.

go go get github.com/richardwooding/c2pa
// the entire integration
r := c2pa.Validate(ctx, c2pa.JPEG, file)
if r.Valid {
    fmt.Println("verified, signed at", r.SignedAt)
}