/// <summary> /// Зчитування особистого ключа за допомогою графічного інтерфейсу бібліотеки. /// </summary> /// <param name="certOwnerInfo">Інформація про сертифікат власника.</param> public static void ReadPrivateKey() { if (!IEUSignCP.IsInitialized()) { throw new Exception(ERROR_NOT_INITIALIZED); } if (IEUSignCP.IsPrivateKeyReaded()) { IEUSignCP.ResetPrivateKey(); Certificates.Own.Clear(); } IEUSignCP.EU_CERT_OWNER_INFO certOwnerInfo; int error = IEUSignCP.ReadPrivateKey(out certOwnerInfo); if (error != IEUSignCP.EU_ERROR_NONE) { throw new Exception(IEUSignCP.GetErrorDesc(error)); } IEUSignCP.EU_CERT_INFO_EX certInfoEx; error = IEUSignCP.GetCertificateInfoEx(certOwnerInfo.issuer, certOwnerInfo.serial, out certInfoEx); if (error != IEUSignCP.EU_ERROR_NONE) { throw new Exception(IEUSignCP.GetErrorDesc(error)); } Certificates.Own.CertInfoEx = certInfoEx; }
/// <summary> /// Ініціалізація бібліотеки. /// </summary> public static void Initialize() { int error = IEUSignCP.Initialize(); if (error == IEUSignCP.EU_ERROR_NONE) { IEUSignCP.SetUIMode(false); string issuer = "O=Інформаційно-довідковий департамент ДФС;OU=Управління (центр) сертифікації ключів ІДД ДФС;CN=Акредитований центр сертифікації ключів ІДД ДФС;Serial=UA-39384476;C=UA;L=Київ"; string serial = "33B6CB7BF721B9CE0400000054FC1B008F645800"; IEUSignCP.EU_CERT_INFO_EX certInfoEx; error = IEUSignCP.GetCertificateInfoEx(issuer, serial, out certInfoEx); IEUSignCP.SetUIMode(true); if (error != IEUSignCP.EU_ERROR_NONE && error != IEUSignCP.EU_ERROR_CERT_NOT_FOUND) { throw new Exception(IEUSignCP.GetErrorDesc(error)); } if (error != IEUSignCP.EU_ERROR_CERT_NOT_FOUND) { Certificates.Recipient.CertInfoEx = certInfoEx; } } else { throw new Exception(IEUSignCP.GetErrorDesc(error)); } }
/// <summary> /// Отримання інформації про сертифікат отримувача за допомогою графічного інтерфейсу бібліотеки. /// </summary> public static void GetRecipientCertificate() { if (!IEUSignCP.IsInitialized()) { throw new Exception(ERROR_NOT_INITIALIZED); } Certificates.Recipient.Clear(); IEUSignCP.EU_CERT_OWNER_INFO certOwnerInfo; IEUSignCP.EU_CERT_INFO_EX certInfoEx; int error = IEUSignCP.SelectCertInfo(out certOwnerInfo); if (error != IEUSignCP.EU_ERROR_NONE) { throw new Exception(IEUSignCP.GetErrorDesc(error)); } error = IEUSignCP.GetCertificateInfoEx(certOwnerInfo.issuer, certOwnerInfo.serial, out certInfoEx); if (error != IEUSignCP.EU_ERROR_NONE) { throw new Exception(IEUSignCP.GetErrorDesc(error)); } if (certInfoEx.keyUsageBits != 16) { throw new Exception("Обраний сертифікат отримувача не призначений для шифрування.\nОберіть інший сертифікат отримувача."); } Certificates.Recipient.CertInfoEx = certInfoEx; }
/// <summary> /// Формування ЕЦП файлу. /// </summary> /// <param name="fileName">Ім'я файлу з даними.</param> /// <param name="fileNameWithSign">Ім'я файлу, в який необхідно записати підписані дані.</param> public static void SignFile(string fileName, string fileNameWithSign) { if (!IEUSignCP.IsInitialized()) { throw new Exception(ERROR_NOT_INITIALIZED); } if (!IEUSignCP.IsPrivateKeyReaded()) { throw new Exception(ERROR_BAD_PRIVATE_KEY); } using (FileStream fsIn = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { byte[] data = DFSPackHelper.fs2bytes(fsIn); byte[] signData; int error = IEUSignCP.SignDataInternal(true, data, out signData); if (error != IEUSignCP.EU_ERROR_NONE) { throw new Exception(IEUSignCP.GetErrorDesc(error)); } using (FileStream fsOut = new FileStream(fileNameWithSign, FileMode.Create, FileAccess.Write)) { byte[] tag = Encoding.ASCII.GetBytes("UA1_SIGN"); fsOut.Write(tag, 0, tag.Length); fsOut.WriteByte(0); fsOut.Write(BitConverter.GetBytes(signData.Length), 0, 4); fsOut.Write(signData, 0, signData.Length); } } }
/// <summary> /// Отримання інформації про сертифікат відправника для зашифрування. /// </summary> /// <param name="certInfoEx">Інформація про сертифікат (розширена).</param> public static byte[] GetOwnCertificateForEnvelop() { byte[] bCert = new byte[0]; IEUSignCP.EU_CERT_INFO_EX cert; int index = 0; for (; ;) { int error = IEUSignCP.EnumOwnCertificates(index, out cert); if (error == IEUSignCP.EU_WARNING_END_OF_ENUM) { break; } if (error != IEUSignCP.EU_ERROR_NONE) { throw new Exception(IEUSignCP.GetErrorDesc(error)); } if (cert.keyUsageBits == 16) { error = IEUSignCP.GetCertificate(cert.issuer, cert.serial, out bCert); if (error != IEUSignCP.EU_ERROR_NONE) { throw new Exception(IEUSignCP.GetErrorDesc(error)); } break; } index += 1; } if (bCert.Length == 0) { throw new Exception("Відсутній сертифікат відправника для зашифрування."); } return(bCert); }
/// <summary> /// Зашифрування файла. /// </summary> /// <param name="fileName">Ім'я файлу з даними.</param> /// <param name="envelopedFileName">Ім'я файлу, в який необхідно записати зашифровані дані.</param> public static void EnvelopFile(string fileName, string envelopedFileName) { if (!IEUSignCP.IsInitialized()) { throw new Exception(ERROR_NOT_INITIALIZED); } if (!IEUSignCP.IsPrivateKeyReaded()) { throw new Exception(ERROR_BAD_PRIVATE_KEY); } if (!Certificates.Own.IsLoaded()) { throw new Exception("Не обрано власний сертифікат відправника."); } if (!Certificates.Recipient.IsLoaded()) { throw new Exception("Не обрано сертифікат одержувача."); } using (FileStream fsIn = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { byte[] data = fs2bytes(fsIn); byte[] envelopedData; int error = IEUSignCP.EnvelopData(Certificates.Recipient.CertInfoEx.issuer, Certificates.Recipient.CertInfoEx.serial, data, out envelopedData); if (error != IEUSignCP.EU_ERROR_NONE) { throw new Exception(IEUSignCP.GetErrorDesc(error)); } using (FileStream fsOut = new FileStream(envelopedFileName, FileMode.Create, FileAccess.Write)) { byte[] tag = Encoding.ASCII.GetBytes("TRANSPORTABLE"); fsOut.Write(tag, 0, tag.Length); fsOut.WriteByte(0); byte[] header = Encoding.ASCII.GetBytes("PRG_TYPE=EUSignDFS\r\n" + "PRG_VER=1.0\r\n" + "FILENAME=" + Path.GetFileName(fileName.Replace(".signBDP", "")) + "\r\n" + "EDRPOU=" + Certificates.Own.CertInfoEx.subjEDRPOUCode + "\r\n" + "STTYPE=1\r\n"); fsOut.Write(BitConverter.GetBytes(header.Length), 0, 4); fsOut.Write(header, 0, header.Length); byte[] tagCert = Encoding.ASCII.GetBytes("CERTCRYPT"); fsOut.Write(tagCert, 0, tagCert.Length); fsOut.WriteByte(0); byte[] cert = GetOwnCertificateForEnvelop(); fsOut.Write(BitConverter.GetBytes(cert.Length), 0, 4); fsOut.Write(cert, 0, cert.Length); byte[] tagCrypt = Encoding.ASCII.GetBytes("UA1_CRYPT"); fsOut.Write(tagCrypt, 0, tagCrypt.Length); fsOut.WriteByte(0); fsOut.Write(BitConverter.GetBytes(envelopedData.Length), 0, 4); fsOut.Write(envelopedData, 0, envelopedData.Length); } } }