Federation Authority
Run the issuing authority for one boundary and hand a partner's verifier a bundle it can check every lease against.
On this page
The issuing authority for a federation boundary declares its signers in a profile and binds a local seed to each declared key. From one request it signs a capability lease for every workflow step and a governance receipt for every destructive one, and a partner's verifier checks all of it against one trust bundle.
The running example is the authority program from the federation guide project. It issues a lease for the read_refund_case step on did:chio:vendor-a and a destructive stage_refund lease for did:chio:vendor-b, publishes a revocation checkpoint, and assembles the bundle.
Every artifact a verifier reads traces back to three inputs
The profile, the seeds, and the request go in. Leases, a governance receipt, a checkpoint, and the trust bundle come out.
authority example's artifacts: what the authority signs from the profile, its seeds, and the request, and the five inputs that assemble the verifier trust bundle. The three refusals are the run's. The profile's own path into the bundle, the workflow intersection, and the disclosure policy are left out of the drawing.Each refusal stops at the artifact it would have produced. A wrong seed signs nothing at all, while a stalled checkpoint leaves the leases already issued intact. The bundle assembles only from complete inputs, so a verifier reads whole bundles.
The profile declares every authority the boundary trusts
An AuthorityProfileDocument names three kinds of signer: lease authorities, governance authorities, and one revocation authority. Each carries a public key, a validity window, and a status. The profile also lists the BBS issuers the verifier accepts and the runtime policy issuer keys.
Validation refuses a key id that mismatches its public key, and a runtime policy issuer key that overlaps an authority key. An authority whose status is inactive is refused at the moment it is asked to sign. A lease authority signs only the action classes in its allowedActionClasses, and a governance authority only the case kinds in its allowedCaseKinds.
Read more in the profile fields.
A seed signs only for the key its authority declares
Seeds live in a separate LocalAuthoritySigningKeysDocument, which a deployment keeps out of every fixture. A lease seed's id is its lease authority's issuer, and a governance seed's id is that authority's authorizingKernel. Before signing, the issuer derives the seed's public key and compares it with the key the profile declares for that authority.
The comparison is what makes the profile binding. A seed swapped for another derives a different key, and issuance stops before a single lease exists, with SigningKeys as the refusal.
One request yields a lease per step and a governance receipt per destructive step
A ChioIssuanceRequest names the workflow and its grant, the profile entries that sign, the verification context, and one entry per step. Each step names its lease, subject, peer kernel, action class, and the digest of its bound arguments. The example program writes its inputs to authority-inputs/, issues from them, and then tries three bad inputs.
Issue, checkpoint, and assemble a verifier trust bundle
Build an authority profile and signing keys, issue two leases and a governance receipt, publish a revocation checkpoint, assemble a strict verifier trust bundle, and refuse a wrong seed, a stalled epoch, and an incomplete pin set.
Complete the project setup, then run the program from federation-guide/. The download includes every constructor and input.
cargo run --locked --bin authorityissued 2 capability leases, 2 lease-scope bindings, 1 governance receipt for the destructive step seed that does not derive the declared lease authority key: refused (local signing keys failed: lease authority did:chio:buyer-kernel signing seed does not match authority public key) published revocation checkpoint at epoch 11 over previous epoch 10 checkpoint whose epoch does not advance: refused (revocation checkpoint publication failed: revocation checkpoint epoch must be monotonic) assembled a verifier trust bundle that parses under the strict verifier peer pins without the workflow grant class: refused (trust bundle assembly failed: trust bundle action classes must include workflow.grant_issue)
Profile, seeds, and peer pins are deterministic demonstration inputs written to authority-inputs/. A deployment keeps signing seeds out of every fixture, uses its own validity windows, and pins the peers it has actually handshaken with.
Open the source file. Each program asserts its expected refusals; keys, timestamps, and digests change between runs.
You should see two leases, two scope bindings, and one governance receipt for the refund step, then a checkpoint at epoch 11 over epoch 10 and a bundle that parses under the strict verifier. The three refusals are a seed for did:chio:buyer-kernel that derives the wrong key, a checkpoint at epoch 10 over epoch 10, and peer pins without the workflow.grant_issue action class.
The CLI issues the same bundle from those input files:
Issue the bundle with the CLI from the same inputs
chio federation authority issue --profile authority-inputs/profile.json --request authority-inputs/request.json --signing-keys authority-inputs/signing-keys.json --out-dir authority-inputs/cli-bundle
ls authority-inputs/cli-bundlecapability-leases.json governance-receipts.json issuance-bundle.json lease-scope-bindings.json verification-context.json
You should see the five files of one ChioIssuanceBundle. Every step gets a signed lease and a scope binding whose digest the lease carries. A step marked destructive must name a governance receipt and carry a lowercase SHA-256 stepSha256, and the bundle holds one signed receipt for it. The action classes are scoped_observation, delegated_action, and narrow_destructive.
Read more in Capability Leases.
Each refusal names the document that failed
The issuer returns one error variant per stage, so the variant tells you which file to fix.
Profile: the profile fails validation.Request: the request fails validation.SigningKeys: a seed does not derive the declared key.Issuance: an authority cannot sign. It is missing from the profile or inactive, has no usable validity window, or lacks the destructive authorization or action class the request needs; or a lease, receipt, or checkpoint window falls outside the authority window.Revocation: the checkpoint epoch does not advance, or the revocation authority is inactive.TrustBundle: the pin set lacks a reference workflow class, or the assembled bundle or the peer pins fail strict validation.Json: a document is not valid JSON.Canonical: the workflow intersection could not be canonicalized (RFC 8785) for hashing.
Every variant is indexed with its repair on Federation Refusal Codes.
Authority documents
Search for keyId, stepSha256, or verificationContext.
Five JSON documents carry the authority. The issuer is crates/trust/chio-federation-authority, with profile validation in src/profile.rs; lease semantics are in crates/trust/chio-governance/src/lease.rs.
AuthorityProfileDocument
schema:chio.federation.authority-profile.v1.trustedBbsIssuers[]:issuerFingerprintandpublicKeyHexof each BBS issuer the verifier accepts.leaseAuthorities[]:issuer,keyId,publicKey,validFromUnixMs,validUntilUnixMs,status,allowedActionClasses.governanceAuthorities[]:authorizingKernel,keyId,publicKey,validFromUnixMs,validUntilUnixMs,status,allowedCaseKinds.runtimePolicyIssuerPublicKeys[]: the runtime policy issuer roots. None may overlap an authority key.revocationAuthority:authorityId,keyId,publicKey,validFromUnixMs,validUntilUnixMs,status.
LocalAuthoritySigningKeysDocument
schema:chio.federation.local-signing-keys.v1.leaseAuthoritySeeds[]:id(the lease authority'sissuer) andseedHex. The seed signs only if its public key equals that authority's declared key.governanceAuthoritySeeds[]:id(the governance authority'sauthorizingKernel) andseedHex, under the same rule.revocationAuthoritySeedHex: the revocation authority's seed.
ChioIssuanceRequest
schema:chio.federation.issuance-request.v1.workflowId,workflowGrantId: the workflow and its grant.leaseAuthorityIssuer,governanceAuthorityKernel: which profile entries sign.verificationContext:audience,challenge,proofPurpose, and the window.steps[]: oneChioIssuanceStepRequestper workflow step.
ChioIssuanceStepRequest
leaseId,stepIndex,toolName: the lease and the step it covers.peerKernelId,subject: who the lease is for.actionClassId,actionClass: the class name and its kind, one ofscoped_observation,delegated_action,narrow_destructive.toolArgsHash: the digest of the bound arguments.destructive: a destructive step must name a governance receipt.leaseIssuedAtUnixMs,leaseExpiresAtUnixMs: the lease window.governanceReceiptId,governanceIssuedAtUnixMs,governanceExpiresAtUnixMs: the governance receipt for a destructive step.stepSha256: the lowercase SHA-256 step digest. Required on a destructive step and refused on any other step.
ChioIssuanceBundle
schema:chio.federation.issuance-bundle.v1.capabilityLeases[]: one signed lease per step.leaseScopeBindings[]: one scope binding per step, whose digest its lease carries.governanceReceipts[]: one signed receipt per destructive step.verificationContext: the request's context, carried through.
Verifier trust bundle inputs
The bundle a verifier reads assembles from five inputs: the authority profile, the peer pins, the workflow intersection, the disclosure policy, and a signed revocation checkpoint. The pins must include the workflow.grant_issue action class. The bundle and the pins both pass strict validation before assembly returns.