Skip to content

wallet: Check existing seed before sharing - #81

Draft
BenWestgate wants to merge 5 commits into
codex/restore-inconclusive-ripemd-sep30from
codex/30-existing-fingerprint-before-shares
Draft

BenWestgate wants to merge 5 commits into
codex/restore-inconclusive-ripemd-sep30from
codex/30-existing-fingerprint-before-shares

Conversation

@BenWestgate

@BenWestgate BenWestgate commented Sep 30, 2026 •

Copy link
Copy Markdown
Owner

Refs #30. Focused follow-up to #57 after the behavior-preserving #105 cleanup and #80.

What and why

ms32 create --existing now checks a supplied hex seed or codex32 master secret against the fingerprint on the separate wallet record before generating or showing a new recovery card. A mismatch can be corrected before a share ceremony begins. The explicit no-record path presents the recovered fingerprint and backup identifier for visual confirmation at the same early point. Wallet initialization receives the already checked result and does not prompt twice.

Ctrl-C or EOF during this early check reports that the existing backup remains valid. For a raw hex seed, the identifier shown during the no-record decision is the identifier used for the new shares and imported secret. Fresh ms32 create still asks the operator to record its newly generated fingerprint.

Review shape

Head aa2d333 is stacked directly on #80 (a29753e). Review only the five commits in this PR. Every stable patch-id matches the previously reviewed #81 head; the only change is the moved base. With #105 before #80, the integrated installed source is 5,188 logical lines, within the maintainer-approved <5200 cap. The existing inline review threads are resolved.

Verification

  • Early record, mismatch, interruption, and no-record regressions: 18 passed normally and 18 under python -O.
  • The strict source-size test, Ruff check and format, strict mypy, and git diff --check pass on the published tree.
  • A full local run completed 930 passing tests. It started before the two-line cap trim and failed only that size test; the size test then passed on the published tree. The published head's GitHub matrix has now completed with all 21 checks successful, including normal and optimized suites on Linux, macOS, and Windows and compatibility checks through Python 3.15.

Human review order: #42 → #57 → #105 → #80 → #81 → #95. The agent-authored commits need responsible-human rewrite or squash under repository policy before integration.

@BenWestgate BenWestgate added bug Something isn't working gate: adversarial review Resolve, merge, or explicitly defer before the next full adversarial review. area:wallet/core area:security labels Sep 30, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1af1e2c951

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/codex32/cli.py Outdated
@BenWestgate

Copy link
Copy Markdown
Owner Author

Current-head agent review ACK for 82d588e. I found no correctness or security blocker in this focused delta. The existing seed is parsed first, then the typed-record/no-record decision completes before CreationCeremony.from_secret() or _emit() can run; the checked expected fingerprint is carried into wallet initialization without a second prompt. The prior interruption P2 is resolved: Ctrl-C/EOF at this early gate now takes _WalletSetupInterrupted, preserving the existing recovery cards instead of telling the operator to void them.\n\nExact-head GitHub Python-package checks are green across the 3.12/3.13 OS matrix. I also rechecked py_compile and git diff --check at this head. A detached local pytest run cannot collect on this historical stack because it predates #7 and still imports the legacy bip32 test dependency; that is pre-existing branch history, not a #81 regression. Final integration should replay this focused delta after #42 → refreshed #57 → #46 (and the independent #80 delta as planned), then rerun the existing early-gate/identity/real-Core regressions on the final combined tip. The agent-authored 1af1e2c still needs the repository-required responsible-human rewrite/squash before integration.

@BenWestgate
BenWestgate force-pushed the codex/v1-pre-review-cleanup branch from 1899011 to 0793590 Compare October 1, 2026 01:33
@BenWestgate
BenWestgate force-pushed the codex/30-existing-fingerprint-before-shares branch from ff0f3b2 to 7d5ebfd Compare October 1, 2026 01:36
BenWestgate pushed a commit that referenced this pull request Oct 1, 2026
Reassign the expected_fingerprint argument instead of copying it into a
local, and give existing_secret its None default before the source
checks instead of in an else branch.

Behavior is unchanged. The installed package drops from 5161 to 5159
logical review lines, which keeps the integrated #7/#42/#57/#46/#80/#81
tip under the <5200 budget.

Security: the record gate still runs before any card is generated or
shown, and interrupts at that gate still raise _WalletSetupInterrupted.

Validation: ruff check, ruff format --check, mypy src/codex32, and
pytest (918 passed, with and without -O).

Refs #81, #38.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018az69UX4773mYohXAtE8kD

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7d5ebfd518

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/codex32/cli.py
@BenWestgate

Copy link
Copy Markdown
Owner Author

AI-assisted release-gate recheck at current head 37f6a25: the reviewer P2 is resolved. Raw hex create --existing now reuses the identifier chosen before the no-record decision as the new share-set identifier, so the safety screen, emitted shares, and finished/imported secret agree. The Codex32-input path remains unchanged because that input already carries a meaningful identifier. Production-flow verification exercised both shares and the finished secret; exact-head Python-package run 36803339842 is green, and all inline review threads are resolved. No remaining correctness blocker found in this focused early-record-gate delta. Agent-authored follow-ups still require responsible-human rewrite/squash before integration.

@BenWestgate
BenWestgate force-pushed the codex/v1-pre-review-cleanup branch from 0793590 to 0867a1b Compare October 1, 2026 03:01
@BenWestgate
BenWestgate marked this pull request as draft October 1, 2026 05:48
@BenWestgate
BenWestgate force-pushed the codex/30-existing-fingerprint-before-shares branch from 37f6a25 to 9c6259b Compare October 1, 2026 06:36
BenWestgate pushed a commit that referenced this pull request Oct 1, 2026
Reassign the expected_fingerprint argument instead of copying it into a
local, and give existing_secret its None default before the source
checks instead of in an else branch.

Behavior is unchanged. The installed package drops from 5161 to 5159
logical review lines, which keeps the integrated #7/#42/#57/#46/#80/#81
tip under the <5200 budget.

Security: the record gate still runs before any card is generated or
shown, and interrupts at that gate still raise _WalletSetupInterrupted.

Validation: ruff check, ruff format --check, mypy src/codex32, and
pytest (918 passed, with and without -O).

Refs #81, #38.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018az69UX4773mYohXAtE8kD
BenWestgate pushed a commit that referenced this pull request Oct 1, 2026
Backup creation rejects a noninteractive terminal before this branch, so the later stdin.isatty() rejection can never run. Removing it preserves the interactive behavior and leaves the integrated source under its strict review line budget. Refs #46 and #81.
@BenWestgate
BenWestgate changed the base branch from codex/v1-pre-review-cleanup to codex/restore-inconclusive-ripemd-sep30 October 1, 2026 06:36
@BenWestgate

Copy link
Copy Markdown
Owner Author

Agent review of refreshed head 9c6259b: the existing seed reaches the typed fingerprint or explicit no-record decision before CreationCeremony or card output; the checked fingerprint is passed into BitcoinCore.initialize, whose identity check runs before wallet selection or mutation. Ctrl-C/EOF at the early gate preserves the existing-backup message. The two resolved inline fixes replay as 99a9119 (interruption) and a8cc840 (stable raw-seed identifier). Focused regressions and the published 21-check matrix pass. No remaining code blocker found; the agent-authored commits still need responsible-human rewrite/squash under repository policy.

@BenWestgate
BenWestgate force-pushed the codex/restore-inconclusive-ripemd-sep30 branch from fb8d671 to f579184 Compare October 1, 2026 18:23
BenWestgate pushed a commit that referenced this pull request Oct 1, 2026
Reassign the expected_fingerprint argument instead of copying it into a
local, and give existing_secret its None default before the source
checks instead of in an else branch.

Behavior is unchanged. The installed package drops from 5161 to 5159
logical review lines, which keeps the integrated #7/#42/#57/#46/#80/#81
tip under the <5200 budget.

Security: the record gate still runs before any card is generated or
shown, and interrupts at that gate still raise _WalletSetupInterrupted.

Validation: ruff check, ruff format --check, mypy src/codex32, and
pytest (918 passed, with and without -O).

Refs #81, #38.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018az69UX4773mYohXAtE8kD
@BenWestgate
BenWestgate force-pushed the codex/30-existing-fingerprint-before-shares branch from 9c6259b to 7686cb0 Compare October 1, 2026 18:28
BenWestgate pushed a commit that referenced this pull request Oct 1, 2026
Backup creation rejects a noninteractive terminal before this branch, so the later stdin.isatty() rejection can never run. Removing it preserves the interactive behavior and leaves the integrated source under its strict review line budget. Refs #46 and #81.
@BenWestgate
BenWestgate changed the base branch from codex/restore-inconclusive-ripemd-sep30 to codex/remove-unreachable-v1-branches October 1, 2026 18:28
@BenWestgate
BenWestgate force-pushed the codex/remove-unreachable-v1-branches branch from b24d72c to d886238 Compare October 1, 2026 18:35
Codex Agent and others added 5 commits October 1, 2026 13:35
An existing hex seed or codex32 master secret previously reached the wallet-record fingerprint check only after new recovery cards had been generated and confirmed. Check the typed record immediately after parsing the source, before any card output or ceremony. Preserve the explicit recordless path at the same early decision point, and pass the checked result through to wallet initialization so it is not prompted twice. Cover matching, mismatching, and recordless flows for both source encodings. Refs #30.
Translate Ctrl-C or EOF at the early wallet-record gate for ms32 create --existing into the existing wallet-setup interruption path. This keeps an operator from being told to invalidate a pre-existing recovery card before any new share ceremony has started.

Add a focused regression proving the interruption occurs before share creation or output and preserves the valid-backup message.
Reassign the expected_fingerprint argument instead of copying it into a
local, and give existing_secret its None default before the source
checks instead of in an else branch.

Behavior is unchanged. The installed package drops from 5161 to 5159
logical review lines, which keeps the integrated #7/#42/#57/#46/#80/#81
tip under the <5200 budget.

Security: the record gate still runs before any card is generated or
shown, and interrupts at that gate still raise _WalletSetupInterrupted.

Validation: ruff check, ruff format --check, mypy src/codex32, and
pytest (918 passed, with and without -O).

Refs #81, #38.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018az69UX4773mYohXAtE8kD
A raw seed imported with create --existing was assigned a temporary random identifier for the no-record safety screen, then assigned a different random identifier when the new share set was created. Reuse the first identifier as the share-set identifier so the safety screen describes the backup that will actually be produced.\n\nExtend the recordless-creation regression to require the displayed, emitted, and imported identifiers to agree.\n\nRefs #30
Backup creation rejects a noninteractive terminal before this branch, so the later stdin.isatty() rejection can never run. Removing it preserves the interactive behavior and leaves the integrated source under its strict review line budget. Refs #46 and #81.
@BenWestgate
BenWestgate force-pushed the codex/30-existing-fingerprint-before-shares branch from 7686cb0 to aa2d333 Compare October 1, 2026 18:36
@BenWestgate
BenWestgate changed the base branch from codex/remove-unreachable-v1-branches to codex/restore-inconclusive-ripemd-sep30 October 1, 2026 18:37

This branch has not been deployed

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

Labels

area: security Security invariants, hardening, and security-sensitive boundaries. area: wallet/core Wallet integration and Bitcoin Core boundaries. bug Something isn't working gate: adversarial review Resolve, merge, or explicitly defer before the next full adversarial review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants