예제 #1
0
        void mnuFileSystemSign_Click(Object sender, System.EventArgs e)
        {
            // Check if we have some secret keys at all.
            XmlNodeList xnlSecretKeys = SharpPrivacy.SecretKeyRing.GetElementsByTagName("SecretKey");

            if (xnlSecretKeys.Count == 0)
            {
                MessageBox.Show("You cannot sign data because you do not own a private key. Please generate a new key pair, before you sign data.", "Action not possible...", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                return;
            }

            System.Windows.Forms.OpenFileDialog ofdOpen = new System.Windows.Forms.OpenFileDialog();

            ofdOpen.Multiselect = true;
            ofdOpen.Filter      = "All Files (*.*)|*.*";
            ofdOpen.ShowDialog();

            if (ofdOpen.FileNames.Length == 0)
            {
                return;
            }

            QueryPassphrase qpPassphrase = new QueryPassphrase();

            qpPassphrase.ShowMultiKeyDialog(SharpPrivacy.SecretKeyRing);
            ulong  lSignatureKeyID = qpPassphrase.SelectedKey;
            string strPassphrase   = qpPassphrase.Passphrase;

            for (int i = 0; i < ofdOpen.FileNames.Length; i++)
            {
                string strPath = ofdOpen.FileNames[i];
                SharpPrivacy.ReloadKeyRing();
                SharpPrivacy.Instance.SignFile(strPath, strPath + ".asc", lSignatureKeyID, strPassphrase);
            }
        }
예제 #2
0
        private void cmdAdd_Click(object sender, EventArgs e)
        {
            if (this.txtEmail.Text.Length < 3 || this.txtName.Text.Length < 1)
            {
                MessageBox.Show("You must enter your full name as well as your email address!", "Error...", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                return;
            }

            QueryPassphrase qpPassphrase = new QueryPassphrase();

            qpPassphrase.ShowSingleKeyDialog(xmlSecretKey);
            string strPassphrase = qpPassphrase.Passphrase;
            string strKeyID      = xmlPublicKey.GetAttribute("keyid");
            ulong  lKeyID        = UInt64.Parse(strKeyID.Substring(2), System.Globalization.NumberStyles.HexNumber);

            try {
                SharpPrivacy.Instance.AddUserID(lKeyID, txtName.Text, txtEmail.Text, strPassphrase);
            } catch (Exception ex) {
                MessageBox.Show("Something went wrong while trying to add a new UserID: " + ex.Message, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
                return;
            }

            bIsCanceled = false;
            this.Close();
        }
예제 #3
0
        void mnuClipboardSign_Click(Object sender, System.EventArgs e)
        {
            // Check if we have some secret keys at all.
            XmlNodeList xnlSecretKeys = SharpPrivacy.SecretKeyRing.GetElementsByTagName("SecretKey");

            if (xnlSecretKeys.Count == 0)
            {
                MessageBox.Show("You cannot sign data because you do not own a private key. Please generate a new key pair, before you sign data.", "Action not possible...", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                return;
            }

            string strMessage = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString();

            QueryPassphrase qpPassphrase = new QueryPassphrase();

            qpPassphrase.ShowMultiKeyDialog(SharpPrivacy.SecretKeyRing);
            ulong  lSignatureKeyID = qpPassphrase.SelectedKey;
            string strPassphrase   = qpPassphrase.Passphrase;

            try {
                SharpPrivacy.ReloadKeyRing();
                string strReturn = SharpPrivacy.Instance.SignText(strMessage, lSignatureKeyID, strPassphrase);
                Clipboard.SetDataObject(strReturn);
            } catch (Exception ex) {
                MessageBox.Show("An error occured while encrypting the message: " + ex.Message + "\n\n" + ex.StackTrace, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
            }
        }
예제 #4
0
        void cmdParse_Click(Object sender, System.EventArgs e)
        {
            Packet[] pKeys = Packet.ParsePackets(txtBase64Key.Text);

            string strKeys = "";

            for (int i = 0; i < pKeys.Length; i++)
            {
                /* As soon as all Packets are implemented, replace
                 * this by a simple pKeys[i].ToString();
                 * For now we need all the ifs
                 */
                if (pKeys[i] is PublicKeyPacket)
                {
                    strKeys += pKeys[i].ToString();
                }
                else if (pKeys[i] is UserIDPacket)
                {
                    strKeys += pKeys[i].ToString();
                }
                else if (pKeys[i] is SignaturePacket)
                {
                    strKeys += pKeys[i].ToString();
                }
                else if (pKeys[i] is SymmetricallyEncryptedDataPacket)
                {
                    strKeys += pKeys[i].ToString();
                }
                else if (pKeys[i] is AsymSessionKeyPacket)
                {
                    strKeys += pKeys[i].ToString();
                }
                else if (pKeys[i] is SymSessionKeyPacket)
                {
                    strKeys += pKeys[i].ToString();
                }
                else if (pKeys[i] is LiteralDataPacket)
                {
                    strKeys += pKeys[i].ToString();
                }
                else if (pKeys[i] is CompressedDataPacket)
                {
                    strKeys += pKeys[i].ToString();
                }
                else if (pKeys[i] is SecretKeyPacket)
                {
                    QueryPassphrase queryPassphrase = new QueryPassphrase();
                    queryPassphrase.ShowMyDialog();
                    string          strPassphrase = queryPassphrase.Passphrase;
                    SecretKeyPacket skpPacket     = (SecretKeyPacket)pKeys[i];
                    skpPacket.GetDecryptedKeyMaterial(strPassphrase);
                    strKeys += pKeys[i].ToString();
                }
            }
            this.txtKeyProperties.Lines = strKeys.Split('\n');
        }
예제 #5
0
        private void cmdSign_Click(object sender, System.EventArgs e)
        {
            int nIntroducerDepth = 0;

            try {
                nIntroducerDepth = Convert.ToInt32(this.txtIntroducer.Text);
            } catch (Exception) {
                MessageBox.Show("Introducer depth must be a number between 0 and 8!", "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
                return;
            }
            if (nIntroducerDepth < 0 || nIntroducerDepth > 8)
            {
                MessageBox.Show("Introducer depth must be a number between 0 and 8!", "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
                return;
            }

            if ((string)cmbUserID.SelectedItem == "")
            {
                MessageBox.Show("Please select the user ID you want to sign!", "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
                return;
            }

            int nType = 0;

            if (this.rbCasualVerification.Checked)
            {
                nType = 0x12;
            }
            if (this.rbNoVerification.Checked)
            {
                nType = 0x11;
            }
            if (this.rbPositivVerification.Checked)
            {
                nType = 0x13;
            }

            QueryPassphrase qpPassphrase = new QueryPassphrase();

            qpPassphrase.ShowMultiKeyDialog(SharpPrivacy.SecretKeyRing);
            string strKeyID      = xmlKey.GetAttribute("keyid");
            ulong  lSignedKeyID  = UInt64.Parse(strKeyID.Substring(2), System.Globalization.NumberStyles.HexNumber);
            ulong  lSigningKeyID = qpPassphrase.SelectedKey;
            string strPassphrase = qpPassphrase.Passphrase;

            try {
                SharpPrivacy.Instance.SignKey(lSignedKeyID, lSigningKeyID, this.cmbUserID.Text, nIntroducerDepth, chkExportable.Checked, nType, strPassphrase);
            } catch (Exception ex) {
                MessageBox.Show("Something went wrong signing the key: " + ex.Message, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
                return;
            }

            this.bSigned = true;
            this.Close();
        }
예제 #6
0
        public static string ClearTextSign(string strMessage, SecretKeyRing skrKeyRing)
        {
            SignaturePacket spSign = new SignaturePacket();

            strMessage = Radix64.TrimMessage(strMessage);
            QueryPassphrase qpPassphrase = new QueryPassphrase();
            qpPassphrase.ShowMyDialog(skrKeyRing);
            string strPassphrase = qpPassphrase.Passphrase;
            TransportableSecretKey tskKey = qpPassphrase.SelectedKey;
            SecretKeyPacket skpKey = tskKey.FindKey(AsymActions.Sign);

            Working wWorking = new Working();
            wWorking.Show();

            spSign.HashAlgorithm = HashAlgorithms.SHA1;
            spSign.Format = PacketFormats.New;

            wWorking.Progress(10);

            SignatureSubPacket sspCreator = new SignatureSubPacket();
            sspCreator.Type = SignatureSubPacketTypes.IssuerKeyID;
            sspCreator.KeyID = skpKey.PublicKey.KeyID;
            SignatureSubPacket sspCreationTime = new SignatureSubPacket();
            sspCreationTime.Type = SignatureSubPacketTypes.SignatureCreationTime;
            sspCreationTime.TimeCreated = DateTime.Now;
            spSign.HashedSubPackets = new SignatureSubPacket[2];
            spSign.HashedSubPackets[0] = sspCreator;
            spSign.HashedSubPackets[1] = sspCreationTime;

            wWorking.Progress(20);

            //spSign.KeyID = skpKey.PublicKey.KeyID;
            //spSign.TimeCreated = DateTime.Now;
            spSign.SignatureAlgorithm = skpKey.PublicKey.Algorithm;
            spSign.SignatureType = SignatureTypes.TextSignature;
            spSign.Version = SignaturePacketVersionNumbers.v4;

            wWorking.Progress(10);

            byte[] bMessage = System.Text.Encoding.UTF8.GetBytes(strMessage);
            spSign.Sign(bMessage, skpKey, strPassphrase);

            wWorking.Progress(40);
            byte[] bSignature = spSign.Generate();

            string strSignature = Radix64.Encode(bSignature, true);

            wWorking.Progress(20);

            string strFinal = Armor.WrapCleartextSignature(strMessage, strSignature);

            wWorking.Hide();

            return strFinal;
        }
예제 #7
0
        void mnuClipboardDecryptVerify_Click(Object sender, System.EventArgs e)
        {
            string strMessage = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString();

            bool  bAskForPassphrase = true;
            ulong lDecryptionKey    = 0;

            try {
                SharpPrivacy.ReloadKeyRing();
                lDecryptionKey = SharpPrivacy.Instance.GetDecryptionKey(strMessage);
            } catch (Exception ex) {
                bAskForPassphrase = false;
                Console.WriteLine(ex.Message);
            }

            string strPassphrase = "";

            if (bAskForPassphrase)
            {
                QueryPassphrase qpPassphrase = new QueryPassphrase();
                if (lDecryptionKey > 0)
                {
                    //Find the fitting key
                    XmlElement xmlKey = FindSecretKey(lDecryptionKey);
                    if (xmlKey == null)
                    {
                        MessageBox.Show("An unexpected error occured: The secret key used to decrypt the message could not be found.", "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
                        return;
                    }
                    qpPassphrase.ShowSingleKeyDialog(xmlKey);
                    strPassphrase = qpPassphrase.Passphrase;
                }
                else
                {
                    qpPassphrase.ShowMyDialog();
                    strPassphrase = qpPassphrase.Passphrase;
                }
            }

            try {
                PlaintextViewer pvPlaintext = new PlaintextViewer();
                SharpPrivacy.ReloadKeyRing();
                pvPlaintext.XmlMessage = SharpPrivacy.Instance.DecryptAndVerify(strMessage, strPassphrase);
                pvPlaintext.ShowPlaintext();
            } catch (Exception ex) {
                MessageBox.Show("An error occured while decrypting the message: " + ex.Message, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
            }
        }
예제 #8
0
        void mnuFileSystemDecryptVerify_Click(Object sender, System.EventArgs e)
        {
            System.Windows.Forms.OpenFileDialog ofdOpen = new System.Windows.Forms.OpenFileDialog();

            ofdOpen.Multiselect = false;
            ofdOpen.Filter      = "OpenPGP Files (*.asc;*.enc)|*.asc;*.enc|All Files (*.*)|*.*";
            ofdOpen.ShowDialog();

            bool  bAskForPassphrase = true;
            ulong lDecryptionKey    = 0;

            try {
                SharpPrivacy.ReloadKeyRing();
                lDecryptionKey = SharpPrivacy.Instance.GetDecryptionKeyFromFile(ofdOpen.FileName);
            } catch (Exception) {
                bAskForPassphrase = false;
            }

            string strPassphrase = "";

            if (bAskForPassphrase)
            {
                QueryPassphrase qpPassphrase = new QueryPassphrase();
                if (lDecryptionKey > 0)
                {
                    //Find the fitting key
                    XmlElement xmlKey = FindSecretKey(lDecryptionKey);
                    qpPassphrase.ShowSingleKeyDialog(xmlKey);
                    strPassphrase = qpPassphrase.Passphrase;
                }
                else
                {
                    qpPassphrase.ShowMyDialog();
                    strPassphrase = qpPassphrase.Passphrase;
                }
            }

            try {
                PlaintextViewer pvPlaintext = new PlaintextViewer();
                SharpPrivacy.ReloadKeyRing();
                pvPlaintext.XmlMessage = SharpPrivacy.Instance.DecryptAndVerifyFile(ofdOpen.FileName, strPassphrase);
                pvPlaintext.ShowPlaintext();
            } catch (Exception ex) {
                MessageBox.Show("An error occured while decrypting the message: " + ex.Message, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
            }
        }
예제 #9
0
        void mnuKeyMenuCopy_Click(Object sender, System.EventArgs e)
        {
            IEnumerator ieItem = tlvKeys.SelectedNodes.GetEnumerator();

            string strKey = "";

            while (ieItem.MoveNext())
            {
                TreeListNode tlnItem = (TreeListNode)ieItem.Current;

                try {
                    XmlElement xmlKey   = (XmlElement)tlnItem.Tag;
                    string     strKeyID = xmlKey.GetAttribute("keyid");
                    ulong      lKeyID   = UInt64.Parse(strKeyID.Substring(2), System.Globalization.NumberStyles.HexNumber);
                    if (xmlKey.Name == "PublicKey")
                    {
                        string strThisKey = SharpPrivacy.Instance.GetPublicKey(lKeyID);
                        strKey += strThisKey;
                    }
                    else if (xmlKey.Name == "SecretKey")
                    {
                        QueryPassphrase qpPassphrase = new QueryPassphrase();
                        qpPassphrase.ShowSingleKeyDialog(xmlKey);
                        string strPassphrase = qpPassphrase.Passphrase;
                        string strThisKey    = SharpPrivacy.Instance.GetSecretKey(lKeyID, strPassphrase);
                        strKey += strThisKey;
                    }
                } catch (Exception ex) {
                    MessageBox.Show("An Error occured: " + ex.Message, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
                    return;
                }
            }
            if (strKey.Length > 0)
            {
                Clipboard.SetDataObject(strKey);
                this.stbStatus.Text = "Selection saved in clipboard";
            }
        }
예제 #10
0
        void mnuClipboardSign_Click(Object sender, System.EventArgs e)
        {
            // Check if we have some secret keys at all.
            XmlNodeList xnlSecretKeys = SharpPrivacy.SecretKeyRing.GetElementsByTagName("SecretKey");

            if (xnlSecretKeys.Count == 0) {
                MessageBox.Show("You cannot sign data because you do not own a private key. Please generate a new key pair, before you sign data.", "Action not possible...", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                return;
            }

            string strMessage = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString();

            QueryPassphrase qpPassphrase = new QueryPassphrase();
            qpPassphrase.ShowMultiKeyDialog(SharpPrivacy.SecretKeyRing);
            ulong lSignatureKeyID = qpPassphrase.SelectedKey;
            string strPassphrase = qpPassphrase.Passphrase;

            try {
                SharpPrivacy.ReloadKeyRing();
                string strReturn = SharpPrivacy.Instance.SignText(strMessage, lSignatureKeyID, strPassphrase);
                Clipboard.SetDataObject(strReturn);
            } catch (Exception ex) {
                MessageBox.Show("An error occured while encrypting the message: " + ex.Message + "\n\n" + ex.StackTrace, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
            }
        }
예제 #11
0
        private static void DecryptAndVerify(SecretKeyRing skrSecretKeyRing, PublicKeyRing pkrPublicKeyRing, byte[] bData)
        {
            string strMessage = System.Text.Encoding.UTF8.GetString(bData);
            ArmorTypes atType = new ArmorTypes();
            string strRest = "";
            string strRadix64 = Armor.RemoveArmor(strMessage, ref atType, ref strRest);
            if (strRadix64.Length > 0)
                bData = Radix64.Decode(strRadix64);

            SharpPrivacy.OpenPGP.Messages.Message mContent = null;

            if (atType == ArmorTypes.OpenPGPSignature) {
                string strSignature = "";
                string strSignedMessage = Armor.RemoveClearSignatureArmor(strMessage, ref atType, ref strSignature);

                strSignedMessage = Radix64.DashUnescape(strSignedMessage);
                strSignedMessage = Radix64.TrimMessage(strSignedMessage);
                SignedMessage smMessage = new SignedMessage();
                Packet[] pPackets = Packet.ParsePackets(strSignature);
                if (!(pPackets[0] is SignaturePacket)) {
                    MessageBox.Show("Not a valid cleartext signature!");
                    return;
                }
                smMessage.Signature = (SignaturePacket)pPackets[0];

                LiteralMessage lmMessage = new LiteralMessage(DataFormatTypes.Text);
                lmMessage.Text = strSignedMessage;
                smMessage.MessageSigned = lmMessage;

                mContent = smMessage;
            } else {

                // let us see what kind of message this is
                EncryptedMessage emMessage = new EncryptedMessage();
                try {
                    Packet[] pPackets = Packet.ParsePackets(bData);
                    emMessage.ParseMessage(pPackets);

                    if (emMessage.SymmetricallyEncrypted) {
                        // Query passphrase for symmetrically encrypted message
                        QueryPassphrase qpPassphrase = new QueryPassphrase();
                        qpPassphrase.ShowMyDialog();
                        string strPassphrase = qpPassphrase.Passphrase;

                        mContent = emMessage.Decrypt(strPassphrase);

                    } else {
                        ulong lKeyID = emMessage.GetFittingKeyID(skrSecretKeyRing);
                        QueryPassphrase qpPassphrase = new QueryPassphrase();
                        qpPassphrase.ShowMyDialog(skrSecretKeyRing.Find(lKeyID));
                        string strPassphrase = qpPassphrase.Passphrase;

                        mContent = emMessage.Decrypt(skrSecretKeyRing, strPassphrase);
                    }

                    while ((!(mContent is LiteralMessage)) && (!(mContent is SignedMessage))) {
                        if (mContent is CompressedMessage) {
                            mContent = ((CompressedMessage)mContent).Uncompress();
                        } else {
                            MessageBox.Show("This is not a valid OpenPGP message!");
                            return;
                        }
                    }
                } catch (Exception ee) {
                    MessageBox.Show("There was an error decrypting your message: " + ee.Message);
                    return;
                }
            }

            LiteralMessage lmContent = new LiteralMessage();
            string strDisplay = "";
            if (mContent is SignedMessage) {
                SignedMessage smContent = (SignedMessage)mContent;
                lmContent = smContent.MessageSigned;
                strDisplay += "*** OpenPGP Signed Message ***\r\n";
                strDisplay += "*** Signature Status: " + smContent.Verify(pkrPublicKeyRing) + " ***\r\n";
                strDisplay += "*** Signing Key: " + smContent.Signature.KeyID.ToString("x") + " ***\r\n";
                strDisplay += "*** Signing Date: " + smContent.Signature.TimeCreated.ToString() + "***\r\n\r\n";
            } else if (mContent is LiteralMessage) {
                lmContent = (LiteralMessage)mContent;
                strDisplay += "*** OpenPGP Encrypted Message ***\r\n\r\n";
            } else {
                MessageBox.Show("An error occured: Could not find an encrypted or signed message!", "Error...");
                return;
            }

            if (lmContent.DataFormat == DataFormatTypes.Text) {
                strDisplay += lmContent.Text;
                strDisplay += "\r\n\r\n*** End OpenPGP Message ***\r\n";
                PlaintextViewer pvViewer = new PlaintextViewer();
                pvViewer.MessageText = strDisplay;
                pvViewer.Show();
            } else {
                if (MessageBox.Show(strDisplay, "Signature Status...", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1) == DialogResult.OK) {
                    System.Windows.Forms.SaveFileDialog sfdSave = new SaveFileDialog();
                    sfdSave.OverwritePrompt = true;
                    sfdSave.Filter = "All Files (*.*)|*.*";
                    sfdSave.FileName = lmContent.Filename;
                    sfdSave.ShowDialog();
                    if (sfdSave.FileName.Length > 0) {
                        System.IO.FileStream fsOut = new FileStream(sfdSave.FileName, FileMode.CreateNew);
                        System.IO.BinaryWriter bwOut = new BinaryWriter(fsOut);
                        bwOut.Write(lmContent.Binary);
                        bwOut.Close();
                        fsOut.Close();
                    }
                }
            }
        }
예제 #12
0
        public static string EncryptText(string strMessage, PublicKeyRing pkrPublicKeyRing, SecretKeyRing skrSecretKeyRing, bool bSign)
        {
            PublicKeySelector pksSelectKeys = new PublicKeySelector(pkrPublicKeyRing);
            pksSelectKeys.ShowDialog();
            TransportableSecretKey tskKey = new TransportableSecretKey();
            string strPassphrase = "";

            if (bSign) {
                QueryPassphrase qpPassphrase = new QueryPassphrase();
                qpPassphrase.ShowMyDialog(skrSecretKeyRing);
                tskKey = qpPassphrase.SelectedKey;
                strPassphrase = qpPassphrase.Passphrase;
            }

            if (pksSelectKeys.SelectedKeys.Count == 0)
                return strMessage;

            Working wWorking = new Working();
            wWorking.Show();

            LiteralMessage lmMessage = new LiteralMessage(DataFormatTypes.Text);
            lmMessage.Text = strMessage;
            lmMessage.TimeCreated = DateTime.Now;
            lmMessage.Filename = "";

            SharpPrivacy.OpenPGP.Messages.Message mEncryptionMessage = lmMessage;

            if (bSign) {
                SignedMessage smMessage = new SignedMessage();
                smMessage.MessageSigned = lmMessage;
                SignaturePacket spPacket = new SignaturePacket();
                spPacket.Version = SignaturePacketVersionNumbers.v3;
                SecretKeyPacket skpKey = tskKey.FindKey(AsymActions.Sign);
                spPacket.KeyID = skpKey.PublicKey.KeyID;
                spPacket.HashAlgorithm = HashAlgorithms.SHA1;
                spPacket.SignatureAlgorithm = skpKey.PublicKey.Algorithm;
                spPacket.TimeCreated = DateTime.Now;
                spPacket.SignatureType = SignatureTypes.TextSignature;
                spPacket.Sign(lmMessage.Binary, skpKey, strPassphrase);
                smMessage.Signature = spPacket;
                mEncryptionMessage = smMessage;
            }

            CompressedMessage cmMessage = new CompressedMessage();
            cmMessage.Compress(mEncryptionMessage);

            wWorking.Progress(20);

            SymAlgorithms saAlgo = GetSymAlgorithmPreferences(pksSelectKeys.SelectedKeys);

            SymmetricallyEncryptedDataPacket sedpEncrypted = new SymmetricallyEncryptedDataPacket();
            SymmetricAlgorithm saEncrypt = CipherHelper.CreateSymAlgorithm(saAlgo);
            saEncrypt.Mode = CipherMode.OpenPGP_CFB;
            saEncrypt.GenerateKey();
            byte[] bKey = saEncrypt.Key;

            wWorking.Progress(10);
            ESKSequence esksKeys = new ESKSequence();
            try {
                 esksKeys = CreateESKSequence(pksSelectKeys.SelectedKeys, AsymActions.Encrypt, saAlgo, bKey);
            } catch (Exception e) {
                wWorking.Hide();
                MessageBox.Show("The following error occured: " + e.Message, "Error...");
                return strMessage;
            }

            wWorking.Progress(50);

            ICryptoTransform ictEncryptor = saEncrypt.CreateEncryptor();
            byte[] bMessage = cmMessage.GetEncoded();
            byte[] bOutput = new byte[bMessage.Length];
            ictEncryptor.TransformBlock(bMessage, 0, bMessage.Length, ref bOutput, 0);
            bKey.Initialize();

            wWorking.Progress(10);

            int iOutLength = (saEncrypt.BlockSize >> 3) + 2 + bMessage.Length;
            sedpEncrypted.Body = new byte[iOutLength];
            Array.Copy(bOutput, 0, sedpEncrypted.Body, 0, iOutLength);

            byte[] bESK = esksKeys.GetEncoded();
            byte[] bEncrypted = sedpEncrypted.Generate();

            byte[] bReturn = new byte[bESK.Length + bEncrypted.Length];
            bESK.CopyTo(bReturn, 0);
            bEncrypted.CopyTo(bReturn, bESK.Length);

            wWorking.Progress(10);
            string strReturn = Radix64.Encode(bReturn, true);

            strReturn = Armor.WrapMessage(strReturn);

            wWorking.Hide();
            return strReturn;
        }
예제 #13
0
        public static void EncryptFiles(String[] strFiles, PublicKeyRing pkrPublicKeyRing, SecretKeyRing skrSecretKeyRing, bool bEncrypt, bool bSign)
        {
            PublicKeySelector pksSelectKeys = new PublicKeySelector(pkrPublicKeyRing);
            if (bEncrypt) {
                pksSelectKeys.ShowDialog();
                if (pksSelectKeys.SelectedKeys.Count == 0) {
                    MessageBox.Show("You did not select a public key to encrypt to. Doing nothing...", "Nothing Done...");
                    return;
                }
            }

            TransportableSecretKey tskKey = new TransportableSecretKey();
            string strPassphrase = "";

            if (bSign) {
                QueryPassphrase qpPassphrase = new QueryPassphrase();
                qpPassphrase.ShowMyDialog(skrSecretKeyRing);
                tskKey = qpPassphrase.SelectedKey;
                strPassphrase = qpPassphrase.Passphrase;
            }

            Working wWorking = new Working();
            wWorking.Show();

            for (int i=0; i<strFiles.Length; i++) {
                byte[] bFileContent = new byte[0];
                try {
                    System.IO.FileStream fsFile = new FileStream(strFiles[i], FileMode.Open);
                    BinaryReader brReader = new BinaryReader(fsFile);
                    bFileContent = brReader.ReadBytes((int)fsFile.Length);
                    brReader.Close();
                    fsFile.Close();
                } catch (Exception e) {
                    wWorking.Hide();
                    MessageBox.Show("An error occured while opening the file " + strFiles[i] + ": " + e.Message, "Error...");
                    return;
                }

                LiteralMessage lmMessage = new LiteralMessage(DataFormatTypes.Binary);
                lmMessage.Binary = bFileContent;
                lmMessage.TimeCreated = DateTime.Now;
                int iLastBackslash = strFiles[i].LastIndexOf("\\");
                lmMessage.Filename = strFiles[i].Substring(iLastBackslash + 1, strFiles[i].Length - iLastBackslash - 1);

                SharpPrivacy.OpenPGP.Messages.Message mEncryptionMessage = lmMessage;

                if (bSign) {
                    SignedMessage smMessage = new SignedMessage();
                    smMessage.MessageSigned = lmMessage;
                    SignaturePacket spPacket = new SignaturePacket();
                    spPacket.Version = SignaturePacketVersionNumbers.v3;
                    SecretKeyPacket skpKey = tskKey.FindKey(AsymActions.Sign);
                    spPacket.KeyID = skpKey.PublicKey.KeyID;
                    spPacket.HashAlgorithm = HashAlgorithms.SHA1;
                    spPacket.SignatureAlgorithm = skpKey.PublicKey.Algorithm;
                    spPacket.TimeCreated = DateTime.Now;
                    spPacket.SignatureType = SignatureTypes.TextSignature;
                    spPacket.Sign(lmMessage.Binary, skpKey, strPassphrase);
                    smMessage.Signature = spPacket;
                    mEncryptionMessage = smMessage;
                }

                CompressedMessage cmMessage = new CompressedMessage();
                cmMessage.Compress(mEncryptionMessage);

                wWorking.Progress(20/strFiles.Length);

                SymAlgorithms saAlgo = GetSymAlgorithmPreferences(pksSelectKeys.SelectedKeys);

                wWorking.Progress(10/strFiles.Length);
                byte[] bReturn = new byte[0];
                if (bEncrypt) {
                    SymmetricallyEncryptedDataPacket sedpEncrypted = new SymmetricallyEncryptedDataPacket();
                    SymmetricAlgorithm saEncrypt = CipherHelper.CreateSymAlgorithm(saAlgo);
                    saEncrypt.Mode = CipherMode.OpenPGP_CFB;
                    saEncrypt.GenerateKey();
                    byte[] bKey = saEncrypt.Key;

                    ESKSequence esksKeys = new ESKSequence();
                    try {
                         esksKeys = CreateESKSequence(pksSelectKeys.SelectedKeys, AsymActions.Encrypt, saAlgo, bKey);
                    } catch (Exception e) {
                        wWorking.Hide();
                        MessageBox.Show("The following error occured: " + e.Message, "Error...");
                        return;
                    }

                    wWorking.Progress(50/strFiles.Length);

                    ICryptoTransform ictEncryptor = saEncrypt.CreateEncryptor();
                    byte[] bMessage = cmMessage.GetEncoded();
                    byte[] bOutput = new byte[bMessage.Length];
                    ictEncryptor.TransformBlock(bMessage, 0, bMessage.Length, ref bOutput, 0);
                    bKey.Initialize();

                    wWorking.Progress(10/strFiles.Length);

                    int iOutLength = (saEncrypt.BlockSize >> 3) + 2 + bMessage.Length;
                    sedpEncrypted.Body = new byte[iOutLength];
                    Array.Copy(bOutput, 0, sedpEncrypted.Body, 0, iOutLength);

                    byte[] bESK = esksKeys.GetEncoded();
                    byte[] bEncrypted = sedpEncrypted.Generate();

                    bReturn = new byte[bESK.Length + bEncrypted.Length];
                    bESK.CopyTo(bReturn, 0);
                    bEncrypted.CopyTo(bReturn, bESK.Length);
                } else {
                    wWorking.Progress(60/strFiles.Length);
                    bReturn = cmMessage.GetEncoded();
                }

                wWorking.Progress(10/strFiles.Length);

                try {
                    FileStream fsOut = new FileStream(strFiles[i] + ".asc", FileMode.CreateNew);
                    BinaryWriter bwWrite = new BinaryWriter(fsOut);

                    bwWrite.Write(bReturn);
                    bwWrite.Close();
                    fsOut.Close();
                } catch (IOException io) {
                    MessageBox.Show("Could not write to file. The following error occured: " + io.Message, "Error...");
                }
            }

            wWorking.Hide();
        }
예제 #14
0
        void cmdParse_Click(Object sender, System.EventArgs e)
        {
            Packet[] pKeys = Packet.ParsePackets(txtBase64Key.Text);

            string strKeys = "";
            for (int i=0; i<pKeys.Length; i++) {
                /* As soon as all Packets are implemented, replace
                 * this by a simple pKeys[i].ToString();
                 * For now we need all the ifs
                 */
                if (pKeys[i] is PublicKeyPacket) {
                    strKeys += pKeys[i].ToString();
                } else if (pKeys[i] is UserIDPacket) {
                    strKeys += pKeys[i].ToString();
                } else if (pKeys[i] is SignaturePacket) {
                    strKeys += pKeys[i].ToString();
                } else if (pKeys[i] is SymmetricallyEncryptedDataPacket) {
                    strKeys += pKeys[i].ToString();
                } else if (pKeys[i] is AsymSessionKeyPacket) {
                    strKeys += pKeys[i].ToString();
                } else if (pKeys[i] is SymSessionKeyPacket) {
                    strKeys += pKeys[i].ToString();
                } else if (pKeys[i] is LiteralDataPacket) {
                    strKeys += pKeys[i].ToString();
                } else if (pKeys[i] is CompressedDataPacket) {
                    strKeys += pKeys[i].ToString();
                } else if (pKeys[i] is SecretKeyPacket) {
                    QueryPassphrase queryPassphrase = new QueryPassphrase();
                    queryPassphrase.ShowMyDialog();
                    string strPassphrase = queryPassphrase.Passphrase;
                    SecretKeyPacket skpPacket = (SecretKeyPacket)pKeys[i];
                    skpPacket.GetDecryptedKeyMaterial(strPassphrase);
                    strKeys += pKeys[i].ToString();
                }
            }
            this.txtKeyProperties.Lines = strKeys.Split('\n');
        }
예제 #15
0
        void mnuFileSystemSign_Click(Object sender, System.EventArgs e)
        {
            // Check if we have some secret keys at all.
            XmlNodeList xnlSecretKeys = SharpPrivacy.SecretKeyRing.GetElementsByTagName("SecretKey");

            if (xnlSecretKeys.Count == 0) {
                MessageBox.Show("You cannot sign data because you do not own a private key. Please generate a new key pair, before you sign data.", "Action not possible...", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                return;
            }

            System.Windows.Forms.OpenFileDialog ofdOpen = new System.Windows.Forms.OpenFileDialog();

            ofdOpen.Multiselect = true;
            ofdOpen.Filter = "All Files (*.*)|*.*";
            ofdOpen.ShowDialog();

            if (ofdOpen.FileNames.Length == 0)
                return;

            QueryPassphrase qpPassphrase = new QueryPassphrase();
            qpPassphrase.ShowMultiKeyDialog(SharpPrivacy.SecretKeyRing);
            ulong lSignatureKeyID = qpPassphrase.SelectedKey;
            string strPassphrase = qpPassphrase.Passphrase;

            for (int i=0; i<ofdOpen.FileNames.Length; i++) {
                string strPath = ofdOpen.FileNames[i];
                SharpPrivacy.ReloadKeyRing();
                SharpPrivacy.Instance.SignFile(strPath, strPath + ".asc", lSignatureKeyID, strPassphrase);
            }
        }
예제 #16
0
        void mnuFileSystemDecryptVerify_Click(Object sender, System.EventArgs e)
        {
            System.Windows.Forms.OpenFileDialog ofdOpen = new System.Windows.Forms.OpenFileDialog();

            ofdOpen.Multiselect = false;
            ofdOpen.Filter = "OpenPGP Files (*.asc;*.enc)|*.asc;*.enc|All Files (*.*)|*.*";
            ofdOpen.ShowDialog();

            bool bAskForPassphrase = true;
            ulong lDecryptionKey = 0;
            try {
                SharpPrivacy.ReloadKeyRing();
                lDecryptionKey = SharpPrivacy.Instance.GetDecryptionKeyFromFile(ofdOpen.FileName);
            } catch (Exception) {
                bAskForPassphrase = false;
            }

            string strPassphrase = "";
            if (bAskForPassphrase) {
                QueryPassphrase qpPassphrase = new QueryPassphrase();
                if (lDecryptionKey > 0) {
                    //Find the fitting key
                    XmlElement xmlKey = FindSecretKey(lDecryptionKey);
                    qpPassphrase.ShowSingleKeyDialog(xmlKey);
                    strPassphrase = qpPassphrase.Passphrase;
                } else {
                    qpPassphrase.ShowMyDialog();
                    strPassphrase = qpPassphrase.Passphrase;
                }
            }

            try {
                PlaintextViewer pvPlaintext = new PlaintextViewer();
                SharpPrivacy.ReloadKeyRing();
                pvPlaintext.XmlMessage = SharpPrivacy.Instance.DecryptAndVerifyFile(ofdOpen.FileName, strPassphrase);
                pvPlaintext.ShowPlaintext();
            } catch (Exception ex) {
                MessageBox.Show("An error occured while decrypting the message: " + ex.Message, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
            }
        }
예제 #17
0
        private void cmdAdd_Click(object sender, EventArgs e)
        {
            if (this.txtEmail.Text.Length < 3 || this.txtName.Text.Length < 1) {
                MessageBox.Show("You must enter your full name as well as your email address!", "Error...", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                return;
            }

            QueryPassphrase qpPassphrase = new QueryPassphrase();
            qpPassphrase.ShowSingleKeyDialog(xmlSecretKey);
            string strPassphrase = qpPassphrase.Passphrase;
            string strKeyID = xmlPublicKey.GetAttribute("keyid");
            ulong lKeyID = UInt64.Parse(strKeyID.Substring(2), System.Globalization.NumberStyles.HexNumber);

            try {
                SharpPrivacy.Instance.AddUserID(lKeyID, txtName.Text, txtEmail.Text, strPassphrase);
            } catch (Exception ex) {
                MessageBox.Show("Something went wrong while trying to add a new UserID: " + ex.Message, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
                return;
            }

            bIsCanceled = false;
            this.Close();
        }
예제 #18
0
        void mnuClipboardDecryptVerify_Click(Object sender, System.EventArgs e)
        {
            string strMessage = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString();

            bool bAskForPassphrase = true;
            ulong lDecryptionKey = 0;
            try {
                SharpPrivacy.ReloadKeyRing();
                lDecryptionKey = SharpPrivacy.Instance.GetDecryptionKey(strMessage);
            } catch (Exception ex) {
                bAskForPassphrase = false;
                Console.WriteLine(ex.Message);
            }

            string strPassphrase = "";
            if (bAskForPassphrase) {
                QueryPassphrase qpPassphrase = new QueryPassphrase();
                if (lDecryptionKey > 0) {
                    //Find the fitting key
                    XmlElement xmlKey = FindSecretKey(lDecryptionKey);
                    if (xmlKey == null) {
                        MessageBox.Show("An unexpected error occured: The secret key used to decrypt the message could not be found.", "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
                        return;
                    }
                    qpPassphrase.ShowSingleKeyDialog(xmlKey);
                    strPassphrase = qpPassphrase.Passphrase;
                } else {
                    qpPassphrase.ShowMyDialog();
                    strPassphrase = qpPassphrase.Passphrase;
                }
            }

            try {
                PlaintextViewer pvPlaintext = new PlaintextViewer();
                SharpPrivacy.ReloadKeyRing();
                pvPlaintext.XmlMessage = SharpPrivacy.Instance.DecryptAndVerify(strMessage, strPassphrase);
                pvPlaintext.ShowPlaintext();
            } catch (Exception ex) {
                MessageBox.Show("An error occured while decrypting the message: " + ex.Message, "Error...", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
            }
        }