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