Wallet Security
At-rest invariants:
- The wallet never stores the unsigned/plain Share 1 outside the secure enclave.
- A locked device (biometrics not yet authenticated) cannot decrypt any of the wallet stores; the only thing visible at process start is the metadata index (DID list + display labels).
- The recovery passphrase is never persisted to disk; it is held in volatile memory only during a backup or restore flow, then wiped via
runtime.zeroize(). - All DIDComm signing and decryption happen in a synchronous, non-yielding code path — no
awaitbetween key import and key zero — to minimise the window of plaintext exposure.
Important: Expo’s
SecureStorehas a 2 KB per-key value limit on iOS. The wallet stores credential bodies in encrypted files, not inSecureStore, and usesSecureStoreonly for keys, tokens, and small metadata. Do not bypass this.