Content Credentials identity - verified signing for on-device C2PA

signed by Lollycontent-credentials-identity.htmlHTMLAI generatedgenerated by ClaudeVerifique você mesmoGet the signed filepixels, not shapes15 KB

The short version. Every image, PDF, or video you export from Lolly can carry a Content Credential - a signed C2PA manifest, created entirely on your device - that proves the file hasn't been altered since it left Lolly, and (once you enrol an identity) records who signed it. Anyone can check it offline: hit Verify in the app (the shield in the bottom bar), drop in a file and Lolly reports the result on-device. Nothing is uploaded - not the file, not the check. This page is the user-facing story; the engineering & operator guide covers how it's built and how to run the CA service.

What you get

Verifying a file

The Verify screen with nothing but a drop target - no upload button, no account, because the check runs where the file already issigned by Lollyvector SVGVerifique você mesmoGet the signed file10 paths~7.6k nodes14 groups84 KBThe Verify screen with nothing but a drop target - no upload button, no account, because the check runs where the file already issigned by Lollyvector SVGVerifique você mesmoGet the signed file10 paths~7.6k nodes14 groups84 KB

The Verify tab (canonical /verify; the aliases /valid and /v redirect to it) checks any file's credential entirely on-device. It reads the whole C2PA manifest store - Lolly's own credentials and credentials written by other C2PA tools (it reads both C2PA 1.x and 2.x claims, so files from cameras, Adobe apps, Google's Gemini and other generators verify too) - and headlines the result with one honest verdict:

VerdictWhat it means
Made with LollyThe credential is intact and records a Lolly export - the file hasn't changed since it was made. (Integrity plus the maker's claim, from an on-device key.)
VerifiedThe file matches what it signed and the signing certificate chains to the pinned Lolly CA root - integrity plus a CA-verified identity.
Delivered by LollyA genuine catalog asset Lolly distributed but didn't author - chains to the Lolly root, so it's intact and its origin is CA-verified; who made it is recorded below.
Likely made with LollyAn amber middle ground: the credential's own signature and everything it references check out and it records a Lolly export, but the file's bytes no longer match the hard binding - it was probably re-saved, re-encoded, or re-uploaded through something that left the manifest intact.
Credential intactThe structure checks out and the bytes match, but the signer isn't identified (an anonymous on-device key).
Credential expiredThe bytes still match exactly - nothing was modified - but the short-lived signing certificate has lapsed, so the credential no longer validates.
Credential brokenThe file carries Content Credentials, but they no longer match its bytes - modified after signing, or the manifest is damaged.
No Content CredentialsNothing to verify - the file carries no C2PA manifest.

The page also shows the recorded edit history, the "made from" ingredients and - when present - the CA-verified signer's email and issuer. And it reads far more than the credential: a file that declares AI-generated content, carries Lolly's own pixel Imprint, or is quietly hiding data in its bytes gets flagged too - see Beyond the credential below.

The Change history panel, where every step names the software that made it and Lolly's own leg of the history reads greensigned by Lollyvector SVGVerifique você mesmoGet the signed file71 paths~8.9k nodes78 groups111 KBThe Change history panel, where every step names the software that made it and Lolly's own leg of the history reads greensigned by Lollyvector SVGVerifique você mesmoGet the signed file71 paths~8.9k nodes78 groups111 KB

The same credential check runs in the CLI (lolly validate <file>) and in any third-party C2PA validator pointed at the public Lolly root (c2patool --trust_anchors lolly-root.pem).

Beyond the credential: what else Verify shows

Verify is more than a C2PA reader. Every file you drop is put through several independent checks, summarised as a row of pips ("Verification checks at a glance") under the headline verdict and then explained in full below it. They all run on your device - nothing is uploaded. The one network touch that can ever happen is called out where it applies: a one-time detector download for the opt-in deep scan (from the app's own origin, not a third party). SEAL verification in the web app makes zero network requests - a record whose key lives in DNS resolves only in the desktop/CLI shells, through your own machine's DNS. The file itself never leaves.

The Lolly Imprint

Alongside its Content Credential, Lolly can seal an invisible watermark into the pixels themselves - the Lolly Imprint. Where the credential travels in metadata and is lost to a re-save, a screenshot, or a metadata strip, the Imprint rides in the image and survives recompression - so it's a durable hint that an image came from Lolly even after the credential is gone. It's a supporting signal, not a cryptographic guarantee. When Verify finds it, a green Lolly Imprint pip joins the scorecard - marked detected, or in an image when the mark sits in a raster embedded inside a PDF or PPTX. The Imprint is now on by default on raster exports; see Exporting → Provenance & watermark.

The Lolly Imprint switch in the export panel, already on, with the question mark opening what it does and does not promisesigned by Lollyvector SVGVerifique você mesmoGet the signed file5 paths186 nodes9 groups1 image6 KBThe Lolly Imprint switch in the export panel, already on, with the question mark opening what it does and does not promisesigned by Lollyvector SVGVerifique você mesmoGet the signed file5 paths186 nodes9 groups1 image6 KB

AI-generated content

When a file declares that its pixels came from a trained model, Verify raises an unmissable AI-generated content flag (or Contains AI-generated content when only part of it was). The declaration comes from one of two places, and Verify says which: a signed C2PA assertion, or a bare IPTC "digital source type" tag written into the file's metadata - the sidecar flag Gemini/Imagen, Midjourney and Meta AI write next to their output. The metadata tag is genuine when present but trivially stripped, so its absence never proves a file isn't AI-made. The bare tag rides in an XMP packet, so the flag fires wherever Lolly reads one: JPEG, PNG, WebP and SVG stills, and MP4/QuickTime video. GIF and TIFF carry no XMP packet Lolly reads, so a bare declaration in one of those is not picked up - a signed C2PA assertion in the same file still is.

"Likely carries" a maker's own watermark

Large AI generators also stamp their own invisible watermark into the pixels - Google's SynthID (also adopted by OpenAI) or Meta's Video Seal. Only the maker's own detector can read those; Lolly cannot. So when a file's declared maker is one of them, Verify says the file very likely carries that watermark. This is a likelihood inferred from the maker's declaration, never a claim that Lolly read the watermark itself.

Deep scan (opt-in): TrustMark & Content Seal

For a real read of two open pixel watermarks, Verify offers an opt-in deep scan. A one-click banner - "Scan for invisible watermarks?" - downloads the detector models once (~90 MB), after which every image in the batch is scanned automatically, all on-device, nothing uploaded. It reads two marks:

SEAL signatures (a cryptographic signature, not a pixel watermark)

Verify also checks for a SEAL record - the hackerfactor SEAL format, which despite the name has nothing to do with Meta's Content Seal above. SEAL is a cryptographic signature over the file's bytes whose public key is published in DNS. Lolly verifies it on-device - and in the web app with zero network requests: a record carrying its key inline verifies fully offline, and a DNS-keyed record reports "no key resolver" rather than being looked up through a third-party DNS service. The desktop and CLI shells resolve DNS-published keys through your own machine's DNS; a signature that verifies against a key found that way shows Signed by \<domain\> (SEAL): it proves control of that domain - domain-level attribution, not a CA-verified legal identity - and says nothing about the visual content. A signature that verifies against a key the file itself carries, but which isn't confirmed in DNS, is reported as internally consistent but unattributed.

Hidden data: appended payloads & steganalysis

Two more reads look for data a file is quietly carrying:

Separately, every file's embedded metadata (EXIF/GPS/IPTC/XMP) is read out in full and grouped, with values that could identify a person, place or device marked - alongside a one-click Download a cleaned copy and a link to the Hidden Data tool to strip it.

Where each check runs

The C2PA verdict runs in the CLI too (lolly validate <file>). The embedded-metadata read (EXIF/XMP, the AI declaration, appended-data) runs over MCP (lolly_verify) and in the web Verify view. The pixel-level reads - the Lolly Imprint, the opt-in deep scan and LSB steganalysis - and SEAL verification are features of the web Verify view. Wherever they run, they run on your machine.

Why identity, not app identity

Lolly's engine and shells are open source. Once the code is public, "made with Lolly" can never be a cryptographic claim - anyone can fork the repo and emit bit-identical manifests. No certificate scheme fixes that, because the thing being attested (the software) is copyable by design.

So the certificate attests who signed, not what app signed: the Subject Alternative Name carries the OIDC-verified email. A fork can't impersonate a Lolly user - it can only obtain certificates for its own users under our issuance policy, or run its own CA whose root simply isn't our root. The "Lolly" generator name in the manifest remains self-asserted, and the verifier copy keeps making that distinction (which is why "Made with Lolly" is the maker's claim, while "Verified" is the cryptographic one).

This follows Kerckhoffs's principle as practised by Sigstore/Fulcio and Let's Encrypt: the repo holds no secrets - only protocol and public anchors. The CA certificate (public) is committed and served; the CA private key lives only in the host's environment store (or a KMS); the device key is generated locally and non-extractable.

Trust tiers (what a verifier can conclude)

TierSignerVerifier result
0Ephemeral self-signed (offline / not enrolled)Structure valid, signer anonymous ("Credential intact" / "Made with Lolly")
1–2Device key + short-lived Lolly-CA certCA-verified identity ("Verified" / "Delivered by Lolly") for verifiers pinning the Lolly root
3 (roadmap)+ RFC 3161 timestamp countersignatureproves when signed, so expired certs stay verifiable
4 (roadmap)C2PA conformance program (audited KMS custody)green in third-party validators (Adobe Verify etc.)

Expired-credential honesty: certificates are short-lived and there is no trusted timestamp yet, so a file verified after the cert expired gets a distinct expired verdict - the bytes still match, but the time of signing can't be proven - never silently downgraded to broken, never inflated to verified.

Credential lifetime (7 / 30 / 90 / 365 days, default 30)

Until the timestamp authority ships (Tier 3), the certificate window does double duty: it bounds abuse (expiry is our only revocation) and it is how long an exported file keeps its verified badge - the verifier compares the cert window against verification time, not signing time. So the lifetime is the user's call, offered at the moment the certificate is actually minted:

The C2PA Credentials card carrying its own Expires picker, so the window is chosen on the export that uses itsigned by Lollyvector SVGVerifique você mesmoGet the signed file8 paths644 nodes14 groups2 images13 KBThe C2PA Credentials card carrying its own Expires picker, so the window is chosen on the export that uses itsigned by Lollyvector SVGVerifique você mesmoGet the signed file8 paths644 nodes14 groups2 images13 KB


For the device/CA architecture, the engine contracts, the CA service protocol and environment, the web-shell wiring, the one-time operator setup, the threat model and the roadmap (RFC 3161 timestamps, transparency log, SUSE SSO), see the Content Credentials - engineering & operator guide.