Hi, Is there a convenience way to compute the size needed for an external signature, prior to signing? To clarify my question. The following is an example from http://itextpdf.sourceforge.net/howtosign.html, which shows how an external signature is added to a pdf.
> KeyStore ks = KeyStore.getInstance("pkcs12"); > ks.load(new FileInputStream("my_private_key.pfx"), > "my_password".toCharArray()); > String alias = (String)ks.aliases().nextElement(); > PrivateKey key = (PrivateKey)ks.getKey(alias, "password".toCharArray()); > Certificate[] chain = ks.getCertificateChain(alias); > > PdfReader reader = new PdfReader("original.pdf"); > FileOutputStream fout = new FileOutputStream("signed.pdf"); > PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0'); > PdfSignatureAppearance sap = stp.getSignatureAppearance(); > // comment next line to have an invisible signature > sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null); > sap.setLayer2Text("This is some custom made text.\n\nDate: some date"); > Calendar cal = Calendar.getInstance(); > PdfDictionary dic = new PdfDictionary(); > dic.put(PdfName.FT, PdfName.SIG); > dic.put(PdfName.FILTER, new PdfName("SAFE.PPKSF")); > dic.put(PdfName.SUBFILTER, new PdfName("adbe.pkcs7.detached")); > dic.put(PdfName.M, new PdfDate(cal)); > dic.put(PdfName.NAME, new > PdfString(PdfPKCS7.getSubjectFields((X509Certificate)chain[0]).getField("CN"))); > sap.setCryptoDictionary(dic); > HashMap exc = new HashMap(); > exc.put(PdfName.CONTENTS, new Integer(0x2502)); here we save space for the signature. the size of the signature is hardcoded in this example. my question is how do I compute this size prior to generating the signature? > sap.preClose(exc); > > PdfPKCS7 pk7 = new PdfPKCS7(key, chain, null, "SHA1", null, false); > MessageDigest messageDigest = MessageDigest.getInstance("SHA1"); > byte buf[] = new byte[8192]; > int n; > InputStream inp = sap.getRangeStream(); > while ((n = inp.read(buf)) > 0) { > messageDigest.update(buf, 0, n); > } > byte hash[] = messageDigest.digest(); > byte sh[] = pk7.getAuthenticatedAttributeBytes(hash, cal); > pk7.update(sh, 0, sh.length); > PdfDictionary dic2 = new PdfDictionary(); > byte sg[] = pk7.getEncodedPKCS7(hash, cal); > byte out[] = new byte[0x2500 / 2]; > System.arraycopy(sg, 0, out, 0, sg.length); > dic2.put(PdfName.CONTENTS, new PdfString(out).setHexWriting(true)); > sap.close(dic2); Thanks in advance. Regards, Armin ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ iText-questions mailing list iText-questions@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/itext-questions Buy the iText book: http://itext.ugent.be/itext-in-action/