Project

General

Profile

Actions

Feature #3887

open

Add encrypted Android software passkeys and preserve legacy credentials

Added by Joshua Zhao 6 days ago. Updated 6 days ago.

Status:
New
Priority:
Normal
Assignee:
-
Start date:
09/08/2026
Due date:
% Done:

0%

Estimated time:

Description

Problem and resulting behavior

New Android passkeys need encrypted local software key storage while existing Android Keystore credentials and still-available legacy software keys retain their original credential identity. The earlier retirement policy in #3880 does not cover this behavior.

Scope

  • Generate software P-256 keys for new passkeys. Encrypt each private key with a fresh AES-GCM record key, wrapped by an authentication-bound Android Keystore RSA key, in noBackupFilesDir.
  • Require the successful BiometricPrompt CryptoObject to decrypt and sign. Preserve the existing Keystore signing path.
  • Validate and encrypt legacy software keys before removing plaintext metadata. Preserve IDs, keys, account metadata, and counters; make interrupted migration retryable.
  • Keep registration-time backup eligibility consistent in assertions. New software credentials are eligible for future backup but never claim an existing backup; backup, sync, export, and recovery remain deferred.
  • Move storage and cryptographic work off the UI thread, serialize credential metadata updates, and show storage failures and unavailable credentials in Passkey Manager.
  • Include regression tests and storage documentation.

Validation

Passed :app:testDebugUnitTest and :app:compileDebugAndroidTestKotlin with Android Studio's bundled JDK and Gradle offline mode. git diff --check passed. Instrumentation tests were compiled, not executed on a device.

Physical-device upgrade, biometric/device-credential authentication, cancellation, key invalidation, and backup/transfer acceptance checks remain pending as documented in docs/android-security-storage.md.

Related prior work: #3879, #3880, #3883, #3884.

Repository workflow instructions and independent-commit rules are tracked separately under the non-functional collector #3832.

Actions

Also available in: Atom PDF