Ejemplo n.º 1
0
        /// <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);
                }
            }
        }