Skip to content

Latest commit

 

History

History
124 lines (105 loc) · 4.67 KB

File metadata and controls

124 lines (105 loc) · 4.67 KB

Phase 6 Authorization Pipeline

Explanatory documentation only. This detailed walkthrough is non-normative and intentionally stops before Host Consumption and Execution.

What problem does this example address?

An eligible policy decision must become scoped, expiring Authorization evidence bound to the exact request, identities, snapshots, Host authority, and replay and Consumption identities.

Why this flow?

Issuance repeats the frozen checks rather than trusting the decision alone. Pure validation later compares the complete artifact against independently retained Host expectations before a separate atomic store may consume it.

Minimal Swift walkthrough

This pseudo-code illustrates structural issuance and validation. It intentionally stops before consumption and execution.

let evaluationInput: EvaluationInput = /* controlled Phase 4 result */
let policyDecision: PolicyDecision = /* deterministic Phase 5 result */
let registrySnapshot: ToolRegistrySnapshot = /* exact bound snapshot */
let policySnapshot: PolicySnapshot = /* exact bound snapshot */
let hostCapabilityBoundary: HostCapabilityBoundary = retainedAuthenticatedHostBoundary

let authorization = try AuthorizationIssuer.issue(
    hostCapabilityBoundary: hostCapabilityBoundary,
    id: try AuthorizationID(validating: "authorization-1042"),
    replayID: try AuthorizationReplayID(validating: "replay-1042"),
    consumptionID: try AuthorizationConsumptionID(validating: "consume-1042"),
    generation: try AuthorizationGeneration(1),
    decision: policyDecision,
    evaluationInput: evaluationInput,
    registrySnapshot: registrySnapshot,
    policySnapshot: policySnapshot,
    issuedAt: explicitIssuanceTime,
    lifetimeRequest: try AuthorizationLifetimeRequest(
        expiresAt: explicitExpiry,
        maximumLifetimeSeconds: 300
    )
)

let expectedScope = try AuthorizationScopeClaim(
    capabilities: [.financialTransfer],
    resources: [ResourceID(rawValue: "invoice-1042")]
)

let validation = try AuthorizationValidator.validate(
    authorization,
    hostCapabilityBoundary: hostCapabilityBoundary,
    context: AuthorizationValidationContext(
        authorizationID: hostExpectedAuthorizationID,
        version: .v1,
        generation: try AuthorizationGeneration(1),
        policyDecision: policyDecision,
        evaluationInput: evaluationInput,
        canonicalRequest: evaluationInput.canonicalRequest,
        toolDefinition: evaluationInput.toolReference.definition,
        registrySnapshot: registrySnapshot,
        policySnapshot: policySnapshot,
        subjectID: evaluationInput.securityContext.subjectID,
        tenantID: evaluationInput.securityContext.tenantID,
        sessionBinding: evaluationInput.securityContext.sessionBinding,
        delegationID: evaluationInput.securityContext.delegationID,
        scope: expectedScope,
        lifetime: AuthorizationLifetimeExpectation(
            issuedAt: explicitIssuanceTime,
            expiresAt: explicitExpiry,
            maximumLifetimeSeconds: 300
        ),
        replayID: try AuthorizationReplayID(validating: "replay-1042"),
        consumptionID: try AuthorizationConsumptionID(validating: "consume-1042")
    ),
    evaluationTime: explicitValidationTime
)

// Stop. `validation.consumptionBinding` identifies the complete logical
// authorization for a future host store, and `validation.consumptionContract`
// says the host must atomically consume once before any side effect. Phase 6 has
// no consumption store and no execution path.
EvaluationInput
      ↓
PolicyDecision
      ↓
AuthorizationIssuer
      ↓
Authorization
      ↓
Host validation
      ↓
Future host atomic consumption (not implemented)
      ↓
Future host execution (outside SecureToolKit; not shown)

Threats prevented

  • Canonical argument, Tool Definition, registry, or policy substitution.
  • Subject, tenant, session, delegation, or Host-boundary mismatch.
  • Capability or resource broadening.
  • Authorization, replay, Consumption, generation, or lifetime substitution.
  • Validation being confused with Consumption or Execution.

Common mistakes

  • Passing a confirmation-required decision to the Phase 6 issuer.
  • Deriving validation expectations from the submitted Authorization.
  • Replacing the retained HostCapabilityBoundary during validation.
  • Treating successful validation as replay prevention.
  • Calling an executor before durable atomic single-use Consumption succeeds.

Related documentation