Open verifier for SatGate Evidence Packs and signed receipts.
It verifies the part that matters to a third party:
- Fetch an Evidence Pack URL.
- Discover the issuer JWKS from the receipt issuer origin.
- RFC8785/JCS canonicalize the receipt while excluding
signatureandreceipt_hash. - Recompute
receipt_hashwith SHA-256. - Verify the Ed25519 signature against the issuer public key.
- Return machine-readable verification output.
python -m pip install 'satgate-evidence-pack-verifier'
satgate-verify-evidence-pack \
--discover-jwks \
--require-trusted-issuer \
https://api.satgate.io/v1/evidence/evid_LrlgUSR1R3SEYtxy0npX7mgneWZFa5ekExpected output from the live SatGate archive:
{
"evidence_pack_id": "ep_KTRbpu22e0ZRDSkpJb5KSg",
"evidence_url": "https://api.satgate.io/v1/evidence/evid_LrlgUSR1R3SEYtxy0npX7mgneWZFa5ek",
"http_status": 200,
"issuer": "https://api.satgate.io",
"issuer_kid": "satgate-gateway-ed25519-2026-05",
"protocol_profile": "issuer_jwks",
"reason_codes": [
"ok"
],
"receipt_hash": "sha256:qz1t4Jt56ncP1CupRxt4PvzGeVh12Na4MEyuOdbjaD4",
"receipt_id": "rcpt_KTRbpu22e0ZRDSkpJb5KSg",
"trust_anchor": "issuer_jwks_anchored",
"trusted_issuer_valid": true,
"valid": true
}curl -fsS https://api.satgate.io/v1/evidence/evid_LrlgUSR1R3SEYtxy0npX7mgneWZFa5ek >/tmp/satgate-evidence-pack.json \
&& satgate-verify-evidence-pack --discover-jwks --require-trusted-issuer \
https://api.satgate.io/v1/evidence/evid_LrlgUSR1R3SEYtxy0npX7mgneWZFa5ekThe verifier intentionally verifies from the URL, not from local SatGate services. The curl line is there so reviewers can inspect the exact artifact before verification.
By default the CLI trusts https://api.satgate.io as a known issuer. Add additional trusted issuers with --trusted-issuer:
satgate-verify-evidence-pack --discover-jwks --require-trusted-issuer \
--trusted-issuer https://issuer.example \
https://issuer.example/v1/evidence/evid_123If you omit --require-trusted-issuer, the verifier can still prove the receipt hash and signature match the issuer key, but it will not fail solely because the issuer is not on your allow-list.
valid: receipt hash and Ed25519 signature verified, and trusted issuer requirement passed if requested.trusted_issuer_valid: issuer matched the trusted issuer allow-list.protocol_profile: verification profile used, usuallyissuer_jwks.trust_anchor: trust anchor used, usuallyissuer_jwks_anchored.http_status: HTTP status returned by the Evidence Pack URL.reason_codes:okor failure reasons such asreceipt_hash_mismatch,signature_invalid, orissuer_not_trusted.
python -m pip install -e '.[dev]'
ruff check .
pytest -qApache-2.0.