示例#1
0
        public virtual void SpacesBeforeContentsTest02()
        {
            String inPdf = TEST_RESOURCES_PATH + "spacesBeforeContentsTest02.pdf";

            PdfReader  reader     = new PdfReader(inPdf);
            AcroFields acroFields = reader.AcroFields;

            Assert.True(acroFields.SignatureCoversWholeDocument("Signature1"));
        }
示例#2
0
        public virtual void NotIndirectSigDictionaryTest()
        {
            String inPdf = TEST_RESOURCES_PATH + "notIndirectSigDictionaryTest.pdf";

            PdfReader  reader     = new PdfReader(inPdf);
            AcroFields acroFields = reader.AcroFields;

            Assert.True(acroFields.SignatureCoversWholeDocument("Signature1"));
        }
示例#3
0
        virtual public PdfPKCS7 VerifySignature(AcroFields fields, String name)
        {
            Console.WriteLine("Signature covers whole document: " + fields.SignatureCoversWholeDocument(name));
            Console.WriteLine("Document revision: " + fields.GetRevision(name) + " of " + fields.TotalRevisions);
            PdfPKCS7 pkcs7 = fields.VerifySignature(name);

            Console.WriteLine("Integrity check OK? " + pkcs7.Verify());
            return(pkcs7);
        }
示例#4
0
        public virtual void BytesAreNotCoveredTest01()
        {
            String inPdf = TEST_RESOURCES_PATH + "bytesAreNotCoveredTest01.pdf";

            PdfReader  reader     = new PdfReader(inPdf);
            AcroFields acroFields = reader.AcroFields;

            Assert.False(acroFields.SignatureCoversWholeDocument("Signature1"));
        }
示例#5
0
        /**
         * Signs a PDF where space was already reserved.
         * @param reader the original PDF
         * @param fieldName the field to sign. It must be the last field
         * @param outs the output PDF
         * @param externalSignatureContainer the signature container doing the actual signing. Only the
         * method ExternalSignatureContainer.sign is used
         * @throws DocumentException
         * @throws IOException
         * @throws GeneralSecurityException
         */
        public static void SignDeferred(PdfReader reader, String fieldName, Stream outs, IExternalSignatureContainer externalSignatureContainer)
        {
            AcroFields    af = reader.AcroFields;
            PdfDictionary v  = af.GetSignatureDictionary(fieldName);

            if (v == null)
            {
                throw new DocumentException("No field");
            }
            if (!af.SignatureCoversWholeDocument(fieldName))
            {
                throw new DocumentException("Not the last signature");
            }
            PdfArray b = v.GetAsArray(PdfName.BYTERANGE);

            long[] gaps = b.AsLongArray();
            if (b.Size != 4 || gaps[0] != 0)
            {
                throw new DocumentException("Single exclusion space supported");
            }
            IRandomAccessSource readerSource = reader.SafeFile.CreateSourceView();
            Stream rg = new RASInputStream(new RandomAccessSourceFactory().CreateRanged(readerSource, gaps));

            byte[] signedContent  = externalSignatureContainer.Sign(rg);
            int    spaceAvailable = (int)(gaps[2] - gaps[1]) - 2;

            if ((spaceAvailable & 1) != 0)
            {
                throw new DocumentException("Gap is not a multiple of 2");
            }
            spaceAvailable /= 2;
            if (spaceAvailable < signedContent.Length)
            {
                throw new DocumentException("Not enough space");
            }
            StreamUtil.CopyBytes(readerSource, 0, gaps[1] + 1, outs);
            ByteBuffer bb = new ByteBuffer(spaceAvailable * 2);

            foreach (byte bi in signedContent)
            {
                bb.AppendHex(bi);
            }
            int remain = (spaceAvailable - signedContent.Length) * 2;

            for (int k = 0; k < remain; ++k)
            {
                bb.Append((byte)48);
            }
            bb.WriteTo(outs);
            StreamUtil.CopyBytes(readerSource, gaps[2] - 1, gaps[3] + 1, outs);
        }
示例#6
0
        private bool ValidarFirma(AcroFields campos, string nombre)
        {
            // Solo se verificará la última revision del documento.

            if (campos.GetRevision(nombre) != campos.TotalRevisions)
            {
                return(false);
            }

            // Solo se verificará si la firma es de todo el documento.

            if (!campos.SignatureCoversWholeDocument(nombre))
            {
                return(false);
            }

            var firma = campos.VerifySignature(nombre);

            if (!firma.Verify())
            {
                return(false);
            }

            foreach (var certificadoDocumento in firma.Certificates)
            {
                foreach (var certificadoDeConfianza in certificado.Chain)
                {
                    try
                    {
                        certificadoDocumento.Verify(certificadoDeConfianza.GetPublicKey());
                        // Si llega hasta aquí, es porque la última firma fue realizada

                        // con el certificado del sistema.

                        return(true);
                    }
                    catch (InvalidKeyException)
                    {
                        continue;
                    }
                    catch (Exception ex)
                    {
                        Trace.TraceError("Error: {0}", ex);
                        continue;
                    }
                }
            }

            return(false);
        }
示例#7
0
        public PdfPKCS7 VerifySignature(AcroFields fields, String name)
        {
            Console.WriteLine("Signature covers whole document: " + fields.SignatureCoversWholeDocument(name));
            Console.WriteLine("Document revision: " + fields.GetRevision(name) + " of " + fields.TotalRevisions);
            PdfPKCS7 pkcs7 = fields.VerifySignature(name);

            Console.WriteLine("Integrity check OK? " + pkcs7.Verify());
            Console.WriteLine("Digest algorithm: " + pkcs7.GetHashAlgorithm());
            Console.WriteLine("Encryption algorithm: " + pkcs7.GetEncryptionAlgorithm());
            Console.WriteLine("Filter subtype: " + pkcs7.GetFilterSubtype());
            X509Certificate cert = pkcs7.SigningCertificate;

            Console.WriteLine("Name of the signer: " + CertificateInfo.GetSubjectFields(cert).GetField("CN"));
            return(pkcs7);
        }
        private bool ValidarAssinatura(AcroFields campos, string nome)
        {
            // Só verifica a última revisão do documento.
            if (campos.GetRevision(nome) != campos.TotalRevisions)
            {
                return(false);
            }

            // Só verifica se a assinatura é do documento todo.
            if (!campos.SignatureCoversWholeDocument(nome))
            {
                return(false);
            }

            var assinatura = campos.VerifySignature(nome);

            if (!assinatura.Verify())
            {
                return(false);
            }

            foreach (var certificadoDocumento in assinatura.Certificates)
            {
                foreach (var certificadoDeConfianca in certificado.Chain)
                {
                    try
                    {
                        certificadoDocumento.Verify(certificadoDeConfianca.GetPublicKey());
                        // Só entra aqui se a ultima assinatura foi assinada com certificado

                        return(true);
                    }
                    catch (InvalidKeyException)
                    {
                        continue;
                    }
                    catch (Exception ex)
                    {
                        Trace.TraceError("Error: {0}", ex);
                        continue;
                    }
                }
            }

            return(false);
        }
示例#9
0
文件: PdfSign.cs 项目: Lietuva2/LT2
        /// <summary>
        /// Verifies the signature of a prevously signed PDF document using the specified public key
        /// </summary>
        /// <param name="pdfFile">a Previously signed pdf document</param>
        /// <param name="publicKeyStream">Public key to be used to verify the signature in .cer format</param>
        /// <exception cref="System.InvalidOperationException">Throw System.InvalidOperationException if the document is not signed or the signature could not be verified</exception>
        public static void VerifyPdfSignature(string pdfFile, Stream publicKeyStream)
        {
            var parser      = new X509CertificateParser();
            var certificate = parser.ReadCertificate(publicKeyStream);

            publicKeyStream.Dispose();

            PdfReader  reader = new PdfReader(pdfFile);
            AcroFields af     = reader.AcroFields;
            var        names  = af.GetSignatureNames();

            if (names.Count == 0)
            {
                throw new InvalidOperationException("No Signature present in pdf file.");
            }

            foreach (string name in names)
            {
                if (!af.SignatureCoversWholeDocument(name))
                {
                    throw new InvalidOperationException(string.Format("The signature: {0} does not covers the whole document.", name));
                }

                PdfPKCS7 pk  = af.VerifySignature(name);
                var      cal = pk.SignDate;
                var      pkc = pk.Certificates;

                if (!pk.Verify())
                {
                    throw new InvalidOperationException("The signature could not be verified.");
                }
                if (!pk.VerifyTimestampImprint())
                {
                    throw new InvalidOperationException("The signature timestamp could not be verified.");
                }

                var fails = CertificateVerification.VerifyCertificates(pkc, new[] { certificate }, null, cal);
                if (fails != null && fails.Any())
                {
                    throw new InvalidOperationException("The file is not signed using the specified key-pair.");
                }
            }
        }
        /**
         * Checks if the signature covers the whole document
         * and throws an exception if the document was altered
         * @return a PdfPKCS7 object
         * @throws GeneralSecurityException
         */
        virtual protected PdfPKCS7 CoversWholeDocument()
        {
            PdfPKCS7 pkcs7 = fields.VerifySignature(signatureName);

            if (fields.SignatureCoversWholeDocument(signatureName))
            {
                LOGGER.Info("The timestamp covers whole document.");
            }
            else
            {
                throw new VerificationException(null, "Signature doesn't cover whole document.");
            }
            if (pkcs7.Verify())
            {
                LOGGER.Info("The signed document has not been modified.");
                return(pkcs7);
            }
            throw new VerificationException(null, "The document was altered after the signature was applied.");
        }
        public static int Main(string[] args)
        {
            // Разбираем аргументы
            if (args.Length < 1)
            {
                Console.WriteLine("Pdf.Verify <document>");
                return(1);
            }
            string document = args[0];

            // Открываем документ
            PdfReader reader = new PdfReader(document);

            // Получаем подписи из документа
            AcroFields    af    = reader.AcroFields;
            List <string> names = af.GetSignatureNames();

            foreach (string name in names)
            {
                string message = "Signature name: " + name;
                message += "\nSignature covers whole document: " + af.SignatureCoversWholeDocument(name);
                message += "\nDocument revision: " + af.GetRevision(name) + " of " + af.TotalRevisions;
                Console.WriteLine(message);

                // Проверяем подпись
                // szOID_CP_GOST_R3411_12_256	"1.2.643.7.1.1.2.2"	Функция хэширования ГОСТ Р 34.11-2012, длина выхода 256 бит

                PdfPKCS7 pk  = af.VerifySignature(name);
                DateTime cal = pk.SignDate;
                Org.BouncyCastle.X509.X509Certificate[] pkc = pk.Certificates;
                message  = "Certificate " + pk.SigningCertificate;
                message += "\nDocument modified: " + !pk.Verify();
                message += "\nDate: " + cal.ToShortDateString();

                // Проверим сертификат через CAPI
                X509Certificate2 cert = new X509Certificate2(pk.SigningCertificate.GetEncoded());
                var isCAPIValid       = cert.Verify();
                message += "\nCAPI Validation: " + isCAPIValid.ToString();
                Console.WriteLine(message);
            }

            return(0);
        }
示例#12
0
        private static PdfPKCS7 VerifySignature(AcroFields fields, String name, ref MessageReport.Signature sigInfo)
        {
            sigInfo.isCoveringWholeDocument = fields.SignatureCoversWholeDocument(name);

            PdfPKCS7 pkcs7 = fields.VerifySignature(name);

            sigInfo.isIntegral = pkcs7.Verify();

            X509Certificate[] certs = pkcs7.SignCertificateChain;
            DateTime          cal   = pkcs7.SignDate;

            IList <VerificationException> errors = CertificateVerification.VerifyCertificates(certs, certificates, null, cal);

            if (errors == null)
            {
                Console.WriteLine("Certificates verified against the KeyStore");
            }
            else
            {
                foreach (object error in errors)
                {
                    Console.WriteLine(error);
                }
            }
            for (int i = 0; i < certs.Length; ++i)
            {
                X509Certificate cert = certs[i];
            }
            X509Certificate signCert   = certs[0];
            X509Certificate issuerCert = (certs.Length > 1 ? certs[1] : null);

            sigInfo.Certificate = GetCertificateInfo(signCert, cal.ToLocalTime());

            sigInfo.isValidDateSigning = CheckRevocation(pkcs7, signCert, issuerCert, cal);

            sigInfo.isValidToday = CheckRevocation(pkcs7, signCert, issuerCert, DateTime.Now.AddDays(-1));



            return(pkcs7);
        }
        public static SignatureValidation VerifySignature(X509Certificate certificate, string input)
        {
            PdfReader  reader         = new PdfReader(input);
            AcroFields fields         = reader.AcroFields;
            ArrayList  signatureNames = fields.GetSignatureNames();

            if (signatureNames.Count == 0)
            {
                return(null);
            }

            SignatureValidation result = null;

            foreach (string signatureName in signatureNames)
            {
                PdfPKCS7 pkcs7 = fields.VerifySignature(signatureName);

                if (certificate.SerialNumber.CompareTo(pkcs7.SigningCertificate.SerialNumber) == 0)
                {
                    byte[] b1 = certificate.GetSignature();
                    byte[] b2 = pkcs7.SigningCertificate.GetSignature();

                    if (b1.SequenceEqual(b2))
                    {
                        result = new SignatureValidation();
                        result.SignatureDate = pkcs7.SignDate;
                        result.SignatureName = pkcs7.SignName;
                        result.Reason        = pkcs7.Reason;
                        result.Location      = pkcs7.Location;
                        result.SignatureCoversWholeDocument = fields.SignatureCoversWholeDocument(signatureName);
                        result.Verified         = pkcs7.Verify();
                        result.CertificateValid = true;
                        return(result);
                    }
                }
            }
            return(null);
        }
示例#14
0
        public async Task <m_verify> Verify(string pdfFile, Stream fileStream)
        {
            //KeyStore kall = PdfPKCS7.loadCacertsKeyStore();
            var parser  = new X509CertificateParser(fileStream);
            var certifi = parser.ReadCertificate();

            fileStream.Dispose();

            //List<m_verify> results = new List<m_verify>();

            PdfReader  reader = new PdfReader(pdfFile);
            AcroFields af     = reader.AcroFields;
            var        names  = af.GetSignatureNames();

            if (names.Count == 0)
            {
                System.Diagnostics.Debug.WriteLine("Tidak ada ttdnya");
            }
            else
            {
                this.avai = "Digital Signature Available";
                System.Diagnostics.Debug.WriteLine("IKI lo TTD ne yooow");
            }
            foreach (string name in names)
            {
                if (!af.SignatureCoversWholeDocument(name))
                {
                    System.Diagnostics.Debug.WriteLine("The signature: {0} does not covers the whole document.", name);
                }

                System.Diagnostics.Debug.WriteLine("Signature Name: " + name);
                System.Diagnostics.Debug.WriteLine("Signature covers whole document: " + af.SignatureCoversWholeDocument(name));

                this.nFile = name;
                this.cove  = af.SignatureCoversWholeDocument(name);

                PdfPKCS7 pk  = af.VerifySignature(name);
                var      cal = pk.SignDate;
                var      pkc = pk.Certificates;
                // TimeStampToken ts = pk.TimeStampToken;
                if (!pk.Verify())
                {
                    System.Diagnostics.Debug.WriteLine("The signature could not be verified");
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("Name signature: " + pk.SignName);
                    System.Diagnostics.Debug.WriteLine("Reason signature: " + pk.Reason);
                    System.Diagnostics.Debug.WriteLine("Location signature: " + pk.Location);
                    System.Diagnostics.Debug.WriteLine("Date signature: " + pk.SignDate);
                    System.Diagnostics.Debug.WriteLine("Version signature: " + pk.SigningInfoVersion);
                    System.Diagnostics.Debug.WriteLine("Sertificate signature: " + pk.SigningCertificate);

                    this.nSign   = pk.SignName;
                    this.reaso   = pk.Reason;
                    this.locatio = pk.Location;
                    this.dat     = pk.SignDate;
                    this.versio  = pk.SigningInfoVersion;
                }

                //IList<VerificationException>[] fails = PdfPKCS7.VerifyCertificates(pkc, new X509Certificate[] { certifi }, null, cal);
                //Object[] fails = PdfPKCS7.VerifyCertificates(pkc, new X509Certificate[] { }, null, cal);
                //if (fails != null)
                //{
                //    System.Diagnostics.Debug.WriteLine("The file is not signed using the specified key-pair.");
                //}
            }
            return(new m_verify
            {
                available = this.avai,

                nameFile = this.nFile,

                cover = this.cove,

                nameSign = this.nSign,

                reason = this.reaso,

                location = this.locatio,

                date = this.dat,

                version = this.versio
            });
        }
示例#15
0
        public m_verify Get()
        {
            string sert = HttpContext.Current.Server.MapPath("~/UploadFile/sertifikat/nunu.pfx");
            string outp = HttpContext.Current.Server.MapPath("~/UploadFile/sertifikat/nani.cer");

            X509Certificate2 certificate   = new X509Certificate2(sert, "nuwas1903");
            StringBuilder    publicBuilder = new StringBuilder();

            publicBuilder.AppendLine("--BEGIN CERTIFICATE--");
            publicBuilder.AppendLine(Convert.ToBase64String(certificate.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks));
            publicBuilder.AppendLine("—–END CERTIFICATE—–");
            publicBuilder.ToString();

            System.Diagnostics.Debug.WriteLine(publicBuilder.ToString());
            File.WriteAllText(outp, publicBuilder.ToString());

            Stream fileStream = new FileStream(outp, FileMode.Open);

            PDFVerify verif = new PDFVerify();
            var       ver   = verif.Verify(pathToFiles, fileStream);


            //KeyStore kall = PdfPKCS7.loadCacertsKeyStore();
            //var parser = new X509CertificateParser(fileStream);
            //var certifi = parser.ReadCertificate();
            //fileStream.Dispose();

            //List<m_verify> results = new List<m_verify>();

            PdfReader  reader = new PdfReader(pathToFiles);
            AcroFields af     = reader.AcroFields;
            var        names  = af.GetSignatureNames();

            if (names.Count == 0)
            {
                System.Diagnostics.Debug.WriteLine("Tidak ada ttdnya");
            }
            else
            {
                this.avai = "Digital Signature Available";
                System.Diagnostics.Debug.WriteLine("IKI lo TTD ne yooow");
            }
            foreach (string name in names)
            {
                if (!af.SignatureCoversWholeDocument(name))
                {
                    System.Diagnostics.Debug.WriteLine("The signature: {0} does not covers the whole document.", name);
                }

                System.Diagnostics.Debug.WriteLine("Signature Name: " + name);
                System.Diagnostics.Debug.WriteLine("Signature covers whole document: " + af.SignatureCoversWholeDocument(name));

                this.nFile = name;
                this.cove  = af.SignatureCoversWholeDocument(name);

                PdfPKCS7 pk  = af.VerifySignature(name);
                var      cal = pk.SignDate;
                var      pkc = pk.Certificates;
                // TimeStampToken ts = pk.TimeStampToken;
                if (!pk.Verify())
                {
                    System.Diagnostics.Debug.WriteLine("The signature could not be verified");
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("Name signature: " + pk.SignName);
                    System.Diagnostics.Debug.WriteLine("Reason signature: " + pk.Reason);
                    System.Diagnostics.Debug.WriteLine("Location signature: " + pk.Location);
                    System.Diagnostics.Debug.WriteLine("Date signature: " + pk.SignDate);
                    System.Diagnostics.Debug.WriteLine("Version signature: " + pk.SigningInfoVersion);
                    System.Diagnostics.Debug.WriteLine("Sertificate signature: " + pk.SigningCertificate);

                    this.nSign   = pk.SignName;
                    this.reaso   = pk.Reason;
                    this.locatio = pk.Location;
                    this.dat     = pk.SignDate;
                    this.versio  = pk.SigningInfoVersion;
                }

                //IList<VerificationException>[] fails = PdfPKCS7.VerifyCertificates(pkc, new X509Certificate[] { certifi }, null, cal);
                //object[] fails = PdfPKCS7.VerifyCertificates(pkc, new X509Certificate[] { certifi }, null, cal);
                //if (fails != null)
                //{
                //    System.Diagnostics.Debug.WriteLine("The file is not signed using the specified key-pair.");
                //}
            }
            return(new m_verify
            {
                available = this.avai,

                nameFile = this.nFile,

                cover = this.cove,

                nameSign = this.nSign,

                reason = this.reaso,

                location = this.locatio,

                date = this.dat,

                version = this.versio
            });
        }
示例#16
0
        public void loadSignInfo(string pdf_filename)
        {
            PdfReader  reader   = new PdfReader(pdf_filename);
            AcroFields fields   = reader.AcroFields;
            int        sigIndex = 1;
            SignatureImageExtractor extractor = new SignatureImageExtractor(reader);

            foreach (string sigFieldName in fields.GetSignatureNames())
            {
                PdfImageObject image = extractor.extractImage(sigFieldName);
                MemoryStream   ms    = new MemoryStream(image.GetImageAsBytes());

                SigObj sig = new SigObj();

                ReadEncodedBitmapResult result = sig.ReadEncodedBitmap(ms.ToArray());
                if (result == ReadEncodedBitmapResult.ReadEncodedBitmapOK)
                {
                    //MessageBox.Show(sig.Who + " " + sig.Why + " " + sig.When);
                    treeView1.BeginUpdate();
                    treeView1.Nodes.Add("Signature " + sigIndex);
                    treeView1.Nodes[sigIndex - 1].Nodes.Add("Name: " + sig.Who);
                    treeView1.Nodes[sigIndex - 1].Nodes.Add("Reason: " + sig.Why);
                    treeView1.Nodes[sigIndex - 1].Nodes.Add("Timestamp: " + sig.When);

                    treeView1.Nodes[sigIndex - 1].Nodes.Add("Digitizer: " + sig.get_AdditionalData(CaptData.CaptDigitizer));
                    treeView1.Nodes[sigIndex - 1].Nodes.Add("Digitizer Driver: " + sig.get_AdditionalData(CaptData.CaptDigitizerDriver));
                    treeView1.Nodes[sigIndex - 1].Nodes.Add("Machine OS: " + sig.get_AdditionalData(CaptData.CaptMachineOS));
                    treeView1.Nodes[sigIndex - 1].Nodes.Add("Network Card: " + sig.get_AdditionalData(CaptData.CaptNetworkCard));

                    treeView1.Nodes[sigIndex - 1].Nodes.Add("Signature Covers whole document: " + fields.SignatureCoversWholeDocument(sigFieldName).ToString());
                    treeView1.Nodes[sigIndex - 1].Nodes.Add("Document Revision: " + fields.GetRevision(sigFieldName).ToString() + " of " + fields.TotalRevisions.ToString());

                    PdfPKCS7 pkcs7 = fields.VerifySignature(sigFieldName);

                    treeView1.Nodes[sigIndex - 1].Nodes.Add("Integrity Check OK? " + pkcs7.Verify().ToString());

                    treeView1.EndUpdate();

                    sigIndex = sigIndex + 1;
                }
                ms.Close();
            }

            treeView1.ExpandAll();
        }
示例#17
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="testFile"></param>
        /// <param name="profile"></param>
        /// <param name="passwords"></param>
        /// <param name="numberOfSignatures"></param>
        /// <param name="allowMultisigning"></param>
        public static void TestSignature(string testFile, ConversionProfile profile, JobPasswords passwords, int numberOfSignatures, bool allowMultisigning)
        {
            PdfReader pdfReader;

            if (profile.PdfSettings.Security.Enabled)
            {
                if (profile.PdfSettings.Security.RequireUserPassword)
                {
                    pdfReader = new PdfReader(testFile, Encoding.Default.GetBytes(passwords.PdfUserPassword));
                }
                else
                {
                    pdfReader = new PdfReader(testFile, Encoding.Default.GetBytes(passwords.PdfOwnerPassword));
                }
            }
            else
            {
                pdfReader = new PdfReader(testFile);
            }

            AcroFields af = pdfReader.AcroFields;

            //Stop here if no Signing was requested
            if (!profile.PdfSettings.Signature.Enabled)
            {
                Assert.AreEqual(0, af.GetSignatureNames().Count, "SignatureName(s) in unsigned file." + Environment.NewLine + "(" + testFile + ")");
                return;
            }
            //Proceed with checking the number of signatures
            Assert.AreEqual(numberOfSignatures, af.GetSignatureNames().Count, "Number of SignatureNames must be " + numberOfSignatures + Environment.NewLine + "(" + testFile + ")");

            #region Verify the last or single signature in document, which must be always valid
            String   signatureName = af.GetSignatureNames()[numberOfSignatures - 1];
            PdfPKCS7 pk            = af.VerifySignature(signatureName);

            Assert.IsTrue(pk.Verify(), "(Last) Signature in document, is not valid.");
            Assert.IsTrue(af.SignatureCoversWholeDocument(signatureName), "(Last) signature in document, does not cover whole document.");

            TimeSpan ts = DateTime.Now.ToUniversalTime() - pk.TimeStampDate;
            Assert.IsTrue(Math.Abs(ts.TotalHours) < 1, "Time stamp has a difference bigger than 1h from now." + Environment.NewLine + "(" + testFile + ")");

            Assert.AreEqual(profile.PdfSettings.Signature.SignLocation, pk.Location, "Wrong SignLocation." + Environment.NewLine + "(" + testFile + ")");
            Assert.AreEqual(profile.PdfSettings.Signature.SignReason, pk.Reason, "Wrong SignReason." + Environment.NewLine + "(" + testFile + ")");

            if (profile.PdfSettings.Signature.DisplaySignatureInDocument)
            {
                switch (profile.PdfSettings.Signature.SignaturePage)
                {
                case SignaturePage.FirstPage:
                    Assert.AreEqual(1, af.GetFieldPositions(signatureName)[0].page, "Signature is not on the first page." + Environment.NewLine + "(" + testFile + ")");
                    break;

                case SignaturePage.CustomPage:
                    if (profile.PdfSettings.Signature.SignatureCustomPage > pdfReader.NumberOfPages)
                    {
                        Assert.AreEqual(pdfReader.NumberOfPages, af.GetFieldPositions(signatureName)[0].page, "Signature is not on the requested page." + Environment.NewLine + "(" + testFile + ")");
                    }
                    else
                    {
                        Assert.AreEqual(profile.PdfSettings.Signature.SignatureCustomPage, af.GetFieldPositions(signatureName)[0].page, "Signature is not on the requested page." + Environment.NewLine + "(" + testFile + ")");
                    }
                    break;

                case SignaturePage.LastPage:
                    Assert.AreEqual(pdfReader.NumberOfPages, af.GetFieldPositions(signatureName)[0].page, "Signature is not on the last Page." + Environment.NewLine + "(" + testFile + ")");
                    break;
                }
                Assert.AreEqual(profile.PdfSettings.Signature.LeftX, (int)af.GetFieldPositions(signatureName)[0].position.GetLeft(0), "Wrong position for LeftX." + Environment.NewLine + "(" + testFile + ")");
                Assert.AreEqual(profile.PdfSettings.Signature.LeftY, (int)af.GetFieldPositions(signatureName)[0].position.GetBottom(0), "Wrong position for LeftY." + Environment.NewLine + "(" + testFile + ")");
                Assert.AreEqual(profile.PdfSettings.Signature.RightX, (int)af.GetFieldPositions(signatureName)[0].position.GetRight(0), "Wrong position for RightX." + Environment.NewLine + "(" + testFile + ")");
                Assert.AreEqual(profile.PdfSettings.Signature.RightY, (int)af.GetFieldPositions(signatureName)[0].position.GetTop(0), "Wrong position for RightY." + Environment.NewLine + "(" + testFile + ")");
            }
            else
            {
                Assert.AreEqual(1, af.GetFieldPositions(signatureName)[0].page, "Wrong position for \"invisible\" signature." + Environment.NewLine + "(" + testFile + ")");
                Assert.AreEqual(0, (int)af.GetFieldPositions(signatureName)[0].position.GetLeft(0), "Wrong position for \"invisible\" signature." + Environment.NewLine + "(" + testFile + ")");
                Assert.AreEqual(0, (int)af.GetFieldPositions(signatureName)[0].position.GetBottom(0), "Wrong position for \"invisible\" signature." + Environment.NewLine + "(" + testFile + ")");
                Assert.AreEqual(0, (int)af.GetFieldPositions(signatureName)[0].position.GetRight(0), "Wrong position for \"invisible\" signature." + Environment.NewLine + "(" + testFile + ")");
                Assert.AreEqual(0, (int)af.GetFieldPositions(signatureName)[0].position.GetTop(0), "Wrong position for \"invisible\" signature." + Environment.NewLine + "(" + testFile + ")");
            }
            #endregion

            /*
             * var stamper = new PdfStamper(pdfReader, );
             *
             * if (profile.PdfSettings.Signature.AllowMultiSigning)
             *  Assert.AreEqual(0, stamper.SignatureAppearance);
             * else
             *  Assert.AreEqual(1, stamper.SignatureAppearance);
             *
             * stamper.Close();
             */

            /*
             * //Check validity of previous signatures. They must be valid if multi signing is allowed, otherwise they must be invalid.
             * for (int i = 1; i < numberOfSignatures; i++)
             * {
             *  String previousSignName = af.GetSignatureNames()[i-1];
             *  //PdfPKCS7 previousPk = af.VerifySignature(previousSignName);
             *
             *  if (allowMultisigning)
             *  {
             *      var sig = af.VerifySignature(previousSignName);
             *      Assert.IsTrue(sig.Verify(), "");
             *      Assert.IsTrue(af.SignatureCoversWholeDocument(previousSignName),
             *          "Last or single signature in document, does not cover whole document , although multi signing was enabled.");
             *  }
             *  else
             *  {
             *      var sig = af.VerifySignature(previousSignName);
             *      Assert.IsFalse(sig.Verify(), "");
             *      Assert.IsFalse(af.SignatureCoversWholeDocument(previousSignName),
             *          "Last or single signature in document, covers whole document , although multi signing was disabled.");
             *  }
             * }
             */
        }