Public, public-key-only verification support for versioned offline entitlement proofs.
Summary
Functions
Returns the bounded client-side action policy for a verified offline decision.
Returns the typed learner-facing guidance seed for a public proof state.
Rejects direct proof issuance.
Creates a one-time challenge for an authenticated device reconnect.
Renders public verification keys while enforcing retirement requirements derived from actual issued proofs.
Functions
@spec action_policy(Accrue.Entitlements.Offline.Proof.Decision.t(), atom()) :: Accrue.Entitlements.Offline.Proof.ActionPolicy.t()
Returns the bounded client-side action policy for a verified offline decision.
@spec challenge(Accrue.Entitlements.Account.t(), String.t(), keyword()) :: {:ok, Accrue.Entitlements.Offline.Challenge.Value.t()} | {:error, :unauthorized | :invalid_request}
@spec guidance(:fresh | :stale_offline | :denied | :invalid) ::
Accrue.Entitlements.Offline.Proof.Guidance.t()
Returns the typed learner-facing guidance seed for a public proof state.
@spec issue( Accrue.Entitlements.Account.t(), Accrue.Entitlements.Offline.Issuer.Request.t(), keyword() ) :: {:error, :unauthorized}
Rejects direct proof issuance.
A compact entitlement proof is minted only after the authenticated reconnect
flow has verified a one-time device proof-of-possession. Hosts must use
reconnect/3; accepting an account and device id here would make either an
allow proof or a deny tombstone forgeable without that admission boundary.
@spec reconnect( Accrue.Entitlements.Account.t(), Accrue.Entitlements.Offline.Reconnect.Request.t(), keyword() ) :: {:ok, Accrue.Entitlements.Offline.Reconnect.Outcome.t()} | {:error, atom()}
@spec reconnect_challenge(Accrue.Entitlements.Account.t(), String.t(), keyword()) :: {:ok, Accrue.Entitlements.Offline.Challenge.Value.t()} | {:error, :unauthorized | :invalid_request}
Creates a one-time challenge for an authenticated device reconnect.
@spec register_device( Accrue.Entitlements.Account.t(), Accrue.Entitlements.Offline.Registration.Request.t(), keyword() ) :: {:ok, Accrue.Entitlements.Offline.Registration.Result.t()} | {:error, atom()}
@spec replace_device( Accrue.Entitlements.Account.t(), Accrue.Entitlements.Offline.Registration.ReplacementRequest.t(), keyword() ) :: {:ok, Accrue.Entitlements.Offline.Registration.ReplacementResult.t()} | {:error, atom()}
@spec verification_keys_with_issued_retention(keyword()) :: {:ok, %{required(String.t()) => [map()]}} | {:error, :config_invalid}
Renders public verification keys while enforcing retirement requirements derived from actual issued proofs.
Unlike verification_keys/1, this operation requires a Repo. Call it from the
host's JWKS publication path; explicit keys and injected providers can use the
pure renderer with precomputed :retention_requirements instead.