From 51735c3f6d5138a1d92baa685797f4dbedc6f7db Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Tue, 10 Apr 2018 21:44:37 +0200 Subject: [PATCH] implement saving with KeepassXC-Challenge (#4) --- src/keepass2android/ChallengeXCKey.cs | 12 +++++-- src/keepass2android/GroupBaseActivity.cs | 2 +- src/keepass2android/GroupEditActivity.cs | 4 ++- src/keepass2android/LockingActivity.cs | 36 +++++++++++++++++++- src/keepass2android/PasswordActivity.cs | 42 ++++++------------------ 5 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/keepass2android/ChallengeXCKey.cs b/src/keepass2android/ChallengeXCKey.cs index 8c224d01..ab3dfb34 100644 --- a/src/keepass2android/ChallengeXCKey.cs +++ b/src/keepass2android/ChallengeXCKey.cs @@ -6,7 +6,7 @@ using Exception = System.Exception; namespace keepass2android { - class ChallengeXCKey : IUserKey, ISeedBasedUserKey + public class ChallengeXCKey : IUserKey, ISeedBasedUserKey { private readonly int _requestCode; @@ -51,9 +51,15 @@ namespace keepass2android Thread.Sleep(50); } if (Error != null) - throw new Exception("YubiChallenge failed: " + Error); + { + var error = Error; + Error = null; + throw new Exception("YubiChallenge failed: " + error); + } - return new ProtectedBinary(true, CryptoUtil.HashSha256(Response)); + var result = CryptoUtil.HashSha256(Response); + Response = null; + return new ProtectedBinary(true, result); } } diff --git a/src/keepass2android/GroupBaseActivity.cs b/src/keepass2android/GroupBaseActivity.cs index 28afe030..3036063e 100644 --- a/src/keepass2android/GroupBaseActivity.cs +++ b/src/keepass2android/GroupBaseActivity.cs @@ -167,7 +167,7 @@ namespace keepass2android } - if (resultCode == Result.Ok) + if ((GroupEditActivity.RequestCodeGroupEdit == requestCode) && (resultCode == Result.Ok)) { String groupName = data.Extras.GetString(GroupEditActivity.KeyName); int groupIconId = data.Extras.GetInt(GroupEditActivity.KeyIconId); diff --git a/src/keepass2android/GroupEditActivity.cs b/src/keepass2android/GroupEditActivity.cs index 203e0971..3da41d72 100644 --- a/src/keepass2android/GroupEditActivity.cs +++ b/src/keepass2android/GroupEditActivity.cs @@ -52,6 +52,8 @@ namespace keepass2android } + public const int RequestCodeGroupEdit = 9713; + public static void Launch(Activity act, PwGroup parentGroup) { @@ -60,7 +62,7 @@ namespace keepass2android PwGroup parent = parentGroup; i.PutExtra(KeyParent, parent.Uuid.ToHexString()); - act.StartActivityForResult(i, 0); + act.StartActivityForResult(i, RequestCodeGroupEdit); } public static void Launch(Activity act, PwGroup parentGroup, PwGroup groupToEdit) diff --git a/src/keepass2android/LockingActivity.cs b/src/keepass2android/LockingActivity.cs index d5feb517..d883120e 100644 --- a/src/keepass2android/LockingActivity.cs +++ b/src/keepass2android/LockingActivity.cs @@ -49,6 +49,8 @@ namespace keepass2android if (xcKey != null) { xcKey.Activity = this; + _currentlyWaitingKey = xcKey; + } } @@ -64,7 +66,8 @@ namespace keepass2android if (xcKey != null) { //don't store a pointer to this activity in the static database object to avoid memory leak - xcKey.Activity = null; + if (xcKey.Activity == this) //don't reset if another activity has come to foreground already + xcKey.Activity = null; } } @@ -88,6 +91,37 @@ namespace keepass2android TimeoutHelper.Resume(this); } + public const int RequestCodeChallengeYubikey = 793; + + protected ChallengeXCKey _currentlyWaitingKey; + + + protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) + { + base.OnActivityResult(requestCode, resultCode, data); + if ((requestCode == RequestCodeChallengeYubikey) && (_currentlyWaitingKey != null)) + { + if (resultCode == Result.Ok) + { + byte[] challengeResponse = data.GetByteArrayExtra("response"); + if ((challengeResponse != null) && (challengeResponse.Length > 0)) + { + _currentlyWaitingKey.Response = challengeResponse; + } + else + _currentlyWaitingKey.Error = "Did not receive a valid response."; + + + } + else + { + _currentlyWaitingKey.Error = "Cancelled Yubichallenge."; + } + + } + + } + public Intent TryGetYubichallengeIntentOrPrompt(byte[] challenge, bool promptToInstall) { diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs index 5fb93842..e2f70d3d 100644 --- a/src/keepass2android/PasswordActivity.cs +++ b/src/keepass2android/PasswordActivity.cs @@ -110,7 +110,7 @@ namespace keepass2android private const int RequestCodePrepareDbFile = 1000; private const int RequestCodePrepareOtpAuxFile = 1001; - private const int RequestCodeChallengeYubikey = 1002; + private const int RequestCodeSelectKeyfile = 1003; private const int RequestCodePrepareKeyFile = 1004; private const int RequestCodeSelectAuxFile = 1005; @@ -119,8 +119,6 @@ namespace keepass2android private Task _loadDbFileTask; private bool _loadDbTaskOffline; //indicate if preloading was started with offline mode - private ChallengeXCKey _currentlyWaitingKey; - private IOConnectionInfo _ioConnection; private String _keyFileOrProvider; bool _showPassword; @@ -371,39 +369,24 @@ namespace keepass2android } if (requestCode == RequestCodeChallengeYubikey) { - if (resultCode == Result.Ok) + if (_currentlyWaitingKey != null) { + //ActivityResult was handled in base class already + return; + } + if (resultCode == Result.Ok) + { try { byte[] challengeResponse = data.GetByteArrayExtra("response"); - if (_currentlyWaitingKey != null) - { - if ((challengeResponse != null) && (challengeResponse.Length > 0)) - { - _currentlyWaitingKey.Response = challengeResponse; - } - else - _currentlyWaitingKey.Error = "Did not receive a valid response."; - - return; - - } - else - { - _challengeProv = new KeeChallengeProv(); - _challengeSecret = _challengeProv.GetSecret(_chalInfo, challengeResponse); - Array.Clear(challengeResponse, 0, challengeResponse.Length); - } - + _challengeProv = new KeeChallengeProv(); + _challengeSecret = _challengeProv.GetSecret(_chalInfo, challengeResponse); + Array.Clear(challengeResponse, 0, challengeResponse.Length); } catch (Exception e) { - if (_currentlyWaitingKey != null) - { - _currentlyWaitingKey.Error = e.Message; - } Kp2aLog.Log(e.ToString()); Toast.MakeText(this, "Error: " + e.Message, ToastLength.Long).Show(); return; @@ -449,11 +432,6 @@ namespace keepass2android } } } - else - { - if (_currentlyWaitingKey != null) - _currentlyWaitingKey.Error = "Cancelled Yubichallenge."; - } } private AuxFileLoader GetAuxFileLoader()