org.apache.poi.poifs.crypt
Class Decryptor

java.lang.Object
  extended by org.apache.poi.poifs.crypt.Decryptor
All Implemented Interfaces:
java.lang.Cloneable
Direct Known Subclasses:
BinaryRC4Decryptor, CryptoAPIDecryptor, StandardDecryptor, XORDecryptor

public abstract class Decryptor
extends java.lang.Object
implements java.lang.Cloneable


Field Summary
static java.lang.String DEFAULT_PASSWORD
           
static java.lang.String DEFAULT_POIFS_ENTRY
           
protected  EncryptionInfo encryptionInfo
           
 
Constructor Summary
protected Decryptor()
           
 
Method Summary
 Decryptor clone()
           
protected  int getBlockSizeInBytes()
           
abstract  java.io.InputStream getDataStream(DirectoryNode dir)
          Return a stream with decrypted data.
 java.io.InputStream getDataStream(java.io.InputStream stream, int size, int initialPos)
          Wraps a stream for decryption
 java.io.InputStream getDataStream(NPOIFSFileSystem fs)
           
 java.io.InputStream getDataStream(OPOIFSFileSystem fs)
           
 java.io.InputStream getDataStream(POIFSFileSystem fs)
           
 EncryptionInfo getEncryptionInfo()
           
static Decryptor getInstance(EncryptionInfo info)
           
 byte[] getIntegrityHmacKey()
           
 byte[] getIntegrityHmacValue()
           
protected  int getKeySizeInBytes()
           
abstract  long getLength()
          Returns the length of the encrypted data that can be safely read with getDataStream(org.apache.poi.poifs.filesystem.DirectoryNode).
 javax.crypto.SecretKey getSecretKey()
           
 byte[] getVerifier()
           
 javax.crypto.Cipher initCipherForBlock(javax.crypto.Cipher cipher, int block)
          Initializes a cipher object for a given block index for encryption
 void setChunkSize(int chunkSize)
          Sets the chunk size of the data stream.
 void setEncryptionInfo(EncryptionInfo encryptionInfo)
           
protected  void setIntegrityHmacKey(byte[] integrityHmacKey)
           
protected  void setIntegrityHmacValue(byte[] integrityHmacValue)
           
protected  void setSecretKey(javax.crypto.SecretKey secretKey)
           
protected  void setVerifier(byte[] verifier)
           
abstract  boolean verifyPassword(java.lang.String password)
           
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFAULT_PASSWORD

public static final java.lang.String DEFAULT_PASSWORD
See Also:
Constant Field Values

DEFAULT_POIFS_ENTRY

public static final java.lang.String DEFAULT_POIFS_ENTRY
See Also:
Constant Field Values

encryptionInfo

protected EncryptionInfo encryptionInfo
Constructor Detail

Decryptor

protected Decryptor()
Method Detail

getDataStream

public abstract java.io.InputStream getDataStream(DirectoryNode dir)
                                           throws java.io.IOException,
                                                  java.security.GeneralSecurityException
Return a stream with decrypted data.

Use getLength() to get the size of that data that can be safely read from the stream. Just reading to the end of the input stream is not sufficient because there are normally padding bytes that must be discarded

Parameters:
dir - the node to read from
Returns:
decrypted stream
Throws:
java.io.IOException
java.security.GeneralSecurityException

getDataStream

public java.io.InputStream getDataStream(java.io.InputStream stream,
                                         int size,
                                         int initialPos)
                                  throws java.io.IOException,
                                         java.security.GeneralSecurityException
Wraps a stream for decryption

As we are handling streams and don't know the total length beforehand, it's the callers duty to care for the length of the entries.

Parameters:
stream - the stream to be wrapped
initialPos - initial/current byte position within the stream
Returns:
decrypted stream
Throws:
java.io.IOException
java.security.GeneralSecurityException

setChunkSize

public void setChunkSize(int chunkSize)
Sets the chunk size of the data stream. Needs to be set before the data stream is requested. When not set, the implementation uses method specific default values

Parameters:
chunkSize - the chunk size, i.e. the block size with the same encryption key

initCipherForBlock

public javax.crypto.Cipher initCipherForBlock(javax.crypto.Cipher cipher,
                                              int block)
                                       throws java.security.GeneralSecurityException
Initializes a cipher object for a given block index for encryption

Parameters:
cipher - may be null, otherwise the given instance is reset to the new block index
block - the block index, e.g. the persist/slide id (hslf)
Returns:
a new cipher object, if cipher was null, otherwise the reinitialized cipher
Throws:
java.security.GeneralSecurityException

verifyPassword

public abstract boolean verifyPassword(java.lang.String password)
                                throws java.security.GeneralSecurityException
Throws:
java.security.GeneralSecurityException

getLength

public abstract long getLength()
Returns the length of the encrypted data that can be safely read with getDataStream(org.apache.poi.poifs.filesystem.DirectoryNode). Just reading to the end of the input stream is not sufficient because there are normally padding bytes that must be discarded

The length variable is initialized in getDataStream(org.apache.poi.poifs.filesystem.DirectoryNode), an attempt to call getLength() prior to getDataStream() will result in IllegalStateException.

Returns:
length of the encrypted data
Throws:
java.lang.IllegalStateException - if getDataStream(org.apache.poi.poifs.filesystem.DirectoryNode) was not called

getInstance

public static Decryptor getInstance(EncryptionInfo info)

getDataStream

public java.io.InputStream getDataStream(NPOIFSFileSystem fs)
                                  throws java.io.IOException,
                                         java.security.GeneralSecurityException
Throws:
java.io.IOException
java.security.GeneralSecurityException

getDataStream

public java.io.InputStream getDataStream(OPOIFSFileSystem fs)
                                  throws java.io.IOException,
                                         java.security.GeneralSecurityException
Throws:
java.io.IOException
java.security.GeneralSecurityException

getDataStream

public java.io.InputStream getDataStream(POIFSFileSystem fs)
                                  throws java.io.IOException,
                                         java.security.GeneralSecurityException
Throws:
java.io.IOException
java.security.GeneralSecurityException

getVerifier

public byte[] getVerifier()

getSecretKey

public javax.crypto.SecretKey getSecretKey()

getIntegrityHmacKey

public byte[] getIntegrityHmacKey()

getIntegrityHmacValue

public byte[] getIntegrityHmacValue()

setSecretKey

protected void setSecretKey(javax.crypto.SecretKey secretKey)

setVerifier

protected void setVerifier(byte[] verifier)

setIntegrityHmacKey

protected void setIntegrityHmacKey(byte[] integrityHmacKey)

setIntegrityHmacValue

protected void setIntegrityHmacValue(byte[] integrityHmacValue)

getBlockSizeInBytes

protected int getBlockSizeInBytes()

getKeySizeInBytes

protected int getKeySizeInBytes()

getEncryptionInfo

public EncryptionInfo getEncryptionInfo()

setEncryptionInfo

public void setEncryptionInfo(EncryptionInfo encryptionInfo)

clone

public Decryptor clone()
                throws java.lang.CloneNotSupportedException
Overrides:
clone in class java.lang.Object
Throws:
java.lang.CloneNotSupportedException