Security & trust

Verdifax is a security product. This page describes the controls, the threat model, the assumptions, and the limits of what the platform protects against. Security promises are stated narrowly so they can be audited.

Last updated: October 17, 2026

Threat model

Verdifax is designed so that a later change to a run's record no longer matches its entry on a public log that Verdifax does not operate. Since verifier 0.12.0, an entry counts only if it is signed with a published Verdifax log-signing key and the timestamp the log signs for it verifies, so a rewritten record that anyone else logs as a new entry fails. Verdifax holds that key, so that check alone does not catch a change made by Verdifax itself. From run 240 on, each record seals a 600-second anchoring window: a re-log by Verdifax after that window fails, and moving the record's sealed clock to fit changes the record's own date. Earlier records show their authenticated anchoring time but cannot fail on it. Nothing here shows that Verdifax sealed true inputs in the first place. Two layers are checked separately. Recomputing the execution record and its proof from the disclosed fields needs no key, no public log and no Verdifax service. The public-log checks are a second layer, which relies on the log's key and on Verdifax's published log-signing keys. What the design covers is what the record binds to the public log, which depends on when it was sealed. Successful runs sealed from run 239 (2026-10-16, 18:27 UTC) on carry a complete-record anchor, a second public-log entry over a digest of every section that the first entry states is required, so a rewritten section no longer matches that entry and deleting the entry fails verification. Run 238 carries the same second entry, but deleting it only lowers the verdict to partial coverage. On records sealed before run 238 it covers the run's identity and, on leaf v5 records (runs 236 and 237), its 33 pre-anchor values, which include the attested decision, the AIVP governance result, the payload hash, the actor and the scaffold flags; their descriptive sections (outcome summary, request substance, authorization and approval chain, real-world effects, system provenance) are sealed by hashes inside the bundle but are not bound to the public log, so they show the bundle is internally consistent, not that a party able to rewrite the whole bundle has not changed them. The platform is not designed to prevent the user's own program from being incorrect, malicious, or biased, those are evaluation problems upstream of the attestation pipeline. See What the Manifest Hash proves for the precise scope of the cryptographic claim.

Cryptographic primitives

All hashing uses SHA-256. Canonicalization uses RFC 8785 (JSON Canonicalization Scheme). The zero-knowledge layer (ZKSP) is a disclosed scaffold: it emits a deterministic hash facade in place of a real zero-knowledge proof, and its status field must equal the expected literal token (SCAFFOLD_R1CS_HASH_FACADE) for the run to seal. Anything else aborts the manifest. The Lean 4 development referenced in each new audit bundle verifies theorems about a model of the pipeline; it does not verify the prover or the production Go binary. See Scaffold gaps. We do not invent cryptography; we compose standard primitives.

Hardware attestation

Runs sealed with a SEV-SNP attestation agent carry a genuine AMD SEV-SNP attestation report taken before the run's execution record is built: the report's guest-controlled field is computed from the record's other fields, the report's hash becomes the record's hardware field, and the orchestrator verifies the report's certificate chain against AMD's Milan root of trust (pinned by fingerprint) plus its signature before sealing. A configured agent that fails halts the run rather than sealing it without the hardware. The report and certificate chain are embedded in the audit bundle so any third party can re-verify them offline. The hosted service runs without a hardware agent today; those runs disclose that honestly with a per-run scaffold flag, which reports what each individual run actually carried. Additional platforms (TPM 2.0, Nitro Enclaves) and a multi-vendor quorum root of trust are disclosed roadmap items, not current capabilities.

Determinism guarantees

Every Verdifax hash is SHA-256 over a canonical preimage defined by the §0 specification, so the same canonical field set always produces the same hash, byte-for-byte. Shared canonical test vectors lock the Go and Python implementations of the DSE, DCAE and CRES kernel formulas to identical output. The pipeline's computation is deterministic as well: replaying the same inputs under a pinned clock and nonce, with the public-log anchoring stage held fixed, reproduces the same manifest hash byte-for-byte, and POST /execute/verify-determinism runs exactly that check. This is a primitive of the system, not an aspiration.

Determinism does not mean that resubmitting the same inputs reproduces an earlier hash. Every /execute call mints a fresh admission clock and per-run nonce, and both enter the manifest hash and the anchored public-log leaf, so two separate submissions of identical inputs are distinct records with different hashes, by design. A production record's hash also binds its own unique public-log entry, so a production record is verified by recomputing its seals from its recorded fields, not by re-running it.

Independent verification

Every Verdifax audit bundle can be checked by a verifier that does not trust Verdifax. The open-source verifier, verdifax-verify, runs on your own machine and, offline, recomputes every section hash, the bundle hash and the anchored public-log leaves from the bundle's own fields, confirms every section is bound to the same manifest hash, and checks each Sigstore Rekor inclusion proof against a public key embedded in the binary.

Use verifier v0.14.5 or later. v0.12.0 also accepts a bundle whose JSON carries a value twice under keys that differ only in letter case, which other readers such as jq, Python and browsers read differently; since v0.12.1 the verifier refuses it. Releases through v0.11.0 accept a record whose public-log entries were logged by any key, and report records from run 240 on as failed because they do not recognize leaf v7. Releases v0.1.4 through v0.9.0 also did not check that an anchor's recorded leaf hash matches the public-log entry its inclusion proof covers; since v0.10.0 the verifier binds every anchor to its log entry. From run 239 on, a record's first public-log entry states that a complete-record anchor is required, and a missing or altered one is a failure (exit code 1). The published log-signing keys, their fingerprints and custody are listed in the verifier's README: key 1, the production key, is a file on the API server's volume, not in a hardware module, and has never been rotated. For run 238, which predates that requirement, require the verdict VERIFIED AND ANCHORED, COMPLETE RECORD ANCHORED, because deleting its complete-record anchor yields PARTIAL COVERAGE with exit code 0. The verifier does not re-derive the manifest hash itself, which takes the full stored manifest; GET /runs/{id}/verify performs that check server-side. There is no privileged path that bypasses verification, not even for the Verdifax operator.

Data handling

Verdifax does not store the raw payload bytes you attest. Payloads are canonicalized, hashed, sealed into an envelope, and discarded; the payload-derived values retained on disk are hashes. If you include AI output text, Verdifax sends it to Anthropic's Claude API for the governance review and stores only its hash. Metadata you include, such as actor identifiers, approver names and comments, and any optional inline prompt, output or entity fields, is stored exactly as sent inside the sealed record. Each sealed record also contains hashes of the connecting IP address and user agent: from run 245 on, keyed HMAC-SHA256 hashes under a secret only the server holds (prefix hmac-sha256:), which nobody without that secret can reverse, though Verdifax could by trying every possible address; up to run 244, unsalted SHA-256 hashes, from which anyone can recover an IP address that way. From run 247 on the server refuses a request that supplies its own values for these two hashes; before then a caller's values were sealed in place of the server's. The API does not ask for model weights, IAM tokens, or customer records; do not put them in payloads or metadata.

Retention. The hosted service currently has no deletion jobs. Sealed records, account records and access requests are kept indefinitely unless they are deleted manually, and entries in the public Sigstore Rekor log cannot be removed.

Erasure. POST /admin/erase is admin-only. It destroys a per-field data-encryption key and issues a sealed deletion receipt, but the encryption path is not yet wired into /execute, so the destroyed key encrypts no stored field and the sealed bundle's content is unchanged. For runs anchored in the Rekor log, there is currently no product function that removes or edits the content of a sealed record.

Public demo bundles. Apart from the 44 earlier bundles described below, a sealed bundle is publicly readable, without an API key, only after a Verdifax admin key publishes it with POST /admin/runs/{id}/publish, and an admin key can publish only runs it created itself. Customer API keys cannot make a bundle public, and a route_id that begins with buyer-demo- no longer does. The 44 bundles published under that earlier prefix rule remain readable at the sequential address /runs/{id}/bundle.json. Bundles published since are readable only at /public/runs/{token}/bundle.json, where the token is 32 hexadecimal characters from a cryptographic random source, so they cannot be found by counting run ids. A public bundle may still be served from cache for up to one hour after it is unpublished.

Key custody. Verdifax's server generates each API key's Ed25519 signing key pair and holds the private key in its database. An actor signature on a run therefore shows that Verdifax's server signed with the key assigned to that API key, not that the customer's own device or system signed. API key secrets are stored only as SHA-256 hashes.

Access controls

Multi-factor authentication is enabled on every account that controls production: Fly.io, Cloudflare, GitHub, AWS and Google Workspace. Within the API, the administrative endpoints (/admin/*) require an admin-scoped API key and refuse customer-scoped keys. Raw payload bytes are not stored (see Data handling above), so they cannot be read from production storage.

Vulnerability disclosure

Security researchers may report suspected vulnerabilities to security@verdifax.com. We acknowledge reports within forty-eight (48) hours and aim to triage within five (5) business days. We do not take legal action against researchers who act in good faith and report vulnerabilities to us at security@verdifax.com.

Compliance posture

Verdifax produces cryptographically sealed records of AI decisions, with hashes published in a public transparency log. Organizations subject to the following can use these records as evidence for their own record-keeping, audit, integrity and monitoring controls:

  • EU AI Act, Articles 12, 19 and 26(6), record-keeping and log retention, which are duties of the provider and deployer of a high-risk AI system
  • HIPAA 45 CFR § 164.312(b), audit controls (customer-assessed)
  • SOX § 404, IT general controls within the issuer's internal control over financial reporting (customer-assessed)
  • NIST SP 800-53 audit and accountability (AU) controls, as used in FedRAMP authorizations (customer-assessed)

Whether that evidence is sufficient is for the organization and its auditors or regulators. Verdifax does not make any organization compliant. Verdifax currently holds no SOC 2 report, ISO/IEC 27001 certificate or FedRAMP certification, and does not sign Business Associate Agreements, so do not send protected health information to Verdifax-hosted services. See the Compliance section for guidance on producing evidence packs from Verdifax artifacts.

What Verdifax does not protect against

To keep the security promise narrow and auditable, we list the out-of-scope items explicitly:

  • Verdifax does not certify that a model's output is correct
  • Verdifax does not certify training-data licensing or representativeness
  • Verdifax does not authenticate the human user, wire your IAM into the inputs you attest
  • Verdifax does not prove that the values inside a payload describe reality (input authenticity is upstream of the pipeline)

The narrow scope is the source of the cryptographic strength. See What the Manifest Hash proves for the full list.

Contact

Security questions can be sent to security@verdifax.com.