C2PA and Consistently Inconsistent Validators
Imagine evidence presented in a courtroom: the prosecution presents a validation report claiming an image is real, while the defense presents a different validator showing it is fake. What is the jury supposed to think? If a judge admits both reports under Frye, Daubert, or Kumho standards, then the jury isn't just judging the media. The jury is forced to decide which software implementation to trust, undermining the goal of automated digital provenance. (Disclaimer: I am not an attorney and this is not a legal interpretation.)
Not every provenance validation solution is intended for legal use. Setting legal standards aside, consider the business implications. Companies often rely on partially-vetted heuristics to make important decisions. As an organization making critical decisions, would you rely on a solution that is designed to return contradictory findings? The wrong decision can result in customer complaints and damage your corporate reputation.
We could even consider a lower standard: social media. It's common to have online arguments and flame wars around contradicting opinions. However, when each side is backed by their own validation approach, it ends up increasing the divide rather than enabling a consensus.
This is the reality that has been provided to us from the Coalition for Content Provenance and Authenticity (C2PA). They have released a provenance solution that enables contradicting results. Moreover, they have backed it with a massive media blitz and widespread tech adoption.
Required Validation
In my previous blog entry, I walked through how different provenance solutions handle their verification workflows. Transport Layer Security (TLS, used by HTTPS) uses a strict, deterministic validation process (with only a small variation based on trust lists). Secure Evidence Attribution Label (SEAL) is only slightly more complex and has less variation. As long as you implement either protocol correctly, every validator should reach the exact same conclusion every single time.C2PA takes the opposite approach. Its specifications rely on a complex workflow with explicit "optional" steps. Because these checks are optional, two fully spec-compliant validators can evaluate the exact same file and arrive at conflicting results. Moreover, users may never know which options the validator used.
(Click to see larger.)
In this workflow diagram, every red decision box highlights a step where optional parameters allow validators to diverge and produce conflicting outputs. The main issues are around which trust list is used (workflow steps 2 and 6), whether revocation is checked (steps 3, 7, 9, and 10), and how the timestamp is validated (steps 6, 7, and 9). This ambiguity-by-design in C2PA's workflow leads to two specific problems:
- The specifications permit differences in validation behavior. This cannot be blamed on coding errors. Two validators can function properly and be fully compliant, and still reach conflicting results based on which options they choose to implement.
- These differences can cause materially misleading conclusions about a file's trustworthiness. Users cannot reliably determine whether a file is authentic, AI-generated, edited, or trustworthy based on a validator's assessment. Even if every validator you test reaches the same conclusion, there could always be another validator that comes up with a different result.
Testing Methodology
To keep the comparison fair and comprehensive, I evaluated test images across a range of C2PA validators:- Adobe Content Authenticity Inspect (https://contentauthenticity.adobe.com/inspect) is a "conforming product", which means that the implementation's details have been reviewed by C2PA and vetted against the specs.
- Verifieddit (verifieddit.com) from SanMarcSoft LLC is another conforming validator.
- CAI Verify (verify.contentauthenticity.org) is built and maintained directly by Adobe's Content Authenticity Initiative (CAI) using their official open-source JavaScript SDK. Ironically, despite being widely cited across CAI and C2PA publications, sharing development teams with Adobe Inspect (a conforming product), and using versions of the same JavaScript SDK, CAI Verify is not listed as a conforming product.
- IPTC Origin Verify (originverify.iptc.org) is provided by the International Press Telecommunication Council.
- C2PA.sh is provided by SSL.com, a commercial Certificate Authority and C2PA Trusted CA.
- Proofmode Verify (formerly "ProofCheck", check.proofmode.org) is provided by Proofmode, an early adopter of C2PA. Today, they have conforming generators for Android and iOS, but they are not listed as a conforming validator.
- Sony has a signature self checker that recognizes Sony's own C2PA signatures.
While each of these platforms implement C2PA's solution, their outputs frequently disagree. Here is how that plays out in practice.
| Picture/Validator | Flying Pug | Glitter Milk | Whack-a-Mole | Sheep | Bike | Protest | Voting | Sunset |
|---|---|---|---|---|---|---|---|---|
| Adobe Inspect | Trusted with timestamp, legacy warning | Trusted, from Google camera | Trusted, from Google camera | Trusted, from GreenCheckmark camera | Unrecognized, from Sony | Trusted, AI, with lots of metadata | Trusted, legacy warning | Trusted, from OpenAI |
| Verifieddit | Trusted, "Looks authentic" | Trusted, "Looks authentic" | Trusted, "Looks authentic" | Trusted, "Looks authentic" | Valid, not trusted | Invalid, untrusted signer, AI | Trusted, "Looks authentic" | Trusted, AI |
| CAI Verify | Trusted with timestamp, legacy warning | Trusted, from Google camera | Trusted, from Google camera | Trusted, from GreenCheckmark camera | Unrecognized issuer | Unrecognized issuer, AI, test certificate | Trusted, legacy warning | Trusted, from OpenAI |
| IPTC Verify | Trusted (on ITL), no timestamp | Verified by a trusted timestamp authority, Revoked by the issuing authority | Verified | Timestamp authority not on a trusted list, Revoked by the issuing authority | Not on a trusted list | Unknown signer, no timestamp, test certificate | Verified, IPTC and ITL | On C2PA trust list, Timestamp authority not on a trusted list |
| SSL.com's C2PA.sh | Untrusted (revoked) | Revoked | Verified, Trusted timestamp | Revoked, Unknown Timestamp Authority (but SSL.com is the timestamp authority!) | Untrusted (unknown signer and timestamp) | Untrusted (unknown signer, cannot validate timestamp) | Untrusted | Verified |
| Proofmode | Trusted with timestamp | Trusted with timestamp | Trusted with timestamp and GPS | Trusted, Uncertain camera (no make/model) | "Uncertain" | Valid, AI generated and from a camera | Trusted, from a camera | Trusted, AI, Edited, Uncertain camera |
| Sony | Trusted, incompatible timestamp | Trusted, incompatible timestamp | Trusted, incompatible timestamp | Trusted, incompatible timestamp | Trusted, incompatible timestamp | Trusted, incompatible timestamp | Trusted, incompatible timestamp | Unsupported |
Although the C2PA specifications recommend how the user interface should report results, few tools follow those recommendations. Also keep in mind, everything with C2PA is dynamic. I did this test on 2026-10-12. If I did this same test 3 months ago, the results would have included a few different inconsistencies. (I'm sure that these vendors will see these results, make more changes without any coordination, and cause more contradictions.)
Example: Nikon and The Flying Pug
Click on the image to see the full size picture and save it for uploading to the validators.This picture has a well-known history. In September 2025 (over a year ago), Nikon released C2PA for their Z6 III camera. Within days, researcher Adam Horshack figured out how to use this to sign any picture as if it came from the Nikon Z6 III. DP Review published details about the vulnerability. Literally the next day Nikon disabled their C2PA signing service, and they revoked their signing cert two weeks later.
If the validator checks for revocation, then it will report that the cert has been revoked. For example, c2pa.sh says that the image is "UNTRUSTED" because the certificate was revoked.
Unfortunately, as seen in the workflow, checking for revocation is optional. Neither conforming product (Verifieddit and Adobe Inspect) checks for revocation, so they report that the content is "Trusted". In fact, Verifieddit even adds, "The signature checks out and the source is one we recognise, so this photo appears to be a real, unedited capture."
Adobe Inspect has no banners or warnings about the picture being untrusted. At best, it has a small note that this picture from 2025 uses a "legacy version" of C2PA.
IPTC provides the only validator that says it checks multiple trust lists. They have teeny tiny icons with teeny tiny alert icons and on-hover text to identify which trust lists match the signature. Ignoring the poor usability aspect, identifying which trust list matched is a cool feature.
With the flying pug picture, first and third icons have tiny orange "!" symbols, indicating that the signature is not on the IPTC or C2PA trust lists. The second icon (a black-and-white squiggle box) has no tiny orange "!", indicating that it matched the ITL. IPTC also reports that there is no timestamp, even though Adobe Inspect shows a timestamp.
The CAI-managed Interim Trust List (ITL) was created as a temporary solution before C2PA had an official trust list. The ITL was officially frozen in January 2026. However, in March 2026, it was updated and the Nikon cert was removed. Since IPTC says Nikon is in the ITL, it means they are using a version before March 2026. In any case, IPTC doesn't notice that the certificate was revoked.
Personally, I find it hard to argue which is worse: accepting a revoked cert, or removing the cert from the trust list so you don't know if it was ever trusted. In either case, IPTC is using an older version of the 'frozen' ITL.
With this one picture, we have contradictions about whether it is valid or revoked, and if it has a timestamp or not.
Example: Google Pixel and Glitter Milk
A few months ago, I blogged about using the Google Pixel phone (a C2PA conforming product) to sign any picture. As an example, I used a picture of a unicorn cow being milked.To their credit, Google revoked the signing cert shortly after my glitter-milk blog came out. They backdated the revocation to cover the entire certificate issuance range. Validators that do not check for revocation, such as Adobe Inspect, CAI Verify, and Verifieddit, all claim that it is a trusted picture from a Google Pixel camera, while validators that check for revocation (e.g., c2pa.sh and IPTC) say it is revoked.
Unfortunately, Google only revoked the specific signing cert attached to this picture. Since the Google Pixel uses a unique signing cert per picture, nothing stops me from immediately generating a new signing cert and signing more forgeries. Google can only revoke certs that they know about, so this becomes a game of whack-a-mole that Google can never win.
To demonstrate this, I created another picture showing Google playing a losing game of whack-a-mole. It is also signed by a Google Pixel camera (using certs from the same Pixel camera as glitter-milk). At the time of this writing, the whack-a-mole picture has not been revoked. If Google revokes it, then I can generate another (and another and another) version that is signed. I can easily generate them faster than Google can revoke them. Of course, that assumes Google knows about the forgery (they have no official reporting method) and you use a validator that checks for revocation (most don't because it is optional).
(When all you have is a hammer, everything looks like a whack-a-mole.)
Example: GreenCheckmark and Rainbow Sheep
Along with the glitter-milk picture, I created a picture using rainbow sheep. This picture was signed using GreenCheckmark (a conforming product). Although GreenCheckmark was notified before the blog came out, they only revoked it after the blog went public. The revocation date is 2026-08-26 18:16:06 GMT, even though the trusted timestamp says the picture was created on 2026-08-07 15:38:08 GMT (over 19 days earlier).This time inconsistency becomes problematic. According to the C2PA documentation, validators can ignore revocation if there is a trusted timestamp and it is valid. As noted in 6.2.1. Revocation information and time-stamps (my bold for emphasis):
Attaching a time-stamp and freshness information to the signature allows validators to conclude the C2PA Manifest is still valid a) even if the signing credential has since expired or was revoked after signing time and b) without the need of an online query.
This introduces another potential inconsistency between validators. For example:
- All of the validators that do not check revocation say that the rainbow-sheep picture came from an Android and was signed by GreenCheckmark. No issues are found with the media.
- c2pa.sh notes that "the signing certificate (GreenCheckmark - Android) was revoked on 2026-08-26, after this file's claimed signing time, which nothing trustworthy confirms. Don't rely on this signer; the content itself may be unchanged. Reason given: keyCompromise."
Within the world of Public Key Infrastructure (PKI; the use of public and private keys for signing), if a private key is reported as keyCompromise, then any signature made with that key -- regardless of the timestamp -- is fundamentally suspect because an attacker could have backdated or forged the signature prior to revocation discovery. However, C2PA's section 6.2.1 grants a loophole that permits revoked certificates. By allowing timestamps to override revocation, C2PA creates an incentive for attackers to timestamp forged manifests immediately.
With this example, I cannot tell if c2pa.sh omits the optional specs section 6.2.1, doesn't like the timestamp signer, or doesn't include it on their trust list. It's worth noting that c2pa.sh is operated by SSL.com and the trusted timestamp was issued by SSL.com and is it listed as trustworthy on the ITL. - IPTC says that the signing certificate was revoked and "Timestamp authority not on a trusted list". The timestamp authority that I used is SSL.com from the ITL. So while IPTC lists the ITL as one of the lists they trust (workflow step 2), they don't appear to use the trusted timestamp list from the ITL (workflow step 6). This contradiction means that the user doesn't know which lists the validator uses, even if the validator claims to use a specific list.

If IPTC or c2pa.sh used the complete ITL and followed specs section 6.2.1, then this picture would appear to be completely valid because it was revoked after the signed timestamp.
Example: Sony
C2PA does not require any specific certificate trust list. As noted in workflow steps 2 and 6, every validator can use their own trusted list. Sony is an example of a vendor that has defined their own certificate list: sony.pem.I used Sony's service to download a set of keys and signed my own forgery as if it came from a Sony camera.
The validators from Adobe, CAI, Verifieddit, IPTC, and c2pa.sh do not use Sony's trusted list, so none find it trustworthy. At best, IPTC and Verifieddit both say that the crypto is valid, but the signers are unknown.
However, other validators report that the file is valid. For example, Proofmode Verify finds no problems with the file. It is signed by Sony and the timestamp is valid (because both signatures really are valid).
Sony's own signature self checker reports that the signing signature is valid, but they marked the timestamp as being "Incompatible".
Example: Enabling Propaganda
User 'bdcry' left a comment on my blog with a forgery he created:This is a light-hearted example of how a forgery can be used for propaganda. According to Adobe Inspect (a conforming validator), this picture of a protest at the White House is valid AI from a Nikon COOLPIX 100 camera. Proofmode says it is verified, AI-generated, and from a camera. In contrast, CAI Verify, IPTC Verify, Verifieddit, and c2pa.sh do not recognize the signer.
With this example, bdcry demonstrates a wide range of metadata fields that can be injected into the file. With very little effort, the same forgery technique could be used to make it appear as a real photo, or make a real photo appear to be AI-generated.
It seems that bdcry has discovered a test certificate that Adobe accepts as valid, while Sony and Proofmode may not check certificates against any trust lists. Who knows what other hidden certificates are acceptable to different validators? This is why transparency around the trusted list (workflow steps 2 and 6) is incredibly important. A malicious user could easily create a realistic forgery and verify it using an accepting validator.
Consistently Inconsistent
These inconsistencies do not even require someone to maliciously manufacture an image. This picture of people voting comes from CBC/Radio-Canada. However, the link in their news report to "Learn more about this image" returns a 404 error, so the original provenance explanation is no longer accessible. The validators disagree on its trustworthiness: Verifieddit and Sony report it as trusted, Adobe Inspect and CAI Verify flag it as legacy, IPTC recognizes it through its trust lists, and c2pa.sh reports it as untrusted.Similarly, I don't know who uploaded this sunset picture to FotoForensics, but it is signed by OpenAI. The signing cert is on C2PA's own trusted list, but the timestamp certificate is not. (I didn't do that; that's how OpenAI does it.) Verifieddit and c2pa.sh says it is fully trusted. IPTC doesn't trust the timestamp authority. Proofmode says the media is both AI-generated and edited. (I don't know how they came up with 'edited' based on the C2PA information.) Adobe Inspect and CAI Verify say the signature is valid, and silently ignore the timestamp because that's how their implementation responds when they don't recognize the timestamp's signature. There is no consistency.
In this blog entry, I have provided links to all of the source pictures as well as over a half-dozen validators, including some that are on the conforming products list. Feel free to try all of these pictures with all of these validators. You will not get a consistent result. With any C2PA-signed file, you can cherry pick your validator to make an argument for it being legitimate or fake.
With each of these examples, the cryptography is valid. I have never questioned C2PA's used of cryptography. However, forging the signing device, signing altered media as if it came from a device, and providing inconsistent interpretations of the C2PA information are not about the cryptography. This is a problem with the attribution and provenance trail; it's the signer and content that are unreliable. (As I often say: putting strong crypto from an unverified source over unvetted data does not make the data more trustworthy.)
C2PA is inconsonant by design. With TLS and SEAL, it doesn't matter which validator you use: a missing, unknown, or revoked signer is a hard-reject. In contrast, C2PA treats security-critical controls (trust list selection, timestamp validation, revocation, etc.) as soft warnings or optional states. This changes the security model from fail-closed (secure) to fail-open or indeterminate.
C2PA's solution was originally created as a "project whose mission is to develop technical specifications that can establish content provenance and authenticity at scale to give publishers, creators, and consumers the ability to trace the origin of media." By providing no consistent results related to trustworthiness, they have failed at this mission. This isn't merely a case of growing pains from an up-and-coming standard. C2PA explicitly permits optional validation decisions that can cause compliant implementations to reach different conclusions about the same file. The resulting inconsistencies aren't implementation bugs; they are the foreseeable outcomes from a bad design.