Skip to content

Workstream K: confidential compute — attestation and conditional key release (confidential-auth-v1) #142

Closed

Description

@gkalombo21

Workstream K — confidential compute: attestation and conditional key release

Makes the J CONFIDENTIAL policy enforceable off-chain. Depends on J (#140, 5a393ef5) and I (compute-conformance-v1). Refs #126 (closed epic; K was recorded there as future work).

Success statement. A worker does not receive confidential private input merely because it claims confidential_execution = true. Instead: valid worker session + fresh, purpose-bound challenge + acceptable attestation evidence + verified session/executor/task binding + trust and measurement policy + J policy eligible → conditional release. Any failure → no key, no plaintext input, no confidential capability, no execution start.

Scope

  • Challenge model (confidential-auth-v1): fresh, unpredictable, single-use, short-lived, bound to session, executor, task and purpose (CONFIDENTIAL_INPUT_RELEASE); ephemeral off-chain state Issued → Presented → Consumed | Expired | Revoked | Denied.
  • Evidence envelope (attestation-envelope-v1): format, verifier kind, bindings, window, opaque vendor payload kept separate from normalized verified claims; logs carry a hash reference, never the payload.
  • Verifier interface AttestationVerifier — vendor-neutral; normalizes into VerifiedAttestation (environment type, measurement, security version, debug state, environment key, bindings, window, trust anchor). Future NVIDIA / AMD / Intel / confidential-VM adapters implement it without touching J or ComputeTask.
  • Trust policy (deployment, non-consensus): accepted formats, trust anchors with revocation, measurement allowlist with revocation, minimum security version, debug policy, freshness bounds, TTLs. Rotation and revocation semantics documented; in-flight authorizations resting on a revoked anchor are revoked; already-redeemed releases cannot be undone.
  • Reference attestation verifier — REFERENCE / TEST ONLY, not hardware attestation, not production confidential compute: Ed25519-signed evidence under a distinct test root (never the executor key), domain-separated, nonce/session/executor/task/purpose bound, measurement allowlist, expiry.
  • J integration: VerifiedAttestation → J Evidence { level = ATTESTED, binding = CHALLENGE(session), window, verifier, reference } injected by the authority (callers cannot inject ATTESTED evidence); policy::eligible remains the final policy decision; claim-only / CERTIFIED / expired / wrong-session all fail.
  • Release authorization — ReleaseAuthority (control-plane confidential authorization service): Requested → ChallengeIssued → EvidencePresented → Verified → PolicySatisfied → Released → Consumed | Expired | Revoked | Denied; single-use, TTL-bounded, bound to task/executor/session; not a bearer token (redeemed only inside the authenticated session).
  • Conditional release, two separate abstractions per F §9: (A) the control plane issues the FetchInput capability for a confidential input only against a redeemed release authorization (authorize_fetch_confidential; ordinary authorize_fetch refuses ConfidentialReleaseRequired); (B) KeyReleaseAuthority (the client's delegated key service, F §11/§14) releases the client-registered content key wrapped (X25519 + BLAKE3 KDF + XChaCha20-Poly1305) to the environment key the attestation bound. The data plane stores ciphertext; plaintext exists only inside the (reference) environment.
  • Named suite confidential-auth-v1, cases K01–K30, CI step Mbongo Compute Confidential Authorization printing CONFIDENTIAL AUTHORIZATION: PASS; negative-control verifiers (signature-blind, binding-blind) that the suite must catch.
  • Architecture document docs/architecture/compute-confidential-attestation-key-release.md (NORMATIVE, non-consensus).

What K proves, and does not

Proven: policy-gated release; encrypted-at-rest confidential input; content key released only to the key a verified attestation bound, only after J eligibility, once per challenge, within a window; every replay / binding / freshness / trust failure fails closed; PUBLIC and VERIFIED paths unchanged; no consensus, RPC, SDK-wire, ComputeTask or Receipt change.

Not proven: provider-resistant confidentiality — the reference environment is a software process with software keys; REFERENCE_ATTESTED is not hardware attestation. Hardware-vendor compromise, TEE side channels, malicious firmware accepted by policy, host denial of service, output correctness (#52), traffic analysis and metadata observation are outside K.

Follow-up gate

Hardware Attestation Adapter — first production backend: the first real vendor/confidential-VM verifier implementing AttestationVerifier, with its own trust-root distribution and evidence format. K is not production hardware-confidential until it exists.

Success criteria

claim-only confidential fails · valid ATTESTED evidence satisfies J · session, executor, task, challenge and freshness bindings proven · replay (challenge, session, task) denied · unknown format, untrusted root, revoked root, bad measurement, verifier outage fail closed · J remains the final policy evaluator · release before authorization impossible · keys absent from chain artifacts and logs · PUBLIC flow unchanged (conformance 38/38, reference harness, v0.4 vertical) · protected blobs identical · CRITICAL = HIGH = BLOCKING_MEDIUM = 0.

Activity

  1. gkalombo21 commented on Sep 8, 2026

    @gkalombo21
    CollaboratorAuthor

    Workstream K — done (reference path; hardware adapter is the follow-up gate)

    Merged: d2bd1429426876b386cce8369741e0589e3f3877 (#143, squash of source bed3885c; tree identical to the source). Baseline 5a393ef5.

    Evidence bound to those SHAs

    • PR CI (run 34176467629 on bed3885c): Rust Checks, Mbongo Compute v0.4 Vertical, Docker Devnet Bootstrap, Monetary Policy Model, TypeScript SDK (Node 20.19.0 and 24), spelling — pass; Devnet Convergence Harness skipped (push-only, by design). The new named step Mbongo Compute Confidential Authorization ran inside Rust Checks: RESULT: PASS (30/30), CONFIDENTIAL AUTHORIZATION: PASS.
    • Post-merge push CI (run 34177199610 on d2bd1429426876b386cce8369741e0589e3f3877): success, 7/7 — Rust Checks, Mbongo Compute v0.4 Vertical, Devnet Convergence Harness, Docker Devnet Bootstrap, Monetary Policy Model, TypeScript SDK (Node 20.19.0 and 24); 0 skipped.
    • Local at the source: fmt, clippy -D warnings, workspace 460 / 0 / 2, replay harness, reference harness PASS, conformance 38/38, provider policy 41/41, confidential authorization 30/30 (+ the 6-test group; both negative-control verifiers fail the suite as they must), SDK 153 tests + typecheck + build, v0.4 vertical PASS, git diff --check; 54 relative links and every section citation resolve; INDEX integrity; LF endings; workflow YAML parses.
    • 46 protected blobs (RFC 0005, RFC 0002, RECEIPT_SPEC, lock v0.4, rpc_v0.3, consensus sources, vertical harness, reference worker sources, conformance, provider policy J, SDK sources and manifest, five vector files, E, F, privacy architecture) byte-identical from 5a393ef5 through bed3885c and d2bd1429426876b386cce8369741e0589e3f3877. Existing crate files changed by design: control_plane.rs (+83: confidential registration, authorize_fetch_confidential, the ordinary path's refusal), lib.rs (+1), Cargo.toml, Cargo.lock (+2 dependency edges, no new crate).

    Delivered

    • docs/architecture/compute-confidential-attestation-key-release.md — NORMATIVE architecture, non-consensus, confidential-auth-v1 + attestation-envelope-v1; indexed.
    • crates/mbongo-compute/src/confidential/ — ReleaseAuthority, KeyReleaseAuthority, sealing and key wrapping, AttestationVerifier boundary, reference/ (REFERENCE_ATTESTED, test only), suite.rs K01–K30 with negative controls; bin confidential_authorization; CI step Mbongo Compute Confidential Authorization.
    • Invariants K1–K44; conflicts with existing authority: none.

    What is proven: claim-only confidential → nothing; valid, fresh, session-, executor- and task-bound attestation under a trusted root and an approved measurement, with J eligible → one single-use release → fetch capability for the sealed input + content key wrapped to the attested environment key; every replay, binding, freshness, trust, measurement, policy and outage failure fails closed; PUBLIC unchanged; keys and plaintext absent from chain bytes and logs; ComputeTask, Receipt, RPC and SDK wire untouched.

    What is not proven, stated: provider-resistant confidentiality. The reference environment is a software process endorsed by a test root; REFERENCE_ATTESTED is not hardware attestation. Replay protection is scoped to one authority process lifetime (in-memory state).

    Follow-up gate: Hardware Attestation Adapter — first production backend (a confidential-VM, CPU-vendor or GPU-vendor AttestationVerifier with its own trust-root distribution and a HARDWARE_ATTESTED label, run through the same suite).

    Dependency graph after K

    v0.4 first vertical (#126)  ✅ released
    J  provider capability / policy model     ✅ 5a393ef5 (#141, #140)
    K  confidential authorization             ✅ d2bd1429426876b386cce8369741e0589e3f3877 (#143, this issue) — REFERENCE_ATTESTED
    K-HW  hardware attestation adapter        ← K ✅            → NEXT GATE (first production backend)
    independent: L verification (#52) · P2P identifier RFC/addendum · persistent data plane and durable
                 release-authority state · receipt-tool rebase (#50) · CPU/GPU/AI workers · economics gates
    

    Every success criterion in this issue is met for the reference path. Closing intentionally as completed; the hardware adapter is tracked as its own gate.

  2. gkalombo21 commented on Sep 8, 2026

    @gkalombo21
    CollaboratorAuthor

    Closing intentionally as completed for the reference path: merged d2bd142 (#143), PR CI and post-merge push CI green, protected blobs identical. The reference attestation path is REFERENCE_ATTESTED (test only); the next gate is the first hardware attestation adapter.

  3. gkalombo21 commented on Sep 8, 2026

    @gkalombo21
    CollaboratorAuthor

    Post-closure note: the first hardware attestation adapter (AMD SEV-SNP, snp-adapter-v1) behind K's AttestationVerifier boundary merged as 89cadb67 (#145), tracked in #144. Proven on real captured Milan evidence; the live SEV-SNP guest run is still outstanding, so the confidential path remains REFERENCE_ATTESTED operationally and provider-resistant confidentiality is not yet claimed. This issue stays closed; nothing here reopens it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions