Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

polaris-verify

A detached verifier for Polaris credentials and signed artifacts. It decides authenticity on its own: no Polaris server, no database, no operator console, no network unless you ask it to fetch status.

Project name and import name differ, and the obvious guess lands elsewhere. This project, polaris-verify, installs the polaris-verify COMMAND and the module polaris_verify_cli. The module polaris_verify belongs to a different project, polaris-sdk-python, which is the library. They install side by side without colliding, and pip install polaris-verify followed by import polaris_verify is the mistake this paragraph exists to prevent. The names were fixed before either was published and are not worth changing after: conformance/SPEC.md publishes python -m polaris_verify.conformance as the reference verifier command, so the module name is part of a contract.

pip install --pre "polaris-verify[cryptography]"

polaris-verify --pqc-provider auto --pack credential.json

This is 1.0.0-rc.1, published to PyPI by GitHub Actions trusted publishing over OIDC. It is a release candidate: --pre tells pip to consider it, and 0.1.0 remains as the prior release. What separates a candidate from 1.0.0 is one thing, an operator who is not the author reaching a verified result without help. Verified by installing from the live registry into a clean virtualenv and running the command there, not by a build that exited zero.

It refuses to start until you say what cryptography it is doing

There is no default and no environment variable for this choice.

--pqc-provider oqs           real ML-DSA via liboqs
--pqc-provider cryptography  real ML-DSA via cryptography>=48
--pqc-provider auto          whichever real backend is installed
--dev-placeholder            NO real cryptography; development only

Run it with none of them and it exits 4 without reading your files. Name a backend that is not usable on the machine and it exits 4 rather than starting and reporting a verification failure for every credential, which reads as the credentials being bad instead of the verifier being unable.

Under --dev-placeholder every verdict carries "crypto": "DEV-PLACEHOLDER" and a banner goes to stderr. Development crypto is never mistaken for production crypto.

Offline means it cannot reach a network

Not "does not today". The verifier contains no networking code at all: zero references to urllib, http.client, socket or requests, and check_detached_verifier fails the build if one appears. An air-gapped relying party is running the same code path as a connected one.

The online status path is a different thing and lives elsewhere, in the SDK and the relying party, both of which are allowed urllib on purpose.

What it verifies

Authenticity packs, presentations and QR frames, status assertions (offline, with a freshness window), ID tokens, epoch checkpoints and leaves, revocation feeds, federation manifests and status bundles, trust lists and attestations, registries, timestamps and their transparency anchors, signed documents, exchange requests, receipts and mints, holder bindings and proofs, agent grants with their revocations and proofs, and cross-authority decisions. --verify-dir re-verifies a directory of published vectors; --selftest checks the verifier against material it generates.

Trust

--issuer-anchor takes a JSON file of the issuer's published verification keys, and --trusted-anchor takes one key hex. Without either, the verifier reports whether a signature is genuine but leaves issuer_trusted unanswered, which is the honest verdict: a genuine signature by a key you do not trust is authentic and worthless.

Configuring a trust root

The anchor file is a JSON list of hex keys, or an object carrying one under public_keys_hex, anchors, public_key_hex or keys. All four are accepted:

["90bece7e1902ccce...the issuer's ML-DSA public key, in hex..."]
polaris-verify --pqc-provider auto --issuer-anchor anchors.json --pack credential.json

Where the key comes from is your decision, and it is the decision that matters. The issuer publishes its keys in a signed registry (GET /api/v1/registry/<agency_id>, verified with verify_registry) and in a signed federation manifest; both are themselves signed, so each moves the question one step rather than answering it. Somewhere a key is pinned out of band, by you. This tool does not pretend otherwise and will not fetch one for you.

What it does guarantee, and what you can script on:

signature_valid issuer_trusted exit
correct anchor true true 0
a different, well-formed key true false 2
empty anchor list true false 2
no anchor given true null 0

A genuine signature by a key you did not anchor is reported authentic and untrusted, and exits non-zero. The two questions stay separate because collapsing them is how a format check gets read as a trust decision.

Status

1.0.0-rc.1, a release candidate. No named external implementation has exercised this command, and the scoreboard's row for an operator who is not the author is blank; that operator is what turns the candidate into 1.0.0. See the scoreboard for what has and has not happened outside the project.

Apache 2.0. Part of the Polaris reference implementation, which runs on notional data.

Metadata

Release files for polaris-verify 1.0.0rc1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for polaris-verify 1.0.0rc1
File Size Uploaded
polaris_verify-1.0.0rc1.tar.gz 64.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for polaris-verify 1.0.0rc1
File Interpreter ABI Platform
polaris_verify-1.0.0rc1-py3-none-any.whl Python 3 none any Details

Total release size: 130.1 kB

Release files / polaris_verify-1.0.0rc1.tar.gz

Download URL polaris_verify-1.0.0rc1.tar.gz
Size 64.4 kB
Tags Source
SHA-256 checksum
How to use checksums
1e7462e76cb3c5019f4fc263205238f6d7f5dcb894fea53c90a8fc39423a009e
BLAKE2b-256 checksum
How to use checksums
39f2ed567861384bd52fd6e69e12bc048268abc150a5d277afdbc120367148e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.

Transparency log

Release files / polaris_verify-1.0.0rc1-py3-none-any.whl

Download URL polaris_verify-1.0.0rc1-py3-none-any.whl
Size 65.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bf982d48139fb8d1f6d21c6f950d38a27f145aaf365bd0348dc95ef9fdc5df9f
BLAKE2b-256 checksum
How to use checksums
a5c79694cc1830dc8648e7a6fca2541bf264d8d65ff4d78a4dcdc78d7501ac34
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page