For anyone who receives a photo or video taken with TUVAMBES GeoCam : GPS Camera (package com.tuvambes.geocam) — courts, lawyers, insurers, investigators, their experts, and anyone else.

Every photo and video GeoCam saves carries a digital signature made inside the phone's secure hardware. Check whether a file is an unchanged GeoCam original — in the GeoCam app if you have it, or right here if you don't. This page also explains exactly how the check works, and what a result does and does not show.

WhoHow to checkWhere your file goes
You have the GeoCam appIn the app: Settings › Security & authenticity › Verify media authenticity, or open the file with GeoCam (section 6).It stays on your phone. Nothing is uploaded.
You don't have the appUpload it in the online checker below (section 1).Sent over an encrypted connection to TUVAMBES's server, checked, and deleted immediately after the check (section 2).
Experts, offlineThe reference verifier, geocam_verify.py (section 7).It stays on your computer.

1.Check a file online

For anyone without the GeoCam app. Choose the photo, video or evidence package exactly as you received it — sent as a file or document, not re-sent as a photo through a chat app.

Drop a photo, video or evidence package here or tap to choose a file

JPEG photo, MP4 video, or a GeoCam evidence package (.zip) — up to 100 MB; 20 checks every 10 minutes.

2.How the online check works

What happens to your file, step by step:

  1. You choose a file and confirm the notice. The checker accepts JPEG photos, MP4 videos and GeoCam evidence packages (.zip), up to the size shown above. Nothing is sent until you press Check file.
  2. Your browser uploads it over an encrypted (HTTPS) connection to TUVAMBES's web server at tuvambes.in, which is hosted by Hostinger. There is no account, no sign-in and no cookie.
  3. The server checks it with the method in section 9 — the same checks the GeoCam app makes. It also uses Google's public list of revoked phone certificates, which the server downloads at most once a day; nothing about you or your file is sent to Google. An evidence package is unpacked into temporary files to be checked.
  4. The file is deleted as soon as the check finishes — before the result is sent back to you — together with anything unpacked from it. If something goes wrong, it is deleted all the same, and the server software also removes every upload when the request ends.
  5. Only the result comes back to your browser. TUVAMBES does not keep the file, a copy, the result or any record of what the file showed. No person looks at it, it is not analysed for faces, and it is not used for anything else.
  6. Keep the result yourself if you need it: print it or save it as a PDF from your browser. We can't send it to you later, because we don't keep it.
  7. What is kept: our hosting provider's standard server logs — your IP address, the time, the page address and your browser type, never the file — kept for a limited time for security; and, to stop abuse, a counter linked to a one-way coded form of your IP address, deleted within an hour.

Files larger than the limit, or many files at once: use the GeoCam app or the reference verifier (section 7), which check files without uploading them. For evidence, a check that anyone can repeat — in the app or with the reference verifier — carries more weight than a printout of this page.

3.Is this checker genuine?

4.The four results

ResultWhat it means
VerifiedThe file was signed by the official GeoCam app on a genuine phone and has not changed since GeoCam saved it. If the only difference is that the phone hid the location in the file's standard details — Android does this when another app opens or receives a file — the result is still Verified, with a note; the signed location stays in the record.
Verified – Mark-up
Verified – Measurements
Verified – Mark-up & measurements
As Verified, but mark-up (drawings, shapes or text), measurements or both were added in GeoCam before saving, and the signed record lists them. They are not part of the scene, and measurements are estimates. When the original was kept, the photo as captured is a separate signed file, linked by its provenance ID.
ModifiedThe file carries a genuine GeoCam signature, but its picture or video, its signed record, or the location written in its details was changed after it was signed. It shows that a change was made — not who made it or why.
UnverifiedWhere the file came from can't be confirmed: it has no signature (apps that re-save or compress files — most chat and social apps — remove it), it was not signed by the official app on a genuine phone, the signing key was withdrawn, the signing phone reported its security as off, or the file is damaged or in a format or version that can't be checked. Unverified is not a finding that the file was edited.

5.What GeoCam signs

When GeoCam saves a capture, it writes a signed record into the file and signs it, together with a fingerprint (SHA-256) of the picture or video, using a key that was created inside the phone's secure hardware and never leaves it. The record holds:

PartContents
TimeCapture time (UTC) and time-zone offset from the phone's clock. When the phone had them, its satellite (GNSS) time and network time at the same instant, and whether automatic date & time was on. The time of signing.
PlaceLatitude and longitude (WGS 84), accuracy, altitude and the GPS fix time; the satellites used and in view and their systems (for example GPS, Galileo, NavIC); whether the phone reported a mock-location (fake GPS) app.
Phone & appThe phone's maker, model and Android version; the app's package, version and build.
CapturePhoto or video; random capture and provenance IDs; for an edited copy, the provenance ID of its kept original; a list of what GeoCam did (markup, measure, dual-lens, orientation-pair, camera-original); any measurements, with their ± estimates, method and points.
SignerThe public key, and the phone's Android key-attestation certificate chain, which shows that the key was created in secure hardware for the app com.tuvambes.geocam, and reports the phone's security state — verified boot, bootloader lock, Android version and security patch level.

The GeoStamp printed on the photo is part of the picture; the signed record is the authoritative copy of what GeoCam recorded. Satellite time, satellites and the phone model can be switched off in the app (Settings › Security & authenticity › Record satellite time & GPS signal); the result then says the time is from the phone's clock only.

6.Check a file in the app

On every plan, offline, with nothing uploaded:

The result shows the details of the signed record and the signer. Export report (PDF) saves a verification report; Export evidence package saves the files themselves together with the report and the custody log (section 8).

Check the file exactly as it was saved Ask for the original file, sent as a file or document — by email attachment, USB or a cloud drive — not as a photo or video in a chat or social app, which re-compresses it and removes the signature. A copy whose location the phone hid still verifies, and so does a capture GeoCam stored in Google Drive, downloaded as the original file.

7.Check a file offline (experts)

Anyone without the app can use the online checker (section 1). To check files without uploading them — or to repeat a check independently, as an expert — use our reference verifier, geocam_verify.py — a single, readable Python script that follows the method in section 9 and gives the same result as the app and the online checker (we test all three on the same set of files). It runs on Windows, macOS and Linux, with Python 3.9 or later:

pip install cryptography
python geocam_verify.py IMG_20261005_101530.jpg
python geocam_verify.py --package GeoCam_evidence_20261005_103000.zip
python geocam_verify.py --json VID_20261005_102000.mp4

It prints each file's SHA-256, the result and its explanation, the signed record and the signer checks. --json gives the same as machine-readable JSON. Exit code 0 means every file is Verified, 1 that a file is Modified, 2 that a file is Unverified or a package or custody check failed. Everything runs on your computer; the optional --google-revocation also downloads Google's public attestation status list, and a revoked certificate in the signer's chain then makes the file Unverified, as on the online checker.

8.Evidence packages & custody logs

An evidence package is a ZIP file made by the app on request. Its files are stored as they are, not recompressed:

To check that a package is complete and unchanged:

sha256sum -c SHA256SUMS.txt            # Linux
shasum -a 256 -c SHA256SUMS.txt        # macOS
certutil -hashfile <file> SHA256       # Windows, file by file

The custody log records, for one capture, each time it was captured and signed, saved to the phone gallery, shared, put in a PDF report, exported in a verification report or evidence package, uploaded to or downloaded back from the user's own Google Drive (Pro), or checked — with the time (phone clock, UTC) and the file's name, size and SHA-256 at that moment. Each entry includes the fingerprint of the one before and is signed with the same hardware key that signed the capture, so an entry can't be changed, removed, reordered or moved to another capture without the check failing. It records only what happened inside GeoCam on that phone — not what happened to copies after they left the app. It can be switched off in Settings.

Tip — fix the time a package existed As soon as you export an evidence package, record its SHA-256 somewhere independent of the phone — for example in an email to your lawyer, or with a trusted time-stamping service or a notary. That shows the package, and every file in it, existed by that time.

9.The method, step by step

For experts. Byte offsets are zero-based; a range [start, end) includes start and excludes end.

9.1 Where the signature is

The media is the file with that segment or box removed.

9.2 The manifest

{ "schemaVersion": 2,
  "signedPayloadB64": "<base64 of the signed payload bytes>",
  "signAlg": "ES256",
  "signatureB64": "<base64 of an ECDSA P-256 / SHA-256 signature, ASN.1 DER>",
  "certChainB64": ["<leaf certificate, DER, base64>", "...", "<root>"] }

The signature covers exactly the payload bytes as embedded — nothing is re-serialised before checking. The payload is UTF-8 JSON with these fields:

FieldMeaning
schemaVersion2
assertionThe signed record (section 5), e.g. capturedAtUtc, tzOffsetMinutes, timeSource (gnss, network or device), gnssTimeUtc, networkTimeUtc, autoTime, signedAtUtc, latitude, longitude, gpsAccuracy, altitude, fixTimeUtc, satellitesUsed, satellitesInView, constellations, mockLocationDetected, deviceMake, deviceModel, osRelease, appId, appVersion, buildId, captureId, provenanceId, parentProvenanceId, transform, measurement.
mediaHashAlgSHA-256
mediaHashHexSHA-256 of the media with every byte of zeroedRanges read as 0x00 (9.3).
zeroedRangesThe location-metadata byte ranges of the media, sorted and non-overlapping: [{"start", "end", "sha256"}], each with the SHA-256 of its bytes at signing.
signAlgES256 (ECDSA P-256 with SHA-256).
publicKeyB64The signing key's SubjectPublicKeyInfo (DER), base64.

9.3 Why location bytes are zeroed

On Android 10 and later, when an app without the media-location permission opens or receives a photo or video, Android overwrites its location metadata with zeros, in place — the file keeps its size but its fingerprint changes. GeoCam therefore signs the media with those bytes read as zero, and signs each range's own fingerprint separately. The ranges are: in a JPEG, the value bytes of every tag in the EXIF GPS IFD; in an MP4, the ©xyz, loci, gps  and gps0 boxes, from their type field to their end. On checking, each range is unchanged (its fingerprint matches), hidden (all zeros) or changed (anything else). The picture and everything else must match exactly.

9.4 The checks, in order

The result is the first rule that applies:

  1. Not a JPEG or MP4 → Unverified (AUTH-009).
  2. schemaVersion higher than 2 → Unverified (AUTH-015).
  3. No signature segment or box → Unverified (AUTH-001).
  4. The manifest or payload can't be read → Unverified (AUTH-010).
  5. The signer. Each certificate in the chain must be signed by the next (ECDSA or RSA, with SHA-256 or SHA-384) up to one of Google's hardware attestation roots (9.5); the leaf's public key must be publicKeyB64; every certificate must be valid at capturedAtUtc; and the leaf's key-attestation extension (OID 1.3.6.1.4.1.11129.2.1.17) must show a key kept in secure hardware (TEE or StrongBox) for the app com.tuvambes.geocam. Otherwise → Unverified (AUTH-006; AUTH-014 when there is no chain).
  6. The key or the leaf certificate is on TUVAMBES's withdrawn list → Unverified (AUTH-007).
  7. The online checker, and the reference verifier with --google-revocation: a certificate in the chain is on Google's attestation status list (revoked or suspended, for example because a phone's keys leaked) → Unverified (AUTH-007). The app works offline and uses the withdrawn list in its signed trust list.
  8. The attestation's root of trust reports a verified-boot state other than Verified, or an unlocked bootloader → Unverified (AUTH-018).
  9. The signature over the payload bytes does not verify with publicKeyB64 → Modified (AUTH-003).
  10. The media hash (9.3) differs from mediaHashHex → Modified (AUTH-004).
  11. A location range is changed → Modified (AUTH-016).
  12. Otherwise → Verified, or Verified – Mark-up / Measurements when transform lists markup or measure; with a note when a location range is hidden.

Notes also report a mock-location flag, and how far the phone's clock was from satellite (else network) time at capture; a difference over 60 seconds is flagged. A report also shows each certificate's SHA-256 and the SHA-256 of the app signing certificate bound to the key — TUVAMBES will confirm on request whether a fingerprint belongs to the official app.

9.5 Trust anchors

RootPublic key (SPKI) SHA-256
Google Hardware Attestation Root (RSA-4096)feb2ea7551ee316ed4bb443c8293b884dbfdea40b603ee3e4f4a897e4580fbae
Google Key Attestation CA1 (ECDSA P-384)3ee44512a1af2beb39c889490c60ea3f82e43f5d5a5532f5ab9419f676cd07ec

Google publishes these roots at developer.android.com. The app carries them, and the withdrawn-key list, in a trust list signed by TUVAMBES; the reference verifier includes the same roots.

9.6 The custody log

Each entry's hashHex is the SHA-256 of the canonical JSON of {recordId, seq, type, atUtc, fileSha256, fileSize, fileName, detail, prevHashHex} — keys sorted, no spaces, UTF-8. prevHashHex is the previous entry's hashHex (empty for the first), seq counts from 0, and signatureB64 is an ECDSA P-256 / SHA-256 signature of the same bytes by publicKeyB64 — the key that signed the capture.

9.7 Earlier format

Pre-release builds of GeoCam wrote manifest version 1, with a plain media hash; every release build writes version 2. The app still checks version 1 files; the reference verifier reports them as Unverified (AUTH-002) and asks you to check them in the app.

10.Diagnostic codes

CodeMeaningResult
AUTH-001No GeoCam signature in the fileUnverified
AUTH-002Earlier signature format (reference verifier only)Unverified
AUTH-003The signed record no longer matches its signatureModified
AUTH-004The picture or video no longer matches its signatureModified
AUTH-006Not signed by the official app on a genuine phoneUnverified
AUTH-007The signing key or a certificate was withdrawn by TUVAMBES or revoked by GoogleUnverified
AUTH-008The file is damagedUnverified
AUTH-009Not a JPEG photo or MP4 videoUnverified
AUTH-010The signature block can't be readUnverified
AUTH-014No certificate chain to check the signerUnverified
AUTH-015Signed by a newer version of GeoCamUnverified
AUTH-016The location in the file's details was changed after signingModified
AUTH-017An earlier-format capture whose location the phone hid (app only)Unverified
AUTH-018The signing phone reported its security as offUnverified

Codes AUTH-005 and AUTH-011 to AUTH-013 are reserved.

11.What a result does not show

12.Using GeoCam files as evidence

Not legal advice Whether a file is admissible, and the weight it carries, is for the court or authority to decide under its own rules. TUVAMBES does not guarantee that any file, result or report will be accepted. Take advice from a lawyer where you are.

A verification result supports the authenticity of the file — that it is the file GeoCam saved, unchanged. What the file shows is usually confirmed by a witness, often the person who took it. To give a capture the most weight:

  1. Keep the files exactly as GeoCam saved them, and keep the original beside any edited copy (on by default).
  2. Export an evidence package soon after the event, and record its SHA-256 independently (section 8).
  3. Hand over the evidence package — the files and the report — rather than screenshots or forwarded copies.
  4. Keep a note of who handled the files and when, after they left the app.
  5. Be ready for the person who took the photo or video to confirm it, and, where the law requires, for a certificate or an expert.

Some examples of the rules that may apply:

13.Contact

Questions about this method, or a request to confirm the official app's signing-certificate fingerprint: contact@tuvambes.in. A file uploaded to the online checker is deleted as soon as it has been checked (section 2); otherwise files never reach TUVAMBES unless you send them to us. See also the Terms and the Privacy Policy.

↑ Back to top