85 lines
3.8 KiB
C#
85 lines
3.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
|
using Microsoft.Extensions.Options;
|
|
using StellaOps.Cryptography;
|
|
using StellaOps.Cryptography.PluginLoader;
|
|
|
|
namespace StellaOps.Cryptography.DependencyInjection;
|
|
|
|
public static partial class CryptoServiceCollectionExtensions
|
|
{
|
|
/// <summary>
|
|
/// Registers crypto services using configuration-driven plugin loading.
|
|
/// This is the recommended method for production deployments with regional compliance requirements.
|
|
/// </summary>
|
|
/// <param name="services">Service collection.</param>
|
|
/// <param name="configuration">Configuration root.</param>
|
|
/// <param name="pluginDirectory">Optional custom plugin directory path. Defaults to application base directory.</param>
|
|
/// <returns>The service collection.</returns>
|
|
public static IServiceCollection AddStellaOpsCryptoFromConfiguration(
|
|
this IServiceCollection services,
|
|
IConfiguration configuration,
|
|
string? pluginDirectory = null)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(services);
|
|
ArgumentNullException.ThrowIfNull(configuration);
|
|
|
|
var pluginConfig = new CryptoPluginConfiguration();
|
|
configuration.GetSection("StellaOps:Crypto:Plugins").Bind(pluginConfig);
|
|
|
|
var complianceConfig = new CryptoComplianceConfiguration();
|
|
configuration.GetSection("StellaOps:Crypto:Compliance").Bind(complianceConfig);
|
|
pluginConfig.Compliance = complianceConfig;
|
|
|
|
services.AddSingleton(pluginConfig);
|
|
services.TryAddSingleton<IOptions<CryptoPluginConfiguration>, CryptoPluginConfigurationOptions>();
|
|
services.TryAddSingleton(new CryptoPluginDirectoryOptions(pluginDirectory));
|
|
|
|
CryptoComplianceOptionsRegistration.Register(services, bindFromConfiguration: false);
|
|
services.Configure<CryptoComplianceOptions>(options =>
|
|
{
|
|
configuration.GetSection(CryptoComplianceOptions.SectionKey).Bind(options);
|
|
});
|
|
|
|
services.TryAddSingleton<ICryptoComplianceService, CryptoComplianceService>();
|
|
services.TryAddSingleton<IReadOnlyList<ICryptoProvider>, CryptoPluginProviderList>();
|
|
services.TryAddSingleton<IEnumerable<ICryptoProvider>, CryptoPluginProviderEnumerable>();
|
|
services.TryAddSingleton<ICryptoProviderRegistry, CryptoPluginConfigurationRegistry>();
|
|
|
|
return services;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Registers crypto services using configuration-driven plugin loading with explicit compliance profile.
|
|
/// </summary>
|
|
/// <param name="services">Service collection.</param>
|
|
/// <param name="configuration">Configuration root.</param>
|
|
/// <param name="complianceProfileId">Compliance profile identifier (e.g., "gost", "fips", "eidas", "sm").</param>
|
|
/// <param name="strictValidation">Enable strict compliance validation.</param>
|
|
/// <param name="pluginDirectory">Optional custom plugin directory path.</param>
|
|
/// <returns>The service collection.</returns>
|
|
public static IServiceCollection AddStellaOpsCryptoFromConfiguration(
|
|
this IServiceCollection services,
|
|
IConfiguration configuration,
|
|
string complianceProfileId,
|
|
bool strictValidation = true,
|
|
string? pluginDirectory = null)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(services);
|
|
ArgumentNullException.ThrowIfNull(configuration);
|
|
ArgumentNullException.ThrowIfNull(complianceProfileId);
|
|
|
|
services.AddStellaOpsCryptoFromConfiguration(configuration, pluginDirectory);
|
|
services.Configure<CryptoComplianceOptions>(options =>
|
|
{
|
|
options.ProfileId = complianceProfileId;
|
|
options.StrictValidation = strictValidation;
|
|
});
|
|
|
|
return services;
|
|
}
|
|
}
|