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/

Reply via email to