Add PKCS#11 startup self-test health reporting
This commit is contained in:
@@ -6,6 +6,8 @@ internal static class Pkcs11InteropBootstrap
|
||||
{
|
||||
private static readonly object Sync = new();
|
||||
private static bool Initialized;
|
||||
private const string ProxyRelativePath = "pkcs11\\windows\\proxy\\libpkcs11-proxy.dll";
|
||||
private const string ToolRelativePath = "pkcs11\\windows\\opensc\\tools\\pkcs11-tool.exe";
|
||||
|
||||
public static void EnsureLoaded(Pkcs11Options options)
|
||||
{
|
||||
@@ -17,7 +19,11 @@ internal static class Pkcs11InteropBootstrap
|
||||
if (Initialized)
|
||||
return;
|
||||
|
||||
EnsureNativeDependencySearchPath(options.LibraryPath);
|
||||
var libraryPath = ResolveLibraryPath(options);
|
||||
var toolPath = ResolveToolPath(options);
|
||||
options.SetResolvedPaths(libraryPath, toolPath);
|
||||
|
||||
EnsureNativeDependencySearchPath(options.ResolvedLibraryPath);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(options.ProxySocket))
|
||||
{
|
||||
@@ -25,9 +31,9 @@ internal static class Pkcs11InteropBootstrap
|
||||
Environment.SetEnvironmentVariable("PKCS11_DAEMON_SOCKET", options.ProxySocket);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(options.ToolPath))
|
||||
if (!string.IsNullOrWhiteSpace(options.ResolvedToolPath))
|
||||
{
|
||||
var toolDir = Path.GetDirectoryName(options.ToolPath);
|
||||
var toolDir = Path.GetDirectoryName(options.ResolvedToolPath);
|
||||
if (!string.IsNullOrWhiteSpace(toolDir))
|
||||
EnsurePathContains(toolDir);
|
||||
}
|
||||
@@ -37,20 +43,46 @@ internal static class Pkcs11InteropBootstrap
|
||||
}
|
||||
}
|
||||
|
||||
private static string ResolveLibraryPath(Pkcs11Options options)
|
||||
{
|
||||
var assetsRoot = string.IsNullOrWhiteSpace(options.AssetsRootPath)
|
||||
? AppContext.BaseDirectory
|
||||
: options.AssetsRootPath;
|
||||
|
||||
var resolved = Path.Combine(assetsRoot, ProxyRelativePath);
|
||||
if (File.Exists(resolved))
|
||||
return resolved;
|
||||
|
||||
throw new FileNotFoundException($"PKCS#11 proxy module not found. Checked path: {resolved}", resolved);
|
||||
}
|
||||
|
||||
private static string? ResolveToolPath(Pkcs11Options options)
|
||||
{
|
||||
var assetsRoot = string.IsNullOrWhiteSpace(options.AssetsRootPath)
|
||||
? AppContext.BaseDirectory
|
||||
: options.AssetsRootPath;
|
||||
|
||||
var resolved = Path.Combine(assetsRoot, ToolRelativePath);
|
||||
if (File.Exists(resolved))
|
||||
return resolved;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void WarmupWithPkcs11Tool(Pkcs11Options options)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(options.ToolPath))
|
||||
if (string.IsNullOrWhiteSpace(options.ResolvedToolPath))
|
||||
return;
|
||||
|
||||
if (!File.Exists(options.ToolPath))
|
||||
if (!File.Exists(options.ResolvedToolPath))
|
||||
return;
|
||||
|
||||
var process = new System.Diagnostics.Process
|
||||
{
|
||||
StartInfo = new System.Diagnostics.ProcessStartInfo
|
||||
{
|
||||
FileName = options.ToolPath,
|
||||
Arguments = $"--module \"{options.LibraryPath}\" -L",
|
||||
FileName = options.ResolvedToolPath,
|
||||
Arguments = $"--module \"{options.ResolvedLibraryPath}\" -L",
|
||||
UseShellExecute = false,
|
||||
RedirectStandardOutput = true,
|
||||
RedirectStandardError = true,
|
||||
|
||||
Reference in New Issue
Block a user