fepli
EntwicklerAPI-Ressourcen

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) oder on.

  • Name
    encrypting
    Typ
    boolean
    Beschreibung

    Ob Schreibzugriffe versiegelt ankommen müssen: true ab running.

  • Name
    tenant
    Typ
    object
    Beschreibung

    Der Mandant, mit uuid und name.

  • Name
    team
    Typ
    object
    Beschreibung

    Der Team-Schlüssel, für den jeder Datensatzschlüssel versiegelt wird: keyId, encPub (X25519) und signPub (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, registeredAt und status, bis zum Vergleich pending, danach confirmed mit seinem scope: {"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 in verifier (mit user), der Team-Schlüssel in group, teamSignPub und die bisherigen Nachrichten in exchange (start, accept, keyA, keyB, macA, macB, cancel). Er bleibt nach dem Vergleich, damit Sie macA prüfen können.


GET/e2e

Den 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.

GET/e2e
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"
  }
}

POST/e2e/key

Einen 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.

POST/e2e/key
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.


POST/e2e/key/accept

Einen 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)).

POST/e2e/key/accept
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"}'

POST/e2e/key/keyB

Den 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.

POST/e2e/key/keyB
curl -X POST https://example.fepli.eu/api/e2e/key/keyB \
  -H "Authorization: Bearer $FEPLI_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"pub": "iPdR1AZknGX95mTA3b7GloMdLVXgwEYCPm0Mslh1p34"}'

POST/e2e/key/macB

Die 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.

POST/e2e/key/macB
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"}'

POST/e2e/key/cancel

Einen 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) oder key.

POST/e2e/key/cancel
curl -X POST https://example.fepli.eu/api/e2e/key/cancel \
  -H "Authorization: Bearer $FEPLI_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"reason": "mismatch"}'

War diese Seite hilfreich?