public bool DecryptWalletKey(string aPassword) { if (SecretData == null) { throw new Exception("Secret data is not set"); } if (string.IsNullOrEmpty(FSalt) || FInventory == null) { FInventory = GetInventoryFromFile(SecretData, out int lInventoryEnd); FSalt = GetSaltFromFile(SecretData, out FEncryptionEnd, lInventoryEnd); } string lPasswordHash = GetSecureHash(aPassword, FSalt); try { PandoraKeys lKeys = DecryptFile(lPasswordHash, SecretData, FEncryptionEnd); PasscodeEntropy = lKeys.AccountGuid; FExchangeKeys = lKeys.ExchangeCredentials; } catch (Exception ex) { Log.Write($"Error decrypting old secret file. Exception: {ex}"); return(false); } return(true); }
public void OverwriteWallet(string aNewPassword = null) { if (PasscodeEntropy == Guid.Empty) { throw new InvalidOperationException("To overwrite wallet first needs to be decrypted"); } if (!FPendingChanges && string.IsNullOrEmpty(aNewPassword)) { return; } string lTempFilePath = Path.Combine(FDataFolder.FullName, "_" + FInternalID + ".secret"); PandoraKeys lPandoraKeys = new PandoraKeys { AccountGuid = PasscodeEntropy, ExchangeCredentials = FExchangeKeys, Inventory = FInventory }; File.Copy(FEncryptedFilePath, lTempFilePath); File.Delete(FEncryptedFilePath); string lPasswordHash; string lSalt; if (!string.IsNullOrEmpty(aNewPassword)) { lPasswordHash = GetSecureHash(aNewPassword, out lSalt); } else { lPasswordHash = FPasswordHash; lSalt = FSalt; } try { EncryptIntoFile(FEncryptedFilePath, lPasswordHash, lSalt, lPandoraKeys); FPasswordHash = lPasswordHash; FSalt = lSalt; FPendingChanges = false; } catch { File.Copy(lTempFilePath, FEncryptedFilePath); throw; } finally { File.Delete(lTempFilePath); } }
public void CreateEncryptedWalletKeys(string aPassword, string aGuid = "") { if (IsPasswordSet) { throw new ClientExceptions.EncryptedKeysException("Encrypted key file already exists"); } Guid lGuid = ParseGUID(aGuid); FPasswordHash = GetSecureHash(aPassword, out string lSalt); PandoraKeys lKeys = new PandoraKeys { AccountGuid = lGuid, ExchangeCredentials = new PandoraKeys.ExchangeKeys[0], Inventory = new KeyInventoryItem[1] { KeyInventoryItem.GUIDSeed } }; EncryptIntoFile(FEncryptedFilePath, FPasswordHash, lSalt, lKeys); }
public bool TryToDecryptWalletKey(string aPassword) { if (string.IsNullOrEmpty(FSalt) || FInventory == null) { FInventory = GetInventoryFromFile(FEncryptedFilePath, out int lInventoryEnd); FSalt = GetSaltFromFile(FEncryptedFilePath, out FEncryptionEnd, lInventoryEnd); } string lPasswordHash = GetSecureHash(aPassword, FSalt); try { PandoraKeys lKeys = DecryptFile(lPasswordHash, FEncryptedFilePath, FEncryptionEnd); PasscodeEntropy = lKeys.AccountGuid; FExchangeKeys = lKeys.ExchangeCredentials; FPasswordHash = lPasswordHash; } catch { return(false); } return(true); }
///<summary> /// Encrypts a file using Rijndael algorithm. ///</summary> private void EncryptIntoFile(string aEncryptedFilePath, string aPassword, string aSalt, PandoraKeys aKeys) { try { using (MemoryStream lMemoryStream = new MemoryStream()) { Tuple <byte[], byte[]> lkeys = GetCryptoKeyAndIV(aPassword); byte[] lkey = lkeys.Item1; byte[] lIV = lkeys.Item2; BinaryFormatter lBinaryFormatter = new BinaryFormatter(); lBinaryFormatter.Serialize(lMemoryStream, aKeys); lMemoryStream.Seek(0, SeekOrigin.Begin); Aes RMCrypto = Aes.Create(); RMCrypto.Padding = PaddingMode.PKCS7; using (FileStream lFile = new FileStream(aEncryptedFilePath, FileMode.Create)) { var lData = lMemoryStream.ToArray(); lMemoryStream.SetLength(0); using (CryptoStream lCryptoStream = new CryptoStream(lMemoryStream, RMCrypto.CreateEncryptor(lkey, lIV), CryptoStreamMode.Write)) { lCryptoStream.Write(lData, 0, lData.Length); lCryptoStream.FlushFinalBlock(); lData = lMemoryStream.ToArray(); lFile.Write(lData, 0, lData.Length); } byte[] lSalt = FUE.GetBytes(aSalt); uint lSaltLenght = (uint)lSalt.Length; lSalt = lSalt.Concat(BitConverter.GetBytes(lSaltLenght)).ToArray(); lFile.Write(lSalt, 0, lSalt.Length); byte[] lInventory; if (aKeys.Inventory == null || !aKeys.Inventory.Any()) { lInventory = new byte[0]; } else { lInventory = aKeys.Inventory.SelectMany(x => BitConverter.GetBytes((int)x)).ToArray(); } uint lInventoryLenght = (uint)lInventory.Length; lInventory = lInventory.Concat(BitConverter.GetBytes(lInventoryLenght)).ToArray(); lFile.Write(lInventory, 0, lInventory.Length); lFile.Flush(); FlushFileBuffers(lFile.SafeFileHandle.DangerousGetHandle()); } } } catch { File.Delete(FEncryptedFilePath); throw; } }