Inheritance: System.Windows.Forms.Form
コード例 #1
0
ファイル: FMain.cs プロジェクト: thunderquack/GUSign
        private void bSign_Click(object sender, EventArgs e)
        {
            FPIN fPIN = new FPIN();
            fPIN.ShowDialog();
            if (fPIN.DialogResult == DialogResult.OK)
            {
                pIN = fPIN.PIN;
                bSign.Enabled = false;
                Application.DoEvents();
                try
                {
                    DoWithFirstEtokenSlotWhileLoggedIn(delegate(EtokenModule aEtokenModule, Session aSession)
                    {
                        OpenFileDialog openFileDialog = new OpenFileDialog();
                        openFileDialog.Filter = "Все файлы (*.*)|*.*";
                        openFileDialog.FilterIndex = 0;
                        openFileDialog.RestoreDirectory = true;
                        if (openFileDialog.ShowDialog() == DialogResult.OK)
                        {
                            // Находим закрытый ключ
                            aSession.FindObjectsInit(new P11Attribute[]{
                                                new ObjectClassAttribute(CKO.PRIVATE_KEY),
                                                new KeyTypeAttribute(CKK.GOST)
                                            });
                            P11Object[] lObjects = aSession.FindObjects(1);
                            if (lObjects.Length == 0)
                            {
                                MessageBox.Show(this, "Закрытый ключ не найден");
                                return;
                            }
                            GostPrivateKey pk = lObjects[0] as GostPrivateKey;
                            aSession.FindObjectsFinal();

                            // Находим открытый ключ
                            aSession.FindObjectsInit(new P11Attribute[]{
                                                new ObjectClassAttribute(CKO.PUBLIC_KEY),
                                                new KeyTypeAttribute(CKK.GOST)
                                            });

                            lObjects = aSession.FindObjects(1);
                            if (lObjects.Length == 0)
                            {
                                MessageBox.Show(this, "Открытый ключ не найден");
                                return;
                            }
                            GostPublicKey pubKey = lObjects[0] as GostPublicKey;
                            aSession.FindObjectsFinal();

                            // Находим сертификат
                            aSession.FindObjectsInit(new P11Attribute[]{
                                                    new ObjectClassAttribute(CKO.CERTIFICATE)
                                                });
                            lObjects = aSession.FindObjects(1);
                            if (lObjects.Length == 0)
                            {
                                MessageBox.Show(this, "Сертификат не найден");
                                return;
                            }
                            Certificate certificate = lObjects[0] as Certificate;
                            aSession.FindObjectsFinal();

                            FileStream openFileStream = File.Open(openFileDialog.FileName, FileMode.Open);
                            byte[] data = new byte[openFileStream.Length];
                            openFileStream.Read(data, 0, data.Length);
                            byte[] lEnvelope;
                            // Подписываем и упаковываем в конверт
                            aEtokenModule.pkcs7Sign(aSession, data, certificate, out lEnvelope, pk, null,
                                Net.Sf.Pkcs11.EtokenExtensions.Wrapper.pkcs7SignFlags.DETACHED_SIGNATURE);

                            SaveFileDialog saveFileDialog = new SaveFileDialog();
                            saveFileDialog.Filter = "Файлы P7C (*.p7c)|*.p7c";
                            saveFileDialog.FilterIndex = 0;
                            saveFileDialog.RestoreDirectory = true;
                            if (saveFileDialog.ShowDialog() == DialogResult.OK)
                            {
                                using (BinaryWriter binWriter = new BinaryWriter(File.Open(saveFileDialog.FileName, FileMode.Create)))
                                {
                                    binWriter.Write(lEnvelope);
                                    MessageBox.Show("Файл успешно подписан");
                                }
                            }

                            // Показываем
                            /*MessageBox.Show(this, "Signed successfully!" + Environment.NewLine +
                                "Initial Data:" + BitConverter.ToString(data) + Environment.NewLine +
                                "Envelope:" + Environment.NewLine + BitConverter.ToString(lEnvelope));
                            */

                            // Проверяем
                            /*aEtokenModule.pkcs7Verify(lEnvelope, data);
                            MessageBox.Show(this, "Signature successfully verified!");
                             */
                        };
                    });
                }
                finally
                {
                    bSign.Enabled = true;
                }
            }
        }
コード例 #2
0
ファイル: FMain.cs プロジェクト: thunderquack/GUSign
        private void bCertExport_Click(object sender, EventArgs e)
        {
            // Форму ввода пин-кода я сделал отдельно, чтобы всякий желающий мог ее усилить средствами
            // противодействия перехвату ввода
            FPIN fPIN = new FPIN();
            fPIN.ShowDialog();
            if (fPIN.DialogResult == DialogResult.OK)
            {
                pIN = fPIN.PIN;
                bCertExport.Enabled = false;
                Application.DoEvents();
                try
                {
                    DoWithFirstEtokenSlotWhileLoggedIn(delegate(EtokenModule aEtokenModule, Session aSession)
                    {
                        // Извлекаем сертификат
                        aSession.FindObjectsInit(
                            new P11Attribute[]
                        {
                            new ObjectClassAttribute(CKO.CERTIFICATE)
                        });

                        P11Object[] lObjects = aSession.FindObjects(1);
                        if (lObjects.Length == 0)
                        {
                            MessageBox.Show(this, "Сертификат не найден");
                            return;
                        }
                        // Форматируем его в формате X509
                        X509PublicKeyCertificate certificate = (X509PublicKeyCertificate)(lObjects[0]);
                        aSession.FindObjectsFinal();

                        SaveFileDialog saveFileDialog = new SaveFileDialog();
                        saveFileDialog.Filter = "Файлы сертификатов DER (*.cer)|*.cer";

                        saveFileDialog.FilterIndex = 0;
                        saveFileDialog.RestoreDirectory = true;
                        if (saveFileDialog.ShowDialog() == DialogResult.OK)
                        {
                            using (BinaryWriter binWriter = new BinaryWriter(File.Open(saveFileDialog.FileName, FileMode.Create)))
                            {
                                binWriter.Write(certificate.Value.Value);
                                MessageBox.Show("Экспорт выполнен");
                            }
                        }
                    });
                }
                finally
                {
                    bCertExport.Enabled = true;
                }
            }
        }