< Summary

Information
Class: AsiBackbone.Core.Signing.GovernanceArtifactSigner
Assembly: AsiBackbone.Core
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Signing/GovernanceArtifactSigner.cs
Line coverage
58%
Covered lines: 50
Uncovered lines: 35
Coverable lines: 85
Total lines: 321
Line coverage: 58.8%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Signing/GovernanceArtifactSigner.cs

#LineLine coverage
 1using AsiBackbone.Core.Audit;
 2using AsiBackbone.Core.Emissions;
 3using AsiBackbone.Core.Outbox;
 4
 5namespace AsiBackbone.Core.Signing;
 6
 7/// <summary>
 8/// Provides provider-neutral helper methods for preparing and signing AsiBackbone governance artifacts.
 9/// </summary>
 10/// <remarks>
 11/// The helpers canonicalize and hash artifacts before optionally invoking <see cref="IAsiBackboneSigningService" />.
 12/// They do not verify signatures, persist records, provide immutable storage, or make tamper-evidence claims.
 13/// </remarks>
 14public static class GovernanceArtifactSigner
 15{
 16    /// <summary>
 17    /// Creates an unsigned wrapper for audit residue.
 18    /// </summary>
 19    public static SignedGovernanceArtifact<IAsiBackboneAuditResidue> CreateUnsignedAuditResidue(
 20        IAsiBackboneAuditResidue residue,
 21        CanonicalPayloadOptions? options = null,
 22        string? hashAlgorithm = null)
 23    {
 024        return CreateUnsigned(residue, CanonicalPayloadBuilder.ForAuditResidue(residue, options), hashAlgorithm);
 25    }
 26
 27    /// <summary>
 28    /// Creates signing-ready metadata for audit residue without invoking a signing provider.
 29    /// </summary>
 30    public static SignedGovernanceArtifact<IAsiBackboneAuditResidue> CreateSigningReadyAuditResidue(
 31        IAsiBackboneAuditResidue residue,
 32        CanonicalPayloadOptions? options = null,
 33        string? hashAlgorithm = null,
 34        IReadOnlyDictionary<string, string>? metadata = null)
 35    {
 036        return CreateSigningReady(residue, CanonicalPayloadBuilder.ForAuditResidue(residue, options), hashAlgorithm, met
 37    }
 38
 39    /// <summary>
 40    /// Signs audit residue after canonical payload hashing.
 41    /// </summary>
 42    public static ValueTask<SignedGovernanceArtifact<IAsiBackboneAuditResidue>> SignAuditResidueAsync(
 43        IAsiBackboneAuditResidue residue,
 44        IAsiBackboneSigningService signingService,
 45        CanonicalPayloadOptions? options = null,
 46        string? hashAlgorithm = null,
 47        string? keyId = null,
 48        string? keyVersion = null,
 49        IReadOnlyDictionary<string, string>? metadata = null,
 50        CancellationToken cancellationToken = default)
 51    {
 052        return SignAsync(
 053            residue,
 054            CanonicalPayloadBuilder.ForAuditResidue(residue, options),
 055            signingService,
 056            hashAlgorithm,
 057            keyId,
 058            keyVersion,
 059            metadata,
 060            cancellationToken);
 61    }
 62
 63    /// <summary>
 64    /// Creates an unsigned wrapper for a persistence-ready audit ledger record.
 65    /// </summary>
 66    public static SignedGovernanceArtifact<AuditLedgerRecord> CreateUnsignedAuditLedgerRecord(
 67        AuditLedgerRecord record,
 68        CanonicalPayloadOptions? options = null,
 69        string? hashAlgorithm = null)
 70    {
 071        return CreateUnsigned(record, CanonicalPayloadBuilder.ForAuditLedgerRecord(record, options), hashAlgorithm);
 72    }
 73
 74    /// <summary>
 75    /// Creates signing-ready metadata for a persistence-ready audit ledger record without invoking a signing provider.
 76    /// </summary>
 77    public static SignedGovernanceArtifact<AuditLedgerRecord> CreateSigningReadyAuditLedgerRecord(
 78        AuditLedgerRecord record,
 79        CanonicalPayloadOptions? options = null,
 80        string? hashAlgorithm = null,
 81        IReadOnlyDictionary<string, string>? metadata = null)
 82    {
 183        return CreateSigningReady(record, CanonicalPayloadBuilder.ForAuditLedgerRecord(record, options), hashAlgorithm, 
 84    }
 85
 86    /// <summary>
 87    /// Signs a persistence-ready audit ledger record after canonical payload hashing.
 88    /// </summary>
 89    public static ValueTask<SignedGovernanceArtifact<AuditLedgerRecord>> SignAuditLedgerRecordAsync(
 90        AuditLedgerRecord record,
 91        IAsiBackboneSigningService signingService,
 92        CanonicalPayloadOptions? options = null,
 93        string? hashAlgorithm = null,
 94        string? keyId = null,
 95        string? keyVersion = null,
 96        IReadOnlyDictionary<string, string>? metadata = null,
 97        CancellationToken cancellationToken = default)
 98    {
 199        return SignAsync(
 1100            record,
 1101            CanonicalPayloadBuilder.ForAuditLedgerRecord(record, options),
 1102            signingService,
 1103            hashAlgorithm,
 1104            keyId,
 1105            keyVersion,
 1106            metadata,
 1107            cancellationToken);
 108    }
 109
 110    /// <summary>
 111    /// Creates an unsigned wrapper for an audit residue lifecycle event.
 112    /// </summary>
 113    public static SignedGovernanceArtifact<AuditResidueLifecycleEvent> CreateUnsignedAuditResidueLifecycleEvent(
 114        AuditResidueLifecycleEvent lifecycleEvent,
 115        CanonicalPayloadOptions? options = null,
 116        string? hashAlgorithm = null)
 117    {
 0118        return CreateUnsigned(lifecycleEvent, CanonicalPayloadBuilder.ForAuditResidueLifecycleEvent(lifecycleEvent, opti
 119    }
 120
 121    /// <summary>
 122    /// Creates signing-ready metadata for an audit residue lifecycle event without invoking a signing provider.
 123    /// </summary>
 124    public static SignedGovernanceArtifact<AuditResidueLifecycleEvent> CreateSigningReadyAuditResidueLifecycleEvent(
 125        AuditResidueLifecycleEvent lifecycleEvent,
 126        CanonicalPayloadOptions? options = null,
 127        string? hashAlgorithm = null,
 128        IReadOnlyDictionary<string, string>? metadata = null)
 129    {
 0130        return CreateSigningReady(lifecycleEvent, CanonicalPayloadBuilder.ForAuditResidueLifecycleEvent(lifecycleEvent, 
 131    }
 132
 133    /// <summary>
 134    /// Signs an audit residue lifecycle event after canonical payload hashing.
 135    /// </summary>
 136    public static ValueTask<SignedGovernanceArtifact<AuditResidueLifecycleEvent>> SignAuditResidueLifecycleEventAsync(
 137        AuditResidueLifecycleEvent lifecycleEvent,
 138        IAsiBackboneSigningService signingService,
 139        CanonicalPayloadOptions? options = null,
 140        string? hashAlgorithm = null,
 141        string? keyId = null,
 142        string? keyVersion = null,
 143        IReadOnlyDictionary<string, string>? metadata = null,
 144        CancellationToken cancellationToken = default)
 145    {
 0146        return SignAsync(
 0147            lifecycleEvent,
 0148            CanonicalPayloadBuilder.ForAuditResidueLifecycleEvent(lifecycleEvent, options),
 0149            signingService,
 0150            hashAlgorithm,
 0151            keyId,
 0152            keyVersion,
 0153            metadata,
 0154            cancellationToken);
 155    }
 156
 157    /// <summary>
 158    /// Creates an unsigned wrapper for a governance emission envelope.
 159    /// </summary>
 160    public static SignedGovernanceArtifact<GovernanceEmissionEnvelope> CreateUnsignedGovernanceEmissionEnvelope(
 161        GovernanceEmissionEnvelope envelope,
 162        CanonicalPayloadOptions? options = null,
 163        string? hashAlgorithm = null)
 164    {
 0165        return CreateUnsigned(envelope, CanonicalPayloadBuilder.ForGovernanceEmissionEnvelope(envelope, options), hashAl
 166    }
 167
 168    /// <summary>
 169    /// Creates signing-ready metadata for a governance emission envelope without invoking a signing provider.
 170    /// </summary>
 171    public static SignedGovernanceArtifact<GovernanceEmissionEnvelope> CreateSigningReadyGovernanceEmissionEnvelope(
 172        GovernanceEmissionEnvelope envelope,
 173        CanonicalPayloadOptions? options = null,
 174        string? hashAlgorithm = null,
 175        IReadOnlyDictionary<string, string>? metadata = null)
 176    {
 0177        return CreateSigningReady(envelope, CanonicalPayloadBuilder.ForGovernanceEmissionEnvelope(envelope, options), ha
 178    }
 179
 180    /// <summary>
 181    /// Signs a governance emission envelope after canonical payload hashing.
 182    /// </summary>
 183    public static ValueTask<SignedGovernanceArtifact<GovernanceEmissionEnvelope>> SignGovernanceEmissionEnvelopeAsync(
 184        GovernanceEmissionEnvelope envelope,
 185        IAsiBackboneSigningService signingService,
 186        CanonicalPayloadOptions? options = null,
 187        string? hashAlgorithm = null,
 188        string? keyId = null,
 189        string? keyVersion = null,
 190        IReadOnlyDictionary<string, string>? metadata = null,
 191        CancellationToken cancellationToken = default)
 192    {
 0193        return SignAsync(
 0194            envelope,
 0195            CanonicalPayloadBuilder.ForGovernanceEmissionEnvelope(envelope, options),
 0196            signingService,
 0197            hashAlgorithm,
 0198            keyId,
 0199            keyVersion,
 0200            metadata,
 0201            cancellationToken);
 202    }
 203
 204    /// <summary>
 205    /// Creates an unsigned wrapper for a governance outbox entry.
 206    /// </summary>
 207    public static SignedGovernanceArtifact<GovernanceOutboxEntry> CreateUnsignedGovernanceOutboxEntry(
 208        GovernanceOutboxEntry entry,
 209        CanonicalPayloadOptions? options = null,
 210        string? hashAlgorithm = null)
 211    {
 1212        return CreateUnsigned(entry, CanonicalPayloadBuilder.ForGovernanceOutboxEntry(entry, options), hashAlgorithm);
 213    }
 214
 215    /// <summary>
 216    /// Creates signing-ready metadata for a governance outbox entry without invoking a signing provider.
 217    /// </summary>
 218    public static SignedGovernanceArtifact<GovernanceOutboxEntry> CreateSigningReadyGovernanceOutboxEntry(
 219        GovernanceOutboxEntry entry,
 220        CanonicalPayloadOptions? options = null,
 221        string? hashAlgorithm = null,
 222        IReadOnlyDictionary<string, string>? metadata = null)
 223    {
 0224        return CreateSigningReady(entry, CanonicalPayloadBuilder.ForGovernanceOutboxEntry(entry, options), hashAlgorithm
 225    }
 226
 227    /// <summary>
 228    /// Signs a governance outbox entry after canonical payload hashing.
 229    /// </summary>
 230    public static ValueTask<SignedGovernanceArtifact<GovernanceOutboxEntry>> SignGovernanceOutboxEntryAsync(
 231        GovernanceOutboxEntry entry,
 232        IAsiBackboneSigningService signingService,
 233        CanonicalPayloadOptions? options = null,
 234        string? hashAlgorithm = null,
 235        string? keyId = null,
 236        string? keyVersion = null,
 237        IReadOnlyDictionary<string, string>? metadata = null,
 238        CancellationToken cancellationToken = default)
 239    {
 1240        return SignAsync(
 1241            entry,
 1242            CanonicalPayloadBuilder.ForGovernanceOutboxEntry(entry, options),
 1243            signingService,
 1244            hashAlgorithm,
 1245            keyId,
 1246            keyVersion,
 1247            metadata,
 1248            cancellationToken);
 249    }
 250
 251    /// <summary>
 252    /// Creates a signing request from canonical payload hash metadata.
 253    /// </summary>
 254    public static SigningRequest CreateSigningRequest(
 255        CanonicalPayloadHash canonicalHash,
 256        string? keyId = null,
 257        string? keyVersion = null,
 258        IReadOnlyDictionary<string, string>? metadata = null)
 259    {
 2260        ArgumentNullException.ThrowIfNull(canonicalHash);
 261
 2262        var signingReadyMetadata = canonicalHash.ToSigningMetadata(metadata);
 263
 2264        return new SigningRequest(
 2265            canonicalHash.HashValue,
 2266            canonicalHash.HashAlgorithm,
 2267            purpose: canonicalHash.ArtifactType,
 2268            keyId: keyId,
 2269            keyVersion: keyVersion,
 2270            metadata: signingReadyMetadata.Metadata);
 271    }
 272
 273    private static SignedGovernanceArtifact<TArtifact> CreateUnsigned<TArtifact>(
 274        TArtifact artifact,
 275        CanonicalPayload payload,
 276        string? hashAlgorithm)
 277    {
 1278        return SignedGovernanceArtifacts.WithoutSignature(
 1279            artifact,
 1280            payload,
 1281            CanonicalPayloadHasher.ComputeHash(payload, hashAlgorithm));
 282    }
 283
 284    private static SignedGovernanceArtifact<TArtifact> CreateSigningReady<TArtifact>(
 285        TArtifact artifact,
 286        CanonicalPayload payload,
 287        string? hashAlgorithm,
 288        IReadOnlyDictionary<string, string>? metadata)
 289    {
 1290        return SignedGovernanceArtifacts.SigningReady(
 1291            artifact,
 1292            payload,
 1293            CanonicalPayloadHasher.ComputeHash(payload, hashAlgorithm),
 1294            metadata);
 295    }
 296
 297    private static async ValueTask<SignedGovernanceArtifact<TArtifact>> SignAsync<TArtifact>(
 298        TArtifact artifact,
 299        CanonicalPayload payload,
 300        IAsiBackboneSigningService signingService,
 301        string? hashAlgorithm,
 302        string? keyId,
 303        string? keyVersion,
 304        IReadOnlyDictionary<string, string>? metadata,
 305        CancellationToken cancellationToken)
 306    {
 2307        ArgumentNullException.ThrowIfNull(signingService);
 2308        cancellationToken.ThrowIfCancellationRequested();
 309
 2310        CanonicalPayloadHash hash = CanonicalPayloadHasher.ComputeHash(payload, hashAlgorithm);
 2311        SigningResult signingResult = await signingService
 2312            .SignAsync(CreateSigningRequest(hash, keyId, keyVersion, metadata), cancellationToken)
 2313            .ConfigureAwait(false);
 314
 2315        return SignedGovernanceArtifacts.FromSigningMetadata(
 2316            artifact,
 2317            payload,
 2318            hash,
 2319            signingResult.Metadata);
 2320    }
 321}

Methods/Properties

CreateUnsignedAuditResidue(AsiBackbone.Core.Audit.IAsiBackboneAuditResidue,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String)
CreateSigningReadyAuditResidue(AsiBackbone.Core.Audit.IAsiBackboneAuditResidue,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>)
SignAuditResidueAsync(AsiBackbone.Core.Audit.IAsiBackboneAuditResidue,AsiBackbone.Core.Signing.IAsiBackboneSigningService,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String,System.String,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>,System.Threading.CancellationToken)
CreateUnsignedAuditLedgerRecord(AsiBackbone.Core.Audit.AuditLedgerRecord,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String)
CreateSigningReadyAuditLedgerRecord(AsiBackbone.Core.Audit.AuditLedgerRecord,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>)
SignAuditLedgerRecordAsync(AsiBackbone.Core.Audit.AuditLedgerRecord,AsiBackbone.Core.Signing.IAsiBackboneSigningService,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String,System.String,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>,System.Threading.CancellationToken)
CreateUnsignedAuditResidueLifecycleEvent(AsiBackbone.Core.Audit.AuditResidueLifecycleEvent,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String)
CreateSigningReadyAuditResidueLifecycleEvent(AsiBackbone.Core.Audit.AuditResidueLifecycleEvent,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>)
SignAuditResidueLifecycleEventAsync(AsiBackbone.Core.Audit.AuditResidueLifecycleEvent,AsiBackbone.Core.Signing.IAsiBackboneSigningService,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String,System.String,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>,System.Threading.CancellationToken)
CreateUnsignedGovernanceEmissionEnvelope(AsiBackbone.Core.Emissions.GovernanceEmissionEnvelope,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String)
CreateSigningReadyGovernanceEmissionEnvelope(AsiBackbone.Core.Emissions.GovernanceEmissionEnvelope,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>)
SignGovernanceEmissionEnvelopeAsync(AsiBackbone.Core.Emissions.GovernanceEmissionEnvelope,AsiBackbone.Core.Signing.IAsiBackboneSigningService,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String,System.String,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>,System.Threading.CancellationToken)
CreateUnsignedGovernanceOutboxEntry(AsiBackbone.Core.Outbox.GovernanceOutboxEntry,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String)
CreateSigningReadyGovernanceOutboxEntry(AsiBackbone.Core.Outbox.GovernanceOutboxEntry,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>)
SignGovernanceOutboxEntryAsync(AsiBackbone.Core.Outbox.GovernanceOutboxEntry,AsiBackbone.Core.Signing.IAsiBackboneSigningService,AsiBackbone.Core.Signing.CanonicalPayloadOptions,System.String,System.String,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>,System.Threading.CancellationToken)
CreateSigningRequest(AsiBackbone.Core.Signing.CanonicalPayloadHash,System.String,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>)
CreateUnsigned(TArtifact,AsiBackbone.Core.Signing.CanonicalPayload,System.String)
CreateSigningReady(TArtifact,AsiBackbone.Core.Signing.CanonicalPayload,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>)
SignAsync()