Skip to content

Clear-signing dialog dismisses on Approve, leaving nothing to compare against the device's digest screens #385

Description

@illithics

Environment: Vault v1.4.10, KeepKey firmware v7.14.1, macOS

Summary

When a paired app requests POST /eth/sign-typed-data, Vault shows an excellent
clear-signing dialog: decoded EIP-712 fields, "Known Pattern" badge, requesting-app
attribution. But clicking Approve immediately dismisses the dialog — and then
the device asks the user to confirm two hash digests ("TYPED DATA DOMAIN — confirm
hash digest" and "TYPED DATA MESSAGE — confirm hash digest").

At the exact moment the user is asked to verify those digests, the host screen shows
nothing to verify them against. The device confirmation degrades into a blind
"press OK to continue," which defeats the purpose of the firmware displaying digests
at all.

Steps to reproduce

  1. Pair any app via /auth/pair.
  2. Send an eth_signTypedData request for any typed struct.
  3. Vault shows the decoded clear-signing dialog → click Approve.
  4. Dialog closes. Device now shows the domain digest and message digest and asks
    for confirmation.
  5. There is no longer anything on the host screen to compare the digests with.

Why this matters

The firmware's typed-data path (EthereumSignTypedHash) has the host compute
domainSeparator and hashStruct and the device sign the EIP-712 digest. The
device screens exist so a user (or an auditor) can check that what the device is
about to sign corresponds to the request they reviewed. That check requires the
reference values to be visible during the device-confirm phase — which is
precisely when Vault currently hides them.

(During development of a pendant-display dapp we recomputed the digests
independently and confirmed they match what the device shows — the comparison is
entirely feasible; the UI just doesn't support it.)

Expected behavior

  1. On Approve, the dialog should not unmount. It should transition to a
    "Waiting for device confirmation…" state with all decoded fields still
    visible.
  2. That state should additionally display the two host-computed digests, labeled
    to match the device's wording:
    • TYPED DATA DOMAIN<domainSeparator hex>
    • TYPED DATA MESSAGE<hashStruct(primaryType, message) hex>
      so the user can compare character-for-character with the device screen.
  3. The dialog dismisses only when the device confirms or rejects (or the request
    times out), and shows the outcome.

Notes

  • Both digests are already computed host-side to build the
    EthereumSignTypedHash message, so this is purely a presentation change — no
    protocol or firmware work.
  • Same applies to the address-verification step (VERIFY ADDRESS screen): keep
    the expected address visible on the host while the device shows it.
  • Nice-to-have: a copy button on each digest for out-of-band verification.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions