1 31 32 package test.pdfbox.encryption; 33 34 import java.io.File ; 35 import java.io.FileInputStream ; 36 import java.io.InputStream ; 37 import java.security.KeyStore ; 38 import java.security.cert.CertificateFactory ; 39 import java.security.cert.X509Certificate ; 40 41 import junit.framework.Assert; 42 import junit.framework.Test; 43 import junit.framework.TestCase; 44 import junit.framework.TestSuite; 45 46 import org.pdfbox.exceptions.CryptographyException; 47 import org.pdfbox.pdmodel.PDDocument; 48 import org.pdfbox.pdmodel.encryption.AccessPermission; 49 import org.pdfbox.pdmodel.encryption.PublicKeyDecryptionMaterial; 50 import org.pdfbox.pdmodel.encryption.PublicKeyProtectionPolicy; 51 import org.pdfbox.pdmodel.encryption.PublicKeyRecipient; 52 53 59 public class TestPublicKeyEncryption extends TestCase 60 { 61 62 private AccessPermission accessPermission; 63 private AccessPermission accessPermission2; 64 65 private File publicCert1; 66 private File privateCert1; 67 private File publicCert2; 68 private File privateCert2; 69 private File input; 70 private File output; 71 72 private String password1 = "test1"; 73 private String password2 = "test2"; 74 75 80 public TestPublicKeyEncryption( String name ) 81 { 82 super( name ); 83 accessPermission = new AccessPermission(); 84 accessPermission.setCanAssembleDocument(false); 85 accessPermission.setCanExtractContent(false); 86 accessPermission.setCanExtractForAccessibility(true); 87 accessPermission.setCanFillInForm(false); 88 accessPermission.setCanModify(false); 89 accessPermission.setCanModifyAnnotations(false); 90 accessPermission.setCanPrint(false); 91 accessPermission.setCanPrintDegraded(false); 92 93 accessPermission2 = new AccessPermission(); 94 accessPermission2.setCanAssembleDocument(false); 95 accessPermission2.setCanExtractContent(false); 96 accessPermission2.setCanExtractForAccessibility(true); 97 accessPermission2.setCanFillInForm(false); 98 accessPermission2.setCanModify(false); 99 accessPermission2.setCanModifyAnnotations(false); 100 accessPermission2.setCanPrint(true); accessPermission2.setCanPrintDegraded(false); 102 103 publicCert1 = new File ("test/encryption/test1.der"); 104 privateCert1 = new File ("test/encryption/test1.pfx"); 105 publicCert2 = new File ("test/encryption/test2.der"); 106 privateCert2 = new File ("test/encryption/test2.pfx"); 107 input = new File ("test/input/Exolab.pdf"); 108 output = new File ("test/encryption/output.pdf"); 109 110 Assert.assertTrue(publicCert1.exists() && publicCert1.isFile()); 111 Assert.assertTrue(privateCert1.exists() && privateCert1.isFile()); 112 113 Assert.assertTrue(publicCert2.exists() && publicCert2.isFile()); 114 Assert.assertTrue(privateCert2.exists() && privateCert2.isFile()); 115 116 Assert.assertTrue(input.exists() && input.isFile()); 117 118 } 119 120 125 public static Test suite() 126 { 127 return new TestSuite( TestPublicKeyEncryption.class ); 128 } 129 130 136 public void testProtectionError() throws Exception 137 { 138 139 PDDocument doc = PDDocument.load(input); 140 protect(doc, publicCert1.getAbsolutePath()); 141 142 doc.save(output.getAbsolutePath()); 143 144 doc.close(); 145 146 PDDocument doc2 = PDDocument.load(output); 147 148 Exception e = null; 149 150 try 151 { 152 open(doc2, privateCert2.getAbsolutePath(), password2); 153 } 154 catch(CryptographyException ex) 155 { 156 e = ex; 157 System.out.println(ex.getMessage()); 158 } 159 finally 160 { 161 Assert.assertNotNull(e); 162 } 163 } 164 165 166 172 public void testProtection() throws Exception 173 { 174 PDDocument doc = PDDocument.load(input); 175 protect(doc, publicCert1.getAbsolutePath()); 176 177 179 doc.save(output.getAbsolutePath()); 180 181 doc.close(); 182 183 PDDocument doc2 = PDDocument.load(output); 184 185 Assert.assertNotNull(doc2); 186 187 open(doc2, privateCert1.getAbsolutePath(), password1); 188 189 Assert.assertTrue(doc2.isEncrypted()); 190 191 AccessPermission currentAp = doc2.getCurrentAccessPermission(); 192 193 Assert.assertFalse(currentAp.canAssembleDocument()); 194 Assert.assertFalse(currentAp.canExtractContent()); 195 Assert.assertTrue(currentAp.canExtractForAccessibility()); 196 Assert.assertFalse(currentAp.canFillInForm()); 197 Assert.assertFalse(currentAp.canModify()); 198 Assert.assertFalse(currentAp.canModifyAnnotations()); 199 Assert.assertFalse(currentAp.canPrint()); 200 Assert.assertFalse(currentAp.canPrintDegraded()); 201 202 doc2.close(); 203 204 } 205 206 207 212 public void testMultipleRecipients() throws Exception 213 { 214 215 CertificateFactory cf = CertificateFactory.getInstance("X.509"); 216 217 PDDocument doc = PDDocument.load(input); 218 219 PublicKeyProtectionPolicy ppp = new PublicKeyProtectionPolicy(); 220 221 PublicKeyRecipient recip1 = new PublicKeyRecipient(); 222 PublicKeyRecipient recip2 = new PublicKeyRecipient(); 223 224 recip1.setPermission(accessPermission); 225 recip2.setPermission(accessPermission2); 226 227 InputStream inStream = new FileInputStream (publicCert1); 228 Assert.assertNotNull(cf); 229 X509Certificate certificate1 = (X509Certificate )cf.generateCertificate(inStream); 230 inStream.close(); 231 232 InputStream inStream2 = new FileInputStream (publicCert2); 233 Assert.assertNotNull(cf); 234 X509Certificate certificate2 = (X509Certificate )cf.generateCertificate(inStream2); 235 inStream.close(); 236 237 recip1.setX509(certificate1); 238 recip2.setX509(certificate2); 239 240 ppp.addRecipient(recip1); 241 ppp.addRecipient(recip2); 242 243 doc.protect(ppp); 244 doc.save(output.getAbsolutePath()); 245 doc.close(); 246 247 248 249 PDDocument docOpen1 = PDDocument.load(output); 250 251 KeyStore ks1 = KeyStore.getInstance("PKCS12"); 252 ks1.load(new FileInputStream (privateCert1), password1.toCharArray()); 253 PublicKeyDecryptionMaterial pdm = new PublicKeyDecryptionMaterial(ks1, null, password1); 254 docOpen1.openProtection(pdm); 255 docOpen1.close(); 256 257 258 259 PDDocument docOpen2 = PDDocument.load(output); 260 261 KeyStore ks2 = KeyStore.getInstance("PKCS12"); 262 ks2.load(new FileInputStream (privateCert2), password2.toCharArray()); 263 PublicKeyDecryptionMaterial pdm2 = new PublicKeyDecryptionMaterial(ks2, null, password2); 264 docOpen2.openProtection(pdm2); 265 docOpen2.close(); 266 267 } 268 269 270 271 private void protect(PDDocument doc, String certPath) throws Exception 272 { 273 InputStream inStream = new FileInputStream (certPath); 274 CertificateFactory cf = CertificateFactory.getInstance("X.509"); 275 Assert.assertNotNull(cf); 276 X509Certificate certificate = (X509Certificate )cf.generateCertificate(inStream); 277 Assert.assertNotNull(certificate); 278 inStream.close(); 279 280 PublicKeyProtectionPolicy ppp = new PublicKeyProtectionPolicy(); 281 PublicKeyRecipient recip = new PublicKeyRecipient(); 282 recip.setPermission(accessPermission); 283 recip.setX509(certificate); 284 285 ppp.addRecipient(recip); 286 287 doc.protect(ppp); 288 289 } 290 291 292 private void open(PDDocument doc, String certPath, String password) throws Exception 293 { 294 KeyStore ks = KeyStore.getInstance("PKCS12"); 295 ks.load(new FileInputStream (certPath), password.toCharArray()); 296 297 PublicKeyDecryptionMaterial pdm = new PublicKeyDecryptionMaterial(ks, null, password); 298 299 doc.openProtection(pdm); 300 301 } 302 303 } 304 | Popular Tags |