Repository navigation
fix: validate BitGo GPG key and session state in EdDSA MPCv2 offline signing - #10127
Conversation
|
@claude review always |
|
Claude finished @vibhavgo's task in 26s —— View job Review of PR #10127 (WAL-2455)I read the diff only and ran no tests. Overall the approach is sound: it pins the BitGo GPG key the same way the keygen and other helpers already do, and it makes the session blobs single-use. I found no blocking issues, only the points below. What looks right
Observations (non-blocking)
Follow-ups already acknowledged No required changes. Item 1 is worth documenting or deciding on before merge. |
7f281e8 to
b043dee
Compare
894d3bd to
fb27cfa
Compare
|
@claude review |
|
Claude finished @vibhavgo's task in 30s —— View job Review of PR #10127 (WAL-2455), commit fb27cfaI read the diff for sdk-core and express and checked it against Verdict: No blocking issues. The earlier review findings are addressed: the digest is formatting-independent, the mark moved to just before What looks right
Observations (non-blocking)
I agree with deferring fingerprint-based key comparison, since it matches the keygen helpers. A ticket for it would be good. |
There was a problem hiding this comment.
Still open from earlier reviews (2):
- Unresolved: 1 minor or pre-existing, 1 blocking on lines changed since (possibly already fixed).
If you have decided not to act on one of these findings, resolve its thread (a reply alone leaves it open) and the next review stops counting it. To review this commit again now, use Re-run on its "Claude Code Review" check.
f2807d4 to
1413b87
Compare
fb27cfa to
85eef5f
Compare
72c442b to
7b881e4
Compare
85eef5f to
d373688
Compare
|
@claude review |
25507aa to
7cf247f
Compare
4199628 to
a1a6510
Compare
79234fd to
58ab47f
Compare
|
@claude review |
58ab47f to
3b54625
Compare
|
@claude review |
There was a problem hiding this comment.
Claude Code Review
This repository is configured for manual code reviews. Comment @claude review for a one-time review, or @claude review always to subscribe this PR to a review on every future push.
Tip: disable this comment in your organization's Code Review settings.
|
@claude do a thorough review of this and give an approval rating |
|
@claude review |
Marzooqa
left a comment
There was a problem hiding this comment.
Overall: Solid — the post-authentication closure pattern for durable consumption is the right shape (mirrors the GG18 MuDelta/S closures from #10126): junk is rejected with a 400 before touching the registry, transient failures don't burn the session, and the durable → in-memory → restoreSession ordering means a concurrent replay can't double-restore. Composes cleanly with the merged #10126 registry, and the digest's canonical-base64 / salt-omission / v1 iv-truncation handling is well-reasoned. Pin rejection and replay rejection paths are both covered by tests.
One security finding and one config question inline — neither changes the overall shape.
(Context: #10155 hoists this module into a shared encryptedSessionSingleUse.ts for the ECDSA MPCv2 rounds — the timestamp finding below would be natural to fix in either place, whichever lands first.)
…signing Aligns the EdDSA MPCv2 offline round-2/round-3 helpers with the existing keygen helpers: the BitGo GPG public key is validated against the known BitGo key table in the envs that already enforce it for keygen, and round session state is tracked so each encrypted session blob is processed at most once, sharing the express ConsumedShareRegistry with the ECDSA MuDelta/S shares. No public API or wire-format changes. Ticket: WAL-2455
3b54625 to
90596a4
Compare
|
|
Marzooqa
left a comment
There was a problem hiding this comment.
Approving. Both findings from the earlier review were addressed correctly — the session-blob expiry (created stamp in the authenticated adata at all four mint sites, skew tolerance, age check before the registry is consulted) and the startup warning for unpinned environments. Re-review also confirmed the mark/restore ordering, the digest canonicalization against re-serialization, and the adata state-prefix discrimination all hold.
The cross-transcript scenario (a restored session blob driven with a different session's peer messages) has been verified by the author as rejected by the DSG state machine.
Three small non-blocking asks:
- Since that scenario was verified manually, consider landing the test itself — a restored round-1 session fed another session's round-1 messages, asserting rejection — so the property stays pinned across future
sdk-lib-mpcupgrades, where a regression would otherwise fail silently. DSG_SESSION_MAX_AGE_MScould alias the exportedOFFLINE_SIGNING_SHARE_MAX_AGE_MSrather than duplicating the value, making the expiry/retention invariant structural instead of comment-enforced.- One README/release-note line: the blob lifetime assumes a single signer process with a consistent clock — a backward clock step >60s mid-session or clock spread across processes rejects in-flight sessions (fail-closed), sessions minted before deploy restart at rollout, and in-flight sessions span at most two blob lifetimes (round hops each get their own 30-day window).
Summary
Aligns the EdDSA MPCv2 offline signing rounds (
EddsaMPCv2Round2/EddsaMPCv2Round3) with the existing keygen helpers:ConsumedShareRegistrymechanism with the ECDSA MuDelta/S shares.Linear: WAL-2455
Test Plan