namespace LehrerApp.Sync.Models; /// /// Anfrage zum Upload eines initialen Snapshots. /// Enthält sowohl den verschlüsselten DB-Snapshot /// als auch den mit dem Code verschlüsselten Sync-Schlüssel. /// public class SnapshotUploadRequest { /// /// AES-256-GCM verschlüsselter Dump der lokalen LiteDB. /// Verschlüsselt mit dem Sync-Schlüssel des Nutzers. /// Der Server versteht den Inhalt nicht. /// public string EncryptedPayload { get; init; } = ""; /// /// Der Sync-Schlüssel, verschlüsselt mit dem aus dem /// Einmal-Code abgeleiteten Key (PBKDF2). /// Ermöglicht dem Empfänger den Schlüssel ohne Vorabübertragung /// zu rekonstruieren – nur der Code wird benötigt. /// public string EncryptedSyncKey { get; init; } = ""; public DeviceType DeviceType { get; init; } } /// /// Antwort nach erfolgreichem Snapshot-Upload. /// public class SnapshotUploadResponse { /// /// Menschenlesbarer Einmal-Code. /// Format: WORT-ZZ-WORT, z.B. "TIGER-42-BLAU" /// Dient gleichzeitig zum Abrufen UND zum Entschlüsseln des Sync-Schlüssels. /// public string Code { get; init; } = ""; public DateTime ExpiresAt { get; init; } } /// /// Antwort beim Abrufen eines Snapshots per Code. /// Nach dem ersten Abruf wird der Snapshot vom Server gelöscht. /// public class SnapshotDownloadResponse { /// Der verschlüsselte DB-Snapshot. public string EncryptedPayload { get; init; } = ""; /// /// Der mit dem Code verschlüsselte Sync-Schlüssel. /// Empfänger: Code → PBKDF2 → Code-Key → EncryptedSyncKey entschlüsseln /// → Sync-Key → EncryptedPayload entschlüsseln. /// public string EncryptedSyncKey { get; init; } = ""; public DateTime CreatedAt { get; init; } public DeviceType SourceDeviceType { get; init; } }