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/sampleproduction 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agentoracle_receipt_verify-0.1.0-py3-none-any.whl.
File metadata
- Download URL: agentoracle_receipt_verify-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1bf80692819f1e47b3f5d951101ace2654f255084d77e56b4ab6df88b230b164
|
|
| MD5 |
d10463a34a5e7571d025e316c0426fda
|
|
| BLAKE2b-256 |
cb88d89a22f684bfcb38271f0d9f2b1012ffef69a07f44543b108003709e334f
|