Skip to content

docs: explain app proofs and boot proofs#669

Open
emostov wants to merge 3 commits into
mainfrom
docs/app-and-boot-proofs
Open

docs: explain app proofs and boot proofs#669
emostov wants to merge 3 commits into
mainfrom
docs/app-and-boot-proofs

Conversation

@emostov
Copy link
Copy Markdown
Contributor

@emostov emostov commented May 21, 2026

Add explainer for App Proofs and Boot Proofs for TVC customers, using Turnkey app proofs as a concrete example of how app proofs can be implemented

@emostov emostov requested a review from narimonf May 21, 2026 19:15
@mintlify
Copy link
Copy Markdown
Contributor

mintlify Bot commented May 21, 2026

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
turnkey-docs 🟢 Ready View Preview May 21, 2026, 7:18 PM

💡 Tip: Enable Workflows to automatically generate PRs for you.

docs: add fetching, multi-replica, and bundling sections

Followup after re-reading the source Slack thread:
- document the public get_boot_proof / get_latest_boot_proof / list_app_proofs endpoints so verifiers know where to fetch Boot Proofs
- document the multi-replica behavior (per-enclave Ephemeral Keys, different responses signed by different keys, cache by Ephemeral key)
- document the Anchorage-style pattern of bundling App Proof + Boot Proof in a single response, and point at tvc_server.go
- add public_api_server.go and tvc_server.go to the code-pointers list

docs: scrub internal references; remove caching and replica sections

- Remove all references to internal tkhq/mono repo paths and file
  locations; rephrase to describe behavior, not implementation.
- Remove the 'Caching Boot Proofs' section entirely.
- Remove the 'Multiple replicas and per-enclave Ephemeral Keys' section
  entirely.
- Remove the 'Where this lives in the code' section (was wall-to-wall
  tkhq/mono links); App Proof bytes-on-the-wire reference now points
  to the public Rust + TypeScript SDK verifier implementations from the
  'Who produces it' subsection.
- Drop named-customer reference (Anchorage) from the bundling pattern
  paragraph; describe the generic pattern instead.
- Soften the cross-link from security/turnkey-verified.mdx so it no
  longer promises a 'where each proof is produced in the codebase'
  walkthrough.

docs: rewrite to conceptual-only per reviewer

- Remove all remaining implementation-level narration (producer reads
  X then Y then Z, bundle-pattern step-by-step instructions, 'who
  produces it' sub-sections describing internal mechanics).
- Drop the 'Bundling the verifiability chain' subsection entirely; the
  generic public-API description of fetching proofs covers what a
  customer needs to know.
- Collapse Boot Proof / App Proof producer paragraphs into single
  what-level sentences; no how-it-works narration.
- Keep cryptography, JSON wire format, public API endpoints, and the
  trust-boundary discussion (Quorum vs Ephemeral Key) untouched per
  reviewer scope.

various cleanup
}
```

On its own, this proves that the QuorumOS enclave instance with the corresponding Ephemeral private key signed the address derivation claim. When the verifier matches `publicKey` to a valid Boot Proof, the claim is tied back to the attested enclave instance and the code identified by its manifest. Your own TVC App Proofs follow the same chain even if the payload schema is specific to your application.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd switch the order of app proof on its own, + boot proof to boot proof on its own, + app proof. On it's own, the app proof doesn't prove anything about quorumOs or an enclave, it just proves that a key signed a payload. What the boot proof proves on its own is easier to reason about imo

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

}
```

On its own, this payload does not that a particular enclave signed it; but when a verifier can match `publicKey` to a valid Boot Proof, the claim is tied back to an enclave instance and the code identified by its manifest. Your own TVC App Proofs follow the same chain even if the payload schema is specific to your application.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

A Boot Proof is a bundle of artifacts that a verifier can use to establish what code an enclave is running. It contains:

- The **[AWS Nitro attestation document](https://docs.aws.amazon.com/enclaves/latest/user/verify-root.html#the-attestation-document)** (DER-encoded COSE Sign1), which contains PCR measurements, the AWS certificate chain, the enclave's Ephemeral public key (in the `public_key` field), and arbitrary `user_data`.
- The **QOS manifest** and **manifest envelope**, which describe the application binary and arguments, the operator quorum, the quorum public key, and other deployment configuration. The AWS attestation document's `user_data` is set by QOS to the digest of this manifest, which is what binds the two together.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- The **QOS manifest** and **manifest envelope**, which describe the application binary and arguments, the operator quorum, the quorum public key, and other deployment configuration. The AWS attestation document's `user_data` is set by QOS to the digest of this manifest, which is what binds the two together.
- The **[QOS](https://github.com/tkhq/qos) manifest** and **manifest envelope**, which describe the application binary and arguments, the operator quorum, the quorum public key, and other deployment configuration. The AWS attestation document's `user_data` is set by QOS to the digest of this manifest, which is what binds the two together.

or something to specify what QOS is


App Proofs are generated by enclave application logic. What makes an App Proof an App Proof is that application-level output is signed with an enclave's Ephemeral Key, so that output can be linked back to the Boot Proof Turnkey stores.

As a TVC builder, you decide what your App Proof payload needs to prove. For example, your application might sign a model inference result, a private computation outcome, or a protocol-specific state transition. The important design requirement is that the payload commits to the facts a verifier will care about, and that the signature uses the enclave Ephemeral Key so the verifier can connect the payload to a valid Boot Proof.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

out of scope for this but thinking a "how to write an app proof for your app" is a good doc to have in TVC before launch

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yess goes along w tkhq/tvc-template#10


The answer is a trust boundary distinction.

The quorum key is designed to live across many different versions of an enclave app and can not be provably exclusive to a specific enclave instance, app binary, or configuration. The Quorum Key is provisioned via the [QuorumOS quorum provisioning protocol](https://github.com/tkhq/qos/blob/main/docs/boot_standard.md): share holders verify a node's attestation document, encrypt quorum key shares to the node's Ephemeral Key, and the node reconstructs the Quorum Key once the configured threshold is met. Because the Quorum Key can be provisioned into any enclave that satisfies the provisioning protocol, a Quorum Key signature can be linked with arbitrary code that has received that key. Turnkey customers have no way to attest "this private key only exists inside this enclave" for the Quorum Key, because that statement is not true at the cryptographic layer.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The quorum key is designed to live across many different versions of an enclave app and can not be provably exclusive to a specific enclave instance, app binary, or configuration. The Quorum Key is provisioned via the [QuorumOS quorum provisioning protocol](https://github.com/tkhq/qos/blob/main/docs/boot_standard.md): share holders verify a node's attestation document, encrypt quorum key shares to the node's Ephemeral Key, and the node reconstructs the Quorum Key once the configured threshold is met. Because the Quorum Key can be provisioned into any enclave that satisfies the provisioning protocol, a Quorum Key signature can be linked with arbitrary code that has received that key. Turnkey customers have no way to attest "this private key only exists inside this enclave" for the Quorum Key, because that statement is not true at the cryptographic layer.
The quorum key is designed to live across many different versions of an enclave app and can not be provably exclusive to a specific enclave instance, app binary, or configuration. The Quorum Key is provisioned via the [QuorumOS quorum provisioning protocol](https://github.com/tkhq/qos/blob/main/docs/boot_standard.md): share holders verify a node's attestation document, encrypt quorum key shares to the node's Ephemeral Key, and the node reconstructs the Quorum Key once the configured threshold is met. Because the Quorum Key can be provisioned into any enclave that satisfies the provisioning protocol, a Quorum Key signature cannot cryptographically prove the app proof payload came from the _inside_ of a _specific_ enclave.

reads a little more straightforward to me

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants