public virtual void TestISAValidPdf()
        {
            String        filePath      = sourceFolder + "isaValidPdf.pdf";
            String        signatureName = "Signature1";
            PdfDocument   document      = new PdfDocument(new PdfReader(filePath));
            SignatureUtil sigUtil       = new SignatureUtil(document);
            PdfPKCS7      pdfPKCS7      = sigUtil.ReadSignatureData(signatureName);

            NUnit.Framework.Assert.IsTrue(pdfPKCS7.VerifySignatureIntegrityAndAuthenticity());
            NUnit.Framework.Assert.IsFalse(sigUtil.SignatureCoversWholeDocument(signatureName));
            String textFromPage = PdfTextExtractor.GetTextFromPage(document.GetPage(1));

            // We are working with the latest revision of the document, that's why we should get amended page text.
            // However Signature shall be marked as not covering the complete document, indicating its invalidity
            // for the current revision.
            NUnit.Framework.Assert.AreEqual("This is manipulated malicious text, ha-ha!", textFromPage);
            NUnit.Framework.Assert.AreEqual(2, sigUtil.GetTotalRevisions());
            NUnit.Framework.Assert.AreEqual(1, sigUtil.GetRevision(signatureName));
            Stream        sigInputStream      = sigUtil.ExtractRevision(signatureName);
            PdfDocument   sigRevDocument      = new PdfDocument(new PdfReader(sigInputStream));
            SignatureUtil sigRevUtil          = new SignatureUtil(sigRevDocument);
            PdfPKCS7      sigRevSignatureData = sigRevUtil.ReadSignatureData(signatureName);

            NUnit.Framework.Assert.IsTrue(sigRevSignatureData.VerifySignatureIntegrityAndAuthenticity());
            NUnit.Framework.Assert.IsTrue(sigRevUtil.SignatureCoversWholeDocument(signatureName));
            sigRevDocument.Close();
            document.Close();
        }
        public PdfPKCS7 VerifySignature(SignatureUtil signUtil, String name)
        {
            PdfPKCS7 pkcs7 = signUtil.ReadSignatureData(name);

            Console.Out.WriteLine("Signature covers whole document: " + signUtil.SignatureCoversWholeDocument(name));
            Console.Out.WriteLine("Document revision: " + signUtil.GetRevision(name) + " of "
                                  + signUtil.GetTotalRevisions());
            Console.Out.WriteLine("Integrity check OK? " + pkcs7.VerifySignatureIntegrityAndAuthenticity());
            return(pkcs7);
        }
        public static (PdfPKCS7, FileDetailsModel) VerifySignature(FileDetailsModel model, SignatureUtil signUtil, String name)
        {
            PdfPKCS7 pkcs7 = signUtil.ReadSignatureData(name);

            logger.Error("Signature covers whole document: " + signUtil.SignatureCoversWholeDocument(name));
            logger.Error("Document revision: " + signUtil.GetRevision(name) + " of "
                         + signUtil.GetTotalRevisions());
            logger.Error("Integrity check OK? " + pkcs7.VerifySignatureIntegrityAndAuthenticity());
            model.Integrity = pkcs7.VerifySignatureIntegrityAndAuthenticity() == true?"OK":"NOT OK";
            return(pkcs7, model);
        }
Beispiel #4
0
        public virtual void TestSWA01()
        {
            String        filePath      = sourceFolder + "siwa.pdf";
            String        signatureName = "Signature1";
            PdfDocument   document      = new PdfDocument(new PdfReader(filePath));
            SignatureUtil sigUtil       = new SignatureUtil(document);
            PdfPKCS7      pdfPKCS7      = sigUtil.ReadSignatureData(signatureName);

            NUnit.Framework.Assert.IsTrue(pdfPKCS7.VerifySignatureIntegrityAndAuthenticity());
            NUnit.Framework.Assert.IsFalse(sigUtil.SignatureCoversWholeDocument(signatureName));
            document.Close();
        }
Beispiel #5
0
        static void coversAllDocument()

        {
            PdfDocument pdfDocument = new PdfDocument(new PdfReader("c:\\temp\\valid signed contract.pdf"));

            String        signatureFieldName = "Signature1";
            SignatureUtil signatureUtil      = new SignatureUtil(pdfDocument);

            Boolean completeDocumentIsSigned = signatureUtil.SignatureCoversWholeDocument(signatureFieldName);

            if (!completeDocumentIsSigned)
            {
                // handle PDF file which contains NOT signed data
            }

            pdfDocument.Close();
        }
Beispiel #6
0
        static void Main(string[] args)
        {
            try
            {
                //File.WriteAllText("D:\\pipInput.txt", args[0]);
                MemoryStream ms       = null;
                byte[]       password = null;
                for (int i = 0; i < args.Length; i++)
                {
                    int splitIndex = args[i].IndexOf(':');

                    string prefix = null;
                    string value  = null;

                    if (splitIndex == -1)
                    {
                        prefix = args[i];
                    }
                    else
                    {
                        prefix = args[i].Substring(0, splitIndex);
                        value  = args[i].Substring(splitIndex + 1);
                    }

                    switch (prefix.ToUpper())
                    {
                    case "-N":
                    case "/N":
                        if (ms != null)
                        {
                            throw new ArgumentException("incorrect input arguments: filedata already initialized");
                        }

                        if (string.IsNullOrWhiteSpace(value) || !File.Exists(value))
                        {
                            throw new ArgumentException("incorrect input arguments: filename not exists");
                        }

                        if (File.Exists(value))
                        {
                            ms = new MemoryStream(File.ReadAllBytes(value));
                        }
                        break;

                    case "-D":
                    case "/D":
                        if (ms != null)
                        {
                            throw new ArgumentException("incorrect input arguments: filedata already initialized");
                        }

                        if (string.IsNullOrWhiteSpace(value))
                        {
                            throw new ArgumentException("incorrect input arguments: filedata is empty");
                        }

                        ms = new MemoryStream(Convert.FromBase64String(value));
                        break;

                    case "-P":
                    case "/P":
                        if (value == null)
                        {
                            throw new ArgumentException("incorrect input arguments: password is empty");
                        }

                        password = Encoding.ASCII.GetBytes(value);
                        break;

                    case "-HELP":
                    case "/HELP":
                    case "-?":
                    case "/?":
                        Console.Write("Retrieves PAdES signatures and returns informations structured into XML" + Environment.NewLine +
                                      "document." + Environment.NewLine +
                                      Environment.NewLine +
                                      "PadesInfoProcessor [/N:[path][filename]] [/D:[filedata]] [/P:[password]]" + Environment.NewLine +
                                      "  /N:[path][filename]" + Environment.NewLine +
                                      "               Specifies PDF document file path to retrieve informations." + Environment.NewLine +
                                      "  /D:[filedata]" + Environment.NewLine +
                                      "               Specifies PDF document data encoded with Base64." + Environment.NewLine +
                                      "  /P:[password]" + Environment.NewLine +
                                      "               Specifies password if PDF document is encrypted." + Environment.NewLine +
                                      Environment.NewLine);
                        break;

                    default:
                        break;
                    }
                }


                string output = string.Empty;
                if (ms != null)
                {
                    iText.Kernel.Pdf.PdfReader pdfReader;
                    if (password == null)
                    {
                        pdfReader = new iText.Kernel.Pdf.PdfReader(ms);
                    }
                    else
                    {
                        pdfReader = new iText.Kernel.Pdf.PdfReader(ms, (new iText.Kernel.Pdf.ReaderProperties()).SetPassword(password));
                    }

                    output += "<PdfSignatures>";
                    PdfDocument document = new PdfDocument(pdfReader);
                    if (iText.Forms.PdfAcroForm.GetAcroForm(document, false) != null)
                    {
                        SignatureUtil  su       = new SignatureUtil(document);
                        IList <string> sigNames = su.GetSignatureNames();

                        foreach (string sigName in sigNames)
                        {
                            PdfSignature sig = su.GetSignature(sigName);

                            //string cert = sig.GetCert().GetValue();
                            string coversWholeDoc = su.SignatureCoversWholeDocument(sigName).ToString();
                            string signingTime    = getDate(sig.GetDate());
                            string contentType    = sig.GetSubFilter().ToString().Replace("/", "");
                            string reason         = sig.GetReason();
                            string location       = sig.GetLocation();

                            output += "<PdfSignature>";
                            output += "<SignatureName>" + sigName + "</SignatureName>";
                            output += "<PdfSigningTimeUtc>" + signingTime + "</PdfSigningTimeUtc>";
                            output += "<Reason>" + reason + "</Reason>";
                            output += "<Location>" + location + "</Location>";
                            output += "<CoversWholeDocument>" + coversWholeDoc + "</CoversWholeDocument>";
                            output += "<ContentType>" + contentType + "</ContentType>";
                            output += processByPdfPKCS7(new PdfDocument(pdfReader), sig, contentType);

                            output += "</PdfSignature>";
                        }
                    }
                    output += "</PdfSignatures>";
                }
                //File.WriteAllText(@"D:\PadesInfoProcessorOutput.xml", output);
                Console.Write(output);
            }
            catch (ArgumentException argEx)
            {
                Console.Error.Write("PadesInfoProcessor 1: " + argEx.Message);
            }
            catch (Exception ex)
            {
                //File.WriteAllText("D:\\pipException.txt", ex.ToString());
                Console.Error.Write("PadesInfoProcessor 1: PDF document unexpected exception: " + ex.ToString());
            }
        }
        private SignedDocumentInfo CollectInfo(String documentPath)
        {
            SignedDocumentInfo docInfo  = new SignedDocumentInfo();
            PdfDocument        pdfDoc   = new PdfDocument(new PdfReader(documentPath));
            PdfAcroForm        form     = PdfAcroForm.GetAcroForm(pdfDoc, false);
            SignatureUtil      signUtil = new SignatureUtil(pdfDoc);
            IList <String>     names    = signUtil.GetSignatureNames();

            docInfo.SetNumberOfTotalRevisions(signUtil.GetTotalRevisions());
            SignaturePermissions  perms     = null;
            IList <SignatureInfo> signInfos = new List <SignatureInfo>();

            foreach (String name in names)
            {
                SignatureInfo sigInfo = new SignatureInfo();
                sigInfo.SetSignatureName(name);
                sigInfo.SetRevisionNumber(signUtil.GetRevision(name));
                sigInfo.SetSignatureCoversWholeDocument(signUtil.SignatureCoversWholeDocument(name));
                IList <PdfWidgetAnnotation> widgetAnnotationsList = form.GetField(name).GetWidgets();
                if (widgetAnnotationsList != null && widgetAnnotationsList.Count > 0)
                {
                    sigInfo.SetSignaturePosition(widgetAnnotationsList[0].GetRectangle().ToRectangle());
                }

                PdfPKCS7 pkcs7 = signUtil.ReadSignatureData(name);
                sigInfo.SetDigestAlgorithm(pkcs7.GetHashAlgorithm());
                sigInfo.SetEncryptionAlgorithm(pkcs7.GetEncryptionAlgorithm());
                PdfName filterSubtype = pkcs7.GetFilterSubtype();
                if (filterSubtype != null)
                {
                    sigInfo.SetFilterSubtype(filterSubtype.ToString());
                }

                X509Certificate signCert = pkcs7.GetSigningCertificate();
                sigInfo.SetSignerName(iText.Signatures.CertificateInfo.GetSubjectFields(signCert).GetField("CN"));
                sigInfo.SetAlternativeSignerName(pkcs7.GetSignName());
                sigInfo.SetSignDate(pkcs7.GetSignDate().ToUniversalTime());
                if (TimestampConstants.UNDEFINED_TIMESTAMP_DATE != pkcs7.GetTimeStampDate())
                {
                    sigInfo.SetTimeStamp(pkcs7.GetTimeStampDate().ToUniversalTime());
                    TimeStampToken ts = pkcs7.GetTimeStampToken();
                    sigInfo.SetTimeStampService(ts.TimeStampInfo.Tsa.ToString());
                }

                sigInfo.SetLocation(pkcs7.GetLocation());
                sigInfo.SetReason(pkcs7.GetReason());
                PdfDictionary sigDict     = signUtil.GetSignatureDictionary(name);
                PdfString     contactInfo = sigDict.GetAsString(PdfName.ContactInfo);
                if (contactInfo != null)
                {
                    sigInfo.SetContactInfo(contactInfo.ToString());
                }

                perms = new SignaturePermissions(sigDict, perms);
                sigInfo.SetIsCertifiaction(perms.IsCertification());
                sigInfo.SetIsFieldsFillAllowed(perms.IsFillInAllowed());
                sigInfo.SetIsAddingAnnotationsAllowed(perms.IsAnnotationsAllowed());
                IList <String> fieldLocks = new List <String>();
                foreach (SignaturePermissions.FieldLock Lock in perms.GetFieldLocks())
                {
                    fieldLocks.Add(Lock.ToString());
                }

                sigInfo.SetFieldsLocks(fieldLocks);
                X509Certificate[]       certs     = pkcs7.GetSignCertificateChain();
                IList <CertificateInfo> certInfos = new List <CertificateInfo>();
                for (int i = 0; i < certs.Length; i++)
                {
                    X509Certificate cert     = (X509Certificate)certs[i];
                    CertificateInfo certInfo = new CertificateInfo();
                    certInfo.SetIssuer(cert.IssuerDN);
                    certInfo.SetSubject(cert.SubjectDN);
                    certInfo.SetValidFrom(cert.NotBefore);
                    certInfo.SetValidTo(cert.NotAfter);
                    certInfos.Add(certInfo);
                }

                sigInfo.SetCertificateInfos(certInfos);
                signInfos.Add(sigInfo);
            }

            docInfo.SetSignatureInfos(signInfos);
            return(docInfo);
        }