using DigitalData.Core.Abstractions.Security; using Microsoft.Extensions.Logging; using System.Text; namespace DigitalData.Core.Security { public class CryptFactory : RSAFactory, ICryptFactory { private readonly IDictionary _decryptors; public IRSADecryptor this[string key] { get => _decryptors[key]; set => _decryptors[key] = value; } public Func RSADecryptorKeyFormatter { get; } public CryptFactory(ILogger logger, IDictionary decryptors, Func rsaDecryptorKeyFormatter) : base() { _decryptors = decryptors ?? new Dictionary(); RSADecryptorKeyFormatter = rsaDecryptorKeyFormatter; logger?.LogInformation("Core.Secrets version: {Version}, Created on: {CreationDate}.", Secrets.Version, Secrets.CreationDate.ToString("dd.MM.yyyy")); } public bool TryGetRSADecryptor(string key, out IRSADecryptor? decryptor) => _decryptors.TryGetValue(key, out decryptor); public static string DefaultRSADecryptorKeyFormatter(IRSADecryptor decryptor, string issuer, string audience, string separator = "-_-") { var sb = new StringBuilder(issuer.Length + audience.Length + separator.Length * 2 + 20); sb.Append(issuer).Append(separator).Append(audience).Append(separator); if (decryptor.HasEncryptedPem) sb.Append("e-private").Append(separator).Append(decryptor.PasswordVersion); else sb.Append("private"); var rsaKey = sb.Append(".pem").ToString(); if (Path.GetInvalidFileNameChars().Any(rsaKey.Contains)) throw new ArgumentException("RSA decryptor key name creation is forbidden. The key contains forbidden characters that are not allowed in file naming.", nameof(rsaKey)); return rsaKey; } } }