# inherence-verifier
Reference verifier for Inherence receipts — implements verification protocol v1 (see [`spec/receipts/v1/SPEC.md`](https://github.com/Inherencelabs/inherence-verifier-rs/blob/main/spec/SPEC.md) — published alongside this crate).
This is the Rust core. The same logic is also distributed as:
- **[`@inherencelabs/verifier`](https://github.com/Inherencelabs/inherence-verifier-js)** — WASM bindings for JavaScript/TypeScript (Node + browser)
- **[`inherence-verifier`](https://github.com/Inherencelabs/inherence-verifier-py)** — PyO3 bindings for Python
All three pass the same 22-vector conformance suite. A bug in one is a bug in all three.
## What this crate is
A standalone library that verifies Inherence receipts offline. Given:
- a receipt (a signed JWT)
- a pinned authority public key
- a pinned set of acceptable Groth16 verifying keys
…it returns `VALID` or `INVALID:{failure_code}` with no network I/O.
## What this crate is NOT
This crate contains **no** policy-compilation logic, **no** proving logic, and **no** circuit-construction logic. Those run behind the hosted gate that issues receipts; they are not necessary to verify a receipt and they're not in this dependency tree.
## Install
```toml
[dependencies]
inherence-verifier = "0.1"
```
## Usage
```rust
use inherence_verifier::{verify_receipt, VerifyConfig};
let cfg = VerifyConfig::new()
.pin_authority_jwk(&authority_jwk_json)?
.pin_vk(&vk_hash_hex, vk_bytes);
match verify_receipt(&jwt, &cfg) {
Ok(()) => println!("VALID"),
Err(e) => println!("INVALID: {} ({})", e.code(), e),
}
```
The failure codes come from a fixed [controlled vocabulary](https://github.com/Inherencelabs/inherence-verifier-rs/blob/main/src/error.rs):
`schema_violation`, `signature_invalid`, `wrong_signer`, `expired`, `not_yet_valid`, `wrong_issuer`, `wrong_audience`, `principal_signature_invalid:principal`, `principal_signature_invalid:agent`, `state_invalid`, `decision_bit_mismatch`, `unknown_vk`, `internal_inconsistency`, `proof_invalid`.
## Verifying keys
VKs are content-addressed. Fetch them from `https://vk.inherencelabs.com/v1/keys/{vk_hash}` — the URL contains no customer identifier. The verifier's `pin_vk(vk_hash, bytes)` re-hashes the bytes and refuses to use them if the hash doesn't match.
## Test
```sh
cargo test --test vectors
```
Runs the 22 conformance vectors. A passing run is sufficient to claim v1 conformance.
## License
Apache-2.0.