Verify an evidence pack

Check a Certanix evidence pack yourself, on your own machine, without contacting us. This page does it in your browser. The command line does it anywhere, including a machine with no network at all.

What verification proves

What it does not prove

The Certanix signing key

Evidence packs are signed by a key generated in, and held by, a YubiHSM 2 hardware security module in FIPS mode. This is its public key, and the SHA-256 fingerprint of its DER-encoded SubjectPublicKeyInfo:

Fingerprint (SHA-256, DER SPKI)
5849:0777:84FA:6061:6EA8:3E8B:FF35:C8B2:94E1:7631:A424:35CD:2019:2DD0:9D9F:9AE5
Public key (PEM)
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEx09YPKh2p2eWTQGQDPxCJv1gO1ua
E839xBqZZ4gFulq1a2iCpfx6ygb1yCKxkMJgIBHXNeM7Ahz0QMfG4Ps/ew==
-----END PUBLIC KEY-----

Download: certanix-hsm.pub.

This page and the key above come from the same website. If this website were compromised, both could be replaced together. Compare the fingerprint with a copy you received another way (a document from us, printed material, a person you know) before you trust a result.

Packs signed before 4 September 2026 were signed with the previous key and keep verifying against it. If a pack names a different key, ask whoever sent it for that key and its fingerprint.

The schemas and vocabulary that packs reference are published at schema.certanix.eu. Verification never fetches them: the verifier carries its own copy, and a pack verifies with no network.

Verify in this browser

This runs certanix-verify, the same Python code as the command-line tool, inside your browser through Pyodide. Nothing about verification is reimplemented in JavaScript.

One dependency differs. The browser uses cryptography 47.0.0, the build Pyodide provides; the command-line tool pins cryptography 48.0.1. On every public test case of certanix-verify 0.14.0 (68 cases, each in JSON and in plain-text output), the browser and the command line gave identical results: the same exit code and the same output, byte for byte.

Your file never leaves this browser. It is read from your disk into this page's memory and verified there. Once the verifier has loaded, the page makes no network connection of any kind: its content security policy forbids it, and the page checks that the browser enforces this before it accepts a file.

Loading the verifier (about 15 MB, from this site, once)…

Verify against
Byte-exact mode: canonical bytes and a detached bundle

For an archived artifact whose exact bytes are the claim. Nothing is recomputed, so any byte change fails, including a reformatting that the default mode accepts.

Verify on the command line

Install

Python 3.10 or later. The tool needs the standard library and two pinned packages, and nothing else.

python3 -m pip install certanix-verify

For a machine with no network: download on a connected machine, carry the files across, install from them.

# connected machine
python3 -m pip download certanix-verify -d certanix-verify-wheels
# offline machine
python3 -m pip install --no-index --find-links certanix-verify-wheels certanix-verify

Check the key

curl -O https://certanix.eu/verify/keys/certanix-hsm.pub
openssl pkey -pubin -in certanix-hsm.pub -outform DER | openssl dgst -sha256

The output must read 5849077784fa60616ea83e8bff35c8b294e17631a42435cd20192dd09d9f9ae5. Without openssl (Windows, for instance), the same value from Python:

python3 -c "import hashlib,sys;from cryptography.hazmat.primitives import serialization as s;k=s.load_pem_public_key(open(sys.argv[1],'rb').read());print(hashlib.sha256(k.public_bytes(s.Encoding.DER,s.PublicFormat.SubjectPublicKeyInfo)).hexdigest())" certanix-hsm.pub

Verify

certanix-verify verify evidence-pack.json --key certanix-hsm.pub
echo $?   # 0 = verified; any other value is the reason it did not

Add --json for one machine-readable object. certanix-verify --help lists the other modes.

Licence

certanix-verify is released under the BSD-3-Clause-Clear licence. Who holds the copyright: NOTICE. Patents: PATENTS-NOTICE, also as PATENTS-NOTICE (plain text). The licence itself grants no patent rights.

Exit codes

The exit code is the reason, so a script can act on why a pack failed without reading text.

CodeClassMeaning
0OKSignature valid over the canonical bytes; schema valid; no gate violation.
1USAGECould not start: unreadable file, missing key, bad invocation. Says nothing about the pack.
2MALFORMED_INPUTNot readable as a JSON object (for example, truncated).
3SCHEMA_INVALIDReadable, but does not match the schema. The signature was not reached.
4UNSUPPORTED_SCHEMA_VERSIONA schema version or artifact type this verifier does not know. Refused rather than guessed.
5SIGNATURE_MISSINGThe pack carries no signature.
6SIGNATURE_MALFORMEDA signature is present but cannot be decoded.
7SIGNATURE_MISMATCHThese are not the bytes that were signed, or not under this key.
8KEY_MISMATCHThe signature names a different signer from the key supplied.
9GATE_VIOLATIONSigned and well formed, but claims a capability its recorded gate denies.

Codes 10 to 13 belong to certanix-verify vault, which checks a trusted timestamp record.