Skip to content

Threshold-signature verification

For a standalone signed attestation, use:

witness --gateway http://localhost:8080 verify signed-attestation.json
witness --gateway http://localhost:8080 verify signed-attestation.json \
  --output json

The file must be a SignedAttestation, not the surrounding AttestationJobResponse. For a saved job, extract the signed object only:

jq '.signed_attestation' job.json > signed-attestation.json

The command fetches /v1/network from the selected gateway and verifies locally. It has no --network-config option; use verify-proof with --bundle and --network-config for an explicitly offline workflow. When --output json is used, cryptographic failure is reported as "valid": false while the command exits successfully. Scripts must inspect the JSON valid field rather than relying only on the exit status.

Signature shapes

An Ed25519 network uses:

{"signatures":[{"witness_id":"w1","signature":"<hex>"}]}

A BLS network uses:

{"signature":"<hex>","signers":["w1","w2"]}

The shape must match signature_scheme in the verification configuration. Signatures, public keys, and hashes are lowercase hex on the documented wire format. The verifier rejects ambiguous signature objects, duplicate signers, unknown witnesses, malformed keys or signatures, network-ID mismatches, and fewer than the configured threshold of valid signatures. For BLS, the threshold is a count of distinct listed signer IDs whose configured public keys are used in the aggregate check; current verification does not check PoP. This requires trusted membership registration with authenticated witness/key bindings and PoP. Without that assumption, the listed distinct IDs do not by themselves prove that distinct witnesses participated.

VALID means the configured public keys verify the signed attestation and the threshold is met. In BLS mode, that result has the trusted membership registration/PoP assumption above. It does not authenticate the configuration source, prove content ownership, or establish a globally agreed timestamp. The gateway's POST /v1/verify response is non-authoritative; local verification against a reviewed configuration is preferred.