Verschlüsselung
Über /e2e nimmt eine Integration an der Ende-zu-Ende-Verschlüsselung eines Mandanten teil: der Team-Schlüssel, für den sie Datensätze versiegelt, ihr eigener Schlüssel und ihre Seite des Emoji-Vergleichs mit eines Super-Admins. Die Schritte und das Format stehen unter Ende-zu-Ende-Verschlüsselung.
GET /e2e geht mit jedem Token. Die übrigen Endpunkte sind nur für Service-Accounts (für ein persönliches API-Token 403), und ein Token mit Nur lesen darf sie nutzen: Ein Schlüssel ändert nichts am Mandanten.
Das Modell des Verschlüsselungsstands
- Name
phase- Typ
- string
- Beschreibung
off,running(der Browser des Teams verschlüsselt die gespeicherten Datensätze) oderon.
- Name
encrypting- Typ
- boolean
- Beschreibung
Ob Schreibzugriffe versiegelt ankommen müssen:
trueabrunning.
- Name
tenant- Typ
- object
- Beschreibung
Der Mandant, mit
uuidundname.
- Name
team- Typ
- object
- Beschreibung
Der Team-Schlüssel, für den jeder Datensatzschlüssel versiegelt wird:
keyId,encPub(X25519) undsignPub(Ed25519), base64url. Vertrauen Sie ihm nur so, wie der Emoji-Vergleich ihn bestätigt hat.
- Name
fingerprint- Typ
- string
- Beschreibung
Der Fingerabdruck des Team-Signaturschlüssels, wie das Admin-Panel und das Notfall-Kit des Mandanten ihn zeigen.
- Name
statement, statementSig- Typ
- object, string
- Beschreibung
Was das Team beim Einschalten der Verschlüsselung erklärt hat, und seine Ed25519-Signatur über das kanonische JSON. Siehe Die Aussage des Mandanten.
- Name
sealedFields- Typ
- object
- Beschreibung
Die versiegelten Felder je Datensatztyp, z. B.
{"participant": ["firstname", "lastname"]}. Ein Schreibzugriff enthält für jedes einen Umschlag.
- Name
key- Typ
- object
- Beschreibung
Der eigene Schlüssel des Service-Accounts:
keyId,encPub,signPub,fingerprint,registeredAtundstatus, bis zum Vergleichpending, danachconfirmedmit seinemscope:{"kind": "team"}für alle Teilnehmer:innen oder{"kind": "host", "hostUuid", "name"}für die Kinder einer Veranstalter:in. Fehlt ohne Schlüssel.
- Name
request- Typ
- object
- Beschreibung
Der Vergleich des Schlüssels:
status(pending,running,completed,cancelled,expired),txn,scope, der Schlüssel des Admins inverifier(mituser), der Team-Schlüssel ingroup,teamSignPubund die bisherigen Nachrichten inexchange(start,accept,keyA,keyB,macA,macB,cancel). Er bleibt nach dem Vergleich, damit SiemacAprüfen können.
/e2eDen Verschlüsselungsstand abrufen
Gibt den Stand der Verschlüsselung des Mandanten zurück. Für ein persönliches API-Token fehlen key und request. Fragen Sie ihn während eines Vergleichs wiederholt ab, um die Nachrichten des Admins zu sehen.
curl https://example.fepli.eu/api/e2e \
-H "Authorization: Bearer $FEPLI_TOKEN"
Antwort (Auszug)
{
"phase": "on",
"encrypting": true,
"tenant": {
"uuid": "0191c7a0-1b2c-7d3e-8f40-5a6b7c8d9e01",
"name": "Ferienpass Elmsbrück"
},
"team": {
"keyId": "9e2b4c6d-8f01-4a23-b456-7c8d9e0f1a2b",
"encPub": "…",
"signPub": "…"
},
"fingerprint": "4F2A 9C1E 77B0 D3A5 0E6C 18F9",
"sealedFields": {
"participant": ["firstname", "lastname"]
},
"key": {
"keyId": "3f0c2c1e-8a4b-4c5d-9e6f-7a8b9c0d1e2f",
"encPub": "ER0ZP0Nvhdmt1HnwTD5pDCPBpt_YMHXfiQyQWTuB8zs",
"signPub": "yumW6j3VfgKQ42w3izlE0nIs9Wwp9i6h3zZsjCswOdM",
"fingerprint": "F6F0 F48E D485 AF87 5737 9FBE",
"status": "confirmed",
"scope": { "kind": "team" },
"registeredAt": "2026-10-26T10:05:00+01:00"
}
}
/e2e/keyEinen Schlüssel anmelden
Meldet die öffentlichen Hälften der Schlüsselpaare des Service-Accounts an. Der Schlüssel wartet dann auf den Emoji-Vergleich eines Super-Admins; vorher wird nichts für ihn versiegelt. Ein noch wartender Schlüssel wird ersetzt. Solange der Service-Account einen bestätigten Schlüssel hat, wird ein neuer abgelehnt (409), bis ein Super-Admin den alten widerruft. Verschlüsselt der Mandant nicht, ist die Antwort ebenfalls 409.
Pflichtattribute
- Name
keyId- Typ
- string
- Beschreibung
Eine UUID der Version 4, die Sie für den Schlüssel wählen.
- Name
encPub- Typ
- string
- Beschreibung
Der öffentliche X25519-Schlüssel, für den Datensätze versiegelt werden: 32 Byte, base64url.
- Name
signPub- Typ
- string
- Beschreibung
Der öffentliche Ed25519-Schlüssel: 32 Byte, base64url.
curl -X POST https://example.fepli.eu/api/e2e/key \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"keyId": "3f0c2c1e-8a4b-4c5d-9e6f-7a8b9c0d1e2f",
"encPub": "ER0ZP0Nvhdmt1HnwTD5pDCPBpt_YMHXfiQyQWTuB8zs",
"signPub": "yumW6j3VfgKQ42w3izlE0nIs9Wwp9i6h3zZsjCswOdM"
}'
Die Antwort (200 OK) ist der Verschlüsselungsstand, mit key.status pending.
/e2e/key/acceptEinen Vergleich annehmen
Beantwortet den Vergleich, den ein Super-Admin gestartet hat (request.status running, request.exchange.start vorhanden), mit Ihrer Festlegung auf einen X25519-Einmal-Schlüssel, den Sie nur für diesen Vergleich erzeugen.
Pflichtattribute
- Name
commit- Typ
- string
- Beschreibung
base64url(SHA-256(öffentlicher Einmal-Schlüssel ‖ kanonisches JSON von
request.exchange.start)).
curl -X POST https://example.fepli.eu/api/e2e/key/accept \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"commit": "shmSD_06nVsrjXtdH0TeEgrfbIlA5k_nfKahJmAfdvc"}'
/e2e/key/keyBDen Einmal-Schlüssel senden
Sendet Ihren öffentlichen X25519-Einmal-Schlüssel, sobald der des Admins in request.exchange.keyA steht. Danach berechnen beide Seiten die 7 Emojis.
Pflichtattribute
- Name
pub- Typ
- string
- Beschreibung
Der öffentliche Einmal-Schlüssel, auf den Sie sich festgelegt haben, base64url.
curl -X POST https://example.fepli.eu/api/e2e/key/keyB \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"pub": "iPdR1AZknGX95mTA3b7GloMdLVXgwEYCPm0Mslh1p34"}'
/e2e/key/macBDie Emojis bestätigen
Bestätigt, dass die Emojis übereinstimmen, mit Ihrer MAC über Ihren Schlüssel. Der Admin bestätigt auf seiner Seite; sein Browser unterschreibt Ihren Schlüssel dann ins Verzeichnis des Mandanten, und key.status wird confirmed. Prüfen Sie macA des Admins, bevor Sie dem Team-Schlüssel vertrauen.
Pflichtattribute
- Name
mac- Typ
- string
- Beschreibung
HMAC-SHA256 über das kanonische JSON von
{"key": {"keyId", "encPub", "signPub", "userUuid"}}, base64url. Siehe Der Emoji-Vergleich.
curl -X POST https://example.fepli.eu/api/e2e/key/macB \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mac": "VUhqONFtbXZXxeTg49Vt-9mlbfTsd5Ulw03VTtSxS6k"}'
/e2e/key/cancelEinen Vergleich abbrechen
Bricht den Vergleich ab. Nichts wird freigegeben; der Admin kann einen neuen starten.
Pflichtattribute
- Name
reason- Typ
- string
- Beschreibung
mismatch(die Emojis weichen ab),cancelled,commitment,mac(eine MAC stimmt nicht) oderkey.
curl -X POST https://example.fepli.eu/api/e2e/key/cancel \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"reason": "mismatch"}'