59 lines
2.2 KiB
C#
59 lines
2.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
|
using Microsoft.Extensions.Options;
|
|
using StellaOps.Cryptography;
|
|
|
|
namespace StellaOps.Cryptography.DependencyInjection;
|
|
|
|
/// <summary>
|
|
/// Dependency injection helpers for registering StellaOps cryptography services.
|
|
/// </summary>
|
|
public static class CryptoServiceCollectionExtensions
|
|
{
|
|
/// <summary>
|
|
/// Registers the default crypto provider and registry.
|
|
/// </summary>
|
|
/// <param name="services">Service collection.</param>
|
|
/// <param name="configureRegistry">Optional registry ordering configuration.</param>
|
|
/// <param name="configureProvider">Optional provider-level configuration (e.g. key registration).</param>
|
|
/// <returns>The service collection.</returns>
|
|
public static IServiceCollection AddStellaOpsCrypto(
|
|
this IServiceCollection services,
|
|
Action<CryptoProviderRegistryOptions>? configureRegistry = null,
|
|
Action<DefaultCryptoProvider>? configureProvider = null)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(services);
|
|
|
|
if (configureRegistry is not null)
|
|
{
|
|
services.Configure(configureRegistry);
|
|
}
|
|
|
|
services.TryAddSingleton<DefaultCryptoProvider>(sp =>
|
|
{
|
|
var provider = new DefaultCryptoProvider();
|
|
configureProvider?.Invoke(provider);
|
|
return provider;
|
|
});
|
|
|
|
services.TryAddEnumerable(ServiceDescriptor.Singleton<ICryptoProvider, DefaultCryptoProvider>());
|
|
|
|
#if STELLAOPS_CRYPTO_SODIUM
|
|
services.TryAddSingleton<LibsodiumCryptoProvider>();
|
|
services.TryAddEnumerable(ServiceDescriptor.Singleton<ICryptoProvider, LibsodiumCryptoProvider>());
|
|
#endif
|
|
|
|
services.TryAddSingleton<ICryptoProviderRegistry>(sp =>
|
|
{
|
|
var providers = sp.GetServices<ICryptoProvider>();
|
|
var options = sp.GetService<IOptions<CryptoProviderRegistryOptions>>();
|
|
IEnumerable<string>? preferred = options?.Value?.PreferredProviders;
|
|
return new CryptoProviderRegistry(providers, preferred);
|
|
});
|
|
|
|
return services;
|
|
}
|
|
}
|