cd /news/artificial-intelligence/what-an-ai-generated-png-actually-ca… · home › topics › artificial-intelligence › article
[ARTICLE · art-155669] src=dev.to ↗ pub= topic=artificial-intelligence verified=true sentiment=· neutral

What an AI-generated PNG actually carries — and what a screenshot of it doesn't

A developer built a browser-based checker called Image or AI that reads C2PA Content Credentials and metadata client-side using @contentauth/c2pa-web (WebAssembly), after dissecting an OpenAI-generated PNG and finding a roughly 21 KB caBX chunk containing a C2PA manifest. The analysis showed the manifest's validation_state returned Invalid not because pixels changed, but because the signer's certificate was untrusted and missing the required extended key usage, and that a single re-encode with a stock tool like macOS sips stripped the manifest entirely. The developer argues Content Credentials prove origin when present but their absence proves nothing, and urges tools to show which evidence a verdict came from.

by read2 min views3 publishedOct 22, 2026

I generated one image with OpenAI's image model and then took it apart. The point wasn't the picture — it was to see what "proof this is AI" looks like inside a real file, and how fast it disappears.

The PNG came out at 1536×1024. Besides the usual IHDR/ IDAT/ IEND chunks it had one extra: a caBX chunk of about 21 KB. That's a C2PA manifest — Content Credentials — stored in a JUMBF box.

Reading it with the official Python binding:

import c2pa
with c2pa.Reader("sample.png") as r:
    print(r.json())

The interesting parts:

OpenAI OpCo, LLC OpenAI Media Service API http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia That last field is the one that actually answers "was this made by generative AI?". The word trained matters: algorithmicMedia without it means procedural computer graphics, not a model.

The overall validation_state came back Invalid. My first instinct was "the signature is broken". It isn't. The per-check results tell a different story:

claimSignature.validated — passassertion.dataHash.match — pass (pixels unchanged since signing)timeStamp.validated — passsigningCredential.untrusted — failsigningCredential.invalid — fail ("certificate missing required EKU") So the content and the claim are intact; what fails is whether the signer's certificate is on the C2PA trust list and carries the extended key usage the spec now requires. If you build anything on top of C2PA, report those two questions separately — "changed after signing?" and "trusted signer?" — or you'll tell users a genuine file was tampered with.

One conversion with a stock image tool (sips on macOS) and the manifest was gone. strings on the JPEG found zero c2pa references. Same thing happens with a screenshot, and with most social and chat uploads, which re-encode everything.

That's the uncomfortable part: Content Credentials prove origin when present, but their absence proves nothing. Most AI images you'll actually be asked about — in a group chat, a dating app, a refund dispute — have already lost them.

The order that held up for me:

I ended up building this order into a small browser-based checker, Image or AI, mostly because every detector I tried skipped straight to step 3 and never said what its answer was based on. Credentials and metadata are read client-side with @contentauth/c2pa-web (WebAssembly), so the image doesn't leave the device for those steps.

If you work with provenance data, the thing I'd most like other tools to copy is simple: show which evidence a verdict came from.

── more in #artificial-intelligence 4 stories · sorted by recency
── more on @openai 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/what-an-ai-generated…] indexed:0 read:2min 2026-10-22 · —