Advertisement
fachhoch

pdf signing

Feb 26th, 2014
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.57 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.security.KeyStore;
  9. import java.security.KeyStoreException;
  10. import java.security.NoSuchAlgorithmException;
  11. import java.security.PrivateKey;
  12. import java.security.UnrecoverableKeyException;
  13. import java.security.cert.CertStore;
  14. import java.security.cert.Certificate;
  15. import java.security.cert.CertificateException;
  16. import java.security.cert.CollectionCertStoreParameters;
  17. import java.security.cert.X509Certificate;
  18. import java.util.Arrays;
  19. import java.util.Calendar;
  20. import java.util.Enumeration;
  21. import java.util.List;
  22.  
  23. import org.apache.pdfbox.exceptions.COSVisitorException;
  24. import org.apache.pdfbox.exceptions.SignatureException;
  25. import org.apache.pdfbox.pdmodel.PDDocument;
  26. import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
  27. import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureInterface;
  28. import org.bouncycastle.cms.CMSException;
  29. import org.bouncycastle.cms.CMSProcessable;
  30. import org.bouncycastle.cms.CMSSignedData;
  31. import org.bouncycastle.cms.CMSSignedDataGenerator;
  32. import org.bouncycastle.cms.CMSSignedGenerator;
  33. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  34.  
  35. public class SigningTest implements SignatureInterface {
  36.  
  37.     private static BouncyCastleProvider provider = new BouncyCastleProvider();
  38.  
  39.     private PrivateKey privKey;
  40.  
  41.     private Certificate[] cert;
  42.  
  43.     public SigningTest(KeyStore keystore, char[] pin) {
  44.         try {
  45.             Enumeration<String> aliases = keystore.aliases();
  46.             String alias = null;
  47.             if (aliases.hasMoreElements())
  48.                 alias = aliases.nextElement();
  49.             else
  50.                 throw new RuntimeException("Could not find Key");
  51.             privKey = (PrivateKey) keystore.getKey(alias, pin);
  52.             cert = keystore.getCertificateChain(alias);
  53.         } catch (KeyStoreException e) {
  54.             // TODO Auto-generated catch block
  55.             e.printStackTrace();
  56.         } catch (UnrecoverableKeyException e) {
  57.             // TODO Auto-generated catch block
  58.             e.printStackTrace();
  59.         } catch (NoSuchAlgorithmException e) {
  60.             // TODO Auto-generated catch block
  61.             e.printStackTrace();
  62.         }
  63.     }
  64.  
  65.     public byte[] sign(InputStream content) throws SignatureException,
  66.             IOException {
  67.         CMSProcessableInputStream input = new CMSProcessableInputStream(content);
  68.         CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
  69.         // CertificateChain
  70.         List<Certificate> certList = Arrays.asList(cert);
  71.  
  72.         CertStore certStore = null;
  73.         try {
  74.             certStore = CertStore.getInstance("Collection",
  75.                     new CollectionCertStoreParameters(certList), provider);
  76.             gen.addSigner(privKey, (X509Certificate) certList.get(0),
  77.                     CMSSignedGenerator.DIGEST_SHA256);
  78.             gen.addCertificatesAndCRLs(certStore);
  79.             CMSSignedData signedData = gen.generate(input, false, provider);
  80.             return signedData.getEncoded();
  81.         } catch (Exception e) {
  82.             // should be handled
  83.             e.printStackTrace();
  84.         }
  85.         throw new RuntimeException("Problem while preparing signature");
  86.     }
  87.  
  88.     public static void main(String[] args) throws KeyStoreException,
  89.             NoSuchAlgorithmException, CertificateException,
  90.             FileNotFoundException, IOException, COSVisitorException,
  91.             SignatureException, Exception {
  92.         File document = new File("resources/OCD.pdf");
  93.         PDDocument pdDocument = PDDocument.load(document);
  94.  
  95.         addSignature(pdDocument, "resources/j4l_test.p12", "test");
  96.         addSignature(pdDocument, "resources/my.p12", "123456");
  97.  
  98.         File outputDocument = new File("resources/signed" + document.getName());
  99.         FileInputStream fis = new FileInputStream(document);
  100.         FileOutputStream fos = new FileOutputStream(outputDocument);
  101.         byte[] buffer = new byte[8 * 1024];
  102.         int c;
  103.         while ((c = fis.read(buffer)) != -1)
  104.         {
  105.           fos.write(buffer, 0, c);
  106.         }
  107.         fis.close();
  108.         fis = new FileInputStream(outputDocument);
  109.  
  110.         pdDocument.saveIncremental(fis, fos);
  111.         //pdDocument.close();
  112.        
  113.     }
  114.    
  115.    
  116.    
  117.    
  118.     static void addSignature(PDDocument  pdDocument,  String filePath,String pwd)  throws Exception{
  119.         File ksFile = new File(filePath);
  120.         KeyStore keystore = KeyStore.getInstance("PKCS12", provider);
  121.         char[] pin = pwd.toCharArray();
  122.         keystore.load(new FileInputStream(ksFile), pin);
  123.         SigningTest signing = new SigningTest(keystore, pin.clone());
  124.         //signing.signPDF(document);
  125.  
  126.         // create signature dictionary
  127.         PDSignature signature = new PDSignature();
  128.         signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE); // default filter
  129.         // subfilter for basic and PAdES Part 2 signatures
  130.         signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
  131.         signature.setName("signer name");
  132.         signature.setLocation("signer location");
  133.         signature.setReason("reason for signature");
  134.  
  135.         // the signing date, needed for valid signature
  136.         signature.setSignDate(Calendar.getInstance());
  137. //      SignatureOptions signatureOptions= new SignatureOptions();
  138. //      signatureOptions.setVisualSignature();
  139.         // register signature dictionary and sign interface
  140.         pdDocument.addSignature(signature, signing);
  141.  
  142.     }
  143. }
  144.  
  145. class CMSProcessableInputStream implements CMSProcessable {
  146.  
  147.     InputStream in;
  148.  
  149.     public CMSProcessableInputStream(InputStream is) {
  150.         in = is;
  151.     }
  152.  
  153.     public Object getContent() {
  154.         return null;
  155.     }
  156.  
  157.     public void write(OutputStream out) throws IOException, CMSException {
  158.         // read the content only one time
  159.         byte[] buffer = new byte[8 * 1024];
  160.         int read;
  161.         while ((read = in.read(buffer)) != -1) {
  162.             out.write(buffer, 0, read);
  163.         }
  164.         in.close();
  165.     }
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement