Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
35a4a04
docs(secret-seam): Phase-1 design artifacts (UX disclosure + test cas…
lklimek Jun 19, 2026
9d313b7
feat(wallet-backend): add raw-SecretBytes secret seam + typed errors …
lklimek Jun 19, 2026
890cae1
fix(model): redacting Debug for ClosedSingleKey (T9, 6a2818cd)
lklimek Jun 19, 2026
85e8c4f
feat(model): PrivateKeyData::InVault placeholder + migration probes (T1)
lklimek Jun 19, 2026
f1cd234
feat(model,wallet-backend): WalletMeta+ImportedKey sidecar fields, sc…
lklimek Jun 19, 2026
1880461
chore(wallet-backend): satisfy fmt + clippy for the secret-seam batch
lklimek Jun 19, 2026
e503bbd
feat(wallet-backend): SecretScope::IdentityKey + seam-first SecretAcc…
lklimek Jun 19, 2026
aa3c34d
feat(wallet-backend): identity_key_store + seed/single-key seam-raw w…
lklimek Jun 19, 2026
a6c11a7
feat: crash-safe dual-format migration + InVault resolver + vault del…
lklimek Jun 19, 2026
aadf532
feat: key_info_screen JIT identity signing + single-key Copy B disclo…
lklimek Jun 19, 2026
dd570b8
chore: fmt + clippy for the T3-T8 integration batch
lklimek Jun 19, 2026
c155020
fix(wallet-backend): dual-format read for WalletMeta + ImportedKey si…
lklimek Jun 19, 2026
12b34f3
test(identity-db): identity-key migration, deletion, write-fault no-l…
lklimek Jun 19, 2026
99b5926
test(wallet-lifecycle): assert lazy-migration secret post-conditions …
lklimek Jun 19, 2026
a727179
test(backend-e2e): TS-SIGN-E2E-01 InVault identity signs + broadcasts…
lklimek Jun 19, 2026
73c189d
refactor(wallet-backend): zeroize migration source, flavor identity-k…
lklimek Jun 19, 2026
66c3204
test(secret-seam): TS-INV-03 audit guard + TS-NOLEAK-02 sidecar no-le…
lklimek Jun 19, 2026
906a2f1
test(kittest): disclosure-banner copy coverage (QA-007/Diziet)
lklimek Jun 19, 2026
551d208
docs: comment hygiene + CLAUDE.md seam pointer + user-story softening…
lklimek Jun 19, 2026
4dabef6
chore: nightly fmt for the QA-findings batch
lklimek Jun 19, 2026
1be4bef
test(backend-e2e): seed Clear key so TS-SIGN-E2E-01 exercises the InV…
lklimek Jun 19, 2026
3cb2d83
Merge remote-tracking branch 'origin/docs/platform-wallet-migration-d…
lklimek Jun 22, 2026
bf7d17b
chore(deps): repin platform deps to feat/platform-wallet-secret-prote…
lklimek Jun 22, 2026
01939db
fix(secret): open the vault keyless (file_unprotected) for the Tier-1…
lklimek Jun 22, 2026
972cf7a
feat(secret): add Tier-2 seam capability (protected set/get + scheme …
lklimek Jun 22, 2026
fd7f078
feat(secret): adopt Tier-2 per-secret passwords for HD seeds
lklimek Jun 22, 2026
6dafbda
refactor(secret): clean keep-protection replacement of the downgrade …
lklimek Jun 22, 2026
8d17f57
feat(secret): adopt Tier-2 keep-protection for imported single keys
lklimek Jun 22, 2026
465f10d
fix(secret): address Smythe Tier-2 review findings (SEC-001/002/004/005)
lklimek Jun 22, 2026
904dc83
docs(migration): note the wallet.uses_password/password_hint schema i…
lklimek Jun 22, 2026
83414f6
fix(test): eliminate register_wallet_from_seed race in cold-boot test
lklimek Jun 23, 2026
564fe7d
fix(wallet-backend): keep Tier-2 protected wallets visible at cold bo…
lklimek Jun 23, 2026
bf435c4
fix(wallet-backend): seal fresh protected single-key imports Tier-2, …
lklimek Jun 23, 2026
0eaa422
docs(secret-seam): correct drifted docs to Tier-2 keep-protection rea…
lklimek Jun 23, 2026
ff15f82
feat(wallet-backend): optional per-identity at-rest encryption for id…
lklimek Jun 23, 2026
d965ca5
fix(wallet-backend): seal new keys on a protected identity Tier-2, ne…
lklimek Jun 23, 2026
fcf6da1
fix(identity): fail closed before broadcast when adding a key to a pr…
lklimek Jun 23, 2026
cf8beab
fix(identity): harden SEC-001 identity-key paths (r2 review)
lklimek Jun 24, 2026
2f40b30
docs(single-key): correct has_passphrase on-disk-shape doc to Tier-2-…
lklimek Jun 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ Code lives by responsibility, not convenience:
- **`backend_task/`** — async business logic, one submodule per domain; the authoritative enforcement layer. `TaskError` and its typed variants live in `backend_task/error.rs`.
- **`database/`** — SQLite persistence, one module per domain.
- **`context/`** — `AppContext` submodules (`*_db.rs`, lifecycle, settings, status).
- **`wallet_backend/`** — the wallet orchestration seam: adapters, views, backend-side live caches, signers, the secret chokepoint, the event bridge.
- **`wallet_backend/`** — the wallet orchestration seam: adapters, views, backend-side live caches, signers, the secret chokepoint, the event bridge. All wallet secret bytes (HD seed, imported single key, identity private key) enter/leave the vault through ONE chokepoint, `wallet_backend/secret_seam.rs` (raw `SecretBytes`, no DET-side serialization). Per-secret at-rest encryption is implemented via `put_secret_protected`/`get_secret_protected` (Argon2id + XChaCha20-Poly1305, per-secret object-password envelope, AAD bound to `wallet_id ‖ label`); unprotected secrets use `put_secret`/`get_secret` (raw, keyless vault). The keyless-vault residual (identity keys and no-password secrets) is the deferred tier. Design + migration: `docs/ai-design/2026-06-19-secret-storage-seam/`.
- **`ui/<domain>/`** — screens (`ScreenLike`). UI may *call* `model/` validators for instant feedback but never implements its own validation.
- **`ui/components/`** — reusable **Component-pattern widgets ONLY**: a `show()` plus a `ComponentResponse`, a display-only render widget, or component infrastructure. If it does not render egui, it is not a component.
- **`ui/state/`** — non-widget UI state: per-screen view-models and async fetch-state caches (e.g. `TrackedAssetLockCache`). Owned by screens, may return `BackendTask`, render nothing.
Expand Down
62 changes: 31 additions & 31 deletions Cargo.lock
Comment thread
lklimek marked this conversation as resolved.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🟡 [LOW] SEC-006: Unmaintained / unsound / yanked transitive crates flagged by cargo-audit

cargo audit also reports 11 warnings, none introduced by this PR's own code but present in the tree: unmaintained — bincode 1.x (RUSTSEC-2025-0141, already acknowledged in src/model/wallet/seed_envelope.rs:24-29; DET's envelope uses bincode 2.x and the 1.x copy is transitive and only ever decodes local owner-only vault data), async-std (RUSTSEC-2025-0052), atomic-polyfill (RUSTSEC-2023-0089), derivative (RUSTSEC-2024-0388), paste (RUSTSEC-2024-0436), proc-macro-error2 (RUSTSEC-2026-0173); unsound — memmap2 (RUSTSEC-2026-0186, unchecked pointer offset); yanked — bitcoin_hashes 0.14.100, base58ck 0.1.100, bitcoin-io (all via the dashcore/key-wallet stack). These are dependency-hygiene items, mostly build-time proc-macros or deep transitive crates with no direct DET attack surface.

Recommendation. Track these for upstream resolution (most clear when the dashpay/platform deps move to released versions per SEC-003). Confirm the memmap2 unsound advisory's affected version range against the locked version and bump if affected. Add cargo deny with an explicit allow-list for any warning consciously accepted, so the set is reviewed rather than silently growing.

Impact. Low direct risk: the unmaintained crates are proc-macros or local-only serializers; the unsound memmap2 and yanked crates ride in via the dash ecosystem deps. The aggregate concern is supply-chain drift — unmaintained crates accrue unpatched issues over time.

Tags: A06 Vulnerable and Outdated Components, CWE-1104, CWE-1395 · full location: Cargo.lock

🤖 Co-authored by Claudius the Magnificent AI Agent

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Tracked with the quinn-proto item — not fixed here. These unmaintained/yanked crates are all transitive via the dash ecosystem stack; they clear when the platform deps move to released versions. A cargo deny allow-list for consciously-accepted warnings is the follow-up. Leaving open.

🤖 Co-authored by Claudius the Magnificent AI Agent

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ qrcode = "0.14.1"
nix = { version = "0.31.1", features = ["signal"] }
eframe = { version = "0.33.3", features = ["persistence", "wgpu"] }
base64 = "0.22.1"
dash-sdk = { git = "https://github.com/dashpay/platform", branch = "fix/wallet-core-derived-rehydration", features = [
dash-sdk = { git = "https://github.com/dashpay/platform", branch = "feat/platform-wallet-secret-protection", features = [
Comment thread
lklimek marked this conversation as resolved.
"core_key_wallet",
"core_key_wallet_manager",
"core_bincode",
Expand All @@ -28,12 +28,12 @@ dash-sdk = { git = "https://github.com/dashpay/platform", branch = "fix/wallet-c
"core_spv",
"shielded",
] }
rs-sdk-trusted-context-provider = { git = "https://github.com/dashpay/platform", branch = "fix/wallet-core-derived-rehydration" }
platform-wallet = { git = "https://github.com/dashpay/platform", branch = "fix/wallet-core-derived-rehydration", features = [
rs-sdk-trusted-context-provider = { git = "https://github.com/dashpay/platform", branch = "feat/platform-wallet-secret-protection" }
platform-wallet = { git = "https://github.com/dashpay/platform", branch = "feat/platform-wallet-secret-protection", features = [
"serde",
"shielded",
] }
platform-wallet-storage = { git = "https://github.com/dashpay/platform", branch = "fix/wallet-core-derived-rehydration" }
platform-wallet-storage = { git = "https://github.com/dashpay/platform", branch = "feat/platform-wallet-secret-protection" }
zip32 = "0.2.0"
grovestark = { git = "https://www.github.com/dashpay/grovestark", rev = "5b9e289cca54c79b1305d5f4f40bf1148f1eb0e3" }
rayon = "1.8"
Expand Down
2 changes: 2 additions & 0 deletions benches/wallet_hydration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,8 @@ fn seed_hd_wallets(
is_main: i == 0,
core_wallet_name: None,
xpub_encoded: xpub,
uses_password: false,
password_hint: None,
};
let seed_hash = wallet.seed_hash();
seed_view.set(&seed_hash, &envelope).expect("set envelope");
Expand Down
Loading
Loading