3 Commits

Author SHA1 Message Date
f371f3da49 main: Attempted to add seed phrase decryption 2023-06-16 15:36:58 +10:00
a024ce7afc readme: Added installation dependencies
- Added instructions for installing .net desktop
- Added instructions for installing Node, NPM, and git
2023-06-16 11:20:48 +10:00
88ee50f4a6 main: Dependencies install links 2023-06-15 22:56:35 +10:00
2 changed files with 97 additions and 4 deletions

View File

@@ -14,6 +14,7 @@ using DnsClient;
using DnsClient.Protocol; using DnsClient.Protocol;
using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.X509Certificates;
using System.Net.Security; using System.Net.Security;
using System.Numerics;
namespace FireWallet namespace FireWallet
{ {
@@ -686,6 +687,7 @@ namespace FireWallet
toolStripStatusLabelLedger.Text = "Cold Wallet"; toolStripStatusLabelLedger.Text = "Cold Wallet";
toolStripStatusLabelLedger.Visible = true; toolStripStatusLabelLedger.Visible = true;
buttonRevealAll.Visible = false; buttonRevealAll.Visible = false;
buttonSeed.Enabled = false;
} }
else else
@@ -693,6 +695,7 @@ namespace FireWallet
watchOnly = false; watchOnly = false;
toolStripStatusLabelLedger.Visible = false; toolStripStatusLabelLedger.Visible = false;
buttonRevealAll.Visible = true; buttonRevealAll.Visible = true;
buttonSeed.Enabled = true;
} }
@@ -864,7 +867,6 @@ namespace FireWallet
{ {
AddLog("Post Error: " + ex.Message); AddLog("Post Error: " + ex.Message);
AddLog(await resp.Content.ReadAsStringAsync()); AddLog(await resp.Content.ReadAsStringAsync());
AddLog("Content: " + content);
return "Error"; return "Error";
} }
@@ -1650,7 +1652,7 @@ namespace FireWallet
if (!outputInstalled.Contains("git version")) if (!outputInstalled.Contains("git version"))
{ {
AddLog("Git is not installed"); AddLog("Git is not installed");
NotifyForm notifyForm = new NotifyForm("Git is not installed\nPlease install it to install HSD dependencies"); NotifyForm notifyForm = new NotifyForm("Git is not installed\nPlease install it to install HSD dependencies","Install", "https://git-scm.com/download/win");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
this.Close(); this.Close();
@@ -1672,7 +1674,7 @@ namespace FireWallet
if (!outputInstalled.Contains("v")) if (!outputInstalled.Contains("v"))
{ {
AddLog("Node is not installed"); AddLog("Node is not installed");
NotifyForm notifyForm = new NotifyForm("Node is not installed\nPlease install it to install HSD dependencies"); NotifyForm notifyForm = new NotifyForm("Node is not installed\nPlease install it to install HSD dependencies","Install", "https://nodejs.org/en/download");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
this.Close(); this.Close();
@@ -1698,7 +1700,7 @@ namespace FireWallet
{ {
AddLog("NPM is not installed"); AddLog("NPM is not installed");
AddLog(outputInstalled); AddLog(outputInstalled);
NotifyForm notifyForm = new NotifyForm("NPM is not installed\nPlease install it to install HSD dependencies"); NotifyForm notifyForm = new NotifyForm("NPM is not installed\nPlease install it to install HSD dependencies","Install", "https://docs.npmjs.com/downloading-and-installing-node-js-and-npm");
notifyForm.ShowDialog(); notifyForm.ShowDialog();
notifyForm.Dispose(); notifyForm.Dispose();
this.Close(); this.Close();
@@ -2175,6 +2177,8 @@ namespace FireWallet
try try
{ {
AddLog("Decrypting seed...");
AddLog(resp.ToString());
string iv = resp["iv"].ToString(); string iv = resp["iv"].ToString();
string ciphertext = resp["ciphertext"].ToString(); string ciphertext = resp["ciphertext"].ToString();
string tmpn = resp["n"].ToString(); string tmpn = resp["n"].ToString();
@@ -2183,9 +2187,26 @@ namespace FireWallet
int n = int.Parse(tmpn); int n = int.Parse(tmpn);
int p = int.Parse(tmpp); int p = int.Parse(tmpp);
int r = int.Parse(tmpr);
int iterations = n; int iterations = n;
byte[] decripted = await Decrypt_Seed(algorithm, ciphertext, iv, n,r,p);
// This is returning garbled text
AddLog("Seed decrypted");
string phrase = Encoding.UTF8.GetString(decripted);
AddLog("Your seed phrase is:\n" + phrase);
phrase = Encoding.ASCII.GetString(decripted);
AddLog("Your seed phrase is:\n" + phrase);
phrase = Encoding.Unicode.GetString(decripted);
AddLog("Your seed phrase is:\n" + phrase);
} }
catch (Exception ex) catch (Exception ex)
@@ -2200,7 +2221,71 @@ namespace FireWallet
} }
} }
private async Task<byte[]> Decrypt_Seed(string algorithm, string ciphertext, string iv, int n,int r, int p)
{
byte[] salt = Encoding.ASCII.GetBytes("hsd");
using (AesManaged aes = new AesManaged())
{
aes.Key = DeriveKey(algorithm, password, salt, n, r, p);
aes.IV = HexStringToByteArray(iv);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.None;
byte[] cipher = HexStringToByteArray(ciphertext);
if (cipher.Length % 16 != 0)
{
AddLog("Invalid cipher length");
return null;
}
using (ICryptoTransform decryptor = aes.CreateDecryptor())
{
byte[] decrypted = decryptor.TransformFinalBlock(cipher, 0, cipher.Length);
return decrypted;
}
}
}
static byte[] HexStringToByteArray(string hex)
{
int numberChars = hex.Length / 2;
byte[] bytes = new byte[numberChars];
for (int i = 0; i < numberChars; i++)
{
bytes[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
}
return bytes;
}
byte[] DeriveKey(string algorithm, string passphrase, byte[] salt, int n, int r, int p)
{
byte[] passwordBytes = Encoding.UTF8.GetBytes(passphrase);
switch (algorithm)
{
case "pbkdf2":
return Pbkdf2DeriveKey(passwordBytes, salt, n, 32);
case "scrypt":
return ScryptDeriveKey(passwordBytes, salt, n, r, p, 32);
default:
throw new Exception($"Unknown algorithm: {algorithm}.");
}
}
static byte[] Pbkdf2DeriveKey(byte[] password, byte[] salt, int iterations, int derivedKeyLength)
{
using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, iterations))
{
return pbkdf2.GetBytes(derivedKeyLength);
}
}
static byte[] ScryptDeriveKey(byte[] password, byte[] salt, int costParameterN, int costParameterR, int costParameterP, int derivedKeyLength)
{
using (var rfc2898 = new Rfc2898DeriveBytes(password, salt, costParameterN, HashAlgorithmName.SHA256))
{
return rfc2898.GetBytes(derivedKeyLength);
}
}
private async void Rescan_Click(object sender, EventArgs e) private async void Rescan_Click(object sender, EventArgs e)
{ {
string content = "{\"height\": 0}"; string content = "{\"height\": 0}";

View File

@@ -2,6 +2,14 @@
Experimental wallet for Handshake chain Experimental wallet for Handshake chain
## Installation ## Installation
### Dependencies
You will need .net desktop installed. You can download it from [here](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-6.0.18-windows-x64-installer).
You will also need Node, NPM, and git installed if you want to use the internal HSD or Ledger wallets.
[Git](https://git-scm.com/downloads)
[Node](https://nodejs.org/en/download/)
[NPM](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
### From Releases ### From Releases
You can install the latest release from [here](https://github.com/Nathanwoodburn/FireWallet/releases/). You can install the latest release from [here](https://github.com/Nathanwoodburn/FireWallet/releases/).