using System.Reflection; using System.Security.Cryptography; using System.Text.Json.Serialization; namespace DigitalData.Core.Security.Config { public class RSAFactoryParams { public int KeySizeInBits { get; init; } = Default.KeySizeInBits; public string PbePassword { internal get; init; } = Default.PbePassword; public PbeEncryptionAlgorithm PbeEncryptionAlgorithm { get; init; } = Default.PbeEncryptionAlgorithm; public HashAlgorithmName PbeHashAlgorithm { get; init; } = Default.PbeHashAlgorithm; // TODO: add as json converter to IConfigurIConfiguration.Config public string PbeHashAlgorithmName { get => PbeHashAlgorithm.ToString(); init => PbeHashAlgorithm = (typeof(HashAlgorithmName).GetProperty(value, BindingFlags.Public | BindingFlags.Static)?.GetValue(null) is HashAlgorithmName hashAlgorithmName) ? hashAlgorithmName : new(value); } public int PbeIterationCount { get; init; } = Default.PbeIterationCount; public string EncryptedPrivateKeyPemLabel { get; init; } = Default.EncryptedPrivateKeyPemLabel; private readonly Lazy _lazyPbeParameters; [JsonIgnore] public PbeParameters PbeParameters => _lazyPbeParameters.Value; public RSAFactoryParams() { _lazyPbeParameters = new(() => new PbeParameters(PbeEncryptionAlgorithm, PbeHashAlgorithm, PbeIterationCount)); } public static class Default { public static readonly int KeySizeInBits = 2048; public static readonly string PbePassword = Secrets.PBE_PASSWORD; public static readonly PbeEncryptionAlgorithm PbeEncryptionAlgorithm = PbeEncryptionAlgorithm.Aes256Cbc; public static readonly HashAlgorithmName PbeHashAlgorithm = HashAlgorithmName.SHA256; public static readonly int PbeIterationCount = 100_000; public static readonly string EncryptedPrivateKeyPemLabel = "ENCRYPTED PRIVATE KEY"; public static readonly PbeParameters PbeParameters = new(PbeEncryptionAlgorithm, PbeHashAlgorithm, PbeIterationCount); } } }