diff options
| author | Danilo M. <danix@danix.xyz> | 2026-11-02 18:57:26 +0100 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-11-02 18:57:26 +0100 |
| commit | 52b19a8c77af7adcb661865cebf8532e605b8d77 (patch) | |
| tree | 6879866b50e8a899288f02e3b4438797588d12aa /format/common/src/main | |
| parent | 9bb39cbc002485fb27fee2de189a257a7b4b02e5 (diff) | |
| download | HardenedPass-52b19a8c77af7adcb661865cebf8532e605b8d77.tar.gz HardenedPass-52b19a8c77af7adcb661865cebf8532e605b8d77.zip | |
feat(crypto): replace androidx security-crypto with Keystore AES-GCM
security-crypto is deprecated in 1.1.0 and the app was stuck on
1.1.0-alpha06, since the stable release fails the warnings-as-errors
build. It also pulled in Tink for what is a single AES-GCM operation.
KeystorePreferences is a SharedPreferences whose values are AES-GCM
sealed under an Android Keystore key (random IV, entry name as AAD so
values cannot be swapped between entries); a value that fails to
decrypt reads as absent. It backs the Git credentials (git_secrets),
the proxy credentials (proxy_secrets) and the PGP passphrase cache,
whose key needs the screen lock or a strong biometric within 60s and is
recreated if a new biometric enrollment invalidates it. Wrapped Ed25519
SSH keys are sealed the same way into the private key file. Password
generator settings are not secret and move to plain preferences.
Nothing is migrated: removeSecurityCryptoData deletes the old encrypted
preference files, Tink keysets, their Keystore master keys and a
security-crypto wrapped Ed25519 key once on upgrade. Only 0.1.x installs
from the last few hours have such data. Hardware SSH keys and imported
keys are untouched.
Tests: KeystorePreferencesTest (round trip, defaults, no plaintext,
random IVs, AAD binding, tamper rejection, remove/clear) with a software
AES key. Verified on the emulator by upgrading a 0.1.2 debug build that
held a wrapped Ed25519 key, Tink keysets and a cached passphrase: the old
data was deleted, a new Ed25519 key authenticated over SSH after a
fingerprint unlock, and a passphrase cached on first decrypt was reused
on the second with only the fingerprint.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'format/common/src/main')
0 files changed, 0 insertions, 0 deletions
