< Summary

Information
Class: LOCKnet.Core.DataAbstractions.VaultHeader
Assembly: LOCKnet.Core
File(s): /home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.Core/DataAbstractions/VaultHeader.cs
Line coverage
100%
Covered lines: 23
Uncovered lines: 0
Coverable lines: 23
Total lines: 86
Line coverage: 100%
Branch coverage
50%
Covered branches: 1
Total branches: 2
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.Core/DataAbstractions/VaultHeader.cs

#LineLine coverage
 1using System.Text.Json;
 2
 3namespace LOCKnet.Core.DataAbstractions;
 4
 5/// <summary>
 6/// Persistierter Vault-Header.
 7/// Er enthaelt die Informationen, die benoetigt werden, um aus dem Master-Passwort
 8/// einen KEK abzuleiten und damit den eigentlichen Vault-Key zu entpacken.
 9/// </summary>
 10public sealed class VaultHeader
 11{
 12  /// <summary>Aktuelle Versionsnummer des Header-Formats.</summary>
 169113  public int FormatVersion { get; set; } = VaultHeaderFormatVersion.WrappedVaultKeyV1;
 14
 15  /// <summary>Bezeichner der verwendeten KDF, z.B. <c>PBKDF2-SHA256</c>.</summary>
 132016  public string KdfIdentifier { get; set; } = string.Empty;
 17
 18  /// <summary>Persistierte Parameter fuer die KDF.</summary>
 200319  public VaultKdfParameters KdfParameters { get; set; } = new();
 20
 21  /// <summary>Salt fuer die KEK-Ableitung.</summary>
 136522  public byte[] Salt { get; set; } = [];
 23
 24  /// <summary>
 25  /// AES-GCM-verpackter Vault-Key.
 26  /// Der Inhalt wird mit dem aus dem Master-Passwort abgeleiteten KEK entpackt.
 27  /// </summary>
 143228  public byte[] WrappedVaultKey { get; set; } = [];
 29
 30  /// <summary>
 31  /// Kompatibilitaets-Hash fuer Legacy-Migrationen vorhandener Datenbanken.
 32  /// Neue Unlocks verlassen sich primaer auf <see cref="WrappedVaultKey"/>.
 33  /// </summary>
 133634  public byte[] LegacyPasswordHash { get; set; } = [];
 35
 36  /// <summary>
 37  /// Gibt an, ob der aktuell verpackte VaultKey noch aus einem Legacy-KDF-Schluessel stammt
 38  /// und deshalb vor kryptografisch abgeschlossener Passwortrotation ersetzt werden muss.
 39  /// </summary>
 82140  public bool UsesLegacyKeyMaterial { get; set; }
 41
 42  /// <summary>
 43  /// Markiert, dass nach einer Migration oder Plausibilitaetsverletzung noch eine SQLite-Kompaktierung aussteht.
 44  /// </summary>
 85045  public bool RequiresStorageCompaction { get; set; }
 46
 47  /// <summary>UTC-Zeitstempel des letzten Kompaktierungsversuchs.</summary>
 74548  public DateTime? LastStorageCompactionAttemptUtc { get; set; }
 49
 50  /// <summary>Klassifizierter Fehler des letzten Kompaktierungsversuchs.</summary>
 73051  public StorageCompactionFailureKind LastStorageCompactionFailureKind { get; set; }
 52
 53  /// <summary>Technische Kurzinfo des letzten Kompaktierungsversuchs.</summary>
 71754  public string? LastStorageCompactionError { get; set; }
 55
 56  /// <summary>Persistierter Zustand einer spaeteren Plain-zu-encrypted-Storage-Migration.</summary>
 39657  public VaultStorageMigrationState StorageMigrationState { get; set; }
 58
 59  /// <summary>Aktuelles Ziel der persistierten Storage-Migration.</summary>
 36960  public VaultStorageMigrationTargetMode StorageMigrationTargetMode { get; set; }
 61
 62  /// <summary>UTC-Zeitstempel des letzten Storage-Migrationsversuchs.</summary>
 36963  public DateTime? LastStorageMigrationAttemptUtc { get; set; }
 64
 65  /// <summary>Technische Kurzinfo des letzten Storage-Migrationsfehlers.</summary>
 37166  public string? LastStorageMigrationError { get; set; }
 67
 68  /// <summary>UTC-Zeitstempel der Erstellung.</summary>
 67069  public DateTime CreatedAt { get; set; }
 70
 71  /// <summary>UTC-Zeitstempel der letzten Aenderung.</summary>
 71272  public DateTime UpdatedAt { get; set; }
 73
 74  /// <summary>Serialisiert den Header in JSON, z.B. fuer Tests oder Exportformate.</summary>
 75  public string Serialize()
 876    => JsonSerializer.Serialize(this);
 77
 78  /// <summary>Deserialisiert einen JSON-String in einen Vault-Header.</summary>
 79  /// <param name="json">Der serialisierte JSON-String.</param>
 80  public static VaultHeader Deserialize(string json)
 181  {
 182    ArgumentException.ThrowIfNullOrWhiteSpace(json);
 183    return JsonSerializer.Deserialize<VaultHeader>(json)
 184      ?? throw new InvalidOperationException("Vault-Header konnte nicht deserialisiert werden.");
 185  }
 86}