Skip to content

The PQ verify precompile exposes no signature context, so signatures are not bound to a purpose #494

Open

Description

@quantova-inc

The SLH DSA verify precompile takes a verifying key, a message, and a signature, and checks a pure SLH DSA signature with an empty context. The interface exposes no context parameter, and the roadmap does not define a purpose binding convention for post quantum signatures. The precompile and the planned post quantum ecrecover are still pre production and not protecting live assets, so this is the right moment to raise it as a design point rather than a live concern.

Without a context, a single SLH DSA key reused across Arc's mechanisms, the raw precompile, the planned ecrecover override, account abstraction, and dApps, produces signatures that are not bound to a purpose. A signature produced for one mechanism verifies in another whenever the signed bytes coincide, which is the cross context reuse that domain separation exists to prevent. The EIP 712 digest binds the ecrecover path, but the raw precompile and cross dApp use have no enforced binding, and leaving it to each caller is where it tends to be missed.

FIPS 205 includes a context string for exactly this. Exposing it in the precompile interface and defining one distinct context per mechanism binds every signature to its purpose by construction, at negligible cost.

We raise this from direct experience. We standardised purpose binding for post quantum signatures on another chain, where every signature is bound to its context so it cannot be replayed across uses, and we are glad to share the construction and help shape the convention here.

We would be happy to open a pull request for the interface change and the test vectors if the direction is welcome.

Activity

  1. nenadmilosevic95 commented on Oct 26, 2026

    @nenadmilosevic95

    Thanks for raising this! We'll review it with the team and follow up here.

  2. msheth-circle commented on Oct 26, 2026

    @msheth-circle
    Contributor

    Thanks for the detailed write-up.

    This behavior is intentional, and it matches ecrecover. ecrecover checks a signature over whatever 32 bytes it is given and does not bind a purpose. Domain separation on EVM comes from the application layer through EIP-191 and EIP-712, not from the precompile. The SLH-DSA precompile follows the same model: it verifies a signature over the bytes the caller passes and leaves the meaning of those bytes to the application.

    The precompile is already live on mainnet, and available in beta mode for app developers at this stage, and its interface might evolve in the future.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions