WINDI Documentation
← Zurück
WINDI System Föderation Merkle Transparency Log
CT-STYLE RFC 6962 PHASE 3B APPEND-ONLY

WINDI Merkle Transparency Log

Öffentliche, append-only, kryptografische Transparenz für combined_root_hash Anker von WINDI-Knoten.

Zweck

Der WINDI Merkle Transparency Log bietet öffentliche, append-only, kryptografische Transparenz für combined_root_hash-Anker, die von WINDI-Knoten und/oder dem Hub emittiert werden.

Ermöglicht jedem Dritten die Verifizierung, dass:

  • ein bestimmter combined_root_hash veröffentlicht wurde
  • zu oder vor einem bestimmten Zeitpunkt
  • in einem append-only Log (mit Konsistenzbeweisen)
  • mit kompakten Verifikationsbeweisen (Inclusion Proofs)

Dieses Design folgt CT-Prinzipien (RFC 6962 Familie): Leaf-Hashing mit Präfix 0x00, Node-Hashing mit Präfix 0x01, periodische Signed Tree Heads (STH) signiert vom Log-Betreiber.

Terminologie

BegriffDefinition
Leaf payloadKanonisches JSON, das einen Ankereintrag beschreibt (z.B. combined_root_hash, node_id, ts).
Leaf hashSHA256(0x00 || canonical_json(leaf_payload))
Node hashSHA256(0x01 || left_hash || right_hash)
Merkle rootRoot-Hash über tree_size Blätter.
STHSigned Tree Head — signierte Aussage über (tree_size, timestamp, root_hash) vom Log-Betreiber.
Inclusion proofAuditpfad, der beweist, dass ein Blatt in einem Baum der Größe tree_size enthalten ist.
Consistency proofBeweis, dass ein neuerer Baum eine append-only-Erweiterung eines älteren Baums ist.

Bedrohungsmodell

Im Geltungsbereich

Nachträgliche ManipulationSobald ein Blatt in einem STH enthalten ist, kann ein Angreifer es nicht ändern/entfernen, ohne Beweise oder Konsistenz zu brechen.
RückdatierungDer Log bietet öffentliche Ordnung und einen signierten STH-Zeitstempel; die Veröffentlichung kann extern auditiert werden.
Stille ÄnderungenWenn ein System versucht, die Geschichte nach dem Anchoring umzuschreiben, kann der Beweis gegen den öffentlichen Log geprüft werden.
Split-View-AngriffeMit STH-Pinning und Konsistenzverifikation können Clients Log-Rollback oder divergente Ansichten erkennen. Nur wenn Monitors/Pinning verwendet werden.

Außerhalb des Geltungsbereichs

Unehrlicher BetreiberWenn der Betreiber einen Anker nie veröffentlicht, kann der Log nicht beweisen, dass er existierte.
Kompromittierter SignaturschlüsselEin kompromittierter Schlüssel kann betrügerische STHs signieren. Gegenmaßnahme: Schlüsselrotation, Keyset-Historie, Multi-Party-Monitoring.
Falsche Hash-GenerierungDer Log beweist nur die Veröffentlichung des Hash; die Korrektheit wird durch WINDI Bundle-Verifikation (WCAF-Kette, Signaturen) validiert.
ZeitgenauigkeitDer Zeitstempel im STH wird vom Betreiber behauptet. Stärkere Garantien durch Verankerung an externem Zeitstempelsystem möglich.

Sicherheitseigenschaften

Was bewiesen wird

Gegeben: combined_root_hash, leaf_index, STH, Inclusion Proof und öffentlicher Schlüssel — kann ein Verifizierer beweisen:

  1. Der combined_root_hash entspricht einem Blatt im Merkle-Baum der Größe tree_size.
  2. Der Baum-Root für tree_size stimmt mit dem signierten STH überein.
  3. Daher war der combined_root_hash spätestens zum STH.timestamp im Log enthalten.
  4. Mit Konsistenzbeweisen: Der Log ist append-only über die Zeit (kein Rollback, kein Umschreiben).

Was NICHT bewiesen wird

  • Dass das zugrunde liegende Dokument gültig ist (→ WINDI/WCAF-Kette)
  • Dass der Aussteller vertrauenswürdig ist (→ Issuer Registry + Policy)
  • Dass der Zeitstempel global genau ist (nur dass der Betreiber ihn signiert hat)
  • Dass der Log global konsistent ist, wenn keine Monitors/Pinning existieren

Datenmodell

Leaf Payload (Canonical JSON)

{
  "combined_root_hash": "<64 hex>",
  "node_id": "node:<...>",     // optional but recommended
  "ts": "ISO-8601 timestamp"   // server time of log append
}

Leaf Hash

leaf_hash = SHA256(0x00 || canonical_json(leaf_payload))

Node Hash

node_hash = SHA256(0x01 || left_hash || right_hash)

API Endpoints

POST /anchors
Anker hinzufügen

Request:

{
  "combined_root_hash": "<64 hex>",
  "node_id": "node:<...>"      // optional
}

Response:

{
  "leaf_index": 42,
  "leaf_hash": "<hex>",
  "sth": { ... }               // optional
}
GET /sth
Aktueller Signed Tree Head
{
  "tree_size": 12345,
  "timestamp": "ISO-8601",
  "root_hash": "<hex>",
  "signature_alg": "Ed25519",
  "signature": "<base64>",
  "key_id": "hub-log-2026"
}
GET /lookup?combined_root_hash=<hex>
Suche nach combined_root_hash
{
  "found": true,
  "leaf_index": 42,
  "leaf_hash": "<hex>",
  "ts": "ISO-8601",
  "node_id": "node:..."
}
GET /proof/inclusion?leaf_index=<n>&tree_size=<m>
Inklusionsbeweis
{
  "leaf_index": 42,
  "tree_size": 12345,
  "audit_path": ["<hex>", "<hex>", ...]
}
GET /proof/consistency?old_size=<n>&new_size=<m>
Konsistenzbeweis
{
  "old_size": 8000,
  "new_size": 12345,
  "consistency_path": ["<hex>", "..."]
}
GET /verify/:combined_root_hash
Komfort-Verifikationsbundle
{
  "lookup": { ... },
  "sth": { ... },
  "inclusion_proof": { ... }
}
GET /pubkey
Öffentlicher Schlüssel
{
  "key_id": "hub-log-2026",
  "algorithm": "Ed25519",
  "public_key_pem": "-----BEGIN PUBLIC KEY-----..."
}

Verifikationsalgorithmen (Client)

STH-Signatur verifizieren

Input: sth, log_public_key

  1. JSON {tree_size, timestamp, root_hash} kanonisieren
  2. Ed25519-Signatur über kanonische JSON-Bytes verifizieren

Inklusionsbeweis verifizieren

Input: leaf_payload, audit_path, leaf_index, tree_size, sth.root_hash

  1. leaf_hash = SHA256(0x00 || canonical_json(leaf_payload))
  2. Mit audit_path gemäß leaf_index-Position kombinieren, um Root zu rekonstruieren
  3. Rekonstruierten Root mit sth.root_hash vergleichen

Konsistenzbeweis verifizieren

Input: old_sth, new_sth, consistency_path

  1. Verifizieren, dass Root von old_size als Präfix von new_size konsistent ist
  2. Rollback/Split-View erkennen, wenn gepinnte STHs divergieren

STH Lifecycle

Emissionsrichtlinien

  • STH alle N Appends emittieren (z.B. 100)
  • STH alle T Minuten emittieren (z.B. 1 min)
  • STH auf Anfrage emittieren (weniger ideal)

Client-Pinning (empfohlen)

Clients sollten persistieren:

{
  "tree_size": 12345,
  "root_hash": "<hex>",
  "timestamp": "ISO-8601",
  "key_id": "hub-log-2026"
}

Bei nächster Verifikation: neuen STH abrufen → tree_size ≥ gepinnten → Konsistenzbeweis abrufen und verifizieren → bei Fehlschlag: Rollback/Split-View melden.

Betriebsempfehlungen

COMPATIBILITY NOTE

WINDI-Kerncodes bleiben sprachneutral. Menschenlesbarer Inhalt gehört zu i18n-Paketen; der Transparency Log speichert nur kryptografische Anker.