private void btnExportPubKey_Click(object sender, EventArgs e)
        {
            if (lwKeys.SelectedItems.Count < 1)
                return;

            string privKeyFilename = tbSettingsPrivateKeyFolder.Text + Path.DirectorySeparatorChar + lwKeys.SelectedItems[0].Text + ".privkey";
            if (!File.Exists(privKeyFilename))
            {
                LogLine("Private key " + privKeyFilename + " does not exist");
                return;
            }            

            FormPass form = new FormPass();
            if (form.ShowDialog() != DialogResult.OK)
                return;

            string password = form.Password;
            DigitalSignature sig = new DigitalSignature();
            try
            {
                sig.LoadKeys(privKeyFilename, password);
            }
            catch (DigitalSignatureException ex)
            {
                LogLine(ex.Message);
            }
            catch (Exception ex)
            {
                LogLine("LoadKeys: An error has occurred. " + ex.Message);
                return;
            }            

            SaveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            SaveFileDialog.Filter = "Public keys | *.pubkey";
            if (SaveFileDialog.ShowDialog() == DialogResult.OK)            
                sig.SavePublicKey(SaveFileDialog.FileName);            
        }
        private void MenuItemSignFile_Click(object sender, EventArgs e)
        {            
            if (lwSign.SelectedItems.Count < 1)
            {
                LogLine("You must select a key");
                return;
            }

            string privKeyFilename = tbSettingsPrivateKeyFolder.Text + Path.DirectorySeparatorChar + lwSign.SelectedItems[0].Text + ".privkey";
            string pubKeyFilename = tbSettingsPublicKeyFolder.Text + Path.DirectorySeparatorChar + lwSign.SelectedItems[0].Text + ".pubkey";

            if (!File.Exists(privKeyFilename))
            {
                LogLine("Private key " + privKeyFilename + " does not exist");
                return;
            }

            if (!File.Exists(pubKeyFilename))
            {
                LogLine("Public key " + pubKeyFilename + " does not exist");
                return;
            }

            FormPass form = new FormPass();
            if (form.ShowDialog() != DialogResult.OK)
                return;

            string password = form.Password;
            DigitalSignature sig = new DigitalSignature();
            try
            {
                sig.LoadKeys(privKeyFilename, password);
            }            
            catch(Exception ex)
            {                
                LogLine("Invalid password");                
                return;
            }            

            FileDialog.Multiselect = true;
            FileDialog.Title = "Select files for signing";
            if (FileDialog.ShowDialog() != DialogResult.OK)
                return;

            Enabled = false;            
            LogLine("Signing files. Please wait...");
            Application.DoEvents();

            foreach (string filename in FileDialog.FileNames)
            {                
                byte[] bytes = File.ReadAllBytes(filename);
                var sha256 = SHA256.Create();
                var hashedData = sha256.ComputeHash(bytes);

                var signature = sig.SignData(hashedData);
                string signatureFilename = filename + ".signature";
                sig.SaveSignature(signatureFilename, signature);                
            }
            
            string dirName = "";
            if(FileDialog.FileNames.Length > 0)
                dirName = Path.GetDirectoryName(FileDialog.FileNames[0]);
            LogLine("Signatures created in directory " + dirName);

            Enabled = true;            
        }