From 0e0513e640bef5790631e3c043caadfa58d089e8 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 20 Nov 2024 10:32:25 +0100 Subject: [PATCH] feat(RSAExtensions): Methoden zum Speichern von IRSACryptographer.Pem erstellt. --- .../RSAExtensions.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/DigitalData.Core.Security.Extensions/RSAExtensions.cs b/DigitalData.Core.Security.Extensions/RSAExtensions.cs index 2e70062..ccb0102 100644 --- a/DigitalData.Core.Security.Extensions/RSAExtensions.cs +++ b/DigitalData.Core.Security.Extensions/RSAExtensions.cs @@ -1,4 +1,5 @@ using DigitalData.Core.Abstractions.Security; +using System.Collections.Concurrent; using System.Security.Cryptography; namespace DigitalData.Core.Security.Extensions @@ -40,5 +41,55 @@ namespace DigitalData.Core.Security.Extensions return false; } } + + private static string CreatePath(string key, string? directory = null) + { + directory ??= Environment.CurrentDirectory; + + if (!Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + return Path.Combine(directory, $"{key}.pem"); + } + + private static readonly ConcurrentDictionary FileLocks = new(); + + public static void SavePem(this IRSACryptographer decryptor, string key, string? directory = null) + { + var filePath = CreatePath(key : key, directory : directory); + var fileLock = FileLocks.GetOrAdd(filePath, _ => new (1, 1)); + fileLock.Wait(); + try + { + File.WriteAllText(filePath, decryptor.Pem); + } + finally + { + fileLock.Release(); + } + } + + public static async Task SavePemAsync(this IRSACryptographer decryptor, string key, string? directory = null) + { + var filePath = CreatePath(key: key, directory: directory); + var fileLock = FileLocks.GetOrAdd(filePath, _ => new (1, 1)); + await fileLock.WaitAsync(); + try + { + await File.WriteAllTextAsync(filePath, decryptor.Pem); + } + finally + { + fileLock.Release(); + } + } + + public static void SavePem(this IRSACryptographer decryptor, string issuer, string audience, string? directory = null) + => decryptor.SavePem($"{issuer}:{audience}", directory); + + public static async Task SavePemAsync(this IRSACryptographer decryptor, string issuer, string audience, string? directory = null) + => await decryptor.SavePemAsync($"{issuer}:{audience}", directory); } } \ No newline at end of file