From 155eb563d1e0dfea5a2d2905f2b24c9b27438f80 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 16 Dec 2024 16:37:48 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20Lazy-Initialisierung=20f=C3=BCr=20threa?= =?UTF-8?q?dsichere=20RSAFactoryParams-Initialisierung=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Lazy-Initialisierungsmechanismus für threadsichere Handhabung der _pbeParameters eingeführt. - IsInitialized-Eigenschaft hinzugefügt, um den Initialisierungsstatus zu verfolgen. - Konstruktor geändert, um das Lazy-Objekt zu initialisieren und das AfterCreate-Ereignis auszulösen. - Sichergestellt, dass die OnDeserialized-Methode Init aufruft, um das Objekt korrekt zu initialisieren. --- .../Config/AsymCryptParams.cs | 51 ++++++++++--------- .../Config/RSAFactoryParams.cs | 24 ++++++++- .../Cryptographer/RSAFactory.cs | 6 ++- 3 files changed, 54 insertions(+), 27 deletions(-) diff --git a/DigitalData.Core.Security/Config/AsymCryptParams.cs b/DigitalData.Core.Security/Config/AsymCryptParams.cs index fc4ce19..6f80c0b 100644 --- a/DigitalData.Core.Security/Config/AsymCryptParams.cs +++ b/DigitalData.Core.Security/Config/AsymCryptParams.cs @@ -38,40 +38,41 @@ namespace DigitalData.Core.Security.Config public RSADecryptor? Vault { get; init; } - public override void OnDeserialized() + public AsymCryptParams() { - base.OnDeserialized(); - - // Create root folder if it does not exist - if (!Directory.Exists(PemDirectory)) - Directory.CreateDirectory(PemDirectory); - - foreach (var decryptor in Decryptors) + AfterCreate += () => { - // set default path - if (decryptor.IsPemNull) + // Create root folder if it does not exist + if (!Directory.Exists(PemDirectory)) + Directory.CreateDirectory(PemDirectory); + + foreach (var decryptor in Decryptors) { - var file_name_params = new List { decryptor.Issuer, decryptor.Audience }; - if (decryptor.IsEncrypted) - file_name_params.Add(Secrets.Version); + // set default path + if (decryptor.IsPemNull) + { + var file_name_params = new List { decryptor.Issuer, decryptor.Audience }; + if (decryptor.IsEncrypted) + file_name_params.Add(Secrets.Version); - var path = Path.Combine(PemDirectory, string.Join(FileNameSeparator, file_name_params)); + var path = Path.Combine(PemDirectory, string.Join(FileNameSeparator, file_name_params)); - if (File.Exists(path)) - decryptor.SetPem(File.ReadAllText(path)); - else - { - var pem = decryptor.IsEncrypted - ? Instance.RSAFactory.CreateEncryptedPrivateKeyPem(pbeParameters: PbeParameters, keySizeInBits: KeySizeInBits, password: Secrets.PBE_PASSWORD) - : Instance.RSAFactory.CreatePrivateKeyPem(keySizeInBits: KeySizeInBits); + if (File.Exists(path)) + decryptor.SetPem(File.ReadAllText(path)); + else + { + var pem = decryptor.IsEncrypted + ? Instance.RSAFactory.CreateEncryptedPrivateKeyPem(pbeParameters: PbeParameters, keySizeInBits: KeySizeInBits, password: Secrets.PBE_PASSWORD) + : Instance.RSAFactory.CreatePrivateKeyPem(keySizeInBits: KeySizeInBits); - decryptor.SetPem(File.ReadAllText(pem)); + decryptor.SetPem(File.ReadAllText(pem)); - // Save file in background - Task.Run(async () => await File.WriteAllTextAsync(path: path, pem)); + // Save file in background + Task.Run(async () => await File.WriteAllTextAsync(path: path, pem)); + } } } - } + }; } } } \ No newline at end of file diff --git a/DigitalData.Core.Security/Config/RSAFactoryParams.cs b/DigitalData.Core.Security/Config/RSAFactoryParams.cs index 5ab57f2..91469b5 100644 --- a/DigitalData.Core.Security/Config/RSAFactoryParams.cs +++ b/DigitalData.Core.Security/Config/RSAFactoryParams.cs @@ -22,6 +22,28 @@ namespace DigitalData.Core.Security.Config [JsonIgnore] public PbeParameters PbeParameters => _pbeParameters!; - public virtual void OnDeserialized() => _pbeParameters = new PbeParameters(PbeEncryptionAlgorithm, PbeHashAlgorithmName, PbeIterationCount); + /// + /// Provides a thread-safe initialization mechanism using Lazy initialization. + /// + private readonly Lazy _lazyInitializer; + + public bool IsInitialized => _lazyInitializer.IsValueCreated; + + public RSAFactoryParams() + { + _lazyInitializer = new(() => + { + AfterCreate?.Invoke(); + return true; + }); + + AfterCreate += () => _pbeParameters = new PbeParameters(PbeEncryptionAlgorithm, PbeHashAlgorithmName, PbeIterationCount); + } + + protected event Action AfterCreate; + + public void Init() => _ = _lazyInitializer.Value; + + public void OnDeserialized() => Init(); } } \ No newline at end of file diff --git a/DigitalData.Core.Security/Cryptographer/RSAFactory.cs b/DigitalData.Core.Security/Cryptographer/RSAFactory.cs index 8e174cd..6b0216a 100644 --- a/DigitalData.Core.Security/Cryptographer/RSAFactory.cs +++ b/DigitalData.Core.Security/Cryptographer/RSAFactory.cs @@ -9,7 +9,11 @@ namespace DigitalData.Core.Security.Cryptographer { protected readonly TRSAFactoryParams _params; - public RSAFactory(IOptions options) => _params = options.Value; + public RSAFactory(IOptions options) + { + options.Value.Init(); + _params = options.Value; + } public string CreatePrivateKeyPem(int? keySizeInBits = null, bool encrypt = false) => encrypt ? CreateEncryptedPrivateKeyPem(keySizeInBits: keySizeInBits)