v0.1.0 — initial release: pure-Go read-only C2PA reader
Backfilled release notes — the v0.1.0 tag was pushed 2026-06-11 without a GitHub release entry.
Initial release: a small, pure-Go, read-only reader for C2PA / Content Credentials provenance manifests embedded in JPEG and PNG files.
Extracted from file-search-on, where it powers the is_c2pa / c2pa_* search attributes.
What it does
Surfaces what a file claims about its provenance — creating tool, title, declared format, whether it declares AI-generated content, and the claimed signer identity + signing time — by parsing the embedded JUMBF manifest (ISO 19566-5), CBOR-decoding the active manifest's claim and c2pa.actions assertion, and decoding the COSE_Sign1 signature envelope.
info := c2pa.Read(context.Background(), c2pa.JPEG, f) // or c2pa.PNG
info.Present, info.ClaimGenerator, info.Title, info.Format,
info.AIGenerated, info.SignedBy, info.SignedAtRead is best-effort and never returns an error: a missing or malformed manifest yields Info{Present: false}. It reads at most c2pa.MaxScan (16 MiB) and honours the context, surrendering promptly mid-scan on cancel.
⚠️ Unverified — read, not validate
At this version the library is the equivalent of reading EXIF, or an email From: header: it reports the file's claims and does not authenticate them. No COSE signature verification, no certificate-chain check against the C2PA trust list — SignedBy is who the file claims signed it. Useful for search, indexing, triage and inventory; not for trust decisions.
(Cryptographic validation arrived later, in v0.2.0's Validate.)
Public API
Read(ctx, container, r) Info; WalkBoxes(ctx, jumbf, fn) for assertions Read doesn't model (depth-capped against adversarial nesting); Info; MaxScan.
Requirements
Go 1.23+. Pure Go, no cgo — depends only on fxamacker/cbor and veraison/go-cose. Context-aware and fuzzed (FuzzRead, FuzzWalkBoxes).