Lolly
Запустити застосунок

Security & Verification

signed by Lollysecurity.htmlHTMLpixels, not shapes13 KBAI generatedgenerated by ClaudeПеревірте саміОтримати підписаний файл

This page is for security reviewers. It covers the standards Lolly implements, the primitives it uses, how a file earns the word "trusted", how all of it is tested and where the guarantees stop.

The short version: verification runs entirely on the device, the cryptography is standards-based and built on the platform's own WebCrypto, and every claim is backed by a test: known-answer vectors, adversarial forgery and replay tests, fuzzing and conformance against independent tools.

Verification is on-device

The app's Verify view and the local CLI verify a file locally and offline, with no upload. Dropping a file on /verify, or running lolly validate <file>, parses it, walks its Content Credential, re-checks the signature and the byte-hash binding and renders a verdict, all in your browser or on your machine. The separate MCP lolly_verify endpoint is different: calling it sends the file to that server, and the local checks never use that endpoint.

The Verify screen - nothing but a drop target, no upload button, no account, because the check runs where the file already is signed by Lollyvector SVG11 paths~4.3k nodes18 groups52 KBПеревірте саміОтримати підписаний файлThe Verify screen - nothing but a drop target, no upload button, no account, because the check runs where the file already is signed by Lollyvector SVG11 paths~4.3k nodes18 groups52 KBПеревірте саміОтримати підписаний файл

Here is the result for a real file: a Gemini image that Lolly opened, marked and converted to WebP. The green verdict, the intact credential, the unchanged bytes and the GEN AI flag were all worked out on the device. Verify It Yourself walks the same file through every badge.

The full Verify verdict for the generated storm image - the image itself, a green Made with Lolly pill, the intact-credential and unchanged-bytes badges and the provenance scorecard signed by Lollyvector SVG76 paths~6.4k nodes48 groups1 image157 KBПеревірте саміОтримати підписаний файлThe full Verify verdict for the generated storm image - the image itself, a green Made with Lolly pill, the intact-credential and unchanged-bytes badges and the provenance scorecard signed by Lollyvector SVG76 paths~6.4k nodes48 groups1 image157 KBПеревірте саміОтримати підписаний файл

The engine's crypto core is platform-agnostic and uses only globalThis.crypto, the WebCrypto API. There is no bespoke crypto library, no Node-only API and no network call anywhere in the engine.

In the web app, verification makes no request to any third party. It can make two fetches, both to the app's own origin and neither carrying the file: the opt-in deep scan's one-time detector download and, on a build configured for a managed CA, that CA's revocation list.

Even a SEAL record whose key lives in DNS is reported as "no key resolver" rather than looked up through a third-party DNS-over-HTTPS service. No Lolly app looks SEAL keys up in DNS today: the desktop and mobile apps run the same Verify view, and lolly validate does not check SEAL.

If your organisation adds Lolly Work, review that service as well as these local paths. It adds identity, permission checks, shared storage, work collabs and server jobs, with its own security boundaries and audit controls. The local verification tests on this page do not certify those services.

Standards implemented

AreaStandard
Content CredentialsC2PA 2.x (reads v1 and v2 manifests from any producer)
Signing certificatesRFC 5280 (X.509/PKIX), C2PA certificate profile, section 14.5.1
Signature containerRFC 9052 / 9360 (COSE_Sign1)
SerializationRFC 8949 (deterministic CBOR)
Key fingerprintingRFC 7638 (JWK thumbprint)
Credential boxingISO 19566-5 (JUMBF)
Video bindingISO 14496-12 (BMFF)
PDF encryptionISO 32000-2, section 7.6.4 (PDF 2.0 AES-256, R6)
Zip encryptionPKWARE APPNOTE and WinZip AE-2
Byte-level signaturesSEAL (verification)
Durable soft bindingAdobe TrustMark (read and write; write off by default)
Supply chainCycloneDX 1.5 (SBOM)

Cryptographic primitives

The export panel's lock card, where Standard and Strong name the actual ciphers rather than hiding them behind a padlock icon signed by Lollyvector SVG11 paths~2.8k nodes11 groups1 image35 KBПеревірте саміОтримати підписаний файлThe export panel's lock card, where Standard and Strong name the actual ciphers rather than hiding them behind a padlock icon signed by Lollyvector SVG11 paths~2.8k nodes11 groups1 image35 KBПеревірте саміОтримати підписаний файл

All of these run on the platform's audited WebCrypto implementation. The two symmetric ciphers use a small in-house block layer only because WebCrypto exposes no raw AES block. That layer only encrypts, over your own content, and is never used to decrypt.

How "trusted" is earned

Lolly reports the trust a file can actually prove, in two gates.

Two gates to trusted: a signed file first passes or fails on its signature and bytes. A failure reads Credential broken; a pass is valid with an anonymous signer. A valid file then reaches trusted only if its certificate chain reaches a pinned anchor; a chain whose certificate has lapsed shows the identity but is not trusted.Two gates to trusted: a signed file first passes or fails on its signature and bytes. A failure reads Credential broken; a pass is valid with an anonymous signer. A valid file then reaches trusted only if its certificate chain reaches a pinned anchor; a chain whose certificate has lapsed shows the identity but is not trusted.Open this in Diagram Builder

Trust anchors are public certificates only: the C2PA ecosystem roots (Google, Adobe, the CAI trust list, camera makers and AI providers) plus Lolly's own public root. Being on the list never confers trust by itself. Trust always needs the live chain walk and signature check. Chain walking is bounded, with a capped number of intermediates parsed defensively, so a hostile certificate chain cannot exhaust resources.

There is no timestamp authority yet, so an authentic but expired signature shows the signer's identity while staying trusted: false. It proves who, not when. An RFC 3161 timestamp countersignature is on the roadmap. On a managed CA deployment, a chain is trusted only while its issuer's revocation list is fresh and does not list the certificate.

Read broad, write narrow

Beyond the credential, Verify reads several signals: the Lolly Imprint, AI declarations, SEAL signatures, an opt-in deep scan for third-party pixel watermarks and hidden data. All of them run locally. What Verify checks covers each one.

Each signal is labelled with its confidence. The statistical ones (the Meta Content Seal read and LSB steganalysis) can raise false alarms, and Verify says so where it shows them. The Lolly Imprint is security through obscurity: cover against casual stripping rather than a hardened defence. It complements the credential and never replaces the credential.

Lolly reads many signals but writes only three: C2PA, its own Imprint and an opt-in durable mark in Adobe's TrustMark format, which is off by default because it needs a neural pass and a one-time model download. That keeps the attack surface on the writing side small, and it is exactly what the export panel shows: three named switches, each a separate mechanism, rather than one blanket "protect this" claim.

The Content protection group on a PNG export, with the credential, the Imprint and the durable mark as three separate switches signed by Lollyvector SVG33 paths~3.8k nodes44 groups5 images53 KBПеревірте саміОтримати підписаний файлThe Content protection group on a PNG export, with the credential, the Imprint and the durable mark as three separate switches signed by Lollyvector SVG33 paths~3.8k nodes44 groups5 images53 KBПеревірте саміОтримати підписаний файл

How it is assured

An automated test in the repository (pnpm test) backs every cryptographic claim above.

The cryptography and parsers have not been independently audited. Where a contract calls for certified assurance, deploy Lolly as one layer of defence in depth.

Design boundaries

Reporting a vulnerability

Found something? Report it privately: fitzy+security@suse.com, the Report a vulnerability button on any lolly-tools repository, or the machine-readable /.well-known/security.txt. The full policy, scope and safe-harbour statement are in SECURITY.md. We practise coordinated disclosure and credit reporters in the fix notes.

Where to go next