/*
* Copyright 2006-2017 ICEsoft Technologies Canada Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS
* IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.icepdf.core.pobjects.security;
import org.icepdf.core.pobjects.Dictionary;
import org.icepdf.core.pobjects.Name;
import org.icepdf.core.util.Library;
import java.util.HashMap;
/**
* Individual Crypt filter definition. A filter is associated with a name
* key in the CryptFilter definition. A stream or string that uses a crypt
* filter will references it by its name.
*/
public class CryptFilterEntry extends Dictionary {
public static final Name TYPE = new Name("CryptFilter");
public static final Name AUTHEVENT_KEY = new Name("AuthEvent");
public static final Name CFM_KEY = new Name("CFM");
public static final Name LENGTH_KEY = new Name("Length");
public CryptFilterEntry(Library library, HashMap entries) {
super(library, entries);
}
/**
* If present, shall be CryptFilter for a crypt filter dictionary.
*
* @return dictionary type, CryptFilter
*/
public Name getType() {
return TYPE;
}
/**
* The method used, if any, by the conforming reader to decrypt data. The
* following values shall be supported:
* <ul>
* <li>None - The application shall not decrypt data but shall direct the
* input stream to the security handler for decryption.</li>
* <li>V2 - The application shall ask the security handler for the
* encryption key and shall implicitly decrypt data with "Algorithm 1:
* Encryption of data using the RC4 or AES algorithms", using the RC4 algorithm.</li>
* <li>AESV2 - (PDF 1.6) The application shall ask the security handler for
* the encryption key and shall implicitly decrypt data with "Algorithm 1:
* Encryption of data using the RC4 or AES algorithms", using the AES
* algorithm in Cipher Block Chaining (CBC) mode with a 16-byte block size
* and an initialization vector that shall be randomly generated and
* placed as the first 16 bytes in the stream or string.</li>
* </ul>
* <br>
* When the value is V2 or AESV2, the application may ask once for this
* encryption key and cache the key for subsequent use for streams that use
* the same crypt filter. Therefore, there shall be a one-to-one relationship
* between a crypt filter name and the corresponding encryption key.
* <br>
* Only the values listed here shall be supported. Applications that encounter
* other values shall report that the file is encrypted with an unsupported algorithm.
* <br>
* Default value: None.
*
* @return name of crypt filter method.
*/
public Name getCryptFilterMethod() {
Object tmp = library.getObject(entries, CFM_KEY);
if (tmp instanceof Name) {
return (Name) tmp;
}
return null;
}
/**
* The event to be used to trigger the authorization that is required to
* access encryption keys used by this filter. If authorization fails, the
* event shall fail. Valid values shall be:
* <ul>
* <li>DocOpen: Authorization shall be required when a document is opened.</li>
* <li>EFOpen: Authorization shall be required when accessing embedded files.</li>
* </ul>
* Default value: DocOpen.
* <br>
* If this filter is used as the value of StrF or StmF in the encryption
* dictionary (see Table 20), the conforming reader shall ignore this key
* and behave as if the value is DocOpen.
*
* @return authorization event.
*/
public Name getAuthEvent() {
Object tmp = library.getObject(entries, AUTHEVENT_KEY);
if (tmp instanceof Name) {
return (Name) tmp;
}
return null;
}
/**
* (Optional) The bit length of the encryption key. It shall be a multiple
* of 8 in the range of 40 to 128. Security handlers may define their own
* use of the Length entry and should use it to define the bit length of
* the encryption key. Standard security handler expresses the length in
* multiples of 8 (16 means 128) and public-key security handler expresses
* it as is (128 means 128).
*
* @return lenth of encryption key
*/
public int getLength() {
int length = library.getInt(entries, LENGTH_KEY);
return Math.min(length * 8, 128);
}
}