Three factors: password, ML-DSA-87 signature from your local key (private key stays in this browser), and TOTP. Your public key is uploaded for account verification; private keys never leave your device.
Password accepted. Sign the challenge locally with your ML-DSA-87 key.
Signature accepted. Enter your 6-digit TOTP code.
If your authenticator shows a new code every 30 seconds, enter the current 6 digits. Recovery codes may be accepted where enabled.
Load/unlock your local key on this device. Private keys are stored encrypted in IndexedDB and never uploaded.