myproductpassport ← Back to the passport
Tamper-evident record

Fernway FX-36 E-Bike Battery

Every published version of this passport is fingerprinted, linked to the version before it and signed. If anything in the record were altered afterwards, the fingerprints below would no longer match.

Unaltered since it was recorded · signatures verified
Current fingerprint (SHA-256)
b7e831dbf369cc947b766db555078e87c54bd5d9e54f7f113c4eb6c2d49d35bc
Last recorded3 Nov 2026, 16:52 UTC
Versions recorded1
SignatureEd25519

History

  1. #1 · Published Signature valid
    Fingerprint: b7e831dbf369cc947b766db555078e87c54bd5d9e54f7f113c4eb6c2d49d35bc
    Chain: cddfa8de6044bb8698b0a86d62eeed064a8b6b891c31a1b7ebdc8639f39b826d

Check it yourself

  1. Download the records as JSON and the public key.
  2. For each record, the chain value is the SHA-256 of: the schema name, the passport ID, the record number, its fingerprint, the previous chain value and the time, one per line.
  3. Check the Ed25519 signature of the chain value against the published key. Each record must also name the chain value of the one before it.
import json, hashlib, base64, urllib.request
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey

doc = json.load(urllib.request.urlopen("https://myproductpassport.eu/p/3daf1fbb-004d-4881-8515-9571e900f3eb/integrity.json"))
keys = {k["key_id"]: k["public_key"] for k in json.load(urllib.request.urlopen("https://myproductpassport.eu/.well-known/mpp-integrity-keys.json"))["keys"]}
prev = None
for r in doc["records"]:
    line = "\n".join([doc["schema"], doc["passport_uuid"], str(r["sequence"]), r["content_hash"], r["previous_hash"] or "", r["recorded_at"]])
    assert hashlib.sha256(line.encode()).hexdigest() == r["chain_hash"] and r["previous_hash"] == prev
    Ed25519PublicKey.from_public_bytes(base64.b64decode(keys[r["key_id"]])).verify(base64.b64decode(r["signature"]), r["chain_hash"].encode())
    prev = r["chain_hash"]
print("verified", len(doc["records"]), "records")

The fingerprint covers the whole record, including restricted information and a hash of every attached document, so it proves the record has not changed without revealing what it holds. It shows the passport has not been altered since it was recorded; it does not certify that the information in it is correct, which remains the responsibility of the economic operator who published it.