wai: bind a decode's joules to the decode (C2PA 2.4 companion assertion) #68
Loading…
Reference in a new issue
No description provided.
Delete branch "wai/energy-binding"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
C2PA 2.4 added
c2pa.environmental-sustainability, carryingenergy_kwhper ISO/IEC TR 20226:2025. The dominant signed-provenance container in media now has a slot for joules — and nothing behind it.Verified against the spec text during the 2026-08-29 sweep: the figure is self-declared,
measurementMethodis optional, and it is not bound to any reproducible output. A validator can check every signature in a manifest and still not know where the number came from or what it was measured over.This fills the slot rather than replacing it — the standard assertion is emitted for interop, with a companion carrying the three things it cannot express.
The load-bearing one: the binding
reconstructionHashis the SHA-256 of the canonical decoded pixels — the same digestreconstruction_bindingcommits to — so two assertions in one manifest name the same decode by construction, and a manifest whose digests disagree is self-refuting.Because a WAI reconstruction is byte-exact on every architecture, a verifier can re-decode, confirm the figure is about those bytes, recompute
workUnitsfrom the descriptor rather than trusting it, and re-derive the rate — leaving exactly one unverifiable term: the joules.That is the point, and also the honest limit. The extension states plainly that a binding does not prove the figure:
The other two
HwShunt/ModelBased/Estimator) — a counter reading and a modelled constant are different claims occupying the same field in the standard assertion.Whole/Partial) — a partial reading is not wrong; presenting it as a total is.Deliberate refusals
methodis required, where the standard leavesmeasurementMethodoptional — which is exactly the field that stays empty in practice.carbon_kgco2eandwater_litresare not emitted. Deriving them from an energy figure and a grid-average factor, then placing them beside a measured joule figure in one assertion with no per-field provenance, is precisely how a model comes to be read as a measurement.Units
Integer microjoules are authoritative;
energy_kwhis derived. One µJ is 2.8e-13 kWh, so an image decode lands near 1e-9 kWh, where the float's trailing digits are conversion artifacts.Verification
76 wai-rs tests pass under
--features provenance(6 new) · no clippy warnings in the new file · extension linked fromSPEC.mdbeside its sibling.