Summary#
- Relay:
POST /v1/didsnow generates a fresh per-user 32-byte recovery secret, splits it into 3 Shamir shares viacrypto::split_secret(), stores Share 2 inaccounts.recovery_share(V010 migration), and returns Share 1 + Share 3 (base32-encoded) in the response - Identity wallet Rust:
perform_did_ceremonyextracts Share 1 → iCloud Keychain ("recovery-share-1"), returns{ did, share3 }to the frontend - Identity wallet frontend: New
ShamirBackupScreenreplaces the placeholder — shows iCloud save confirmation, displays Share 3 with copy button + QR code + backup tips, requires confirmation checkbox before proceeding; onboarding state machine gainscompletestep
Test plan#
- Build compiles cleanly:
cargo build --package relay --package identity-wallet - Clippy clean:
cargo clippy --package relay --package identity-wallet -- -D warnings - Unit tests pass:
cargo test --lib --package identity-wallet— newdid_ceremony_result_serializes_share3_in_camel_casepasses - Run app in iOS Simulator: complete onboarding through DID ceremony and verify Shamir backup screen renders with share, copy button, QR code, and confirmation checkbox
- Verify Share 1 written to Keychain as
"recovery-share-1"after DID ceremony - Verify Share 2 stored in
accounts.recovery_sharein relay DB (base32, 52 chars) - Verify "I've Saved My Backup" button is disabled until checkbox is checked
- Verify app advances to
completestep after confirmation