EU Offline Verifier Trust Roots

Status: Active Signer security contract Owner: Attestor/Signer guild Sprint: docs-archive/implplan/SPRINT_20260430_203_Signer_eu_signing_verifier_contracts.md

This page is the security contract for the Stella Ops EU offline artefact verifier (EuArtifactOfflineVerifier): how trust roots are shaped, normalized, and time-validated when regulators or auditors replay signed EU artefacts entirely offline. It is written for Signer/Attestor engineers and for operators who assemble trust bundles for sealed and air-gapped deployments. Verification never touches the network — it validates only local envelope bytes, local trust roots, local schema-pin data, and caller-supplied replay metadata.

See also: offline-verification-crypto-provider.md for the underlying verification provider and crypto-compliance.md for the eidas compliance profile.

Trust Root Shape

Each EU verifier trust root is explicit local metadata:

{
  "trustRootId": "tenant-reporting-root-2026",
  "keyId": "tenant-reporting-key",
  "publicKeyPem": "-----BEGIN PUBLIC KEY-----...",
  "fingerprint": "sha256:<64 lowercase hex>",
  "notBeforeUtc": "2026-01-01T00:00:00Z",
  "notAfterUtc": "2027-01-01T00:00:00Z",
  "signerProfiles": ["tenant-regulatory-reporting"]
}

The fingerprint is the sha256:-prefixed lowercase-hex digest over the DER SubjectPublicKeyInfo bytes (computed by EuArtifactOfflineVerifier.ComputePublicKeyFingerprint, which delegates to CanonJson.Sha256Prefixed). A -----BEGIN CERTIFICATE----- PEM is accepted: the verifier extracts the certificate’s public key and computes the fingerprint over the extracted SPKI, not over the certificate bytes.

EuArtifactOfflineVerifier.NormalizeTrustRootsAsync silently drops a candidate root from the verifier set when any of the following hold:

If every supplied root is dropped (or none are supplied), the result fails with trust_roots_required. Dropped roots are not surfaced as individual error codes; they simply leave no candidate able to verify the signature, yielding signature_untrusted:<keyId> and no_valid_signature.

Loading Modes

EuOfflineVerificationRequest.TrustRootMode is an EuTrustRootMode enum with three members (Online, Sealed, AirGap). The field is required on the request record but currently informational only: EuArtifactOfflineVerifier does not branch on it, and verification is always offline regardless of the value. The mode is therefore evidence metadata recording how the operator sourced the trust roots, not a switch that changes verifier behaviour or grants permission to fetch keys.

ModeExpected source of trust rootsExpected use
OnlineOperator-managed runtime configuration projected into the Signer/CLI processConnected administrative environments
SealedSealed bootstrap bundle or sealed environment configLocked-down deployments with mounted config
AirGapOffline Kit or physical-media trust bundleDisconnected review and regulator evidence replay

All modes use the same verifier contract. None of them cause the verifier to perform network access: it validates only local envelope bytes, local trust roots, local schema-pin data, and caller-supplied replay metadata.

Validity Rules

Operational Notes