public void Folder_EncryptDecrypt(bool testCompression, FAES.Packaging.CompressionMode compressionMode, FAES.Packaging.CompressionLevel compressionLevel)
        {
            string encFolder            = "TestFolder";
            string encFilePath          = "TestFile.txt";
            string encPath              = Path.Combine(encFolder, encFilePath);
            string originalFileContents = "Hello World!\r\nTest";
            string finalFileContents    = string.Empty;
            string password             = "******";
            string hint = "Example Hint";

            try
            {
                FileAES_Utilities.SetVerboseLogging(true);

                Directory.CreateDirectory(encFolder);
                File.WriteAllText(encPath, originalFileContents);

                FAES_File encFile = new FAES_File(encPath);

                FileAES_Encrypt encrypt = new FileAES_Encrypt(encFile, password, hint);

                if (testCompression)
                {
                    encrypt.SetCompressionMode(compressionMode, compressionLevel);
                }

                bool encryptSuccess = encrypt.encryptFile();

                if (!encryptSuccess)
                {
                    throw new Exception("Encryption Failed! 'encryptFile' was false.");
                }

                string    decFilePath = Path.ChangeExtension(encPath, FileAES_Utilities.ExtentionFAES);
                FAES_File decFile     = new FAES_File(decFilePath);

                FileAES_Decrypt decrypt        = new FileAES_Decrypt(decFile, password);
                bool            decryptSuccess = decrypt.decryptFile();

                if (!decryptSuccess)
                {
                    throw new Exception("Decryption Failed! 'decryptFile' was false.");
                }

                finalFileContents = File.ReadAllText(encPath).TrimEnd('\n', '\r', ' ');

                if (finalFileContents != originalFileContents)
                {
                    throw new Exception("Final file contents does not match original!");
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.ToString());
            }
            finally
            {
                if (Directory.Exists(encFolder))
                {
                    Directory.Delete(encFolder, true);
                }

                Console.WriteLine("\r\n=== Test Values ===\r\n");
                Console.WriteLine("encFolder: {0}", encFolder);
                Console.WriteLine("encFilePath: {0}", encFilePath);
                Console.WriteLine("encPath: {0}", encPath);
                Console.WriteLine("Initial Contents: {0}", originalFileContents.Replace("\r\n", "\\r\\n"));
                Console.WriteLine("Final Contents: {0}", finalFileContents.Replace("\r\n", "\\r\\n"));
            }
        }
Beispiel #2
0
        static void Main(string[] args)
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

            for (int i = 0; i < args.Length; i++)
            {
                string strippedArg = args[i].ToLower();

                if (Directory.Exists(args[i]))
                {
                    _directory = args[i];
                }
                else if (File.Exists(args[i]))
                {
                    _directory = args[i];
                }

                strippedArg = strippedArg.TrimStart('-', '/', '\\');

                if (strippedArg == "verbose" || strippedArg == "v")
                {
                    _verbose = true;
                    FileAES_Utilities.SetVerboseLogging(_verbose);
                }
                else if (String.IsNullOrEmpty(_password) && (strippedArg == "password" || strippedArg == "p") && !string.IsNullOrEmpty(args[i + 1]))
                {
                    _password = args[i + 1];
                }
                else if (strippedArg == "purgetemp" || strippedArg == "deletetemp")
                {
                    _purgeTemp = true;
                }
                else if (strippedArg == "help")
                {
                    _help = true;
                }
                else if (String.IsNullOrEmpty(_passwordHint) && (strippedArg == "hint" || strippedArg == "passwordhint" || strippedArg == "h") && !string.IsNullOrEmpty(args[i + 1]))
                {
                    _passwordHint = args[i + 1];
                }
                else if (strippedArg == "gethint" || strippedArg == "getpasswordhint")
                {
                    _getHint = true;
                }
                else if (strippedArg == "gettimestamp" || strippedArg == "timestamp" || strippedArg == "encryptiondate")
                {
                    _getEncryptTimestamp = true;
                }
                else if (strippedArg == "getcompression" || strippedArg == "getcompressionmethod")
                {
                    _getEncryptCompression = true;
                }
                else if (strippedArg == "showprogress" || strippedArg == "progress" || strippedArg == "prog")
                {
                    if (!string.IsNullOrEmpty(args[i + 1]) && UInt16.TryParse(args[i + 1], out _progressSleep))
                    {
                    }
                    _showProgress = true;
                }
                else if (strippedArg == "faesversion" || strippedArg == "faes" || strippedArg == "faesver")
                {
                    _getFaesVersion = true;
                }
                else if (strippedArg == "faescliversion" || strippedArg == "faescliver" || strippedArg == "faescli" || strippedArg == "cliver" || strippedArg == "ver" || strippedArg == "version")
                {
                    _getVersion     = true;
                    _getFaesVersion = true;
                }
                else if (String.IsNullOrEmpty(_compressionMethod) && (strippedArg == "compression" || strippedArg == "compressionmethod" || strippedArg == "c") && !string.IsNullOrEmpty(args[i + 1]))
                {
                    _compressionMethod = args[i + 1].ToUpper();
                }
                else if ((strippedArg == "level" || strippedArg == "compressionlevel" || strippedArg == "l") && !string.IsNullOrEmpty(args[i + 1]))
                {
                    Int32.TryParse(args[i + 1], out _compressionLevel);
                }
                else if (strippedArg == "buffer" || strippedArg == "cryptostreambuffer" || strippedArg == "csbuffer" && !string.IsNullOrEmpty(args[i + 1]))
                {
                    UInt32.TryParse(args[i + 1], out _csBuffer);
                }
                else if (strippedArg == "overwrite" || strippedArg == "overwriteduplicates" || strippedArg == "o")
                {
                    _overwriteDuplicates = true;
                }
                else if (strippedArg == "preserveoriginal" || strippedArg == "original" || strippedArg == "po")
                {
                    _deleteOriginalFile = false;
                }
                else if (strippedArg == "showallmetadata" || strippedArg == "showmetadata" || strippedArg == "metadata")
                {
                    _showAllMetadata = true;
                }
                else if (strippedArg == "showallutf8metadata" || strippedArg == "showutf8metadata" || strippedArg == "utf8metadata")
                {
                    _showAllMetadataString = true;
                }
                else if (strippedArg == "" || strippedArg == "showutf8metadata" || strippedArg == "utf8metadata")
                {
                    _showAllMetadataString = true;
                }
                else if (strippedArg == "tempencrypt" || strippedArg == "temp")
                {
                    _useLocalEncrypt = false;
                }
                else if (strippedArg == "localencrypt" || strippedArg == "local")
                {
                    _useLocalEncrypt = true;
                }
                else if (strippedArg == "showlatest" || strippedArg == "getlatest" || strippedArg == "getlatestversion" || strippedArg == "latestversion" || strippedArg == "latest")
                {
                    _showLatestVer = true;

                    if (args.Length > (i + 1) && !string.IsNullOrEmpty(args[i + 1]))
                    {
                        string arg = args[i + 1];

                        if (arg.ToLower() == "dev" || arg.ToLower() == "developer" || arg.ToLower() == "d")
                        {
                            _showLatestBranch = "dev";
                        }
                        else if (arg.ToLower() == "beta" || arg.ToLower() == "b")
                        {
                            _showLatestBranch = "beta";
                        }
                        else if (arg.ToLower() == "stable" || arg.ToLower() == "s" || arg.ToLower() == "release" || arg.ToLower() == "r")
                        {
                            _showLatestBranch = "stable";
                        }
                    }
                }
                else if (strippedArg == "noupdatecheck" || strippedArg == "nocheck" || strippedArg == "offline" || strippedArg == "noupdate")
                {
                    _checkForUpdate = false;
                }
                else if (strippedArg == "update" || strippedArg == "u")
                {
                    string branch  = "";
                    string version = "";

                    if (args.Length > (i + 1) && !string.IsNullOrEmpty(args[i + 1]))
                    {
                        string arg = args[i + 1];

                        {
BranchFinder:
                            if (arg.ToLower() == "dev" || arg.ToLower() == "developer" || arg.ToLower() == "d")
                            {
                                branch = "dev";
                            }
                            else if (arg.ToLower() == "beta" || arg.ToLower() == "b")
                            {
                                branch = "beta";
                            }
                            else if (arg.ToLower() == "stable" || arg.ToLower() == "s" || arg.ToLower() == "release" || arg.ToLower() == "r")
                            {
                                branch = "stable";
                            }
                            else if (args.Length > (i + 2) && !string.IsNullOrEmpty(args[i + 2]) && String.IsNullOrWhiteSpace(version))
                            {
                                version = args[i + 1];
                                arg     = args[i + 2];
                                goto BranchFinder;
                            }
                        }

                        if (string.IsNullOrEmpty(branch) && string.IsNullOrEmpty(version) && args.Length > (i + 1) && !string.IsNullOrEmpty(args[i + 1]))
                        {
                            version = args[i + 1];
                        }
                    }

                    if (args.Length > (i + 1) && string.IsNullOrEmpty(args[i + 1]) && args[i + 1].ToLower() == "force")
                    {
                        _forceUpdate = true;
                    }
                    else if (args.Length > (i + 2) && string.IsNullOrEmpty(args[i + 2]) && args[i + 2].ToLower() == "force")
                    {
                        _forceUpdate = true;
                    }
                    else if (args.Length > (i + 3) && string.IsNullOrEmpty(args[i + 3]) && args[i + 3].ToLower() == "force")
                    {
                        _forceUpdate = true;
                    }

                    if (!String.IsNullOrWhiteSpace(branch))
                    {
                        _updateBranch = branch;
                    }
                    if (!String.IsNullOrWhiteSpace(version))
                    {
                        _updateToVer = version;
                    }

                    _doUpdate = true;
                }

                _strippedArgs.Add(strippedArg);
            }

            if (_checkForUpdate)
            {
                if (_updateBranch == "unknown")
                {
                    if (IsDevBuild())
                    {
                        _updateBranch = "dev";
                    }
                    else if (IsBetaBuild())
                    {
                        _updateBranch = "beta";
                    }
                    else
                    {
                        _updateBranch = "stable";
                    }
                }

                _update = new Update("dev");
            }

            if (_showLatestBranch == "unknown")
            {
                _showLatestBranch = _updateBranch;
            }

            if (_help)
            {
                Logging.Log("A FAES-based tool for encrypting and decrypting files using the command-line.\n\nPossible Launch Parameters:\n'--verbose' or '-v': Show more debugging information in the console (WIP)." +
                            "\n'--purgeTemp' or '-p': Purge the FileAES Temp folder to resolve possible errors.\n'--password <password>' or '-p <password>': Sets the password that will be used to encrypt/decrypt the file/folder." +
                            "\n'--hint <Password Hint>' or '-h <Password Hint>': Sets a password hint.\n'--compression <ZIP/TAR/LZMA/LEGACYZIP>' or '-c <ZIP/TAR/LZMA/LEGACYZIP>': Sets the compression method that will be used to encrypt the file/folder." +
                            "\n'--level <0-9>' or '-l <0-9>': Sets the compression level that will be used to encrypt the file/folder. (Only works for with the ZIP compression method)" +
                            ".\n'--getHint': Gets the password hint for the encrypted file.\n'--getTimestamp': Gets the encryption timestamp of the encrypted file." +
                            "\n'--getCompression': Gets the compression method of the encrypted file.\n'--ver': Gets the current version of FileAES-CLI and FAES being used." +
                            "\n'--FAES': Gets the current version of FAES being used.\n'--overwrite' or '-o': Overwrites any duplicate files found within the FAES process." +
                            "\n'--original' or '-po': Preserves the original file used in the encrypt/decrypt process." +
                            "\n'--progress [<Polling Rate (ms)>]': Outputs the current encryption/decryption progress to the console after desired time (Leaving polling rate blank defaults to 5000ms)." +
                            "\n'--buffer <Size (bytes)>': Sets the size of the FAES CryptoStream buffer.\n'--metadata': Shows the raw metadeta (Hex) of the encrypted file." +
                            "\n'--utf8metadata': Shows the raw metadeta (Decoded UTF8) of the encrypted file.\n'--offline': Disables auto-update checking." +
                            "\n'--latest [<branch>]': Outputs the latest version of FileAES-CLI on that branch (Leaving branch blank defaults to current builds branch)." +
                            "\n'--update [<version>] [<branch>] [force]': Updates FileAES-CLI as specified. Using no arguments updates to the latest version on the current branch.\n\n" +
                            "\n'--localEncrypt' or '-local': Encrypt files within the same folder as the source file (Default behaviour).\n\n" +
                            "\n'--tempEncrypt' or '-temp': Encrypt files within the OS' Temp folder (Old behaviour).\n\n" +
                            "File/Folder names can be entered as a launch parameter to select what to encrypt/decrypt (also allows for dragging/dropping a file/folder on the .exe).\n\n" +
                            "Example: 'FileAES-CLI.exe File.txt -p password123'");
                return;
            }

            if (_doUpdate)
            {
                if (_update != null && _checkForUpdate)
                {
                    _update.CheckForUpdateNonThreadded(true);

                    bool doUpdate = false;

                    if ((!_forceUpdate && _update.IsUpdate()) || _forceUpdate || _updateToVer != "latest")
                    {
                        if (_updateToVer == "latest")
                        {
                            string latestVer = _update.GetLatestVersion();
                            Logging.Log(String.Format("Installing FileAES-CLI {0}...", latestVer));
                            doUpdate = true;
                        }
                        else if (_update.DoesVersionExist(_updateToVer, "dev"))
                        {
                            Logging.Log(String.Format("Installing FileAES-CLI {0}...", _updateToVer));
                            doUpdate = true;
                        }
                        else
                        {
                            Logging.Log(String.Format("Could not find FileAES-CLI {0}!", _updateToVer), Severity.WARN);
                        }

                        if (doUpdate)
                        {
                            _update.UpdateSelf(true, _updateToVer);
                            return;
                        }
                    }
                }
            }
            else if (_checkForUpdate)
            {
                _update.CheckForUpdate();
            }

            if (_purgeTemp)
            {
                FileAES_Utilities.PurgeTempFolder();
            }

            if (_getVersion)
            {
                Logging.Log(String.Format("Current FileAES-CLI Version: {0}", GetVersion()));
                if (!_getFaesVersion)
                {
                    return;
                }
            }

            if (_getFaesVersion)
            {
                Logging.Log(String.Format("Current FAES Version: {0}", FileAES_Utilities.GetVersion()));
                return;
            }

            if (_showLatestVer)
            {
                if (_checkForUpdate)
                {
                    _update.SetBranch(_showLatestBranch);

                    string latestVer = _update.GetLatestVersion();

                    if (latestVer != "v0.0.0")
                    {
                        Logging.Log(String.Format("The latest FileAES-CLI version on branch '{0}' is: {1}", _showLatestBranch.ToUpper(), latestVer));
                    }
                    else
                    {
                        Logging.Log("The latest FileAES-CLI version could not be found! Please check your internet connection.", Severity.WARN);
                    }

                    _update.SetBranch(_updateBranch);
                }

                else
                {
                    Logging.Log("The latest version cannot be displayed when the program is in offline mode!");
                }

                return;
            }

            if (_getHint)
            {
                if (File.Exists(_directory) && FileAES_Utilities.isFileDecryptable(_directory))
                {
                    string passHint = FileAES_Utilities.GetPasswordHint(_directory);

                    if (passHint != "No Password Hint Set")
                    {
                        Logging.Log(String.Format("The hint for '{0}' is: {1}", Path.GetFileName(_directory), passHint));
                    }
                    else
                    {
                        Logging.Log(String.Format("'{0}' does not contain a password hint!", Path.GetFileName(_directory)));
                    }

                    if (String.IsNullOrEmpty(_password) && (!_getEncryptTimestamp || !_getEncryptCompression))
                    {
                        return;
                    }
                }
                else
                {
                    Logging.Log("You have not specified a valid encrypted file!", Severity.WARN);
                    return;
                }
            }

            if (_getEncryptTimestamp)
            {
                if (File.Exists(_directory) && FileAES_Utilities.isFileDecryptable(_directory))
                {
                    long timestamp = FileAES_Utilities.GetEncryptionTimeStamp(_directory);

                    if (timestamp >= 0)
                    {
                        DateTime dateTime = FileAES_Utilities.UnixTimeStampToDateTime((double)timestamp);
                        Logging.Log(String.Format("'{0}' was encrypted on {1} at {2}.", Path.GetFileName(_directory), dateTime.ToString("dd/MM/yyyy"), dateTime.ToString("HH:mm:ss tt")));
                    }
                    else
                    {
                        Logging.Log("This file does not contain a encryption date. This is likely due to this file being encrypted using an older FAES version.");
                    }

                    if (String.IsNullOrEmpty(_password) && !_getEncryptCompression)
                    {
                        return;
                    }
                }
                else
                {
                    Logging.Log("You have not specified a valid encrypted file!", Severity.WARN);
                    return;
                }
            }

            if (_getEncryptCompression)
            {
                if (File.Exists(_directory) && FileAES_Utilities.isFileDecryptable(_directory))
                {
                    string compressionMode = FileAES_Utilities.GetCompressionMode(_directory);

                    if (compressionMode != "LGYZIP")
                    {
                        Logging.Log(String.Format("The Compression Mode used for '{0}' is: {1}", Path.GetFileName(_directory), compressionMode));
                    }
                    else
                    {
                        Logging.Log(String.Format("The Compression Mode used for '{0}' is: LGYZIP (LEGACYZIP)", Path.GetFileName(_directory)));
                    }

                    if (String.IsNullOrEmpty(_password))
                    {
                        return;
                    }
                }
                else
                {
                    Logging.Log("You have not specified a valid encrypted file!", Severity.WARN);
                    return;
                }
            }

            if (_showAllMetadata)
            {
                if (File.Exists(_directory) && FileAES_Utilities.isFileDecryptable(_directory))
                {
                    string compressionMode = FileAES_Utilities.GetCompressionMode(_directory);

                    MetaData faesMetaData = new MetaData(_directory);

                    if (faesMetaData.IsLegacyVersion())
                    {
                        Logging.Log(String.Format("The metadata (bytes) for '{0}' is (FAESv2):\n{1}", Path.GetFileName(_directory), BitConverter.ToString(faesMetaData.GetMetaData())));
                    }
                    else
                    {
                        Logging.Log(String.Format("The metadata (bytes) for '{0}' is (FAESv3):\n{1}", Path.GetFileName(_directory), BitConverter.ToString(faesMetaData.GetMetaData())));
                    }

                    if (String.IsNullOrEmpty(_password))
                    {
                        return;
                    }
                }
                else
                {
                    Logging.Log("You have not specified a valid encrypted file!", Severity.WARN);
                    return;
                }
            }

            if (_showAllMetadataString)
            {
                if (File.Exists(_directory) && FileAES_Utilities.isFileDecryptable(_directory))
                {
                    string compressionMode = FileAES_Utilities.GetCompressionMode(_directory);

                    MetaData faesMetaData = new MetaData(_directory);

                    if (faesMetaData.IsLegacyVersion())
                    {
                        Logging.Log(String.Format("The metadata (string) for '{0}' is (FAESv2):\n{1}", Path.GetFileName(_directory), Encoding.UTF8.GetString(faesMetaData.GetMetaData())));
                    }
                    else
                    {
                        Logging.Log(String.Format("The metadata (string) for '{0}' is (FAESv3):\n{1}", Path.GetFileName(_directory), Encoding.UTF8.GetString(faesMetaData.GetMetaData())));
                    }

                    if (String.IsNullOrEmpty(_password))
                    {
                        return;
                    }
                }
                else
                {
                    Logging.Log("You have not specified a valid encrypted file!", Severity.WARN);
                    return;
                }
            }

            if (String.IsNullOrEmpty(_directory))
            {
                while (true)
                {
                    Console.Write("File/Folder: ");
                    _directory = Console.ReadLine();

                    if (File.Exists(_directory) || Directory.Exists(_directory))
                    {
                        break;
                    }
                    Logging.Log("You have not specified a valid file or folder!", Severity.WARN);
                }
            }
            if (String.IsNullOrEmpty(_password))
            {
                while (true)
                {
                    Console.Write("Password: "******"\nConf. Password: "******"Passwords do not match!");
                    }
                    else
                    {
                        Console.Write(Environment.NewLine);
                        _password = password;
                        break;
                    }
                }
            }

            if (!File.Exists(_directory) && !Directory.Exists(_directory))
            {
                Logging.Log("You have not specified a valid file or folder!", Severity.WARN);
            }
            else if (String.IsNullOrEmpty(_password))
            {
                Logging.Log("Please specify a password!", Severity.WARN);
            }
            else
            {
                FAES_File faesFile = new FAES_File(_directory);
                FileAES_Utilities.SetCryptoStreamBuffer(_csBuffer);

                try
                {
                    if (_compressionLevel < 0 || _compressionLevel > 9)
                    {
                        Logging.Log("You have not specified a valid compression level! Please choose a value between 0 and 9.", Severity.WARN);
                        return;
                    }
                    else
                    {
                        if (_verbose)
                        {
                            Logging.Log(String.Format("CryptoStream Buffer Size: {0} bytes", FileAES_Utilities.GetCryptoStreamBuffer()), Severity.DEBUG);
                        }

                        if (faesFile.isFileEncryptable())
                        {
                            FileAES_Utilities.LocalEncrypt = _useLocalEncrypt;
                            FileAES_Encrypt encrypt = new FileAES_Encrypt(faesFile, _password, _passwordHint, Optimise.Balanced, null, _deleteOriginalFile, _overwriteDuplicates);

                            if (!String.IsNullOrEmpty(_compressionMethod))
                            {
                                switch (_compressionMethod)
                                {
                                case "ZIP":
                                {
                                    encrypt.SetCompressionMode(CompressionMode.ZIP, _compressionLevel);
                                    break;
                                }

                                case "TAR":
                                {
                                    encrypt.SetCompressionMode(CompressionMode.TAR, _compressionLevel);
                                    break;
                                }

                                case "LZMA":
                                {
                                    encrypt.SetCompressionMode(CompressionMode.LZMA, _compressionLevel);
                                    break;
                                }

                                case "LGYZIP":
                                case "LEGACYZIP":
                                case "LEGACY":
                                {
                                    encrypt.SetCompressionMode(CompressionMode.LGYZIP, _compressionLevel);
                                    break;
                                }

                                default:
                                    Logging.Log(String.Format("Unknown Compression Method: {0}", _compressionMethod), Severity.ERROR);
                                    return;
                                }
                            }

                            Thread progressThread = new Thread(() =>
                            {
                                while (_showProgress)
                                {
                                    ushort percentComplete = Convert.ToUInt16(encrypt.GetEncryptionPercentComplete());
                                    Logging.Log(String.Format("Progress: {0}%", percentComplete));
                                    Thread.Sleep(_progressSleep);
                                }
                            });

                            Thread eThread = new Thread(() =>
                            {
                                try
                                {
                                    if (encrypt.encryptFile())
                                    {
                                        if (_showProgress)
                                        {
                                            Logging.Log("Progress: 100%");
                                        }

                                        Logging.Log(String.Format("Encryption on {0} succeeded!", faesFile.getFaesType().ToLower()));
                                    }
                                    else
                                    {
                                        Logging.Log(String.Format("Encryption on {0} failed!", faesFile.getFaesType().ToLower()));
                                    }
                                }
                                catch (Exception e)
                                {
                                    #if NETFRAMEWORK
                                    progressThread.Abort();
                                    #endif
                                    HandleException(e);
                                }
                            });

                            if (_showProgress)
                            {
                                progressThread.Start();
                            }
                            eThread.Start();

                            while (eThread.ThreadState == ThreadState.Running)
                            {
                            }
                            #if NETFRAMEWORK
                            progressThread.Abort();
                            #endif
                        }
                        else
                        {
                            FileAES_Decrypt decrypt = new FileAES_Decrypt(faesFile, _password, _deleteOriginalFile, _overwriteDuplicates);

                            Thread progressThread = new Thread(() =>
                            {
                                while (_showProgress)
                                {
                                    ushort percentComplete = Convert.ToUInt16(decrypt.GetDecryptionPercentComplete());

                                    Logging.Log(String.Format("Progress: {0}%", percentComplete));
                                    Thread.Sleep(_progressSleep);
                                }
                            });

                            Thread dThread = new Thread(() =>
                            {
                                try
                                {
                                    if (decrypt.decryptFile())
                                    {
                                        if (_showProgress)
                                        {
                                            Logging.Log("Progress: 100%");
                                        }

                                        Logging.Log(String.Format("Decryption on {0} succeeded!", faesFile.getFaesType().ToLower()));
                                    }
                                    else
                                    {
                                        Logging.Log(String.Format("Decryption on {0} failed!", faesFile.getFaesType().ToLower()));
                                        Logging.Log("Ensure that you entered the correct password!");
                                        Logging.Log(String.Format("Password Hint: {0}", faesFile.GetPasswordHint()));
                                    }
                                }
                                catch (Exception e)
                                {
                                    #if NETFRAMEWORK
                                    progressThread.Abort();
                                    #endif
                                    HandleException(e);
                                }
                            });

                            if (_showProgress)
                            {
                                progressThread.Start();
                            }
                            dThread.Start();

                            while (dThread.ThreadState == ThreadState.Running)
                            {
                            }
                            #if NETFRAMEWORK
                            progressThread.Abort();
                            #endif
                        }
                    }
                }
                catch (Exception e)
                {
                    HandleException(e);
                }
            }
        }