keepass2android/src/MasterKeePlugin/ActionReceiver.cs

80 lines
2.4 KiB
C#

using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Java.Util;
using KeePassLib.Utility;
using Keepass2android.Pluginsdk;
namespace MasterKeePlugin
{
[BroadcastReceiver(Exported = true)]
[IntentFilter(new[] {Strings.ActionOpenEntry, Strings.ActionEntryActionSelected })]
public class ActionReceiver: PluginActionBroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Android.Util.Log.Debug("KP2A_MasterKee", intent.Action);
base.OnReceive(context, intent);
}
private static byte[] HashHMAC(byte[] key, byte[] message)
{
var hash = new HMACSHA256(key);
return hash.ComputeHash(message);
}
protected override void OpenEntry(OpenEntryAction oe)
{
string masterkey;
Android.Util.Log.Debug("KP2A_MasterKee", "Opening entry...");
if (oe.EntryFields.TryGetValue("MK_MasterKey", out masterkey))
{
Android.Util.Log.Debug("KP2A_MasterKee", "Entry is MK entry.");
string type;
if (!oe.EntryFields.TryGetValue("MK_Type", out type))
type = "Long Password";
int counter = 1;
string strCounter;
if (oe.EntryFields.TryGetValue("MK_Site_Counter", out strCounter))
{
int.TryParse(strCounter, out counter);
}
Android.Util.Log.Debug("KP2A_MasterKee", "Calculating password...");
string calculatedKey = MasterPassword.MpAlgorithm.GenerateContent(type,
oe.EntryFields[KeepassDefs.TitleField],
MemUtil.HexStringToByteArray(masterkey),
counter,
HashHMAC
);
Android.Util.Log.Debug("KP2A_MasterKee", "ok. Returning data.");
try
{
oe.SetEntryField(KeepassDefs.PasswordField, calculatedKey, true);
oe.SetEntryField("MK_MasterKey", "", true);
oe.SetEntryField("MK_Type", "", true);
oe.SetEntryField("MK_Site_Counter", "", true);
}
catch (Exception e)
{
Android.Util.Log.Debug("KP2A_MasterKee", e.ToString());
}
}
Android.Util.Log.Debug("KP2A_MasterKee", "Done.");
}
protected override void ActionSelected(ActionSelectedAction asa)
{
}
}
}