You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Passkey alongside PIN — user picks either factor at unlock; PIN remains as fallback (safer rollout, but keeps the weaker factor alive).
Passkey replaces PIN — WebAuthn PRF extension derives/decrypts the keystore key directly (no password in the loop at all); requires a recovery path (e.g. ncryptsec backup) for lost devices.
Implementation notes
Research: WebAuthn PRF (prf extension) support in Chromium extension sidepanels — can we use the PRF output to derive the AES key that currently wraps the keystore?
If PRF is unavailable/awkward: store a random unlock secret in the keystore wrapper, gate its release behind navigator.credentials.get() with user verification
Manifest: add publickey-credentials permission; verify behavior in Firefox (may need a PIN fallback path there)
Enrollment flow: settings pane to register a passkey (with device/user verification required)
Unlock flow: passkey prompt in the sidebar before decrypting the keystore
Recovery: document that ncryptsec backup is the recovery path if the passkey/device is lost
Currently the encrypted keystore is unlocked with a PIN. Passkeys (WebAuthn) should be supported as an additional — or replacement — unlock factor.
Why
publickey-credentialsin the manifest permissions (Chromium supports this for extensions with MV3).Options to decide
Implementation notes
prfextension) support in Chromium extension sidepanels — can we use the PRF output to derive the AES key that currently wraps the keystore?navigator.credentials.get()with user verificationpublickey-credentialspermission; verify behavior in Firefox (may need a PIN fallback path there)Audit doc: docs/security-audit-2026-08-14.md