Skip to content

fix(sdk-core): redact EdDSA MPCv1 R share, bind G round to signer-held envelope - #10154

Draft
Marzooqa wants to merge 5 commits into
masterfrom
marzooqanaeemakather/wal-2456-critical-bitgojs-external-signer-eddsa-mpcv1-helpers-expose
Draft

Marzooqa wants to merge 5 commits into
masterfrom
marzooqanaeemakather/wal-2456-critical-bitgojs-external-signer-eddsa-mpcv1-helpers-expose

Conversation

@Marzooqa

Copy link
Copy Markdown
Contributor

Summary

Hardens the EdDSA MPCv1 offline-signing (signer mode) share handling in the SDK and Express, mirroring #10126 for the GG18 flow. Stacked on #10126 (reuses its consumed-shares registry and adata binding helpers).

Linear: WAL-2456

Changes

  • tssshare/R returns only the nonce reveal (r, R); the R-share envelope created at the commitment step is bound to the signable via AEAD adata and validated at the R and G rounds.
  • The G round consumes the signer-created envelope, exactly once, via the Express consumed-shares registry.
  • The commitment round accepts only the pinned BitGo MPCv1 GPG public key in environments that require BitGo public key config.
  • Breaking: the external-signer signing callbacks change shape; signer and relay must be upgraded together for EdDSA MPCv1 wallets.

Test Plan

  • Updated the EdDSA MPCv1 unit and route tests for the new contracts.
  • Added coverage for envelope replay rejection, signable-binding mismatch, and the GPG key pin.

@linear-code

linear-code Bot commented Nov 10, 2026

Copy link
Copy Markdown
Contributor

WAL-2456

@github-actions

github-actions Bot commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Compatibility checks are failing on Node.js 27-nightly (experimental, non-blocking). This does not block merge, but it signals an incompatibility to fix before this release becomes supported.

View run

@Marzooqa
Marzooqa changed the base branch from master to vibhavgopalkrishna/wal-2459-critical-bitgojs-gg18-external-signer-s-share-helper-accepts November 10, 2026 11:00
@Marzooqa
Marzooqa requested a deployment to breaking-changes-override November 10, 2026 11:05 — with GitHub Actions Waiting
@vibhavgo
vibhavgo force-pushed the vibhavgopalkrishna/wal-2459-critical-bitgojs-gg18-external-signer-s-share-helper-accepts branch 2 times, most recently from 4199628 to a1a6510 Compare November 11, 2026 08:23
Base automatically changed from vibhavgopalkrishna/wal-2459-critical-bitgojs-gg18-external-signer-s-share-helper-accepts to master November 11, 2026 11:33
@Marzooqa
Marzooqa force-pushed the marzooqanaeemakather/wal-2456-critical-bitgojs-external-signer-eddsa-mpcv1-helpers-expose branch from 3c554a0 to d4416d8 Compare November 11, 2026 11:38
@Marzooqa
Marzooqa requested a deployment to breaking-changes-override November 11, 2026 11:48 — with GitHub Actions Waiting
Moves the offline-signing adata binding helpers (signable/path core,
envelope formatting and validation, max age) from EcdsaUtils into a
shared module so signing protocols enforce an identical binding format.
Behavior-preserving; EcdsaUtils delegates to the shared helpers.

References: WAL-2456
…held envelope

The R round now returns only the nonce reveal (r and R). The R-share
envelope is bound to the signable via AEAD adata and validated at the
R and G rounds, and the G round consumes the signer-created envelope
once via a markConsumed callback instead of caller-supplied share
values. The commitment round accepts only the pinned BitGo MPCv1 GPG
public key in environments that require BitGo public key config.

References: WAL-2456
Wires the consumed-shares registry into the EdDSA MPCv1 G round,
removes the plaintext user share from the G request codec, and
redacts the R response codec to the nonce reveal.

References: WAL-2456
Share-generation failures on the EdDSA MPCv1 rounds (GPG key pin,
envelope binding, expiry, single use, undecryptable envelope) are
caller-input failures; surface them as 400 client errors instead of
500. The original error is still logged by the handler.

References: WAL-2456
In environments that do not enforce the BitGo GPG public key config
(mock, custom, local dev), the signer share is encrypted to any
caller-supplied GPG public key. Log a warning at startup so operators
of unpinned environments know share encryption accepts any key.

References: WAL-2456
@Marzooqa
Marzooqa force-pushed the marzooqanaeemakather/wal-2456-critical-bitgojs-external-signer-eddsa-mpcv1-helpers-expose branch from d4416d8 to 8dfed06 Compare November 11, 2026 13:46
@Marzooqa
Marzooqa requested a deployment to breaking-changes-override November 11, 2026 13:56 — with GitHub Actions Waiting

This branch is waiting to be deployed

1 waiting deployment
breaking-changes-override — 8dfed06e Waiting Nov 11, 2026 by Marzooqa via Linter Override #6259
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant