Skip to main content

agentoracle-receipt-verify

Verifier for AgentOracle composed envelopes: RFC 8785 JCS canonicalization plus Ed25519 JWS signature verification. Canonicalization output is byte-identical to the production Node canonicalizer.

Design goal

Three implementations, one canonicalization. A receipt canonicalized in Node, Python, or the browser must produce the byte-identical string and byte-identical SHA-256. No language-specific behavior. No trusted issuer round-trip.

Install

pip install agentoracle-receipt-verify

Usage

Key material is required to reach a verdict. Pass jwks_by_issuer:

from agentoracle_receipt_verify import verify

result = verify(envelope, jwks_by_issuer={
    "https://agentoracle.co/.well-known/jwks.json": ao_jwks,
    "https://agenttrust.uk/.well-known/jwks.json": at_jwks,
})

if result.status == "valid":
    print("verified — canonical:", result.canonical_sha256)

Three outcomes, not two

status valid Meaning
"valid" True Every check ran and passed
"invalid" False A check ran and failed; see .errors
"indeterminate" None A check could not run; see .indeterminate_reason

Calling verify(envelope) without jwks_by_issuer on a signed envelope returns indeterminate, not valid. Canonicalization recompute proves the payload matches its claimed hash; it binds the payload to no issuer. Only the signature does that. A verifier that reported valid there would assert a property it never tested.

None is falsy, so if result.valid: fails closed. Branch on .status when you need to distinguish "failed" from "could not check".

What it checks

Invariant Description
canonical_recomputes JCS(payload) → SHA-256 recomputes byte-identical to claimed
decision_ref_recomputes sha256(JCS(preimage)) matches published decision_ref (per invinoveritas/babyblueviper1 spec)
decision_signer_ne_runtime Decision signer issuer ≠ runtime issuer (fail-closed: self-approval is void)
all_signatures_verified Every JWS signature verifies against a resolvable JWK by kid. None when no key material was supplied — unevaluated, not failed

Cross-language guarantees

The tests/ suite includes byte-identical fixtures shared with the Node reference implementation:

  • test_jcs_byte_identical_to_node — Python JCS output byte-matches Node output for a payload with nested objects, arrays, unicode, booleans, and integers.
  • test_decision_ref_recompute_babyblueviper1 — Python recomputes the shipped invinoveritas fixture, byte-identical to her Python and our Node.
  • test_conformance_sample_canonical_hash — reproduces the canonical hash from AgentOracle's /v1/conformance/sample production endpoint.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agentoracle_receipt_verify-0.1.0-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

Details for the file agentoracle_receipt_verify-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for agentoracle_receipt_verify-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1bf80692819f1e47b3f5d951101ace2654f255084d77e56b4ab6df88b230b164
MD5 d10463a34a5e7571d025e316c0426fda
BLAKE2b-256 cb88d89a22f684bfcb38271f0d9f2b1012ffef69a07f44543b108003709e334f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page