예제 #1
0
        /// <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);
                        }
                    }
                }
            }
        }