Fix build and code structure improvements. New but essential UI functionality. CI improvements. Documentation improvements. AI module improvements.

This commit is contained in:
StellaOps Bot
2025-12-26 21:54:17 +02:00
parent 335ff7da16
commit c2b9cd8d1f
3717 changed files with 264714 additions and 48202 deletions

View File

@@ -1,199 +1,380 @@

Microsoft Visual Studio Solution File, Format Version 12.00
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Signer", "StellaOps.Signer", "{93E67595-BF90-642A-D1B1-E56DFA9E06DF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Core", "StellaOps.Signer\StellaOps.Signer.Core\StellaOps.Signer.Core.csproj", "{B568E49A-91CF-4579-A8AD-C1214D27E088}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Infrastructure", "StellaOps.Signer\StellaOps.Signer.Infrastructure\StellaOps.Signer.Infrastructure.csproj", "{B4A54B6C-998B-4D8D-833F-44932500AF1B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Tests", "StellaOps.Signer\StellaOps.Signer.Tests\StellaOps.Signer.Tests.csproj", "{A30EA34C-0595-4399-AD6A-4D240F87C258}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.WebService", "StellaOps.Signer\StellaOps.Signer.WebService\StellaOps.Signer.WebService.csproj", "{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration", "..\__Libraries\StellaOps.Configuration\StellaOps.Configuration.csproj", "{3B8F2A6A-EB4E-459D-855B-445CCD23422E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins.Abstractions", "..\Authority\StellaOps.Authority\StellaOps.Authority.Plugins.Abstractions\StellaOps.Authority.Plugins.Abstractions.csproj", "{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography", "..\__Libraries\StellaOps.Cryptography\StellaOps.Cryptography.csproj", "{9F1B7315-0521-4266-8E51-C5FA92BF33D3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Abstractions", "..\Authority\StellaOps.Authority\StellaOps.Auth.Abstractions\StellaOps.Auth.Abstractions.csproj", "{7D9D3603-0138-4E65-877A-CCE4BB7705DC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DependencyInjection", "..\__Libraries\StellaOps.DependencyInjection\StellaOps.DependencyInjection.csproj", "{B49713E0-CB65-414A-BE39-3F60585F5C41}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Client", "..\Authority\StellaOps.Authority\StellaOps.Auth.Client\StellaOps.Auth.Client.csproj", "{3C959A09-8E09-4E2E-B9E8-7723007445EE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.ServerIntegration", "..\Authority\StellaOps.Authority\StellaOps.Auth.ServerIntegration\StellaOps.Auth.ServerIntegration.csproj", "{D4E2E052-9CD5-4683-AF12-041662DEC782}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "__Libraries", "__Libraries", "{E1A2B3C4-D5E6-47F8-9A0B-1C2D3E4F5A6B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Keyless", "__Libraries\StellaOps.Signer.Keyless\StellaOps.Signer.Keyless.csproj", "{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Debug|x64.ActiveCfg = Debug|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Debug|x64.Build.0 = Debug|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Debug|x86.ActiveCfg = Debug|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Debug|x86.Build.0 = Debug|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Release|Any CPU.Build.0 = Release|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Release|x64.ActiveCfg = Release|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Release|x64.Build.0 = Release|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Release|x86.ActiveCfg = Release|Any CPU
{B568E49A-91CF-4579-A8AD-C1214D27E088}.Release|x86.Build.0 = Release|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Debug|x64.ActiveCfg = Debug|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Debug|x64.Build.0 = Debug|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Debug|x86.ActiveCfg = Debug|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Debug|x86.Build.0 = Debug|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Release|Any CPU.Build.0 = Release|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Release|x64.ActiveCfg = Release|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Release|x64.Build.0 = Release|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Release|x86.ActiveCfg = Release|Any CPU
{B4A54B6C-998B-4D8D-833F-44932500AF1B}.Release|x86.Build.0 = Release|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Debug|x64.ActiveCfg = Debug|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Debug|x64.Build.0 = Debug|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Debug|x86.ActiveCfg = Debug|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Debug|x86.Build.0 = Debug|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Release|Any CPU.Build.0 = Release|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Release|x64.ActiveCfg = Release|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Release|x64.Build.0 = Release|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Release|x86.ActiveCfg = Release|Any CPU
{A30EA34C-0595-4399-AD6A-4D240F87C258}.Release|x86.Build.0 = Release|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Debug|x64.ActiveCfg = Debug|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Debug|x64.Build.0 = Debug|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Debug|x86.ActiveCfg = Debug|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Debug|x86.Build.0 = Debug|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Release|Any CPU.Build.0 = Release|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Release|x64.ActiveCfg = Release|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Release|x64.Build.0 = Release|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Release|x86.ActiveCfg = Release|Any CPU
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0}.Release|x86.Build.0 = Release|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Debug|x64.ActiveCfg = Debug|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Debug|x64.Build.0 = Debug|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Debug|x86.ActiveCfg = Debug|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Debug|x86.Build.0 = Debug|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Release|Any CPU.Build.0 = Release|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Release|x64.ActiveCfg = Release|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Release|x64.Build.0 = Release|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Release|x86.ActiveCfg = Release|Any CPU
{3B8F2A6A-EB4E-459D-855B-445CCD23422E}.Release|x86.Build.0 = Release|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Debug|x64.ActiveCfg = Debug|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Debug|x64.Build.0 = Debug|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Debug|x86.ActiveCfg = Debug|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Debug|x86.Build.0 = Debug|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Release|Any CPU.Build.0 = Release|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Release|x64.ActiveCfg = Release|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Release|x64.Build.0 = Release|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Release|x86.ActiveCfg = Release|Any CPU
{40C38CD7-2DFD-40BC-9F72-C15CB7C405E5}.Release|x86.Build.0 = Release|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Debug|x64.ActiveCfg = Debug|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Debug|x64.Build.0 = Debug|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Debug|x86.ActiveCfg = Debug|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Debug|x86.Build.0 = Debug|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Release|Any CPU.Build.0 = Release|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Release|x64.ActiveCfg = Release|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Release|x64.Build.0 = Release|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Release|x86.ActiveCfg = Release|Any CPU
{9F1B7315-0521-4266-8E51-C5FA92BF33D3}.Release|x86.Build.0 = Release|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Debug|x64.ActiveCfg = Debug|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Debug|x64.Build.0 = Debug|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Debug|x86.ActiveCfg = Debug|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Debug|x86.Build.0 = Debug|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Release|Any CPU.Build.0 = Release|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Release|x64.ActiveCfg = Release|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Release|x64.Build.0 = Release|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Release|x86.ActiveCfg = Release|Any CPU
{7D9D3603-0138-4E65-877A-CCE4BB7705DC}.Release|x86.Build.0 = Release|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Debug|x64.ActiveCfg = Debug|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Debug|x64.Build.0 = Debug|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Debug|x86.ActiveCfg = Debug|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Debug|x86.Build.0 = Debug|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Release|Any CPU.Build.0 = Release|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Release|x64.ActiveCfg = Release|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Release|x64.Build.0 = Release|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Release|x86.ActiveCfg = Release|Any CPU
{B49713E0-CB65-414A-BE39-3F60585F5C41}.Release|x86.Build.0 = Release|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Debug|x64.ActiveCfg = Debug|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Debug|x64.Build.0 = Debug|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Debug|x86.ActiveCfg = Debug|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Debug|x86.Build.0 = Debug|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Release|Any CPU.Build.0 = Release|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Release|x64.ActiveCfg = Release|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Release|x64.Build.0 = Release|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Release|x86.ActiveCfg = Release|Any CPU
{3C959A09-8E09-4E2E-B9E8-7723007445EE}.Release|x86.Build.0 = Release|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Debug|x64.ActiveCfg = Debug|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Debug|x64.Build.0 = Debug|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Debug|x86.ActiveCfg = Debug|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Debug|x86.Build.0 = Debug|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Release|Any CPU.Build.0 = Release|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Release|x64.ActiveCfg = Release|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Release|x64.Build.0 = Release|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Release|x86.ActiveCfg = Release|Any CPU
{D4E2E052-9CD5-4683-AF12-041662DEC782}.Release|x86.Build.0 = Release|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Debug|x64.ActiveCfg = Debug|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Debug|x64.Build.0 = Debug|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Debug|x86.ActiveCfg = Debug|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Debug|x86.Build.0 = Debug|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Release|Any CPU.Build.0 = Release|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Release|x64.ActiveCfg = Release|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Release|x64.Build.0 = Release|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Release|x86.ActiveCfg = Release|Any CPU
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{B568E49A-91CF-4579-A8AD-C1214D27E088} = {93E67595-BF90-642A-D1B1-E56DFA9E06DF}
{B4A54B6C-998B-4D8D-833F-44932500AF1B} = {93E67595-BF90-642A-D1B1-E56DFA9E06DF}
{A30EA34C-0595-4399-AD6A-4D240F87C258} = {93E67595-BF90-642A-D1B1-E56DFA9E06DF}
{0AAA68F5-D148-4B53-83D3-E486D3BAE5A0} = {93E67595-BF90-642A-D1B1-E56DFA9E06DF}
{A1B2C3D4-E5F6-47A8-9B0C-1D2E3F4A5B6C} = {E1A2B3C4-D5E6-47F8-9A0B-1C2D3E4F5A6B}
EndGlobalSection
EndGlobal
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Signer", "StellaOps.Signer", "{B5B63E30-9A90-9E10-BDB1-E39BE017A399}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Signer.Core", "StellaOps.Signer.Core", "{62E2D01C-B619-9F6D-EB6B-9897CB55677A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Signer.Infrastructure", "StellaOps.Signer.Infrastructure", "{C8C4DA30-F054-990A-7C17-DF31840CB58A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Signer.Tests", "StellaOps.Signer.Tests", "{840C550B-AC09-0BEE-F102-1C551A8D7163}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Signer.WebService", "StellaOps.Signer.WebService", "{3522796C-50F2-8457-4ADE-23E7F6F61C78}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "__External", "__External", "{5B52EF8A-3661-DCFF-797D-BC4D6AC60BDA}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AirGap", "AirGap", "{F310596E-88BB-9E54-885E-21C61971917E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.AirGap.Policy", "StellaOps.AirGap.Policy", "{D9492ED1-A812-924B-65E4-F518592B49BB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.AirGap.Policy", "StellaOps.AirGap.Policy", "{3823DE1E-2ACE-C956-99E1-00DB786D9E1D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Authority", "Authority", "{C1DCEFBD-12A5-EAAE-632E-8EEB9BE491B6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Authority", "StellaOps.Authority", "{A6928CBA-4D4D-AB2B-CA19-FEE6E73ECE70}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Auth.Abstractions", "StellaOps.Auth.Abstractions", "{F2E6CB0E-DF77-1FAA-582B-62B040DF3848}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Auth.Client", "StellaOps.Auth.Client", "{C494ECBE-DEA5-3576-D2AF-200FF12BC144}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Auth.ServerIntegration", "StellaOps.Auth.ServerIntegration", "{7E890DF9-B715-B6DF-2498-FD74DDA87D71}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Authority.Plugins.Abstractions", "StellaOps.Authority.Plugins.Abstractions", "{64689413-46D7-8499-68A6-B6367ACBC597}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Provenance", "Provenance", "{316BBD0A-04D2-85C9-52EA-7993CC6C8930}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Provenance.Attestation", "StellaOps.Provenance.Attestation", "{9D6AB85A-85EA-D85A-5566-A121D34016E6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Router", "Router", "{FC018E5B-1E2F-DE19-1E97-0C845058C469}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "__Libraries", "__Libraries", "{1BE5B76C-B486-560B-6CB2-44C6537249AA}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Messaging", "StellaOps.Messaging", "{F4F1CBE2-1CDD-CAA4-41F0-266DB4677C05}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Microservice", "StellaOps.Microservice", "{3DE1DCDC-C845-4AC7-7B66-34B0A9E8626B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Microservice.AspNetCore", "StellaOps.Microservice.AspNetCore", "{6FA01E92-606B-0CB8-8583-6F693A903CFC}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Router.AspNet", "StellaOps.Router.AspNet", "{A5994E92-7E0E-89FE-5628-DE1A0176B8BA}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Router.Common", "StellaOps.Router.Common", "{54C11B29-4C54-7255-AB44-BEB63AF9BD1F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "__Libraries", "__Libraries", "{1345DD29-BB3A-FB5F-4B3D-E29F6045A27A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Canonical.Json", "StellaOps.Canonical.Json", "{79E122F4-2325-3E92-438E-5825A307B594}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Configuration", "StellaOps.Configuration", "{538E2D98-5325-3F54-BE74-EFE5FC1ECBD8}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography", "StellaOps.Cryptography", "{66557252-B5C4-664B-D807-07018C627474}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography.DependencyInjection", "StellaOps.Cryptography.DependencyInjection", "{7203223D-FF02-7BEB-2798-D1639ACC01C4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography.Plugin.CryptoPro", "StellaOps.Cryptography.Plugin.CryptoPro", "{3C69853C-90E3-D889-1960-3B9229882590}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography.Plugin.OpenSslGost", "StellaOps.Cryptography.Plugin.OpenSslGost", "{643E4D4C-BC96-A37F-E0EC-488127F0B127}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography.Plugin.Pkcs11Gost", "StellaOps.Cryptography.Plugin.Pkcs11Gost", "{6F2CA7F5-3E7C-C61B-94E6-E7DD1227B5B1}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography.Plugin.PqSoft", "StellaOps.Cryptography.Plugin.PqSoft", "{F04B7DBB-77A5-C978-B2DE-8C189A32AA72}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography.Plugin.SimRemote", "StellaOps.Cryptography.Plugin.SimRemote", "{7C72F22A-20FF-DF5B-9191-6DFD0D497DB2}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography.Plugin.SmRemote", "StellaOps.Cryptography.Plugin.SmRemote", "{C896CC0A-F5E6-9AA4-C582-E691441F8D32}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography.Plugin.SmSoft", "StellaOps.Cryptography.Plugin.SmSoft", "{0AA3A418-AB45-CCA4-46D4-EEBFE011FECA}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography.Plugin.WineCsp", "StellaOps.Cryptography.Plugin.WineCsp", "{225D9926-4AE8-E539-70AD-8698E688F271}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Cryptography.PluginLoader", "StellaOps.Cryptography.PluginLoader", "{D6E8E69C-F721-BBCB-8C39-9716D53D72AD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.DependencyInjection", "StellaOps.DependencyInjection", "{589A43FD-8213-E9E3-6CFF-9CBA72D53E98}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Plugin", "StellaOps.Plugin", "{772B02B5-6280-E1D4-3E2E-248D0455C2FB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.TestKit", "StellaOps.TestKit", "{8380A20C-A5B8-EE91-1A58-270323688CB9}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "__Libraries", "__Libraries", "{A5C98087-E847-D2C4-2143-20869479839D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Signer.KeyManagement", "StellaOps.Signer.KeyManagement", "{F1EF9372-E0B1-6CD5-6831-53D74C9F3D7E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StellaOps.Signer.Keyless", "StellaOps.Signer.Keyless", "{9A3CF97F-22C7-CEC3-3B62-B378929AA805}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.AirGap.Policy", "E:\dev\git.stella-ops.org\src\AirGap\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy\StellaOps.AirGap.Policy.csproj", "{AD31623A-BC43-52C2-D906-AC1D8784A541}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Abstractions", "E:\dev\git.stella-ops.org\src\Authority\StellaOps.Authority\StellaOps.Auth.Abstractions\StellaOps.Auth.Abstractions.csproj", "{55D9B653-FB76-FCE8-1A3C-67B1BEDEC214}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Client", "E:\dev\git.stella-ops.org\src\Authority\StellaOps.Authority\StellaOps.Auth.Client\StellaOps.Auth.Client.csproj", "{DE5BF139-1E5C-D6EA-4FAA-661EF353A194}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.ServerIntegration", "E:\dev\git.stella-ops.org\src\Authority\StellaOps.Authority\StellaOps.Auth.ServerIntegration\StellaOps.Auth.ServerIntegration.csproj", "{ECA25786-A3A8-92C4-4AA3-D4A73C69FDCA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins.Abstractions", "E:\dev\git.stella-ops.org\src\Authority\StellaOps.Authority\StellaOps.Authority.Plugins.Abstractions\StellaOps.Authority.Plugins.Abstractions.csproj", "{97F94029-5419-6187-5A63-5C8FD9232FAE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Canonical.Json", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Canonical.Json\StellaOps.Canonical.Json.csproj", "{AF9E7F02-25AD-3540-18D7-F6A4F8BA5A60}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Configuration\StellaOps.Configuration.csproj", "{92C62F7B-8028-6EE1-B71B-F45F459B8E97}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography\StellaOps.Cryptography.csproj", "{F664A948-E352-5808-E780-77A03F19E93E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.DependencyInjection", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography.DependencyInjection\StellaOps.Cryptography.DependencyInjection.csproj", "{FA83F778-5252-0B80-5555-E69F790322EA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.CryptoPro", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography.Plugin.CryptoPro\StellaOps.Cryptography.Plugin.CryptoPro.csproj", "{C53E0895-879A-D9E6-0A43-24AD17A2F270}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.OpenSslGost", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography.Plugin.OpenSslGost\StellaOps.Cryptography.Plugin.OpenSslGost.csproj", "{0AED303F-69E6-238F-EF80-81985080EDB7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.Pkcs11Gost", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography.Plugin.Pkcs11Gost\StellaOps.Cryptography.Plugin.Pkcs11Gost.csproj", "{2904D288-CE64-A565-2C46-C2E85A96A1EE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.PqSoft", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography.Plugin.PqSoft\StellaOps.Cryptography.Plugin.PqSoft.csproj", "{A6667CC3-B77F-023E-3A67-05F99E9FF46A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SimRemote", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography.Plugin.SimRemote\StellaOps.Cryptography.Plugin.SimRemote.csproj", "{A26E2816-F787-F76B-1D6C-E086DD3E19CE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SmRemote", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography.Plugin.SmRemote\StellaOps.Cryptography.Plugin.SmRemote.csproj", "{B3DEC619-67AC-1B5A-4F3E-A1F24C3F6877}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.SmSoft", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography.Plugin.SmSoft\StellaOps.Cryptography.Plugin.SmSoft.csproj", "{90DB65B4-8F6E-FB8E-0281-505AD8BC6BA6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.Plugin.WineCsp", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography.Plugin.WineCsp\StellaOps.Cryptography.Plugin.WineCsp.csproj", "{059FBB86-DEE6-8207-3F23-2A1A3EC00DEA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography.PluginLoader", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Cryptography.PluginLoader\StellaOps.Cryptography.PluginLoader.csproj", "{8BBA3159-C4CC-F685-A28C-7FE6CBD3D2A1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DependencyInjection", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.DependencyInjection\StellaOps.DependencyInjection.csproj", "{632A1F0D-1BA5-C84B-B716-2BE638A92780}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Messaging", "E:\dev\git.stella-ops.org\src\Router\__Libraries\StellaOps.Messaging\StellaOps.Messaging.csproj", "{97998C88-E6E1-D5E2-B632-537B58E00CBF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice", "E:\dev\git.stella-ops.org\src\Router\__Libraries\StellaOps.Microservice\StellaOps.Microservice.csproj", "{BAD08D96-A80A-D27F-5D9C-656AEEB3D568}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Microservice.AspNetCore", "E:\dev\git.stella-ops.org\src\Router\__Libraries\StellaOps.Microservice.AspNetCore\StellaOps.Microservice.AspNetCore.csproj", "{F63694F1-B56D-6E72-3F5D-5D38B1541F0F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Plugin", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.Plugin\StellaOps.Plugin.csproj", "{38A9EE9B-6FC8-93BC-0D43-2A906E678D66}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Provenance.Attestation", "E:\dev\git.stella-ops.org\src\Provenance\StellaOps.Provenance.Attestation\StellaOps.Provenance.Attestation.csproj", "{A78EBC0F-C62C-8F56-95C0-330E376242A2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.AspNet", "E:\dev\git.stella-ops.org\src\Router\__Libraries\StellaOps.Router.AspNet\StellaOps.Router.AspNet.csproj", "{79104479-B087-E5D0-5523-F1803282A246}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Router.Common", "E:\dev\git.stella-ops.org\src\Router\__Libraries\StellaOps.Router.Common\StellaOps.Router.Common.csproj", "{F17A6F0B-3120-2BA9-84D8-5F8BA0B9705D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Core", "StellaOps.Signer\StellaOps.Signer.Core\StellaOps.Signer.Core.csproj", "{0AF13355-173C-3128-5AFC-D32E540DA3EF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Infrastructure", "StellaOps.Signer\StellaOps.Signer.Infrastructure\StellaOps.Signer.Infrastructure.csproj", "{06BC00C6-78D4-05AD-C8C8-FF64CD7968E0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.KeyManagement", "__Libraries\StellaOps.Signer.KeyManagement\StellaOps.Signer.KeyManagement.csproj", "{38AE6099-21AE-7917-4E21-6A9E6F99A7C7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Keyless", "__Libraries\StellaOps.Signer.Keyless\StellaOps.Signer.Keyless.csproj", "{E33C348E-0722-9339-3CD6-F0341D9A687C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Tests", "StellaOps.Signer\StellaOps.Signer.Tests\StellaOps.Signer.Tests.csproj", "{B638BFD9-7A36-94F3-F3D3-47489E610B5B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.WebService", "StellaOps.Signer\StellaOps.Signer.WebService\StellaOps.Signer.WebService.csproj", "{97605BA3-162D-704C-A6F4-A8D13E7BF91D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.TestKit", "E:\dev\git.stella-ops.org\src\__Libraries\StellaOps.TestKit\StellaOps.TestKit.csproj", "{AF043113-CCE3-59C1-DF71-9804155F26A8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AD31623A-BC43-52C2-D906-AC1D8784A541}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AD31623A-BC43-52C2-D906-AC1D8784A541}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AD31623A-BC43-52C2-D906-AC1D8784A541}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AD31623A-BC43-52C2-D906-AC1D8784A541}.Release|Any CPU.Build.0 = Release|Any CPU
{55D9B653-FB76-FCE8-1A3C-67B1BEDEC214}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{55D9B653-FB76-FCE8-1A3C-67B1BEDEC214}.Debug|Any CPU.Build.0 = Debug|Any CPU
{55D9B653-FB76-FCE8-1A3C-67B1BEDEC214}.Release|Any CPU.ActiveCfg = Release|Any CPU
{55D9B653-FB76-FCE8-1A3C-67B1BEDEC214}.Release|Any CPU.Build.0 = Release|Any CPU
{DE5BF139-1E5C-D6EA-4FAA-661EF353A194}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DE5BF139-1E5C-D6EA-4FAA-661EF353A194}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DE5BF139-1E5C-D6EA-4FAA-661EF353A194}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DE5BF139-1E5C-D6EA-4FAA-661EF353A194}.Release|Any CPU.Build.0 = Release|Any CPU
{ECA25786-A3A8-92C4-4AA3-D4A73C69FDCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ECA25786-A3A8-92C4-4AA3-D4A73C69FDCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ECA25786-A3A8-92C4-4AA3-D4A73C69FDCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ECA25786-A3A8-92C4-4AA3-D4A73C69FDCA}.Release|Any CPU.Build.0 = Release|Any CPU
{97F94029-5419-6187-5A63-5C8FD9232FAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{97F94029-5419-6187-5A63-5C8FD9232FAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{97F94029-5419-6187-5A63-5C8FD9232FAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{97F94029-5419-6187-5A63-5C8FD9232FAE}.Release|Any CPU.Build.0 = Release|Any CPU
{AF9E7F02-25AD-3540-18D7-F6A4F8BA5A60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AF9E7F02-25AD-3540-18D7-F6A4F8BA5A60}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AF9E7F02-25AD-3540-18D7-F6A4F8BA5A60}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AF9E7F02-25AD-3540-18D7-F6A4F8BA5A60}.Release|Any CPU.Build.0 = Release|Any CPU
{92C62F7B-8028-6EE1-B71B-F45F459B8E97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{92C62F7B-8028-6EE1-B71B-F45F459B8E97}.Debug|Any CPU.Build.0 = Debug|Any CPU
{92C62F7B-8028-6EE1-B71B-F45F459B8E97}.Release|Any CPU.ActiveCfg = Release|Any CPU
{92C62F7B-8028-6EE1-B71B-F45F459B8E97}.Release|Any CPU.Build.0 = Release|Any CPU

View File

@@ -107,6 +107,43 @@ public static class PredicateTypes
/// </summary>
public const string StellaOpsVerdictAlt = "verdict.stella/v1";
// -------------------------------------------------------------------------
// Delta Predicate Types
// Sprint: SPRINT_20251228_007_BE_sbom_lineage_graph_ii (LIN-BE-024)
// Delta attestations capture changes between lineage node versions.
// -------------------------------------------------------------------------
/// <summary>
/// StellaOps VEX Delta predicate type.
/// Captures changes in VEX consensus status between two SBOM versions.
/// Contains: from_digest, to_digest, status_changes[], new_vulns[], resolved_vulns[].
/// </summary>
public const string StellaOpsVexDelta = "stella.ops/vex-delta@v1";
/// <summary>
/// StellaOps SBOM Delta predicate type.
/// Captures changes in SBOM composition between two versions.
/// Contains: from_digest, to_digest, components_added[], components_removed[],
/// version_changes[], license_changes[].
/// </summary>
public const string StellaOpsSbomDelta = "stella.ops/sbom-delta@v1";
/// <summary>
/// StellaOps Verdict Delta predicate type.
/// Captures changes in security verdicts between two evaluations.
/// Contains: from_digest, to_digest, gate_changes[], risk_delta,
/// reachability_delta, attestation_refs[].
/// </summary>
public const string StellaOpsVerdictDelta = "stella.ops/verdict-delta@v1";
/// <summary>
/// StellaOps Reachability Delta predicate type.
/// Captures changes in reachability analysis between two versions.
/// Contains: from_digest, to_digest, paths_added, paths_removed,
/// gates_changed[], entrypoints_changed[].
/// </summary>
public const string StellaOpsReachabilityDelta = "stella.ops/reachability-delta@v1";
/// <summary>
/// CycloneDX SBOM predicate type.
/// </summary>
@@ -158,7 +195,8 @@ public static class PredicateTypes
|| predicateType == StellaOpsEvidence
|| predicateType == StellaOpsReachabilityWitness
|| predicateType == StellaOpsPathWitness
|| predicateType == StellaOpsReachabilityDrift;
|| predicateType == StellaOpsReachabilityDrift
|| predicateType == StellaOpsReachabilityDelta;
}
/// <summary>
@@ -169,7 +207,20 @@ public static class PredicateTypes
return predicateType == StellaOpsVerdict
|| predicateType == StellaOpsVerdictAlt
|| predicateType == StellaOpsPolicy
|| predicateType == StellaOpsPolicyDecision;
|| predicateType == StellaOpsPolicyDecision
|| predicateType == StellaOpsVerdictDelta;
}
/// <summary>
/// Determines if the predicate type is a delta/change tracking type.
/// Sprint: LIN-BE-024
/// </summary>
public static bool IsDeltaType(string predicateType)
{
return predicateType == StellaOpsVexDelta
|| predicateType == StellaOpsSbomDelta
|| predicateType == StellaOpsVerdictDelta
|| predicateType == StellaOpsReachabilityDelta;
}
/// <summary>
@@ -197,6 +248,11 @@ public static class PredicateTypes
StellaOpsReachabilityDrift,
StellaOpsVerdict,
StellaOpsVerdictAlt,
// Delta types (LIN-BE-024)
StellaOpsVexDelta,
StellaOpsSbomDelta,
StellaOpsVerdictDelta,
StellaOpsReachabilityDelta,
// Third-party types
CycloneDxSbom,
SpdxSbom,

View File

@@ -0,0 +1,462 @@
// -----------------------------------------------------------------------------
// DeltaPredicateSchemas.cs
// Sprint: SPRINT_20251228_007_BE_sbom_lineage_graph_ii (LIN-BE-024)
// Task: Define delta predicate schemas for lineage change tracking
// Description: JSON-serializable models for delta predicate payloads.
// -----------------------------------------------------------------------------
using System.Collections.Immutable;
using System.Text.Json.Serialization;
namespace StellaOps.Signer.Core.Predicates;
/// <summary>
/// Base class for delta predicates capturing changes between lineage versions.
/// </summary>
public abstract record DeltaPredicateBase
{
/// <summary>
/// Digest of the source/from artifact.
/// </summary>
[JsonPropertyName("fromDigest")]
public required string FromDigest { get; init; }
/// <summary>
/// Digest of the target/to artifact.
/// </summary>
[JsonPropertyName("toDigest")]
public required string ToDigest { get; init; }
/// <summary>
/// UTC timestamp when the delta was computed.
/// </summary>
[JsonPropertyName("computedAt")]
public required DateTimeOffset ComputedAt { get; init; }
/// <summary>
/// Tenant identifier for multi-tenancy.
/// </summary>
[JsonPropertyName("tenantId")]
public string? TenantId { get; init; }
}
/// <summary>
/// VEX Delta predicate capturing VEX consensus status changes.
/// Predicate type: stella.ops/vex-delta@v1
/// </summary>
public sealed record VexDeltaPredicate : DeltaPredicateBase
{
/// <summary>
/// VEX status changes between versions.
/// </summary>
[JsonPropertyName("statusChanges")]
public ImmutableArray<VexStatusChange> StatusChanges { get; init; } = ImmutableArray<VexStatusChange>.Empty;
/// <summary>
/// New vulnerabilities discovered in the target version.
/// </summary>
[JsonPropertyName("newVulnerabilities")]
public ImmutableArray<VexVulnerabilityEntry> NewVulnerabilities { get; init; } = ImmutableArray<VexVulnerabilityEntry>.Empty;
/// <summary>
/// Vulnerabilities resolved (fixed or not_affected) in target version.
/// </summary>
[JsonPropertyName("resolvedVulnerabilities")]
public ImmutableArray<VexVulnerabilityEntry> ResolvedVulnerabilities { get; init; } = ImmutableArray<VexVulnerabilityEntry>.Empty;
/// <summary>
/// Summary statistics.
/// </summary>
[JsonPropertyName("summary")]
public required VexDeltaSummary Summary { get; init; }
}
/// <summary>
/// Individual VEX status change entry.
/// </summary>
public sealed record VexStatusChange
{
[JsonPropertyName("cve")]
public required string Cve { get; init; }
[JsonPropertyName("fromStatus")]
public required string FromStatus { get; init; }
[JsonPropertyName("toStatus")]
public required string ToStatus { get; init; }
[JsonPropertyName("fromJustification")]
public string? FromJustification { get; init; }
[JsonPropertyName("toJustification")]
public string? ToJustification { get; init; }
[JsonPropertyName("product")]
public string? Product { get; init; }
[JsonPropertyName("reason")]
public string? Reason { get; init; }
}
/// <summary>
/// Vulnerability entry in a VEX delta.
/// </summary>
public sealed record VexVulnerabilityEntry
{
[JsonPropertyName("cve")]
public required string Cve { get; init; }
[JsonPropertyName("status")]
public required string Status { get; init; }
[JsonPropertyName("severity")]
public string? Severity { get; init; }
[JsonPropertyName("cvss")]
public double? Cvss { get; init; }
[JsonPropertyName("product")]
public string? Product { get; init; }
}
/// <summary>
/// Summary of VEX delta changes.
/// </summary>
public sealed record VexDeltaSummary
{
[JsonPropertyName("statusChangeCount")]
public int StatusChangeCount { get; init; }
[JsonPropertyName("newVulnCount")]
public int NewVulnCount { get; init; }
[JsonPropertyName("resolvedVulnCount")]
public int ResolvedVulnCount { get; init; }
[JsonPropertyName("criticalNew")]
public int CriticalNew { get; init; }
[JsonPropertyName("highNew")]
public int HighNew { get; init; }
}
/// <summary>
/// SBOM Delta predicate capturing composition changes.
/// Predicate type: stella.ops/sbom-delta@v1
/// </summary>
public sealed record SbomDeltaPredicate : DeltaPredicateBase
{
/// <summary>
/// Components added in the target version.
/// </summary>
[JsonPropertyName("componentsAdded")]
public ImmutableArray<SbomComponentEntry> ComponentsAdded { get; init; } = ImmutableArray<SbomComponentEntry>.Empty;
/// <summary>
/// Components removed in the target version.
/// </summary>
[JsonPropertyName("componentsRemoved")]
public ImmutableArray<SbomComponentEntry> ComponentsRemoved { get; init; } = ImmutableArray<SbomComponentEntry>.Empty;
/// <summary>
/// Components with version changes.
/// </summary>
[JsonPropertyName("versionChanges")]
public ImmutableArray<SbomVersionChangeEntry> VersionChanges { get; init; } = ImmutableArray<SbomVersionChangeEntry>.Empty;
/// <summary>
/// Components with license changes.
/// </summary>
[JsonPropertyName("licenseChanges")]
public ImmutableArray<SbomLicenseChangeEntry> LicenseChanges { get; init; } = ImmutableArray<SbomLicenseChangeEntry>.Empty;
/// <summary>
/// Summary statistics.
/// </summary>
[JsonPropertyName("summary")]
public required SbomDeltaSummary Summary { get; init; }
}
/// <summary>
/// Component entry in SBOM delta.
/// </summary>
public sealed record SbomComponentEntry
{
[JsonPropertyName("purl")]
public string? Purl { get; init; }
[JsonPropertyName("name")]
public required string Name { get; init; }
[JsonPropertyName("version")]
public string? Version { get; init; }
[JsonPropertyName("license")]
public string? License { get; init; }
}
/// <summary>
/// Version change entry in SBOM delta.
/// </summary>
public sealed record SbomVersionChangeEntry
{
[JsonPropertyName("purl")]
public string? Purl { get; init; }
[JsonPropertyName("name")]
public required string Name { get; init; }
[JsonPropertyName("fromVersion")]
public required string FromVersion { get; init; }
[JsonPropertyName("toVersion")]
public required string ToVersion { get; init; }
}
/// <summary>
/// License change entry in SBOM delta.
/// </summary>
public sealed record SbomLicenseChangeEntry
{
[JsonPropertyName("purl")]
public string? Purl { get; init; }
[JsonPropertyName("name")]
public required string Name { get; init; }
[JsonPropertyName("fromLicense")]
public string? FromLicense { get; init; }
[JsonPropertyName("toLicense")]
public string? ToLicense { get; init; }
}
/// <summary>
/// Summary of SBOM delta changes.
/// </summary>
public sealed record SbomDeltaSummary
{
[JsonPropertyName("addedCount")]
public int AddedCount { get; init; }
[JsonPropertyName("removedCount")]
public int RemovedCount { get; init; }
[JsonPropertyName("versionChangedCount")]
public int VersionChangedCount { get; init; }
[JsonPropertyName("licenseChangedCount")]
public int LicenseChangedCount { get; init; }
}
/// <summary>
/// Verdict Delta predicate capturing security verdict changes.
/// Predicate type: stella.ops/verdict-delta@v1
/// </summary>
public sealed record VerdictDeltaPredicate : DeltaPredicateBase
{
/// <summary>
/// Gate evaluation changes.
/// </summary>
[JsonPropertyName("gateChanges")]
public ImmutableArray<GateChangeEntry> GateChanges { get; init; } = ImmutableArray<GateChangeEntry>.Empty;
/// <summary>
/// Change in overall risk assessment.
/// </summary>
[JsonPropertyName("riskDelta")]
public RiskDelta? RiskDelta { get; init; }
/// <summary>
/// Summary of reachability changes.
/// </summary>
[JsonPropertyName("reachabilityDelta")]
public ReachabilityDeltaSummary? ReachabilityDelta { get; init; }
/// <summary>
/// References to supporting attestations.
/// </summary>
[JsonPropertyName("attestationRefs")]
public ImmutableArray<AttestationRef> AttestationRefs { get; init; } = ImmutableArray<AttestationRef>.Empty;
/// <summary>
/// Summary statistics.
/// </summary>
[JsonPropertyName("summary")]
public required VerdictDeltaSummary Summary { get; init; }
}
/// <summary>
/// Gate change entry in verdict delta.
/// </summary>
public sealed record GateChangeEntry
{
[JsonPropertyName("gateName")]
public required string GateName { get; init; }
[JsonPropertyName("fromResult")]
public required string FromResult { get; init; }
[JsonPropertyName("toResult")]
public required string ToResult { get; init; }
[JsonPropertyName("reason")]
public string? Reason { get; init; }
}
/// <summary>
/// Risk score delta.
/// </summary>
public sealed record RiskDelta
{
[JsonPropertyName("fromScore")]
public double FromScore { get; init; }
[JsonPropertyName("toScore")]
public double ToScore { get; init; }
[JsonPropertyName("fromCvssMax")]
public double? FromCvssMax { get; init; }
[JsonPropertyName("toCvssMax")]
public double? ToCvssMax { get; init; }
[JsonPropertyName("kevCountChange")]
public int KevCountChange { get; init; }
}
/// <summary>
/// Reachability changes summary.
/// </summary>
public sealed record ReachabilityDeltaSummary
{
[JsonPropertyName("pathsAdded")]
public int PathsAdded { get; init; }
[JsonPropertyName("pathsRemoved")]
public int PathsRemoved { get; init; }
[JsonPropertyName("newlyReachableCves")]
public ImmutableArray<string> NewlyReachableCves { get; init; } = ImmutableArray<string>.Empty;
[JsonPropertyName("newlyUnreachableCves")]
public ImmutableArray<string> NewlyUnreachableCves { get; init; } = ImmutableArray<string>.Empty;
}
/// <summary>
/// Reference to a supporting attestation.
/// </summary>
public sealed record AttestationRef
{
[JsonPropertyName("digest")]
public required string Digest { get; init; }
[JsonPropertyName("predicateType")]
public required string PredicateType { get; init; }
[JsonPropertyName("timestamp")]
public DateTimeOffset? Timestamp { get; init; }
}
/// <summary>
/// Summary of verdict delta changes.
/// </summary>
public sealed record VerdictDeltaSummary
{
[JsonPropertyName("gateChangeCount")]
public int GateChangeCount { get; init; }
[JsonPropertyName("overallStatusChange")]
public bool OverallStatusChange { get; init; }
[JsonPropertyName("fromStatus")]
public string? FromStatus { get; init; }
[JsonPropertyName("toStatus")]
public string? ToStatus { get; init; }
}
/// <summary>
/// Reachability Delta predicate capturing call-graph changes.
/// Predicate type: stella.ops/reachability-delta@v1
/// </summary>
public sealed record ReachabilityDeltaPredicate : DeltaPredicateBase
{
/// <summary>
/// CVE identifier if this delta is for a specific vulnerability.
/// </summary>
[JsonPropertyName("cve")]
public string? Cve { get; init; }
/// <summary>
/// Number of paths added.
/// </summary>
[JsonPropertyName("pathsAdded")]
public int PathsAdded { get; init; }
/// <summary>
/// Number of paths removed.
/// </summary>
[JsonPropertyName("pathsRemoved")]
public int PathsRemoved { get; init; }
/// <summary>
/// New entrypoints discovered.
/// </summary>
[JsonPropertyName("entrypointsAdded")]
public ImmutableArray<string> EntrypointsAdded { get; init; } = ImmutableArray<string>.Empty;
/// <summary>
/// Entrypoints no longer present.
/// </summary>
[JsonPropertyName("entrypointsRemoved")]
public ImmutableArray<string> EntrypointsRemoved { get; init; } = ImmutableArray<string>.Empty;
/// <summary>
/// Gates that changed status.
/// </summary>
[JsonPropertyName("gatesChanged")]
public ImmutableArray<GateStatusChange> GatesChanged { get; init; } = ImmutableArray<GateStatusChange>.Empty;
/// <summary>
/// Summary statistics.
/// </summary>
[JsonPropertyName("summary")]
public required ReachabilityDeltaDetailSummary Summary { get; init; }
}
/// <summary>
/// Gate status change in reachability delta.
/// </summary>
public sealed record GateStatusChange
{
[JsonPropertyName("gateName")]
public required string GateName { get; init; }
[JsonPropertyName("fromStatus")]
public required string FromStatus { get; init; }
[JsonPropertyName("toStatus")]
public required string ToStatus { get; init; }
}
/// <summary>
/// Detailed summary for reachability delta.
/// </summary>
public sealed record ReachabilityDeltaDetailSummary
{
[JsonPropertyName("totalPathsAdded")]
public int TotalPathsAdded { get; init; }
[JsonPropertyName("totalPathsRemoved")]
public int TotalPathsRemoved { get; init; }
[JsonPropertyName("entrypointChangeCount")]
public int EntrypointChangeCount { get; init; }
[JsonPropertyName("gateChangeCount")]
public int GateChangeCount { get; init; }
[JsonPropertyName("reachabilityChanged")]
public bool ReachabilityChanged { get; init; }
}

View File

@@ -11,10 +11,10 @@
<ProjectReference Include="..\..\..\__Libraries\StellaOps.Cryptography\StellaOps.Cryptography.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.0" />
<PackageReference Include="StackExchange.Redis" Version="2.8.37" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Http" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Options" />
<PackageReference Include="StackExchange.Redis" />
</ItemGroup>
</Project>

View File

@@ -11,7 +11,6 @@ using System.Net.Http.Json;
using FluentAssertions;
using Microsoft.AspNetCore.Mvc.Testing;
using Xunit;
using Xunit.Abstractions;
namespace StellaOps.Signer.Tests.Auth;

View File

@@ -9,7 +9,6 @@ using System.Security.Cryptography;
using System.Text;
using FluentAssertions;
using Xunit;
using Xunit.Abstractions;
namespace StellaOps.Signer.Tests.Availability;

View File

@@ -14,7 +14,6 @@ using System.Text.Json;
using FluentAssertions;
using Microsoft.AspNetCore.Mvc.Testing;
using Xunit;
using Xunit.Abstractions;
namespace StellaOps.Signer.Tests.Contract;

View File

@@ -10,7 +10,6 @@ using System.Text;
using System.Text.Json;
using FluentAssertions;
using Xunit;
using Xunit.Abstractions;
namespace StellaOps.Signer.Tests.Integration;
@@ -160,7 +159,7 @@ public sealed class MultiPluginSignVerifyIntegrationTests
var uniqueSignatures = signatureHashes.Values.Distinct().Count();
_output.WriteLine($"Unique signatures: {uniqueSignatures}/{signatures.Count}");
uniqueSignatures.Should().BeGreaterOrEqualTo(Math.Max(1, signatures.Count / 2),
uniqueSignatures.Should().BeGreaterThanOrEqualTo(Math.Max(1, signatures.Count / 2),
"different plugins should generally produce different signatures");
}

View File

@@ -10,7 +10,6 @@ using System.Text;
using System.Text.Json;
using FluentAssertions;
using Xunit;
using Xunit.Abstractions;
namespace StellaOps.Signer.Tests.Integration;

View File

@@ -153,7 +153,7 @@ public sealed class KeylessDsseSignerTests : IDisposable
// Assert
bundle.Metadata.CertificateChain.Should().NotBeNullOrEmpty();
bundle.Metadata.CertificateChain.Should().HaveCountGreaterOrEqualTo(1);
bundle.Metadata.CertificateChain.Should().HaveCountGreaterThanOrEqualTo(1);
}
[Fact]

View File

@@ -162,7 +162,7 @@ public sealed class KeylessSigningIntegrationTests : IDisposable
// Assert
bundle.Metadata.CertificateChain.Should().NotBeNullOrEmpty();
bundle.Metadata.CertificateChain.Should().HaveCountGreaterOrEqualTo(1);
bundle.Metadata.CertificateChain.Should().HaveCountGreaterThanOrEqualTo(1);
}
[Fact]

View File

@@ -13,7 +13,6 @@ using System.Text.Json;
using FluentAssertions;
using Microsoft.AspNetCore.Mvc.Testing;
using Xunit;
using Xunit.Abstractions;
namespace StellaOps.Signer.Tests.Negative;

View File

@@ -12,7 +12,6 @@ using System.Net.Http.Json;
using FluentAssertions;
using Microsoft.AspNetCore.Mvc.Testing;
using Xunit;
using Xunit.Abstractions;
namespace StellaOps.Signer.Tests.Observability;

View File

@@ -6,19 +6,22 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<UseConcelierTestInfra>false</UseConcelierTestInfra>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="10.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageReference Include="coverlet.collector" Version="6.0.4" />
<PackageReference Include="FluentAssertions" Version="6.12.0" />
<PackageReference Include="NSubstitute" Version="5.1.0" />
<PackageReference Include="BouncyCastle.Cryptography" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" />
<PackageReference Include="FluentAssertions" />
<PackageReference Include="NSubstitute" />
<PackageReference Include="xunit.runner.visualstudio" >
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Using Include="Xunit.Abstractions" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\StellaOps.Signer.WebService\StellaOps.Signer.WebService.csproj" />
<ProjectReference Include="..\StellaOps.Signer.Infrastructure\StellaOps.Signer.Infrastructure.csproj" />
@@ -31,4 +34,4 @@
<ProjectReference Include="../../../__Libraries/StellaOps.Canonical.Json/StellaOps.Canonical.Json.csproj" />
<ProjectReference Include="../../../__Libraries/StellaOps.TestKit/StellaOps.TestKit.csproj" />
</ItemGroup>
</Project>
</Project>

View File

@@ -56,4 +56,5 @@ app.TryRefreshStellaRouterEndpoints(routerOptions);
app.Run();
// Expose Program class for WebApplicationFactory in tests
public partial class Program;

View File

@@ -0,0 +1,12 @@
{
"profiles": {
"StellaOps.Signer.WebService": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:62545;http://localhost:62546"
}
}
}

View File

@@ -8,14 +8,14 @@
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.12.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
<PackageReference Include="StackExchange.Redis" Version="2.8.37" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
<PackageReference Include="Serilog.AspNetCore" />
<PackageReference Include="Serilog.Sinks.Console" />
<PackageReference Include="StackExchange.Redis" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\StellaOps.Signer.Core\StellaOps.Signer.Core.csproj" />
@@ -27,6 +27,6 @@
<ProjectReference Include="../../../Authority/StellaOps.Authority/StellaOps.Auth.Abstractions/StellaOps.Auth.Abstractions.csproj" />
<ProjectReference Include="../../../Authority/StellaOps.Authority/StellaOps.Auth.Client/StellaOps.Auth.Client.csproj" />
<ProjectReference Include="../../../Authority/StellaOps.Authority/StellaOps.Auth.ServerIntegration/StellaOps.Auth.ServerIntegration.csproj" />
<ProjectReference Include="../../../__Libraries/StellaOps.Router.AspNet/StellaOps.Router.AspNet.csproj" />
<ProjectReference Include="../../../Router/__Libraries/StellaOps.Router.AspNet/StellaOps.Router.AspNet.csproj" />
</ItemGroup>
</Project>
</Project>

View File

@@ -1,174 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Core", "StellaOps.Signer.Core\StellaOps.Signer.Core.csproj", "{81EB20CC-54DE-4450-9370-92B489B64F19}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Infrastructure", "StellaOps.Signer.Infrastructure\StellaOps.Signer.Infrastructure.csproj", "{AD28F5E8-CF69-4587-B3D2-C2B42935993D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.WebService", "StellaOps.Signer.WebService\StellaOps.Signer.WebService.csproj", "{104C429B-2122-43B5-BE2A-5FC846FEBDC4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration", "..\StellaOps.Configuration\StellaOps.Configuration.csproj", "{7A261EB8-60DF-4DD7-83E0-43811B0433B3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins.Abstractions", "..\StellaOps.Authority\StellaOps.Authority.Plugins.Abstractions\StellaOps.Authority.Plugins.Abstractions.csproj", "{B0E46302-AAC2-409C-AA2F-526F8328C696}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography", "..\StellaOps.Cryptography\StellaOps.Cryptography.csproj", "{726F764A-EEE9-4910-8149-42F326E37AF0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DependencyInjection", "..\StellaOps.DependencyInjection\StellaOps.DependencyInjection.csproj", "{D17E135F-57B9-476A-8ECE-BE081F25E917}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Abstractions", "..\StellaOps.Authority\StellaOps.Auth.Abstractions\StellaOps.Auth.Abstractions.csproj", "{526A921C-E020-4B7E-A195-29CC6FD1C634}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Client", "..\StellaOps.Authority\StellaOps.Auth.Client\StellaOps.Auth.Client.csproj", "{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.ServerIntegration", "..\StellaOps.Authority\StellaOps.Auth.ServerIntegration\StellaOps.Auth.ServerIntegration.csproj", "{EA1037DD-3213-4360-87B8-1129936D89CE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Signer.Tests", "StellaOps.Signer.Tests\StellaOps.Signer.Tests.csproj", "{B09322C0-6827-46D6-91AD-D2380BD36F21}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{81EB20CC-54DE-4450-9370-92B489B64F19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Debug|Any CPU.Build.0 = Debug|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Debug|x64.ActiveCfg = Debug|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Debug|x64.Build.0 = Debug|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Debug|x86.ActiveCfg = Debug|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Debug|x86.Build.0 = Debug|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Release|Any CPU.ActiveCfg = Release|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Release|Any CPU.Build.0 = Release|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Release|x64.ActiveCfg = Release|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Release|x64.Build.0 = Release|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Release|x86.ActiveCfg = Release|Any CPU
{81EB20CC-54DE-4450-9370-92B489B64F19}.Release|x86.Build.0 = Release|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Debug|x64.ActiveCfg = Debug|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Debug|x64.Build.0 = Debug|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Debug|x86.ActiveCfg = Debug|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Debug|x86.Build.0 = Debug|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Release|Any CPU.Build.0 = Release|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Release|x64.ActiveCfg = Release|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Release|x64.Build.0 = Release|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Release|x86.ActiveCfg = Release|Any CPU
{AD28F5E8-CF69-4587-B3D2-C2B42935993D}.Release|x86.Build.0 = Release|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Debug|x64.ActiveCfg = Debug|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Debug|x64.Build.0 = Debug|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Debug|x86.ActiveCfg = Debug|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Debug|x86.Build.0 = Debug|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Release|Any CPU.Build.0 = Release|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Release|x64.ActiveCfg = Release|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Release|x64.Build.0 = Release|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Release|x86.ActiveCfg = Release|Any CPU
{104C429B-2122-43B5-BE2A-5FC846FEBDC4}.Release|x86.Build.0 = Release|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Debug|x64.ActiveCfg = Debug|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Debug|x64.Build.0 = Debug|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Debug|x86.ActiveCfg = Debug|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Debug|x86.Build.0 = Debug|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Release|Any CPU.Build.0 = Release|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Release|x64.ActiveCfg = Release|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Release|x64.Build.0 = Release|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Release|x86.ActiveCfg = Release|Any CPU
{7A261EB8-60DF-4DD7-83E0-43811B0433B3}.Release|x86.Build.0 = Release|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Debug|x64.ActiveCfg = Debug|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Debug|x64.Build.0 = Debug|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Debug|x86.ActiveCfg = Debug|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Debug|x86.Build.0 = Debug|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Release|Any CPU.Build.0 = Release|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Release|x64.ActiveCfg = Release|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Release|x64.Build.0 = Release|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Release|x86.ActiveCfg = Release|Any CPU
{B0E46302-AAC2-409C-AA2F-526F8328C696}.Release|x86.Build.0 = Release|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Debug|x64.ActiveCfg = Debug|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Debug|x64.Build.0 = Debug|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Debug|x86.ActiveCfg = Debug|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Debug|x86.Build.0 = Debug|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Release|Any CPU.Build.0 = Release|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Release|x64.ActiveCfg = Release|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Release|x64.Build.0 = Release|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Release|x86.ActiveCfg = Release|Any CPU
{726F764A-EEE9-4910-8149-42F326E37AF0}.Release|x86.Build.0 = Release|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Debug|x64.ActiveCfg = Debug|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Debug|x64.Build.0 = Debug|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Debug|x86.ActiveCfg = Debug|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Debug|x86.Build.0 = Debug|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Release|Any CPU.Build.0 = Release|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Release|x64.ActiveCfg = Release|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Release|x64.Build.0 = Release|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Release|x86.ActiveCfg = Release|Any CPU
{D17E135F-57B9-476A-8ECE-BE081F25E917}.Release|x86.Build.0 = Release|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Debug|Any CPU.Build.0 = Debug|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Debug|x64.ActiveCfg = Debug|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Debug|x64.Build.0 = Debug|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Debug|x86.ActiveCfg = Debug|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Debug|x86.Build.0 = Debug|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Release|Any CPU.ActiveCfg = Release|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Release|Any CPU.Build.0 = Release|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Release|x64.ActiveCfg = Release|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Release|x64.Build.0 = Release|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Release|x86.ActiveCfg = Release|Any CPU
{526A921C-E020-4B7E-A195-29CC6FD1C634}.Release|x86.Build.0 = Release|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Debug|x64.ActiveCfg = Debug|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Debug|x64.Build.0 = Debug|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Debug|x86.ActiveCfg = Debug|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Debug|x86.Build.0 = Debug|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Release|Any CPU.Build.0 = Release|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Release|x64.ActiveCfg = Release|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Release|x64.Build.0 = Release|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Release|x86.ActiveCfg = Release|Any CPU
{BA683E2B-350F-4719-ACF7-1C5C35F5B72F}.Release|x86.Build.0 = Release|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Debug|x64.ActiveCfg = Debug|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Debug|x64.Build.0 = Debug|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Debug|x86.ActiveCfg = Debug|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Debug|x86.Build.0 = Debug|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Release|Any CPU.Build.0 = Release|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Release|x64.ActiveCfg = Release|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Release|x64.Build.0 = Release|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Release|x86.ActiveCfg = Release|Any CPU
{EA1037DD-3213-4360-87B8-1129936D89CE}.Release|x86.Build.0 = Release|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Debug|x64.ActiveCfg = Debug|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Debug|x64.Build.0 = Debug|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Debug|x86.ActiveCfg = Debug|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Debug|x86.Build.0 = Debug|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Release|Any CPU.Build.0 = Release|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Release|x64.ActiveCfg = Release|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Release|x64.Build.0 = Release|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Release|x86.ActiveCfg = Release|Any CPU
{B09322C0-6827-46D6-91AD-D2380BD36F21}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,105 @@
-- Signer Schema Migration 001: Initial Schema (Compacted)
-- Consolidated from 20251214000001_AddKeyManagementSchema.sql for 1.0.0 release
-- Creates the signer schema for key management, rotation, and trust anchor management
-- ============================================================================
-- Extensions
-- ============================================================================
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- ============================================================================
-- Schema Creation
-- ============================================================================
CREATE SCHEMA IF NOT EXISTS signer;
-- ============================================================================
-- Signer Schema Tables
-- ============================================================================
-- Key history table (tracks all keys ever added to trust anchors)
CREATE TABLE IF NOT EXISTS signer.key_history (
history_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
anchor_id UUID NOT NULL,
key_id TEXT NOT NULL,
public_key TEXT NOT NULL,
algorithm TEXT NOT NULL,
added_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
revoked_at TIMESTAMPTZ,
revoke_reason TEXT,
expires_at TIMESTAMPTZ,
metadata JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT uq_key_history_anchor_key UNIQUE (anchor_id, key_id)
);
CREATE INDEX IF NOT EXISTS idx_key_history_anchor ON signer.key_history(anchor_id);
CREATE INDEX IF NOT EXISTS idx_key_history_key_id ON signer.key_history(key_id);
CREATE INDEX IF NOT EXISTS idx_key_history_added ON signer.key_history(added_at);
CREATE INDEX IF NOT EXISTS idx_key_history_revoked ON signer.key_history(revoked_at) WHERE revoked_at IS NOT NULL;
COMMENT ON TABLE signer.key_history IS 'Tracks all keys ever added to trust anchors for historical verification';
COMMENT ON COLUMN signer.key_history.revoke_reason IS 'Reason for revocation (e.g., rotation-complete, compromised)';
-- Key audit log table (tracks all key operations)
CREATE TABLE IF NOT EXISTS signer.key_audit_log (
log_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
anchor_id UUID NOT NULL,
key_id TEXT,
operation TEXT NOT NULL,
actor TEXT,
old_state JSONB,
new_state JSONB,
details JSONB,
ip_address TEXT,
user_agent TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_key_audit_anchor ON signer.key_audit_log(anchor_id);
CREATE INDEX IF NOT EXISTS idx_key_audit_key ON signer.key_audit_log(key_id) WHERE key_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_key_audit_operation ON signer.key_audit_log(operation);
CREATE INDEX IF NOT EXISTS idx_key_audit_created ON signer.key_audit_log(created_at DESC);
COMMENT ON TABLE signer.key_audit_log IS 'Audit log for all key management operations';
COMMENT ON COLUMN signer.key_audit_log.operation IS 'Operation type: add_key, revoke_key, create_anchor, update_anchor, etc.';
-- ============================================================================
-- Optional Foreign Key to ProofChain
-- ============================================================================
-- This is conditional to avoid errors if the proofchain schema doesn't exist yet
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.tables
WHERE table_schema = 'proofchain' AND table_name = 'trust_anchors'
) THEN
-- Add foreign key if not already exists
IF NOT EXISTS (
SELECT 1 FROM information_schema.table_constraints
WHERE constraint_name = 'fk_key_history_anchor'
AND table_schema = 'signer'
AND table_name = 'key_history'
) THEN
ALTER TABLE signer.key_history
ADD CONSTRAINT fk_key_history_anchor
FOREIGN KEY (anchor_id) REFERENCES proofchain.trust_anchors(anchor_id)
ON DELETE CASCADE;
END IF;
IF NOT EXISTS (
SELECT 1 FROM information_schema.table_constraints
WHERE constraint_name = 'fk_key_audit_anchor'
AND table_schema = 'signer'
AND table_name = 'key_audit_log'
) THEN
ALTER TABLE signer.key_audit_log
ADD CONSTRAINT fk_key_audit_anchor
FOREIGN KEY (anchor_id) REFERENCES proofchain.trust_anchors(anchor_id)
ON DELETE CASCADE;
END IF;
END IF;
END $$;

View File

@@ -0,0 +1,21 @@
# Archived Pre-1.0 Migrations
This directory contains the original migrations that were compacted into `001_initial_schema.sql`
for the 1.0.0 release.
## Original Files
- `20251214000001_AddKeyManagementSchema.sql` - Key management schema (key_history, key_audit_log)
## Why Archived
Pre-1.0, the schema evolved incrementally. For 1.0.0, migrations were compacted into a single
initial schema to:
- Simplify new deployments
- Reduce startup time
- Provide cleaner upgrade path
## For Existing Deployments
If upgrading from pre-1.0, run the reset script directly with psql:
```bash
psql -h <host> -U <user> -d <db> -f devops/scripts/migrations-reset-pre-1.0.sql
```
This updates `schema_migrations` to recognize the compacted schema.

View File

@@ -10,8 +10,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
</ItemGroup>
<ItemGroup>

View File

@@ -194,7 +194,7 @@ public sealed class CertificateChainValidator : ICertificateChainValidator
try
{
// Parse the leaf certificate
using var leaf = new X509Certificate2(leafCertificate);
using var leaf = X509CertificateLoader.LoadCertificate(leafCertificate);
// Validate certificate is not expired
var now = _timeProvider.GetUtcNow();
@@ -225,7 +225,7 @@ public sealed class CertificateChainValidator : ICertificateChainValidator
// Add intermediate certificates
foreach (var intermediateDer in chain)
{
chainBuilder.ChainPolicy.ExtraStore.Add(new X509Certificate2(intermediateDer));
chainBuilder.ChainPolicy.ExtraStore.Add(X509CertificateLoader.LoadCertificate(intermediateDer));
}
// Build and validate the chain
@@ -410,7 +410,7 @@ public sealed class CertificateChainValidator : ICertificateChainValidator
.Replace("\n", "");
var derBytes = Convert.FromBase64String(base64);
certs.Add(new X509Certificate2(derBytes));
certs.Add(X509CertificateLoader.LoadCertificate(derBytes));
startIndex = endIndex + endMarker.Length;
}

View File

@@ -8,11 +8,11 @@
<Description>Keyless signing support for StellaOps Signer using Sigstore Fulcio</Description>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.0-*" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0-*" />
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.0-*" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="10.0.0-*" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.3.1" />
<PackageReference Include="Microsoft.Extensions.Http" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Options" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\StellaOps.Signer\StellaOps.Signer.Core\StellaOps.Signer.Core.csproj" />