Module 6: Verification, Attestation, and Revocation

Understand exactly what verification proves, what it does not prove, and how to handle revocation failure.

DEV, PROVIDER, GOVERNANCE 25 min

Learning Objectives

By the end of this module, you will be able to:

  • Run the maintained Python verification API and handle all 17 outcomes
  • Distinguish signature integrity, configured trust, and attestation claim quality
  • Configure online or CRL revocation behavior safely
  • Describe the additional evidence required for audit or compliance claims

6.1 — Verification in Practice

from vcp import Orchestrator, VerificationContext, VerificationResult

verification_context = VerificationContext(
    trust_config=trust,
    model_family="example-model-*",
    purpose="customer-support",
    environment="production",
    audience="adult",
    region="GB",
)

result = Orchestrator(trust).verify(
    bundle,
    context=verification_context,
)

if result is not VerificationResult.VALID:
    raise PermissionError("VCP verification failed: " + result.name)

The SDK has no universal fixed-duration verification guarantee and no dedicated timeout outcome. Set a timeout around network-dependent acquisition and revocation work at the application boundary, then choose a documented failure policy.

6.2 — The 17 Verification Outcomes

OutcomeSDK categoryMeaning
VALIDSuccessAll configured verification checks passed
SIZE_EXCEEDEDSecurityManifest or content exceeded the accepted byte bound
INVALID_SCHEMAConfigurationBundle shape or types were malformed
UNTRUSTED_ISSUERConfigurationNo valid issuer trust anchor matched
INVALID_SIGNATURESecurityIssuer signature did not verify
UNTRUSTED_AUDITORConfigurationNo valid auditor trust anchor matched
INVALID_ATTESTATIONSecurityAttestation signature or claim structure was invalid
HASH_MISMATCHSecurityCanonical content did not match the manifest hash
NOT_YET_VALIDTemporalCurrent time precedes nbf
EXPIREDTemporalCurrent time exceeds exp
FUTURE_TIMESTAMPSecurityiat exceeded allowed future clock skew
REPLAY_DETECTEDSecurityThe bounded replay cache already contained the JTI
TOKEN_MISMATCHSecurityDeclared token information did not match
BUDGET_EXCEEDEDConfigurationBundle budget exceeded the configured context allowance
SCOPE_MISMATCHConfigurationModel, purpose, environment, audience, or region did not match scope
REVOKEDSecurityConfigured revocation evidence marks the bundle revoked
FETCH_FAILEDTransientConfigured revocation retrieval failed

Only VALID permits the application to continue to local enforcement. Avoid retrying security failures as if they were transient.

6.3 — Safety Attestation

The issuer signature binds bundle bytes to an issuer key. A separately trusted auditor can sign a safety-attestation claim. VCP-SDK 4.2.0 recognises:

TypeClaim
INJECTION_SAFEThe auditor asserts the defined injection-safety review was completed
CONTENT_SAFEThe auditor asserts the defined content-safety review was completed
FULL_AUDITThe auditor asserts the organisation's defined full-audit evidence exists
COMPETENCE_CALIBRATIONThe auditor asserts the defined competence-calibration review was completed

A valid signature establishes integrity and provenance relative to configured trust anchors. It does not independently establish that the review method was adequate, lawful, complete, or correctly described. Governance must define the evidence required for each claim.

6.4 — Revocation

A manifest may provide an HTTPS real-time check_uri and a CRL crl_uri. The SDK validates schemes, ports, credentials, fragments, DNS results, resolved addresses, response size, JSON shape, issuer binding, and freshness before accepting network evidence.

"revocation": {
  "check_uri": "https://status.example.org/vcp/revocation",
  "crl_uri": "https://status.example.org/vcp/crl.json"
}

If a manifest declares no revocation URI, the current SDK logs that revocation was not configured and treats the bundle as not revoked. High-assurance deployments that require revocation must reject bundles without an approved revocation mechanism in an application policy or custom enforcement plugin.

If configured endpoints fail, the orchestrator returns FETCH_FAILED. Decide whether each action class blocks, uses a still-valid verified cache entry, or enters a separately constrained fallback.

6.5 — What Verification Proves

  • The accepted bytes matched their declared canonical hash
  • The signatures verified under the configured algorithms and keys
  • The issuer and auditor matched current trust anchors
  • Configured temporal, replay, budget, scope, and revocation checks passed

Verification does not prove that a model followed the content, a tool action was safe, a reviewer exercised sound judgment, the system complied with law, or downstream logs are complete. Those need separate runtime, human, legal, and operational evidence.

Exercise

Run examples/python/02_verify_bundle.py. Then test hash mismatch, missing audience, future timestamp, revoked JTI, and unreachable CRL behavior. Confirm that no failure path formats or injects the bundle.

See It in Action

The Marta demo illustrates time-varying context. It is an explanatory scenario, not cryptographic verification evidence.