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; } } }
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; } } }