Amity EspaƱol

Check a signed copy

Choose the ZIP file of an Amity signed copy. It is checked in this browser and is not uploaded.

Nothing leaves your device

The copy may hold private family information, so this page never sends it anywhere. The file is read here, in your browser, in pieces. This page sets no cookies and has no analytics. The only thing it downloads is the list of Amity’s public keys.

or drop the ZIP file here

What a check shows

That every file in the copy is exactly the file Amity signed for that export: no character changed, no file added, removed or renamed, and the list of files itself unchanged.

What it doesn’t show

It doesn’t show that what people wrote is accurate: the copy is Amity’s record of what was sent through the app. It doesn’t show who has had the copy since, or an independent time of signing. Whether a court or anyone else accepts a copy is their decision, and Amity doesn’t give legal advice.

Amity’s public keys

A copy is signed with a private key that only Amity’s key service holds. Its public part is published as a list of keys. A key stays on the list after it is replaced, so a copy made years ago can still be checked. The list only ever gets longer.

How the check works

  1. The copy is one ZIP file. manifest.json lists every other file with its size and its SHA-256.
  2. manifest.sig is a signature over manifest.json, made with Amity’s private key (ECDSA, curve P-256, SHA-256). It names the public key to use by its fingerprint.
  3. This page finds that key in the published list (never in the copy), checks the signature, then reads every file, recomputes its SHA-256 and compares it with the list. It also checks that the ZIP holds no file the list doesn’t name.
  4. The fingerprint shown with a match is the SHA-256 of manifest.json. Compare it with the fingerprint the app shows for the copy.

Check it yourself, without this page

Anyone can repeat the check with standard tools, on a machine that is offline. Save the publicKeyPem of the key whose fingerprint matches keyFingerprint in the copy’s manifest.sig (from the key list) as amity-key.pem, put the copy next to it as copy.zip, and run these commands (they need unzip, openssl, jq and shasum):

unzip -q copy.zip -d copy
openssl pkey -pubin -in amity-key.pem -outform DER | shasum -a 256
jq -r .keyFingerprint copy/manifest.sig
jq -r .signature copy/manifest.sig | openssl base64 -d -A > sig.der
openssl dgst -sha256 -verify amity-key.pem -signature sig.der copy/manifest.json
(cd copy && jq -r '.files[] | "\(.sha256)  \(.path)"' manifest.json | shasum -a 256 -c -)
jq -r '.files[].path' copy/manifest.json | sort > listed.txt
(cd copy && find . -type f ! -name manifest.json ! -name manifest.sig | sed 's|^\./||' | sort) > present.txt
diff listed.txt present.txt && echo "same files"

The two fingerprints printed first must be the same, Verified OK must appear, every file must say OK, and the last line must be same files. Anything else means the copy is not what Amity signed.