Jetzt hab ich die vollständige Antwort — und sie überrascht: PrivKeys eigentliches Lizenzsystem ist gar keine Server-Aktivierung mit Fail-open, sondern genau Variante 2, die ich dir vorgeschlagen hatte.
Aus LicenseManager.java und ActivationApi.java:
So funktioniert es wirklich:
- Einmalig online:
ActivationApi.tryActivate(code, deviceId)— ein einziger Serveraufruf beim Aktivieren, mit einer Geräte-ID (vermutlich um zu verhindern, dass ein Code auf beliebig vielen Geräten läuft). Das ist der einzige Netzwerkkontakt im ganzen System. - Danach für immer rein lokal: Der Server liefert einen ECDSA-signierten Lizenzcode zurück, der lokal in
EncryptedSharedPreferencesgespeichert wird. Jede spätere Prüfung (isActivated(),getAccessState()) verifiziert nur noch die Signatur gegen einen fest im APK eingebauten öffentlichen Schlüssel (PUBLIC_KEY_BASE64, EC/SHA256withECDSA) — komplett offline, kein weiterer Serverkontakt, für immer. - Kein periodisches Nachprüfen, kein Fail-open-Mechanismus, keine Frist. Es gibt schlicht nichts, das ablaufen könnte — die Signatur ist entweder gültig oder nicht, für immer. Meine Vermutung eines „Fail-open nach X Tagen“ beim Lizenzsystem war also falsch — dieses Verhalten existiert bei PrivKey nur bei der Zeitkapsel (
NetworkTimeSync, 7 Tage), nicht bei der Lizenz. - Zusätzlich ein Demo-Modus: 8 Nutzungen (
DEMO_MAX_USES = 8), lokal heruntergezählt, komplett zeitunabhängig — kein Ablaufdatum, sondern ein Nutzungs-Kontingent.
Für Tresor heißt das: Es gibt bei PrivKey exakt das, was ich als „lokales signiertes Lizenz-Token“ vorgeschlagen hatte — nur zusätzlich mit einer Geräte-Bindung beim einmaligen Aktivieren. Damit erübrigt sich deine ursprüngliche Frage 2 komplett: Es gibt keine Frist, weil nach der einmaligen Aktivierung nie wieder online geprüft wird.
Willst du das für Tresor genauso übernehmen — einmalige Server-Aktivierung mit Geräte-Bindung, danach für immer lokale Signaturprüfung, kein erneuter Online-Kontakt?