EU Signing Payload Registry v1

Contract ID: CONTRACT-EU-SIGNING-PAYLOAD-REGISTRY-V1-203 Status: Active Signer contract Owner: Attestor/Signer guild Runtime library: src/Attestor/StellaOps.Signer/StellaOps.Signer.Core/EuSigningContracts.cs Adjacent tests: src/Attestor/StellaOps.Signer/StellaOps.Signer.Tests/Signing/EuArtifactOfflineVerifierTests.cs Sprint: SPRINT_20260430_203_Signer_eu_signing_verifier_contracts.md

Purpose

This registry is the authoritative allow-list for engineers integrating with the Stella Ops Signer: it defines the only EU compliance artifact payload types that the Signer offline verifier accepts. The registry is fail-closed — unknown payload ids, mismatched DSSE payload media types, wrong schema pins, or missing replay hashes all yield an invalid verification result.

The registry distinguishes Stella-as-manufacturer artifacts from tenant/operator artifacts so verifiers can require the correct signer profile.

Registry Entries

Payload idDSSE payload typeSchema pin idSigner profileAudience
product-csaf-advisory-v1application/vnd.stellaops.product.csaf-advisory.v1+json2.0stella-manufacturer-releaseProduct manufacturer
product-update-manifest-v1application/vnd.in-toto+jsonstella.ops/productUpdateManifest@v1stella-manufacturer-releaseProduct manufacturer
cra-tech-file-v1application/vnd.stellaops.cra.tech-file.index.v1+jsoncra-tech-file-v1tenant-regulatory-exportTenant/operator
conformity-dossier-v1application/vnd.stellaops.cra.conformity-dossier.index.v1+jsonconformity-dossier-v1tenant-regulatory-exportTenant/operator
nis2-soa-v1application/vnd.stellaops.nis2.soa.v1+jsonnis2-soa-v1tenant-regulatory-exportTenant/operator
dora-major-incident-report-v1application/vnd.stellaops.dora.major-incident-report.envelope.v1+jsondora-major-incident-report.v1tenant-regulatory-reportingTenant/operator
dora-roi-v1application/vnd.stellaops.dora.roi.bundle-index.v1+jsondora-roi.v1tenant-regulatory-reportingTenant/operator
dora-info-sharing-event-v1application/vnd.stellaops.dora-info-sharing.stix-batch.v1+jsondora-info-sharing-event-v1tenant-regulatory-sharingTenant/operator
tlpt-evidence-pack-v1application/vnd.stellaops.tlpt-evidence-pack+jsontlpt-evidence-pack.v1tenant-regulatory-evidenceTenant/operator

Schema Pin Locations

Direct JSON payloads carry the schema pin at a fixed JSON path:

Payload idJSON path
product-csaf-advisory-v1document.csaf_version
cra-tech-file-v1schemaVersion
conformity-dossier-v1schemaVersion
nis2-soa-v1schemaVersion
dora-major-incident-report-v1contractVersion
dora-roi-v1schemaVersion
dora-info-sharing-event-v1x_stella_dora_info_sharing.contract_version
tlpt-evidence-pack-v1schemaVersion

product-update-manifest-v1 is an in-toto statement (PayloadShape = InTotoStatement). The verifier checks predicateType = stella.ops/product-update-manifest@v1, then reads the schema pin from predicate.schemaVersion (the registry SchemaPinJsonPath is schemaVersion, evaluated against the predicate object). If the predicate type does not match or the predicate object is absent, no schema pin is resolved and verification fails with schema_pin_invalid rather than a distinct predicate-type code.

Signer Production Path

Direct JSON registry entries are signed through SigningRequest.DirectPayload (a DirectDssePayload). SignerPipeline.ValidateRequest calls ValidateDirectPayload, which checks (in order) the registry id, registry payload shape (DirectJson), DSSE media type, schema pin id, presence of payload bytes, the sha256:<64 lowercase hex> form of the supplied canonical hash, the recomputed canonical payload hash, that the payload bytes are already canonical JSON, and that the schema pin value at the registry JSON path matches. These run before entitlement introspection, release-integrity verification of the scanner image digest, quota enforcement, the provider-backed sign step, and the audit-sink write. Direct JSON payloads must not be wrapped in an in-toto statement unless their registry entry declares PayloadShape = InTotoStatement.

Validation failures throw SignerValidationException with stable codes including direct_payload_type_id_missing, direct_payload_type_unknown, direct_payload_shape_invalid, direct_payload_type_mismatch, direct_payload_schema_pin_mismatch, direct_payload_missing, direct_payload_hash_invalid, direct_payload_hash_mismatch, direct_payload_json_invalid, direct_payload_not_canonical, and direct_payload_schema_pin_invalid.

Signer pins the primary DSSE signing algorithm from the active crypto profile before resolving key material. Built-in pins are fips -> ES256, eidas -> ES256, gost -> GOST12-256, sm -> SM2 (the sm pin honours the optional SmAlgorithm override and otherwise defaults to SM2), and pq -> DILITHIUM3; explicit ProfileAlgorithmPins (DsseSignerOptions) may override the built-in map for deployment-specific provider packs. The sm and pq algorithms are additionally gated by environment flags: SM2 requires SM_SOFT_ALLOWED=1 and DILITHIUM3/FALCON512 require PQ_SOFT_ALLOWED=1, otherwise the sign step throws InvalidOperationException (fail-closed).

Offline Verification Contract

Verifier callers populate EuOfflineVerificationRequest with:

Optional request fields:

The verifier must not perform network access. It validates only local envelope bytes, local trust roots, local schema pin data, and caller-provided replay metadata.

Fail-Closed Reasons

Current stable issue codes include:

Audit Linkage Status

EuSigningAuditLinkageBuilder.FromVerification projects a verification request/result pair into an EuSigningAuditLinkage record carrying the shared EvidenceLocker audit fields:

The builder also exposes ArtifactSignedEventName = evidence.eu.artifact.signed for the production/sign path.

Downstream sign/export flows record these fields in evidence_locker.regulatory_audit_events and can link the output from evidence_locker.regulatory_artifact_ledger (both created by EvidenceLocker migration 007_regulatory_audit_retention_ledger.sql). The Signer verifier remains a local/offline contract and does not write EvidenceLocker tables directly.