EIF v1.0
Evidence Integrity Framework · Open specification

Proof of capture, bound to the pixels

EIF is a file format for photographs that decisions get made from — insurance claims, lending inspections, evidence. The proof lives inside the container, covers a Merkle tree of image tiles, and identifies which regions changed rather than only that something did.

eif verify claim-0041.eif Reading

A 640×480 capture, sealed as 80 tiles of 64 pixels. Verification recomputes every tile against the sealed tree.

01 — Why not detection

We tried detecting fakes first. It does not work.

The instinctive answer to synthetic imagery is a classifier that spots it. Our first study built four physics-based forensic probes and ran them across a corpus of real and generated images. The best classifier we could produce reached 74% accuracy under leave-one-out cross-validation.

74%best accuracy

Not a number anyone can deny a claim with — and it degrades every time a generative model improves. Detection is a race against an adversary who is getting better faster than the defence. The negative result is published in full, because it is the argument for everything that follows.

Provenance asks a different question. Instead of is this fake?, which is statistical, it asks can this image prove where it came from? — which has a cryptographic answer.

02 — The container

Five blocks, one signature

An .eif file is a chunked binary container. One ECDSA P-256 signature covers the attestation, the tile tree root and the image data concatenated under a domain tag, so the three cannot be recombined across files.

CABK

Capture Attestation Block

When, what device, what software, what location — and the relying party's challenge.

SILT

Structural Integrity Layer

A Merkle tree over image tiles, built per RFC 6962 with the tile index bound into each leaf.

SEAL

Cryptographic Seal

One ES256 signature, stored fixed-width so there is exactly one valid encoding.

PVCH

Provenance Chain

Append-only custody entries, each committing to the hash of the one before it.

IMGD

Image Data

The pixels, stored byte for byte.

Because the proof is the container rather than metadata beside it, there is no such thing as an EIF file with the provenance stripped. Remove it and what remains is an ordinary image with no claim to make.

03 — Localisation

Which region changed, not just that something did

A whole-image hash answers one question. A Merkle tree over tiles answers a second: a verifier recomputes each leaf from the image present in the file and compares it position by position against the leaves sealed at capture.

For a claims handler this is the difference between an unactionable verdict and a finding they can write down. Invalid tells them nothing. Tiles 34, 35, 44 and 45 differ — the region around the left headlight tells them where to look.

# edit an 80×60 region of a sealed capture, then verify
$ eif tamper-test claim-0041.eif --x 300 --y 200 --width 80 --height 60

  L2  Cryptographic    FAIL
      - recomputed tile tree does not match the sealed root

  Tamper localisation: 4 of 80 tiles altered
      tile    34  (col 4, row 3)  pixels [256,192]-[320,256]
      tile    35  (col 5, row 3)  pixels [320,192]-[384,256]
      tile    44  (col 4, row 4)  pixels [256,256]-[320,320]
      tile    45  (col 5, row 4)  pixels [320,256]-[384,320]

The same structure supports selective disclosure. A single tile can be proved to belong to the sealed image with an inclusion proof of a few dozen hashes, so a reinsurer can confirm the region that matters without receiving the number plate, the faces, or the house front.

04 — Verification

Five levels, four of them offline

Evidence has to be checkable in a courtroom, in an adjuster's car, and in ten years' time, none of which guarantee a working connection to somebody's trust service. Levels are reported independently, because they fail for different reasons and a relying party acts differently on each.

LevelQuestion it answersNetwork
L1 FormatIs this a well-formed EIF file?offline
L2 CryptographicDoes the seal verify? If not, which tiles changed?offline
L3 TemporalAre the timestamps coherent and plausible?offline
L4 ProvenanceIs the chain of custody unbroken?offline
L5 DeviceIs the signing key resident in real hardware?online

A level that could not run reports not evaluated rather than passing quietly. A file with no hardware attestation is not invalid — it is lower assurance, and what that is worth is the relying party's decision, not the format's.

05 — The recapture problem

A real camera photographing a fake screen

Generate a synthetic image, display it, photograph the screen with a genuine device. The capture is real. The attestation is honest. The content is fabricated. No provenance system that only records how a file was made can catch this, because nothing about the provenance is false.

EIF's answer is a challenge: the relying party issues a single-use nonce for a session, the capture pipeline binds it into the signed attestation, and the nonce is redeemed once on submission. The question shifts from was this a real capture? to was this a real capture inside a session I opened?

What it changes

The attack now needs real-time execution on a provisioned device inside a window you control, instead of being performable offline and in bulk at no marginal cost.

What it does not

It does not make recapture impossible. Against an organised operation it is a cost increase, not a barrier, and deployments facing that need controls above the format.

06 — Where it fits

Not a replacement for C2PA or JPEG Trust

C2PA Content Credentials and JPEG Trust (ISO/IEC 21617) are the content provenance ecosystem. Between them they have thousands of member organisations, a conformance programme with hardware-backed assurance levels, signing built into shipping cameras and phones, and an ISO process. For content that has to travel across the open web, they are the answer, and EIF changes nothing about that.

EIF is a narrow profile for a different case: evidence capture where the relying party controls the application and needs two things general-purpose provenance does not target — knowing which region of a frame changed, and binding a capture to a transaction it opened.

Reach for C2PA when

Provenance must survive platform re-encoding, travel across the open web, or come from consumer camera hardware today.

Reach for EIF when

You control the capture app, need region-level integrity, and need verification that works with no network and no vendor, years later.

The two compose. An EIF file can carry a C2PA manifest in its signed annotations, and a verifier can treat a valid Content Credential as one input among several.

07 — Limitations

What EIF does not do

A relying party who believes a control works when it does not is worse off than one who knows the gap exists. These are on the front page rather than in an appendix.

  • PNG only, for now. JPEG decoding is not bit-exact across libraries, so tile hashes would not reliably recompute and the verifier would report tampering on untouched images. v1.0 restricts itself to losslessly decodable payloads. This is the largest practical limitation and the first thing a future version must address.
  • It does not survive re-encoding. Any pipeline that recompresses destroys the file's status. Keep EIF files inside controlled systems; publish derivatives if you need to.
  • A signature proves who signed, not that the content is true. EIF cannot tell you the adjuster photographed the right vehicle.
  • Everything reduces to the private key. An attacker holding it produces valid files with any content. Hardware-resident keys and L5 raise the cost; no format removes it.
  • The chain records what was recorded. A handler who never appends an entry leaves no trace. Chain of custody is a procedural control that cryptography supports.
  • No mobile SDK yet. Android and iOS are where this format actually needs to run, and they are not built.
  • No independent security review. v1.0 is published for implementation and comment. Expect a v1.1.
08 — Start

Seal and verify in a minute

$ pip install eif-sdk

$ eif keygen --out signing-key.pem
$ eif capture damage.png --key signing-key.pem --challenge srv-nonce-7f3a
$ eif verify damage.eif --key signing-key.pub.pem

  Verification result: VALID
  Key pinning          pass
  L1  Format           pass
  L2  Cryptographic    pass
  L3  Temporal         pass
  L4  Provenance       pass
  L5  Device           not evaluated

The most useful contribution anyone can make is an independent implementation in another language — Kotlin and Swift above all, because mobile capture is where this needs to run. Build from the specification rather than the code, and validate against the eleven shared conformance vectors. If the specification is not enough to build from, that is a defect in the specification and the bug report is worth more than most patches.