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);
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        ///<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;
            }
        }