| Internet-Draft | Authority Introduction | August 2026 |
| Schrock | Expires 5 February 2027 | [Page] |
Signature verification answers whether a key produced an artifact. It does not answer why a relying party accepts that key, or whether the key holder had authority for the action. This document specifies two composable artifacts. An Authority Document introduces and rotates an organization's evidence-issuing keys through a signed, hash-chained sequence. A Scoped Authority Proof records the authority held by a subject at a registry snapshot, including role, action scope, material limits, policy binding, validity, and revocation status. A relying party evaluates both artifacts under its own pinned trust inputs and policy. The design does not make a self-presented key authoritative, does not turn log inclusion or domain control into automatic trust, and does not equate a valid signature with permission to act. It also defines a source-resolution boundary: signing a statement does not give its underlying source data finer freshness or precision than that source actually provides.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 5 February 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
This document follows the distinction between VERIFIED and ACCEPTED. Verification establishes cryptographic and structural facts given a key. Acceptance is a relying-party decision about which keys, issuers, authority sources, and policies are admissible. Existing systems use certificates, federation metadata, trust bundles, transparency services, and deployment configuration for portions of that decision. Agent-action evidence profiles still need a concrete way to bind those trust inputs to the issuer key and to the human authority being relied upon.¶
The design is deliberately not a universal public-key infrastructure. The relying party selects its trust anchors and acceptance policy. Domain control, log inclusion, and endorsement are evidence inputs, not authority by themselves. The goal is a reproducible answer to two narrower questions: which evidence key was valid at issuance, and what scoped authority did the approving subject hold for the exact action under review?¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
An authority document is a JSON object, served from the organization's own origin (RECOMMENDED: /.well-known/ep-authority.json) and registrable to a transparency service:¶
{
"@version": "EP-AUTHORITY-DOC-v1",
"org": { "id": "org1", "name": "...", "domain": "acme.example" },
"seq": 3,
"prev_doc_digest": "sha256:<core digest of doc seq 2>",
"root_key": "<b64url SPKI>",
"issuer_keys": [
{ "kid": "ep:authority-issuer-key:sha256:<64-hex>",
"registry_issuer_id": "ep:authority-registry:acme-payments",
"key": "<b64url SPKI>",
"usages": ["evidence_issuer", "authority_proof_issuer"],
"valid_from": "...", "valid_to": "...",
"revoked_at": "<OPTIONAL>" }
],
"issued_at": "...",
"sig": "<root_key over the canonical core>",
"continuity_sig": "<by a key from the PREVIOUS doc>",
"endorsements": [ { "by_org": "...", "by_key": "...",
"doc_digest": "...", "sig": "..." } ]
}
¶
The signed core is the document without sig, continuity_sig, and endorsements; its canonical digest is the document's identity. Endorsements are countersignatures over that digest by OTHER authorities -- third-party attestations that ride with the document without being part of it.¶
A signature authenticates a statement by its signer. It does not establish that every upstream fact used to construct that statement was observed at the signature time, or that an upstream record supports the same temporal or semantic precision as the signed statement. This is especially important for role, employment, entitlement, delegation, and revocation data that may be synchronized from another system.¶
Implementations and profiles MUST distinguish, when applicable, the following instants:¶
Issuing or re-signing a proof MUST NOT move the source observation time forward. In particular, a producer MUST NOT set revocation.checked_at to issued_at unless the named revocation source was actually checked at that instant. If no revocation observation was made, the implementation MUST represent that absence and MUST NOT synthesize not_revoked.¶
A profile that relies on a fact derived from an upstream source MUST state the source or source class, the maximum accepted observation age, and any coarser resolution or synchronization bound that affects the claim. A signed assertion MUST NOT claim finer resolution than the underlying source record supports. For example, a proof issued at 12:00 cannot establish role validity at 12:00 when its only role source is a directory snapshot last synchronized at 06:00, unless the relying party's policy explicitly accepts that six-hour source bound.¶
If a required source observation is absent, older than the relying party's bound, or unable to support the required claim precision, the authority leg is indeterminate. The relying party MUST refuse an action that requires that authority leg; a fresh signature over stale or imprecise source data MUST NOT upgrade the result. This rule applies equally to corporate authority records such as those linked by OMP [I-D.veridom-omp] and to standing role credentials such as the vLEI composition described by AGTP-LEI [I-D.hood-agtp-lei]. Those mechanisms retain their native verification and governance semantics; the relying party decides whether their source resolution is sufficient for the action under review.¶
A proof signature and an Authority Document chain are not an integrated trust result merely because each verifies separately. A relying party that resolves an Authority Proof signer through an Authority Document MUST perform the following join. Every input described as pinned or expected is supplied by the relying party, not by the presenter.¶
The Authority Document issuer-key kid is ep:authority-issuer-key:sha256:<64-hex>, derived from the complete SHA-256 digest of the SPKI bytes. The proof-envelope key_id likewise carries its complete SPKI digest; a truncated identifier is not sufficient for the trust join. The effective-document and authenticated-time rules in Section 8 apply during resolution. A later revocation does not invalidate a proof independently time-anchored before its effective instant; a proof at or after that instant is refused. The proof's own signed issued_at is not independent evidence that it predates compromise.¶
A successful join accepts only the REGISTRY ISSUER for proof issuance. It does not establish that authority_id is a member of the named registry snapshot, validate a delegation chain, or decide that the grant's scope, role, limits, validity, and revocation status authorize a particular action. Those are separate checks in Section 6.¶
Authority and independence are different properties. An authority source can establish that a subject is eligible to approve an action; it cannot establish that the subject did not initiate that same action merely by asserting a flag. Initiator exclusion MUST be evaluated by joining the signed initiator and approver identities for the action. For a quorum, every counted approver MUST have its own accepted authority proof, and the authorization profile MUST separately enforce distinct-human and initiator-exclusion requirements.¶
Documents chain: seq increments by one, prev_doc_digest names the previous core digest, and each rotation MUST carry a continuity signature by the previous document's root key or one of its issuer keys explicitly carrying authority_doc_rotation and valid at the successor document's issuance instant. Document issuance instants MUST increase strictly. A verifier walking the chain therefore needs exactly one leap - the first document it ever saw - and every subsequent rotation is mechanically checkable. A rotation without valid continuity MUST be flagged, never silently accepted; whether endorsements can substitute for continuity is the relying party's policy (Section 11), not a default.¶
Two invariants govern key resolution, and implementations that miss either will hurt someone:¶
A malicious authority might show different documents to different relying parties. The hash chain exposes a fork when a verifier possesses both branches or a previously pinned head. Registration to a transparency service [RFC9943] can make revisions discoverable, but inclusion in one log view alone does not prove global consistency. Split-view resistance requires an independently checked consistency mechanism such as witnesses, gossip, or cross-logging. A profile MUST state which of those observations it requires; this document does not convert log inclusion into automatic acceptance.¶
Acceptance is not a boolean in a config file; it is a verdict over introduction evidence, evaluated under a RELYING-PARTY policy, using the same closed-verdict classification and replay-digest discipline as the evidence-sufficiency layer this family defines for actions ([I-D.schrock-ep-authorization-evidence-chain]). The evidence facts: the authority chain itself (consistent, signed, no unexplained continuity breaks); domain binding (the relying party's own attested observation that it fetched this document digest from the organization's origin); transparency-log inclusion and FIRST-LOGGED AGE (history can be a policy input, particularly when the history is independently witnessed); and endorsements, graded by whether the endorser is among the relying party's own pinned anchors.¶
Policies are per action class. A relying party can require stronger introduction evidence for money movement than for a low-impact action. New observations, such as an endorsement from an already pinned anchor or a longer witnessed history, may satisfy an unchanged policy, but they never alter that policy and never compel acceptance. The replay result MUST identify the policy and observations used so another evaluator can reproduce the decision.¶
If an authority loses its keys entirely, continuity breaks by construction. The recovery path is explicit rather than exceptional: the successor document is published with no (or invalid) continuity signature, the break is flagged by every verifier, and the relying party's policy decides what substitutes - typically an endorsement threshold (a quorum of the relying party's pinned anchors countersigning the successor document) plus a revocation statement over the compromised keys. A relying party with no such policy simply continues to refuse: fail closed is the default, recovery is opt-in.¶
Nothing creates trust from nothing, and this document does not claim to. It makes the bootstrap and scoped-authority inputs explicit and permits their checks to be replayed. The residual assumptions are named: domain binding inherits the Web PKI and is worth exactly that; log-backed consistency is as strong as the log's operator or the cross-log witnessing above it; endorsements are as strong as the endorser and mean nothing until a relying party pins one. A presenter-supplied key cannot establish its own authority. Key-resurrection (resolving a revoked key through an older document) is defeated by the newest-document-authoritative rule. Component-level verification is not composition: an Authority Document and Authority Proof that each verify independently still provide no integrated result unless the proof signer is joined to the accepted document at issuance time with the required key usage and organization binding. Even that join accepts only the issuer: a verifier that omits the separate grant/action and delegation checks can accept a genuine proof that does not authorize the action under review. Hash chaining detects conflicting branches only when the verifier has a comparison point; a single log view is insufficient to prove non-equivocation. Rotation-based history rewriting is constrained by time-of-issuance resolution. No combination of missing observations grades toward acceptance.¶
A valid signature can authenticate an over-precise claim. A verifier that compares only artifact issuance time to its freshness bound can accept stale role, entitlement, or revocation data that was merely re-signed. The source-resolution rules in Section 4 prevent that freshness laundering.¶
This document has no IANA actions. A well-known URI registration (ep-authority.json) is anticipated for a future revision.¶
Three Apache-2.0 reference components are published in the EMILIA Protocol repository. lib/authority/authority-doc.ts covers document creation, rotation, chain verification, time-of-issuance key resolution, endorsement verification, and introduction-policy replay. lib/authority/proof.ts and lib/authority/resolver.ts cover signed scoped-authority proofs and closed authority verdicts. lib/authority/document-proof-join.ts performs the integrated, fail-closed Authority Document to Authority Proof trust join. The authority vector suite contains 27 cases, including unpinned-key, issuer-substitution, amount, currency, scope, role, lifecycle, policy, delegation, malformed-time, registry-head, and stale-epoch refusals. A separate language-neutral join catalogue contains 26 scenarios and is executable by the JavaScript reference implementation. It covers accepted resolution, missing or mismatched document anchors, continuity failure, unauthorized or expired rotation keys, non-monotonic document time, organization and domain substitution, missing and wrong-usage signer keys, refusal of a usage added only by a later document, key validity and revocation at issuance, honest historical verification before a later revocation under an authenticated time anchor, missing or mismatched proof-time anchors, mandatory registry pins, registry-issuer substitution, document-head versus registry-head confusion, full issuer-key mismatch, registry-head and epoch failures, and proof tampering. The join result explicitly marks grant/action and delegation evaluation as not performed. This is one team's reference implementation. The repository includes both the scenario catalogue and 26 fixed serialized fixtures carrying exact document chains, proofs, relying-party pins, and expected results. No second implementation has yet reported results over those fixtures, so they are interoperability inputs rather than an independent or cross-language agreement claim.¶
The reference signer does not manufacture a positive revocation state. When the caller supplies no observation, the signed proof carries revocation as null; an explicit unknown observation remains unknown. Only an explicit status and strict RFC 3339 checked_at instant can enter the revocation object. Regression tests cover omitted, unknown, malformed, fresh, stale, and revoked cases. The authorization-server confirmation adapter applies the same source-resolution rule to directory snapshots: a fresh confirmation cannot make an older directory observation fresh.¶
This revision defines the source-resolution boundary for authority evidence, distinguishes source observation from artifact issuance and relying-party evaluation, prohibits freshness laundering by re-signing, and records the fail-closed reference behavior for absent, unknown, and stale revocation observations. It adds informative composition context for OMP and AGTP-LEI without changing either mechanism's native verification or governance semantics.¶