/// <summary> /// Розшифрування файлу. /// </summary> /// <param name="envelopedFileName">Ім'я файлу з зашифрованими даними.</param> /// <param name="fileName">Ім'я файлу в який необхідно записати розшифровані дані.</param> public static void DevelopFile(string envelopedFileName) { if (!IEUSignCP.IsInitialized()) { throw new Exception(ERROR_NOT_INITIALIZED); } if (!IEUSignCP.IsPrivateKeyReaded()) { throw new Exception(ERROR_BAD_PRIVATE_KEY); } using (FileStream fs_in = new FileStream(envelopedFileName, FileMode.Open, FileAccess.Read)) { // Зняття обгорток з шифрованих даних. fs_in.Seek(14, SeekOrigin.Begin); byte[] bSizeTRANSPORTABLE = new byte[4]; fs_in.Read(bSizeTRANSPORTABLE, 0, 4); int sizeTRANSPORTABLE = BitConverter.ToInt32(bSizeTRANSPORTABLE, 0); fs_in.Seek(sizeTRANSPORTABLE, SeekOrigin.Current); fs_in.Seek(10, SeekOrigin.Current); byte[] bSizeCERTCRYPT = new byte[4]; fs_in.Read(bSizeCERTCRYPT, 0, 4); int sizeCERTCRYPT = BitConverter.ToInt32(bSizeCERTCRYPT, 0); fs_in.Seek(sizeCERTCRYPT, SeekOrigin.Current); fs_in.Seek(14, SeekOrigin.Current); int sizeEnvelopData; sizeEnvelopData = (int)(fs_in.Length - 18 - sizeTRANSPORTABLE - 14 - sizeCERTCRYPT - 14); byte[] bEnvelopData = new byte[sizeEnvelopData]; fs_in.Read(bEnvelopData, 0, sizeEnvelopData); // Розшифрування даних. byte[] bDevelopData; IEUSignCP.EU_SENDER_INFO senderInfo; IEUSignCP.DevelopData(bEnvelopData, out bDevelopData, out senderInfo); // Зняття обгорток з підписанних даних. int sizeSignData = bDevelopData.Length - 13; byte[] bSignData = new byte[sizeSignData]; Array.Copy(bDevelopData, 13, bSignData, 0, sizeSignData); // Зняття підпису з данних XML-файлу. if (Path.GetExtension(envelopedFileName).ToUpper() == ".XML") { string dirName = envelopedFileName + ".orig"; Directory.CreateDirectory(dirName); string verifyFileName = dirName + "\\" + Path.GetFileName(envelopedFileName); byte[] bData; IEUSignCP.EU_SIGN_INFO signInfo; IEUSignCP.VerifyDataInternal(bSignData, out bData, out signInfo); using (FileStream fs_out = new FileStream(verifyFileName, FileMode.Create, FileAccess.Write)) { fs_out.Write(bData, 0, bData.Length); } return; } // Зняття підпису з данних ZIP-файлу та підписів з вкладених до архіву файлів. if (Path.GetExtension(envelopedFileName).ToUpper() == ".ZIP") { string dirName = envelopedFileName + ".orig"; Directory.CreateDirectory(dirName); byte[] bZipData; IEUSignCP.EU_SIGN_INFO signInfo; IEUSignCP.VerifyDataInternal(bSignData, out bZipData, out signInfo); MemoryStream msZipData = new MemoryStream(bZipData); ZipArchive archive = new ZipArchive(msZipData); foreach (ZipArchiveEntry entry in archive.Entries) { string verifyFileName = dirName + "\\" + entry.Name; byte[] bEntryData; using (MemoryStream ms = new MemoryStream()) { entry.Open().CopyTo(ms); bEntryData = ms.ToArray(); } // Зняття обгорток з підписанних даних. int sizeSignEntryData = bEntryData.Length - 13; byte[] bSignEntryData = new byte[sizeSignEntryData]; Array.Copy(bEntryData, 13, bSignEntryData, 0, sizeSignEntryData); byte[] bData; IEUSignCP.EU_SIGN_INFO signInfoEntry; IEUSignCP.VerifyDataInternal(bSignEntryData, out bData, out signInfoEntry); using (FileStream fs_out = new FileStream(verifyFileName, FileMode.Create, FileAccess.Write)) { fs_out.Write(bData, 0, bData.Length); } } } } }