001: /**
002: * Copyright (c) 2003-2005, www.pdfbox.org
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain the above copyright notice,
009: * this list of conditions and the following disclaimer.
010: * 2. Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: * 3. Neither the name of pdfbox; nor the names of its
014: * contributors may be used to endorse or promote products derived from this
015: * software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
018: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
019: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
021: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: *
028: * http://www.pdfbox.org
029: *
030: */package org.pdfbox.pdmodel.encryption;
031:
032: import java.security.cert.X509Certificate;
033: import java.util.ArrayList;
034: import java.util.Iterator;
035:
036: /**
037: * This class represents the protection policy to use to protect
038: * a document with the public key security handler as described
039: * in the PDF specification 1.6 p104.
040: *
041: * PDF documents are encrypted so that they can be decrypted by
042: * one or more recipients. Each recipient have its own access permission.
043: *
044: * The following code sample shows how to protect a document using
045: * the public key security handler. In this code sample, <code>doc</code> is
046: * a <code>PDDocument</code> object.
047: *
048: * <pre>
049: * PublicKeyProtectionPolicy policy = new PublicKeyProtectionPolicy();
050: * PublicKeyRecipient recip = new PublicKeyRecipient();
051: * AccessPermission ap = new AccessPermission();
052: * ap.setCanModify(false);
053: * recip.setPermission(ap);
054: *
055: * // load the recipient's certificate
056: * InputStream inStream = new FileInputStream(certificate_path);
057: * CertificateFactory cf = CertificateFactory.getInstance("X.509");
058: * X509Certificate certificate = (X509Certificate)cf.generateCertificate(inStream);
059: * inStream.close();
060: *
061: * recip.setX509(certificate); // set the recipient's certificate
062: * policy.addRecipient(recip);
063: * policy.setEncryptionKeyLength(128); // the document will be encrypted with 128 bits secret key
064: * doc.protect(policy);
065: * doc.save(out);
066: * </pre>
067: *
068: *
069: * @see org.pdfbox.pdmodel.PDDocument#protect(ProtectionPolicy)
070: * @see AccessPermission
071: * @see PublicKeyRecipient
072: *
073: * @author Benoit Guillon (benoit.guillon@snv.jussieu.fr)
074: *
075: * @version $Revision: 1.2 $
076: */
077: public class PublicKeyProtectionPolicy extends ProtectionPolicy {
078:
079: /**
080: * The list of recipients.
081: */
082: private ArrayList recipients = null;
083:
084: /**
085: * The X509 certificate used to decrypt the current document.
086: */
087: private X509Certificate decryptionCertificate;
088:
089: /**
090: * Constructor for encryption. Just creates an empty recipients list.
091: */
092: public PublicKeyProtectionPolicy() {
093: recipients = new ArrayList();
094: }
095:
096: /**
097: * Adds a new recipient to the recipients list.
098: *
099: * @param r A new recipient.
100: */
101: public void addRecipient(PublicKeyRecipient r) {
102: recipients.add(r);
103: }
104:
105: /**
106: * Removes a recipient from the recipients list.
107: *
108: * @param r The recipient to remove.
109: *
110: * @return true If a recipient was found and removed.
111: */
112: public boolean removeRecipient(PublicKeyRecipient r) {
113: return recipients.remove(r);
114: }
115:
116: /**
117: * Returns an iterator to browse the list of recipients. Object
118: * found in this iterator are <code>PublicKeyRecipient</code>.
119: *
120: * @return The recipients list iterator.
121: */
122: public Iterator getRecipientsIterator() {
123: return recipients.iterator();
124: }
125:
126: /**
127: * Getter of the property <tt>decryptionCertificate</tt>.
128: *
129: * @return Returns the decryptionCertificate.
130: */
131: public X509Certificate getDecryptionCertificate() {
132: return decryptionCertificate;
133: }
134:
135: /**
136: * Setter of the property <tt>decryptionCertificate</tt>.
137: *
138: * @param aDecryptionCertificate The decryption certificate to set.
139: */
140: public void setDecryptionCertificate(
141: X509Certificate aDecryptionCertificate) {
142: this .decryptionCertificate = aDecryptionCertificate;
143: }
144:
145: /**
146: * Returns the number of recipients.
147: *
148: * @return The number of recipients.
149: */
150: public int getRecipientsNumber() {
151: return recipients.size();
152: }
153: }
|