- Added IIssuerDirectory interface for managing VEX document issuers, including methods for registration, revocation, and trust validation. - Created InMemoryIssuerDirectory class as an in-memory implementation of IIssuerDirectory for testing and single-instance deployments. - Introduced ISignatureVerifier interface for verifying signatures on VEX documents, with support for multiple signature formats. - Developed SignatureVerifier class as the default implementation of ISignatureVerifier, allowing extensibility for different signature formats. - Implemented handlers for DSSE and JWS signature formats, including methods for verification and signature extraction. - Defined various records and enums for issuer and signature metadata, enhancing the structure and clarity of the verification process.
229 lines
10 KiB
C#
229 lines
10 KiB
C#
using System.Collections.Immutable;
|
|
using System.Text.Json.Serialization;
|
|
using StellaOps.Policy.Engine.Attestation;
|
|
|
|
namespace StellaOps.Policy.Engine.ConsoleSurface;
|
|
|
|
/// <summary>
|
|
/// Console request for attestation report query per CONTRACT-VERIFICATION-POLICY-006.
|
|
/// </summary>
|
|
internal sealed record ConsoleAttestationReportRequest(
|
|
[property: JsonPropertyName("artifact_digests")] IReadOnlyList<string>? ArtifactDigests,
|
|
[property: JsonPropertyName("artifact_uri_pattern")] string? ArtifactUriPattern,
|
|
[property: JsonPropertyName("policy_ids")] IReadOnlyList<string>? PolicyIds,
|
|
[property: JsonPropertyName("predicate_types")] IReadOnlyList<string>? PredicateTypes,
|
|
[property: JsonPropertyName("status_filter")] IReadOnlyList<string>? StatusFilter,
|
|
[property: JsonPropertyName("from_time")] DateTimeOffset? FromTime,
|
|
[property: JsonPropertyName("to_time")] DateTimeOffset? ToTime,
|
|
[property: JsonPropertyName("group_by")] ConsoleReportGroupBy? GroupBy,
|
|
[property: JsonPropertyName("sort_by")] ConsoleReportSortBy? SortBy,
|
|
[property: JsonPropertyName("page")] int Page = 1,
|
|
[property: JsonPropertyName("page_size")] int PageSize = 25);
|
|
|
|
/// <summary>
|
|
/// Grouping options for Console attestation reports.
|
|
/// </summary>
|
|
[JsonConverter(typeof(JsonStringEnumConverter<ConsoleReportGroupBy>))]
|
|
internal enum ConsoleReportGroupBy
|
|
{
|
|
None,
|
|
Policy,
|
|
PredicateType,
|
|
Status,
|
|
ArtifactUri
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sorting options for Console attestation reports.
|
|
/// </summary>
|
|
[JsonConverter(typeof(JsonStringEnumConverter<ConsoleReportSortBy>))]
|
|
internal enum ConsoleReportSortBy
|
|
{
|
|
EvaluatedAtDesc,
|
|
EvaluatedAtAsc,
|
|
StatusAsc,
|
|
StatusDesc,
|
|
CoverageDesc,
|
|
CoverageAsc
|
|
}
|
|
|
|
/// <summary>
|
|
/// Console response for attestation reports.
|
|
/// </summary>
|
|
internal sealed record ConsoleAttestationReportResponse(
|
|
[property: JsonPropertyName("schema_version")] string SchemaVersion,
|
|
[property: JsonPropertyName("summary")] ConsoleReportSummary Summary,
|
|
[property: JsonPropertyName("reports")] IReadOnlyList<ConsoleArtifactReport> Reports,
|
|
[property: JsonPropertyName("groups")] IReadOnlyList<ConsoleReportGroup>? Groups,
|
|
[property: JsonPropertyName("pagination")] ConsolePagination Pagination,
|
|
[property: JsonPropertyName("filters_applied")] ConsoleFiltersApplied FiltersApplied);
|
|
|
|
/// <summary>
|
|
/// Summary of attestation reports for Console.
|
|
/// </summary>
|
|
internal sealed record ConsoleReportSummary(
|
|
[property: JsonPropertyName("total_artifacts")] int TotalArtifacts,
|
|
[property: JsonPropertyName("total_attestations")] int TotalAttestations,
|
|
[property: JsonPropertyName("status_breakdown")] ImmutableDictionary<string, int> StatusBreakdown,
|
|
[property: JsonPropertyName("coverage_rate")] double CoverageRate,
|
|
[property: JsonPropertyName("compliance_rate")] double ComplianceRate,
|
|
[property: JsonPropertyName("average_age_hours")] double AverageAgeHours);
|
|
|
|
/// <summary>
|
|
/// Console-friendly artifact attestation report.
|
|
/// </summary>
|
|
internal sealed record ConsoleArtifactReport(
|
|
[property: JsonPropertyName("artifact_digest")] string ArtifactDigest,
|
|
[property: JsonPropertyName("artifact_uri")] string? ArtifactUri,
|
|
[property: JsonPropertyName("artifact_short_digest")] string ArtifactShortDigest,
|
|
[property: JsonPropertyName("status")] string Status,
|
|
[property: JsonPropertyName("status_label")] string StatusLabel,
|
|
[property: JsonPropertyName("status_icon")] string StatusIcon,
|
|
[property: JsonPropertyName("attestation_count")] int AttestationCount,
|
|
[property: JsonPropertyName("coverage_percentage")] double CoveragePercentage,
|
|
[property: JsonPropertyName("policies_passed")] int PoliciesPassed,
|
|
[property: JsonPropertyName("policies_failed")] int PoliciesFailed,
|
|
[property: JsonPropertyName("evaluated_at")] DateTimeOffset EvaluatedAt,
|
|
[property: JsonPropertyName("evaluated_at_relative")] string EvaluatedAtRelative,
|
|
[property: JsonPropertyName("details")] ConsoleReportDetails? Details);
|
|
|
|
/// <summary>
|
|
/// Detailed report information for Console.
|
|
/// </summary>
|
|
internal sealed record ConsoleReportDetails(
|
|
[property: JsonPropertyName("predicate_types")] IReadOnlyList<ConsolePredicateTypeStatus> PredicateTypes,
|
|
[property: JsonPropertyName("policies")] IReadOnlyList<ConsolePolicyStatus> Policies,
|
|
[property: JsonPropertyName("signers")] IReadOnlyList<ConsoleSignerInfo> Signers,
|
|
[property: JsonPropertyName("issues")] IReadOnlyList<ConsoleIssue> Issues);
|
|
|
|
/// <summary>
|
|
/// Predicate type status for Console.
|
|
/// </summary>
|
|
internal sealed record ConsolePredicateTypeStatus(
|
|
[property: JsonPropertyName("type")] string Type,
|
|
[property: JsonPropertyName("type_label")] string TypeLabel,
|
|
[property: JsonPropertyName("status")] string Status,
|
|
[property: JsonPropertyName("status_label")] string StatusLabel,
|
|
[property: JsonPropertyName("freshness")] string Freshness);
|
|
|
|
/// <summary>
|
|
/// Policy status for Console.
|
|
/// </summary>
|
|
internal sealed record ConsolePolicyStatus(
|
|
[property: JsonPropertyName("policy_id")] string PolicyId,
|
|
[property: JsonPropertyName("policy_version")] string PolicyVersion,
|
|
[property: JsonPropertyName("status")] string Status,
|
|
[property: JsonPropertyName("status_label")] string StatusLabel,
|
|
[property: JsonPropertyName("verdict")] string Verdict);
|
|
|
|
/// <summary>
|
|
/// Signer information for Console.
|
|
/// </summary>
|
|
internal sealed record ConsoleSignerInfo(
|
|
[property: JsonPropertyName("key_fingerprint_short")] string KeyFingerprintShort,
|
|
[property: JsonPropertyName("issuer")] string? Issuer,
|
|
[property: JsonPropertyName("subject")] string? Subject,
|
|
[property: JsonPropertyName("algorithm")] string Algorithm,
|
|
[property: JsonPropertyName("verified")] bool Verified,
|
|
[property: JsonPropertyName("trusted")] bool Trusted);
|
|
|
|
/// <summary>
|
|
/// Issue for Console display.
|
|
/// </summary>
|
|
internal sealed record ConsoleIssue(
|
|
[property: JsonPropertyName("severity")] string Severity,
|
|
[property: JsonPropertyName("message")] string Message,
|
|
[property: JsonPropertyName("field")] string? Field);
|
|
|
|
/// <summary>
|
|
/// Report group for Console.
|
|
/// </summary>
|
|
internal sealed record ConsoleReportGroup(
|
|
[property: JsonPropertyName("key")] string Key,
|
|
[property: JsonPropertyName("label")] string Label,
|
|
[property: JsonPropertyName("count")] int Count,
|
|
[property: JsonPropertyName("status_breakdown")] ImmutableDictionary<string, int> StatusBreakdown);
|
|
|
|
/// <summary>
|
|
/// Pagination information for Console.
|
|
/// </summary>
|
|
internal sealed record ConsolePagination(
|
|
[property: JsonPropertyName("page")] int Page,
|
|
[property: JsonPropertyName("page_size")] int PageSize,
|
|
[property: JsonPropertyName("total_pages")] int TotalPages,
|
|
[property: JsonPropertyName("total_items")] int TotalItems,
|
|
[property: JsonPropertyName("has_next")] bool HasNext,
|
|
[property: JsonPropertyName("has_previous")] bool HasPrevious);
|
|
|
|
/// <summary>
|
|
/// Applied filters information for Console.
|
|
/// </summary>
|
|
internal sealed record ConsoleFiltersApplied(
|
|
[property: JsonPropertyName("artifact_count")] int ArtifactCount,
|
|
[property: JsonPropertyName("policy_ids")] IReadOnlyList<string>? PolicyIds,
|
|
[property: JsonPropertyName("predicate_types")] IReadOnlyList<string>? PredicateTypes,
|
|
[property: JsonPropertyName("status_filter")] IReadOnlyList<string>? StatusFilter,
|
|
[property: JsonPropertyName("time_range")] ConsoleTimeRange? TimeRange);
|
|
|
|
/// <summary>
|
|
/// Time range for Console filters.
|
|
/// </summary>
|
|
internal sealed record ConsoleTimeRange(
|
|
[property: JsonPropertyName("from")] DateTimeOffset? From,
|
|
[property: JsonPropertyName("to")] DateTimeOffset? To);
|
|
|
|
/// <summary>
|
|
/// Console request for attestation statistics dashboard.
|
|
/// </summary>
|
|
internal sealed record ConsoleAttestationDashboardRequest(
|
|
[property: JsonPropertyName("time_range")] string? TimeRange,
|
|
[property: JsonPropertyName("policy_ids")] IReadOnlyList<string>? PolicyIds,
|
|
[property: JsonPropertyName("artifact_uri_pattern")] string? ArtifactUriPattern);
|
|
|
|
/// <summary>
|
|
/// Console response for attestation statistics dashboard.
|
|
/// </summary>
|
|
internal sealed record ConsoleAttestationDashboardResponse(
|
|
[property: JsonPropertyName("schema_version")] string SchemaVersion,
|
|
[property: JsonPropertyName("overview")] ConsoleDashboardOverview Overview,
|
|
[property: JsonPropertyName("trends")] ConsoleDashboardTrends Trends,
|
|
[property: JsonPropertyName("top_issues")] IReadOnlyList<ConsoleDashboardIssue> TopIssues,
|
|
[property: JsonPropertyName("policy_compliance")] IReadOnlyList<ConsoleDashboardPolicyCompliance> PolicyCompliance,
|
|
[property: JsonPropertyName("evaluated_at")] DateTimeOffset EvaluatedAt);
|
|
|
|
/// <summary>
|
|
/// Dashboard overview for Console.
|
|
/// </summary>
|
|
internal sealed record ConsoleDashboardOverview(
|
|
[property: JsonPropertyName("total_artifacts")] int TotalArtifacts,
|
|
[property: JsonPropertyName("total_attestations")] int TotalAttestations,
|
|
[property: JsonPropertyName("pass_rate")] double PassRate,
|
|
[property: JsonPropertyName("coverage_rate")] double CoverageRate,
|
|
[property: JsonPropertyName("average_freshness_hours")] double AverageFreshnessHours);
|
|
|
|
/// <summary>
|
|
/// Dashboard trends for Console.
|
|
/// </summary>
|
|
internal sealed record ConsoleDashboardTrends(
|
|
[property: JsonPropertyName("pass_rate_change")] double PassRateChange,
|
|
[property: JsonPropertyName("coverage_rate_change")] double CoverageRateChange,
|
|
[property: JsonPropertyName("attestation_count_change")] int AttestationCountChange,
|
|
[property: JsonPropertyName("trend_direction")] string TrendDirection);
|
|
|
|
/// <summary>
|
|
/// Dashboard issue for Console.
|
|
/// </summary>
|
|
internal sealed record ConsoleDashboardIssue(
|
|
[property: JsonPropertyName("issue")] string Issue,
|
|
[property: JsonPropertyName("count")] int Count,
|
|
[property: JsonPropertyName("severity")] string Severity);
|
|
|
|
/// <summary>
|
|
/// Dashboard policy compliance for Console.
|
|
/// </summary>
|
|
internal sealed record ConsoleDashboardPolicyCompliance(
|
|
[property: JsonPropertyName("policy_id")] string PolicyId,
|
|
[property: JsonPropertyName("policy_version")] string PolicyVersion,
|
|
[property: JsonPropertyName("compliance_rate")] double ComplianceRate,
|
|
[property: JsonPropertyName("artifacts_evaluated")] int ArtifactsEvaluated);
|