> ## Documentation Index
> Fetch the complete documentation index at: https://docs.enfinitos.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Verification keys

> How EnfinitOS publishes, rotates, and revokes verification keys. The public keys themselves and the rotation schedule.

EnfinitOS signs every proof pack with an **Ed25519** private key.
The public half is published and stable within a rotation window.

This page is the canonical key-publication reference. Other
documentation pages that link to `/compliance/verification-keys`
should be directed here.

## Where to fetch the keys

**Sandbox** (live now):

```
https://sandbox.api.enfinitos.com/v1/runtime-keys
```

**Production** (available at the April 2027 launch):

```
https://api.enfinitos.com/v1/runtime-keys
```

The sandbox endpoint returns a JSON directory in the `ws30.v1`
contract shape. Each key entry has a `keyId` matching the per-record
`keyId` carried on every proof-pack record.

The keys are also pinned in each release of the open-source
auditor — `packages/sdks/auditor-ts/src/keys.ts`. The auditor
prefers the pinned key set when offline; falls back to the
published endpoint only when a record's `keyId` is not in the
pinned set.

## Rotation schedule

<Note>
  Rotation applies to the **production** key set (HSM-held, from the April 2027
  launch). The current **sandbox** key is derived from a published seed string
  (`enfinitos.sandbox.2026-q4.seed.v1`) and intentionally does **not** rotate —
  it is public by design so anyone can re-derive it and verify sandbox packs. The
  schedule below describes the production operational model.
</Note>

We rotate production keys on a **90-day overlap window**. The schedule for a
new key generation:

1. **T₀** — new key generated. Public half published.
2. **T₀ + 14 days** — platform starts dual-signing (old key + new
   key) on a subset of packs for forward-compat verification.
3. **T₀ + 30 days** — platform cuts over to the new key as the
   primary. Old key continues to sign for backward-compat
   verification.
4. **T₀ + 90 days** — old key revoked. The key entry in the
   `runtime-keys` directory gains a non-null `revokedAt`. Packs
   older than 90 days remain verifiable against the historical key
   — the entry is retained in the directory indefinitely for
   backward-compat verification; it is never reissued under.

## Emergency rotation

If a key is suspected compromised, we rotate immediately and
publish a CVE with the affected key id. The auditor refuses to
verify any pack signed under a revoked key issued **after** the
revocation timestamp.

The current revocation list is published in the same `runtime-keys`
response: revoked keys carry a non-null `revokedAt` timestamp. The
auditor refuses to verify any pack signed under a key issued after
its `revokedAt`.

## Where to report a suspected compromise

Email `security@enfinitos.com` immediately. See
[the auditor SECURITY.md](https://github.com/EnfinitOS/sdk-auditor-ts/blob/main/SECURITY.md)
for the full security disclosure policy.
