see the book examples at part3 and chapter12

/*
  * This class is part of the book "iText in Action - 2nd Edition"
  * written by Bruno Lowagie (ISBN: 9781935182610)
  * For more info, go to: http://itextpdf.com/examples/
  * This example only works with the AGPL version of iText.
  */
package part3.chapter12;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Properties;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfPKCS7;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSignatureAppearance;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;

public class Signatures {

     /** The resulting PDF */
     public static String ORIGINAL = "results/part3/chapter12/hello.pdf";
     /** The resulting PDF */
     public static String SIGNED1 = "results/part3/chapter12/signature_1.pdf";
     /** The resulting PDF */
     public static String SIGNED2 = "results/part3/chapter12/signature_2.pdf";
     /** Info after verification of a signed PDF */
     public static String VERIFICATION = "results/part3/chapter12/verify.txt";
     /** The resulting PDF */
     public static String REVISION = "results/part3/chapter12/revision_1.pdf";

     /**
      * A properties file that is PRIVATE.
      * You should make your own properties file and adapt this line.
      */
     public static String PATH = "c:/home/blowagie/key.properties";
     /** Some properties used when signing. */
     public static Properties properties = new Properties();
     /** One of the resources. */
     public static final String RESOURCE = "resources/img/logo.gif";

     /**
      * Creates a PDF document.
      * @param filename the path to the new PDF document
      * @throws DocumentException
      * @throws IOException
      */
     public void createPdf(String filename) throws IOException,  
DocumentException {
         Document document = new Document();
         PdfWriter.getInstance(document, new FileOutputStream(filename));
         document.open();
         document.add(new Paragraph("Hello World!"));
         document.close();
     }

     /**
      * Manipulates a PDF file src with the file dest as result
      * @param src the original PDF
      * @param dest the resulting PDF
      * @throws IOException
      * @throws DocumentException
      * @throws GeneralSecurityException
      */
     public void signPdfFirstTime(String src, String dest)
         throws IOException, DocumentException, GeneralSecurityException {
         String path = properties.getProperty("PRIVATE");
         String keystore_password = properties.getProperty("PASSWORD");
         String key_password = properties.getProperty("PASSWORD");
         KeyStore ks = KeyStore.getInstance("pkcs12", "BC");
         ks.load(new FileInputStream(path), keystore_password.toCharArray());
         String alias = (String)ks.aliases().nextElement();
         PrivateKey key = (PrivateKey) ks.getKey(alias,  
key_password.toCharArray());
         Certificate[] chain = ks.getCertificateChain(alias);
         PdfReader reader = new PdfReader(src);
         FileOutputStream os = new FileOutputStream(dest);
         PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
         PdfSignatureAppearance appearance = stamper
                 .getSignatureAppearance();
         appearance.setCrypto(key, chain, null,
                 PdfSignatureAppearance.WINCER_SIGNED);
         appearance.setImage(Image.getInstance(RESOURCE));
         appearance.setReason("I've written this.");
         appearance.setLocation("Foobar");
         appearance.setVisibleSignature(new Rectangle(72, 732, 144,  
780), 1,    "first");
         stamper.close();
     }

     /**
      * Manipulates a PDF file src with the file dest as result
      * @param src the original PDF
      * @param dest the resulting PDF
      * @throws IOException
      * @throws DocumentException
      * @throws GeneralSecurityException
      */
     public void signPdfSecondTime(String src, String dest)
         throws IOException, DocumentException, GeneralSecurityException {
         String path = "resources/encryption/.keystore";
         String keystore_password = "f00b4r";
         String key_password = "f1lmf3st";
         String alias = "foobar";
         KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
         ks.load(new FileInputStream(path), keystore_password.toCharArray());
         PrivateKey key = (PrivateKey) ks.getKey(alias,  
key_password.toCharArray());
         Certificate[] chain = ks.getCertificateChain(alias);
         PdfReader reader = new PdfReader(src);
         FileOutputStream os = new FileOutputStream(dest);
         PdfStamper stamper = PdfStamper.createSignature(reader, os,  
'\0', null, true);
         PdfSignatureAppearance appearance = stamper
                 .getSignatureAppearance();
         appearance.setCrypto(key, chain, null,
                 PdfSignatureAppearance.WINCER_SIGNED);
         appearance.setReason("I'm approving this.");
         appearance.setLocation("Foobar");
         appearance.setVisibleSignature(new Rectangle(160, 732, 232,  
780), 1, "second");
         stamper.close();

     }

     /**
      * Verifies the signatures of a PDF we've signed twice.
      * @throws GeneralSecurityException
      * @throws IOException
      */
     public void verifySignatures() throws GeneralSecurityException,  
IOException {
         KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
         ks.load(null, null);
         CertificateFactory cf = CertificateFactory.getInstance("X509");
         FileInputStream is1 = new  
FileInputStream(properties.getProperty("ROOTCERT"));
         X509Certificate cert1 = (X509Certificate) cf.generateCertificate(is1);
         ks.setCertificateEntry("cacert", cert1);
         FileInputStream is2 = new  
FileInputStream("resources/encryption/foobar.cer");
         X509Certificate cert2 = (X509Certificate) cf.generateCertificate(is2);
         ks.setCertificateEntry("foobar", cert2);

         PrintWriter out = new PrintWriter(new FileOutputStream(VERIFICATION));
         PdfReader reader = new PdfReader(SIGNED2);
         AcroFields af = reader.getAcroFields();
         ArrayList<String> names = af.getSignatureNames();
         for (String name : names) {
             out.println("Signature name: " + name);
             out.println("Signature covers whole document: " +  
af.signatureCoversWholeDocument(name));
             out.println("Document revision: " + af.getRevision(name)  
+ " of " + af.getTotalRevisions());
             PdfPKCS7 pk = af.verifySignature(name);
             Calendar cal = pk.getSignDate();
             Certificate[] pkc = pk.getCertificates();
             out.println("Subject: " +  
PdfPKCS7.getSubjectFields(pk.getSigningCertificate()));
             out.println("Revision modified: " + !pk.verify());
             Object fails[] = PdfPKCS7.verifyCertificates(pkc, ks, null, cal);
             if (fails == null)
                 out.println("Certificates verified against the KeyStore");
             else
                 out.println("Certificate failed: " + fails[1]);
         }
         out.flush();
         out.close();
     }

     /**
      * Extracts the first revision of a PDF we've signed twice.
      * @throws IOException
      */
     public void extractFirstRevision() throws IOException {
         PdfReader reader = new PdfReader(SIGNED2);
         AcroFields af = reader.getAcroFields();
         FileOutputStream os = new FileOutputStream(REVISION);
         byte bb[] = new byte[1028];
         InputStream ip = af.extractRevision("first");
         int n = 0;
         while ((n = ip.read(bb)) > 0)
             os.write(bb, 0, n);
         os.close();
         ip.close();
     }

     /**
      * Main method.
      *
      * @param    args    no arguments needed
      * @throws DocumentException
      * @throws IOException
      * @throws GeneralSecurityException
      */
     public static void main(String[] args)
         throws IOException, DocumentException, GeneralSecurityException {
         Security.addProvider(new BouncyCastleProvider());
         properties.load(new FileInputStream(PATH));
         Signatures signatures = new Signatures();
         signatures.createPdf(ORIGINAL);
         signatures.signPdfFirstTime(ORIGINAL, SIGNED1);
         signatures.signPdfSecondTime(SIGNED1, SIGNED2);
         signatures.verifySignatures();
         signatures.extractFirstRevision();
     }
}

--------------------------------------------------------

/*
  * This class is part of the book "iText in Action - 2nd Edition"
  * written by Bruno Lowagie (ISBN: 9781935182610)
  * For more info, go to: http://itextpdf.com/examples/
  * This example only works with the AGPL version of iText.
  */
package part3.chapter12;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.Security;
import java.security.Signature;
import java.security.cert.Certificate;
import java.util.Properties;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfLiteral;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfPKCS7;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSigGenericPKCS;
import com.itextpdf.text.pdf.PdfSignatureAppearance;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfString;

public class SignatureExternalHash {

     /**
      * A properties file that is PRIVATE.
      * You should make your own properties file and adapt this line.
      */
     public static String PATH = "c:/home/blowagie/key.properties";
     /** Some properties used when signing. */
     public static Properties properties = new Properties();

     /** The resulting PDF */
     public static String SIGNED1 =  
"results/part3/chapter12/externalhash_1.pdf";
     /** The resulting PDF */
     public static String SIGNED2 =  
"results/part3/chapter12/externalhash_2.pdf";
     /** The resulting PDF */
     public static String SIGNED3 =  
"results/part3/chapter12/externalhash_3.pdf";

     /**
      * Manipulates a PDF file src with the file dest as result
      * @param src the original PDF
      * @param dest the resulting PDF
      * @throws IOException
      * @throws DocumentException
      * @throws GeneralSecurityException
      */
     public void signPdfSelf(String src, String dest)
         throws IOException, DocumentException, GeneralSecurityException {
        // Private key and certificate
         String path = properties.getProperty("PRIVATE");
         String keystore_password = properties.getProperty("PASSWORD");
         String key_password = properties.getProperty("PASSWORD");
         KeyStore ks = KeyStore.getInstance("pkcs12", "BC");
         ks.load(new FileInputStream(path), keystore_password.toCharArray());
         String alias = (String)ks.aliases().nextElement();
         PrivateKey key = (PrivateKey) ks.getKey(alias,  
key_password.toCharArray());
         Certificate[] chain = ks.getCertificateChain(alias);
         // reader and stamper
         PdfReader reader = new PdfReader(src);
         FileOutputStream os = new FileOutputStream(dest);
         PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
         PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
         appearance.setCrypto(null, chain, null,  
PdfSignatureAppearance.SELF_SIGNED);
         appearance.setReason("External hash example");
         appearance.setLocation("Foobar");
         appearance.setVisibleSignature(new Rectangle(72, 732, 144,  
780), 1,    "sig");
         appearance.setExternalDigest(new byte[128], null, "RSA");
         appearance.preClose();
         // digital signature
         Signature signature = Signature.getInstance("SHA1withRSA");
         signature.initSign(key);
         byte buf[] = new byte[8192];
         int n;
         InputStream inp = appearance.getRangeStream();
         while ((n = inp.read(buf)) > 0) {
             signature.update(buf, 0, n);
         }
         PdfPKCS7 sig = appearance.getSigStandard().getSigner();
         sig.setExternalDigest(signature.sign(), null, "RSA");
         PdfDictionary dic = new PdfDictionary();
         dic.put(PdfName.CONTENTS, new  
PdfString(sig.getEncodedPKCS1()).setHexWriting(true));
         appearance.close(dic);
     }
     /**
      * Manipulates a PDF file src with the file dest as result
      * @param src the original PDF
      * @param dest the resulting PDF
      * @throws IOException
      * @throws DocumentException
      * @throws GeneralSecurityException
      */
     public void signPdfWinCer(String src, String dest, boolean sign)
         throws IOException, DocumentException, GeneralSecurityException {
         // private key and certificate
        String path = properties.getProperty("PRIVATE");
         String keystore_password = properties.getProperty("PASSWORD");
         String key_password = properties.getProperty("PASSWORD");
         KeyStore ks = KeyStore.getInstance("pkcs12", "BC");
         ks.load(new FileInputStream(path), keystore_password.toCharArray());
         String alias = (String)ks.aliases().nextElement();
         PrivateKey key = (PrivateKey) ks.getKey(alias,  
key_password.toCharArray());
         Certificate[] chain = ks.getCertificateChain(alias);
         // reader and stamper
         PdfReader reader = new PdfReader(src);
         FileOutputStream os = new FileOutputStream(dest);
         PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
         PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
         appearance.setCrypto(key, chain, null,  
PdfSignatureAppearance.WINCER_SIGNED);
         appearance.setReason("External hash example");
         appearance.setLocation("Foobar");
         appearance.setVisibleSignature(new Rectangle(72, 732, 144,  
780), 1,    "sig");
         appearance.setExternalDigest(null, new byte[20], null);
         appearance.preClose();
         // signature
         MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
         byte buf[] = new byte[8192];
         int n;
         InputStream inp = appearance.getRangeStream();
         while ((n = inp.read(buf)) > 0) {
             messageDigest.update(buf, 0, n);
         }
         byte hash[] = messageDigest.digest();
         PdfSigGenericPKCS sg = appearance.getSigStandard();
         PdfLiteral slit = (PdfLiteral)sg.get(PdfName.CONTENTS);
         byte[] outc = new byte[(slit.getPosLength() - 2) / 2];
         PdfPKCS7 sig = sg.getSigner();
         if (sign) {
             Signature signature = Signature.getInstance("SHA1withRSA");
             signature.initSign(key);
             signature.update(hash);
             sig.setExternalDigest(signature.sign(), hash, "RSA");
         }
         else
             sig.setExternalDigest(null, hash, null);
         PdfDictionary dic = new PdfDictionary();
         byte[] ssig = sig.getEncodedPKCS7();
         System.arraycopy(ssig, 0, outc, 0, ssig.length);
         dic.put(PdfName.CONTENTS, new PdfString(outc).setHexWriting(true));
         appearance.close(dic);
     }

     /**
      * Main method.
      *
      * @param    args    no arguments needed
      * @throws DocumentException
      * @throws IOException
      * @throws GeneralSecurityException
      */
     public static void main(String[] args)
         throws IOException, DocumentException, GeneralSecurityException {
         Security.addProvider(new BouncyCastleProvider());
         properties.load(new FileInputStream(PATH));
         new Signatures().createPdf(Signatures.ORIGINAL);
         SignatureExternalHash signatures = new SignatureExternalHash();
         signatures.signPdfSelf(Signatures.ORIGINAL, SIGNED1);
         signatures.signPdfWinCer(Signatures.ORIGINAL, SIGNED2, false);
         signatures.signPdfWinCer(Signatures.ORIGINAL, SIGNED3, true);
     }
}





------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing 
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
iText-questions mailing list
iText-questions@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/itext-questions

iText(R) is a registered trademark of 1T3XT BVBA.
Many questions posted to this list can (and will) be answered with a reference 
to the iText book: http://www.itextpdf.com/book/
Please check the keywords list before you ask for examples: 
http://itextpdf.com/themes/keywords.php

Reply via email to