using DigitalData.Core.Abstractions.Security; using System.Reflection; using System.Security.Cryptography; namespace DigitalData.Core.Security.RSAKey { public class RSADecryptor : RSAPrivateKey, IAsymmetricDecryptor { public RSAEncryptionPadding Padding { get; init; } = RSAEncryptionPadding.OaepSHA256; // TODO: add as json converter to IConfigurIConfiguration.Config public string PaddingName { get => Padding.ToString(); init => Padding = typeof(RSAEncryptionPadding).GetProperty(value, BindingFlags.Public | BindingFlags.Static)?.GetValue(null) as RSAEncryptionPadding ?? throw new ArgumentException($"Padding '{value}' not found."); } public byte[] Decrypt(byte[] data) => RSA.Decrypt(data, Padding); private readonly Lazy _lazyEncryptor; public IAsymmetricEncryptor Encryptor => _lazyEncryptor.Value; public RSADecryptor() { _lazyEncryptor = new(() => new RSAEncryptor() { Content = RSA.ExportRSAPublicKeyPem(), Padding = Padding }); } } }