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")); }
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")); }
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); }
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")); }
/** * 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); }
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); }
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); }
/// <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); }
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); }
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 }); }
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 }); }
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(); }
/// <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."); * } * } */ }