using DigitalData.Core.Abstractions.Security; using DigitalData.Core.Security.Config; using DigitalData.Core.Security.Cryptographer; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace DigitalData.Core.Security { public class AsymCryptHandler : RSAFactory, IAsymCryptHandler, IRSAFactory { public IEnumerable PrivateKeys { get; } /// /// It is a separate decryptor for permanently stored encrypted data. It is assigned to the first Default decryptor by default. /// public IAsymmetricPrivateKey VaultPrivateKey { get; } private readonly Lazy> _lazyEncryptors; public IEnumerable Encryptors => _lazyEncryptors.Value; public IEnumerable TokenDescriptions { get; init; } = new List(); public AsymCryptHandler(IOptions options, ILogger? logger = null) : base(options) { logger?.LogInformation("Core.Secrets version: {Version}, Created on: {CreationDate}.", Secrets.Version, Secrets.CreationDate.ToString("dd.MM.yyyy")); if (!_params.PrivateKeys.Any()) throw new InvalidOperationException( "Any decryptor is not found. Ensure that at least one decryptor is configured in the provided parameters. " + "This issue typically arises if the configuration for decryptors is incomplete or missing. " + "Check the 'Decryptors' collection in the configuration and verify that it contains valid entries." ); PrivateKeys = _params.PrivateKeys; VaultPrivateKey = _params.Vault ?? PrivateKeys.First(); _lazyEncryptors = new(PrivateKeys.Select(decryptor => decryptor.Encryptor)); } } }