Security & Verification

A security reviewer's summary of the cryptography behind Lolly's Content Credentials, verification, and encryption — the standards it implements, the primitives it uses, how trust is earned, and how all of it is tested. This is the public companion to the deeper Content Credentials — Engineering guide; the operator narrative lives in Lolly for Operators.

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

Verification is on-device

Everything Lolly verifies, it verifies locally, offline, without uploading the file. Dropping a file on /verify (or 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. There is no verification server.

The Verify screen with nothing but a drop target - no upload button, no account, because the check runs where the file already is

The engine's crypto core is platform-agnostic and uses only globalThis.crypto / WebCrypto — no bespoke crypto library, no Node-only APIs, and no network calls anywhere in the engine. The single network-capable path in the whole verification surface is an optional DNS-over-HTTPS lookup of a SEAL signer's public key — and even that never sends the file, only fetches a public key the shell (not the engine) requests.

Standards implemented

AreaStandard
Content CredentialsC2PA 2.x (reads v1 + v2 manifests from any producer)
Signing certificatesRFC 5280 (X.509/PKIX), C2PA cert profile §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 §7.6.4 (PDF 2.0 AES-256, R6)
Zip encryptionPKWARE APPNOTE + WinZip AE-2
Byte-level signaturesSEAL (verification)
Durable soft bindingAdobe TrustMark (read)
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

All of the above 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 — this is used encrypt-only, over your own content, never as a decryption oracle.

How "trusted" is earned

Lolly reports the trust a file can actually prove, in explicit tiers:

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

There is no timestamp authority yet, so an authentic-but-expired signature surfaces the signer's identity while staying trusted: false — it proves who, not when. An RFC 3161 timestamp countersignature is on the roadmap.

Complementary provenance signals

Beyond the C2PA credential, Verify surfaces several read-only signals — each an honest heuristic that only ever adds confidence, never a false alarm:

Lolly's provenance strategy is read-broad, embed-narrow: it reads many signals but only ever writes C2PA (plus its own Imprint), which keeps the write-side attack surface small. That narrow write side is visible in the export panel: 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

How it's assured

Every cryptographic claim above is backed by an automated test in the repository (npm test):

The cryptography and parsers are additionally undergoing SUSE's enterprise-scale security hardening. They are strong by design today; where a contract calls for certified assurance, deploy Lolly as one layer of defence-in-depth.

Design boundaries (worth having straight)

Where to go next