Exemple #1
0
        public static byte[] AssinarPDF(ref byte[] dadosArquivo)
        {
            var     configuration = ConfigurationManager.ConfigurationManager.AppSettings;
            Assinar objAssinar    = new Assinar();

            return(objAssinar.AssinarPdfStreamCert(ref dadosArquivo, configuration["Certificado:RepositorioCertificado"], configuration["Certificado:ThumberPrint"]));
        }
Exemple #2
0
        private MemoryStream Assinar2(MemoryStream ArquivoOrigem, X509Certificate2 cert, ref byte[] pkcs7)
        {
            this.card = cert;
            X509CertificateParser x509CertificateParser = new X509CertificateParser();

            Org.BouncyCastle.X509.X509Certificate[] array = new Org.BouncyCastle.X509.X509Certificate[]
            {
                x509CertificateParser.ReadCertificate(this.card.RawData)
            };
            PdfReader              reader              = new PdfReader(ArquivoOrigem);
            MemoryStream           memoryStream        = new MemoryStream();
            PdfStamper             pdfStamper          = PdfStamper.CreateSignature(reader, memoryStream, '\0', null, true);
            PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

            signatureAppearance.SetCrypto(null, array, null, PdfSignatureAppearance.SELF_SIGNED);
            signatureAppearance.Reason           = this.proposito;
            signatureAppearance.Contact          = this.contato;
            signatureAppearance.Location         = this.localizacao;
            signatureAppearance.CryptoDictionary = new PdfSignature(PdfName.ADOBE_PPKLITE, new PdfName("adbe.pkcs7.detached"))
            {
                Reason   = signatureAppearance.Reason,
                Location = signatureAppearance.Location,
                Contact  = signatureAppearance.Contact,
                Date     = new PdfDate(signatureAppearance.SignDate)
            };
            int num = 15000;
            Dictionary <PdfName, int> dictionary = new Dictionary <PdfName, int>();

            dictionary[PdfName.CONTENTS] = num * 2 + 2;
            signatureAppearance.PreClose(dictionary);
            //PdfPKCS7 pdfPKCS = new PdfPKCS7(null, array, null, "SHA1", false);
            PdfPKCS7 pdfPKCS     = new PdfPKCS7(null, array, null, "MD5", false);
            IDigest  digest      = DigestUtilities.GetDigest("MD5");
            Stream   rangeStream = signatureAppearance.GetRangeStream();

            byte[] array2 = new byte[8192];
            int    length;

            while ((length = rangeStream.Read(array2, 0, array2.Length)) > 0)
            {
                digest.BlockUpdate(array2, 0, length);
            }
            byte[] array3 = new byte[digest.GetDigestSize()];
            digest.DoFinal(array3, 0);
            DateTime now = DateTime.Now;

            byte[] ocsp = null;
            if (array.Length >= 2)
            {
                string oCSPURL = PdfPKCS7.GetOCSPURL(array[0]);
                if (oCSPURL != null && oCSPURL.Length > 0)
                {
                    ocsp = new OcspClientBouncyCastle().GetEncoded(array[0], array[1], oCSPURL);
                }
            }
            byte[] authenticatedAttributeBytes = pdfPKCS.GetAuthenticatedAttributeBytes(array3, now, ocsp);
            byte[] digest2 = Assinar.SignSHA1withRSA(this.card, authenticatedAttributeBytes);
            pdfPKCS.SetExternalDigest(digest2, array3, "RSA");
            byte[] array4      = new byte[num];
            byte[] encodedPKCS = pdfPKCS.GetEncodedPKCS7(array3, now, null, ocsp);
            pkcs7 = encodedPKCS;
            Array.Copy(encodedPKCS, 0, array4, 0, encodedPKCS.Length);
            if (num + 2 < encodedPKCS.Length)
            {
                throw new ApplicationException("Não há espaço suficiente para assinatura.");
            }
            PdfDictionary pdfDictionary = new PdfDictionary();

            pdfDictionary.Put(PdfName.CONTENTS, new PdfString(array4).SetHexWriting(true));
            signatureAppearance.Close(pdfDictionary);
            //pdfStamper.
            return(memoryStream);
        }