From db74e573d13a69601219f9e5b8b752bebc4669f6 Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Sat, 2 Dec 2017 16:41:57 +0100 Subject: [PATCH] catch exception when decrypting key fails, fixes #50 --- src/keepass2android/PasswordActivity.cs | 33 ++++++++++++++++++------- src/keepass2android/QuickUnlock.cs | 15 +++++++---- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs index b48a03d2..04a38b97 100644 --- a/src/keepass2android/PasswordActivity.cs +++ b/src/keepass2android/PasswordActivity.cs @@ -1054,10 +1054,19 @@ namespace keepass2android var btn = FindViewById(Resource.Id.fingerprintbtn); btn.SetImageResource(Resource.Drawable.ic_fingerprint_success); - - var masterPassword = _fingerprintDec.DecryptStored(Database.GetFingerprintPrefKey(_ioConnection)); - _password = FindViewById(Resource.Id.password_edit).Text = masterPassword; + try + { + var masterPassword = _fingerprintDec.DecryptStored(Database.GetFingerprintPrefKey(_ioConnection)); + _password = FindViewById(Resource.Id.password_edit).Text = masterPassword; + + } + catch (Java.Security.GeneralSecurityException ex) + { + HandleFingerprintKeyInvalidated(); + return; + } + btn.PostDelayed(() => { //re-init fingerprint unlock in case something goes wrong with opening the database @@ -1961,12 +1970,7 @@ namespace keepass2android } else { - //key invalidated permanently - btn.SetImageResource(Resource.Drawable.ic_fingerprint_error); - btn.Tag = GetString(Resource.String.fingerprint_unlock_failed); - _fingerprintDec = null; - - ClearFingerprintUnlockData(); + HandleFingerprintKeyInvalidated(); return false; } } @@ -1982,6 +1986,17 @@ namespace keepass2android } + private void HandleFingerprintKeyInvalidated() + { + var btn = FindViewById(Resource.Id.fingerprintbtn); +//key invalidated permanently + btn.SetImageResource(Resource.Drawable.ic_fingerprint_error); + btn.Tag = GetString(Resource.String.fingerprint_unlock_failed); + _fingerprintDec = null; + + ClearFingerprintUnlockData(); + } + private void InitializeOptionCheckboxes() { CheckBox cbQuickUnlock = (CheckBox)FindViewById(Resource.Id.enable_quickunlock); cbQuickUnlock.Checked = _prefs.GetBoolean(GetString(Resource.String.QuickUnlockDefaultEnabled_key), true); diff --git a/src/keepass2android/QuickUnlock.cs b/src/keepass2android/QuickUnlock.cs index 8ba3d556..b2ce30ea 100644 --- a/src/keepass2android/QuickUnlock.cs +++ b/src/keepass2android/QuickUnlock.cs @@ -285,11 +285,7 @@ namespace keepass2android else { Kp2aLog.Log("failed to initialize fingerprint."); - //key invalidated permanently - btn.SetImageResource(Resource.Drawable.ic_fingerprint_error); - btn.Tag = GetString(Resource.String.fingerprint_unlock_failed); - _fingerprintIdentifier = null; - + HandleFingerprintKeyInvalidated(); } } catch (Exception e) @@ -304,6 +300,15 @@ namespace keepass2android } + private void HandleFingerprintKeyInvalidated() + { + var btn = FindViewById(Resource.Id.fingerprintbtn); +//key invalidated permanently + btn.SetImageResource(Resource.Drawable.ic_fingerprint_error); + btn.Tag = GetString(Resource.String.fingerprint_unlock_failed); + _fingerprintIdentifier = null; + } + private void ClearFingerprintUnlockData() { ISharedPreferencesEditor edit = PreferenceManager.GetDefaultSharedPreferences(this).Edit();