Body:
Context
Android production currently stores the wallet mnemonic in plaintext:
Proposed design
- Encrypt
seed_phrase with AES-256-GCM.
- Store the encryption key in Android Keystore, without interactive user authentication.
- Use StrongBox when available, with a TEE/software fallback.
- Introduce one seed-storage abstraction used by
NodeService, StabilityProcessingService, and AppState.
- Migrate in stages:
- Shadow-write
seed_encrypted; keep plaintext authoritative.
- Read encrypted storage first, with plaintext fallback.
- After validation, verify decrypt success and delete
seed_phrase.
- Preserve
keys_seed migration support.
- Delete
seed_encrypted and the Keystore key during wallet reset.
Required invariants
- Never delete plaintext before a successful encrypted write and verified decrypt.
- Never generate a replacement key when encrypted data already exists.
- Decryption failure must not silently start a different wallet.
- Background services must decrypt without user interaction.
- Do not log seed material or include it in telemetry.
@toneloc Please review the Android storage design, migration behavior, failure handling, and phased rollout before implementation begins.
Body:
Context
Android production currently stores the wallet mnemonic in plaintext:
seed_phraseis read and written byNodeService.StabilityProcessingServicereads the seed during unattended background processing.AppStatechecksseed_phraseand legacykeys_seed.KeystoreEncryptionService, but it was closed and is not wired into production.Proposed design
seed_phrasewith AES-256-GCM.NodeService,StabilityProcessingService, andAppState.seed_encrypted; keep plaintext authoritative.seed_phrase.keys_seedmigration support.seed_encryptedand the Keystore key during wallet reset.Required invariants
@toneloc Please review the Android storage design, migration behavior, failure handling, and phased rollout before implementation begins.