Lease draft
Workload grants, host leases and the offline Gate.
draft-manav-lease-00 — Workload Grants and Leases (Internet-Draft, informational, work in progress)
Last updated 24 September 2026
Abstract. A workload grant is a Receipt whose statement (workload.grant) authorises one exact build of one program to reach one asset within stated limits until a stated date. The issuer converts it into one-hour leases bound to a key generated on the workload host from two sources of entropy (issuer seed and host randomness), such that the issuer can never derive the key. A local, offline Gate that holds no private key enforces leases from memory; an online Refresher renews them and cannot itself grant access. This document specifies the grant rules GR1–GR6, the objects manav-seed/1, manav-lease-req/1, manav-lease/1, manav-revocation/2, manav-gatelog/1, the activation checks V1–V12, lease states, the proof-of-possession message, and the transparency log.
- Objects — as in the Guard reference; reference issuer
core/Lease.php,core/Host.php,core/GateLog.php,core/TransparencyLog.php. - Key generation (tier G1) —
sk_seed = HKDF-SHA-384(salt = seed, IKM = local, info = "manav-epoch-key/1" || 0x0A || host_id || 0x0A || decimal(seq), L = 32); tier G2 —TPM2_StirRandom(seed),TPM2_Createwith fixedTPM | fixedParent | sensitiveDataOrigin,TPM2_Certifyby the attestation key. - Issuer checks (in order) — host active; host signature and ±120 s timestamp; seed valid and unused; proof of possession under
cnf; attestation (else tier G1, never silently G2);seqstrictly increasing (else clone alarm, host suspect); per-grant existence, revocation, expiry, host membership, tier; gate-log head reconciliation. - Activation checks V1–V12 — the Gate trusts nothing the Refresher hands it; V6 (statement
rp_sigunder a key pinned in the Gate's own configuration) bounds an issuer breach; V12 (proof of possession with a fresh challenge) makes a copied keyring useless. - States — FRESH (
now ≤ expand revocation list age ≤ 900 s), GRACE (untiloffline_until, peroffline_mode), DEAD (refuse and close). Worst-case revocation lag =max(max_revocation_age, offline_cap_s). - Proof of possession —
"manav-pop/1" || 0x0A || lease_id || 0x0A || challenge || 0x0A || context,context ∈ {activate, upstream:<exporter b64url>, loghead:<from>-<to>:sha256:<h>}; in chained mode the challenge is the TLS exporter value (EXPORTER-manav-pop), so a captured opening frame cannot be replayed. - Security considerations — see the Guard reference for the per-adversary verdicts; Mode A does not protect against root on the workload host; the identity of a program is the identity of its launch.