Zum Inhalt springen

Signaturen mehrerer Pässe prüfen

Prüfen Sie die Ed25519-Signaturen einer Liste öffentlicher Pässe offline, laden Sie das Schlüsselset nur einmal und geben Sie je Pass ein Ergebnis aus.

Das Skript erwartet Pass-UUIDs (den Teil nach urn:dpp:) als Argumente, lädt das Schlüsselset von /.well-known/batterypass/keys.json einmal und prüft jeden Pass wie in Passsignatur offline prüfen beschrieben: document nach RFC 8785 kanonisieren, den SHA-256 mit verification.hash vergleichen und die Ed25519-Signatur mit dem Schlüssel prüfen, den verification.key_id nennt. Einen API-Schlüssel braucht es nicht. Ist ein Pass nicht valid, endet es mit dem Status 1; es passt also in einen Monitoring-Job oder eine Wareneingangsprüfung.

Der Tab cURL nutzt stattdessen verifyPassport: Dort prüft der Server die Signaturen für Sie. Das geht schnell, verlässt sich aber auf die Antwort des Servers.

#!/usr/bin/env bash
# verify-many.sh <passport-uuid>...: the server-side check with verifyPassport (needs curl and jq)
for id in "$@"; do
  curl -sS "$BATTERYPASS_URL/api/v1/public/passports/$id/verify" |
    jq -r --arg id "$id" '"\($id)\t\(if .valid == true then "valid (version \(.version_no))" elif .code then .code else "INVALID" end)"'
done
Ausgabe
0192f0c4-7d1e-7a3b-9c55-2f1e8d4a6b10	valid
0192f0c4-7d1e-7a3b-9c55-2f1e8d4a6b11	not checked (qr_locked)
0192f0c4-7d1e-7a3b-9c55-2f1e8d4a6b12	error 404

not checked heißt, dass der Pass gerade nicht öffentlich ist (sein status steht dabei); ein signiertes Dokument gibt es dann nicht. Öffentliche Abrufe sind auf 300 Anfragen pro Minute und Client-Adresse begrenzt; bei langen Listen legen Sie eine Pause ein oder behandeln 429 wie unter Fehler und Wiederholungen. Um Pässe eines anderen Herstellers zu prüfen, setzen Sie BATTERYPASS_URL auf die Adresse, von der dessen Pässe stammen.