org.apache.poi.poifs.crypt

## Class ChunkedCipherInputStream

- java.lang.Object
- - java.io.InputStream
  - - java.io.FilterInputStream
    - - org.apache.poi.util.LittleEndianInputStream
      - - org.apache.poi.poifs.crypt.ChunkedCipherInputStream

- All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, LittleEndianInput

      @Internal
      public abstract class ChunkedCipherInputStream
      extends LittleEndianInputStream

- - ### Field Summary

    - ### Fields inherited from class java.io.FilterInputStream

      `in`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `ChunkedCipherInputStream(java.io.InputStream stream, long size, int chunkSize)`
    `ChunkedCipherInputStream(java.io.InputStream stream, long size, int chunkSize, int initialPos)`

  - ### Method Summary

    All Methods Instance Methods Abstract Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `int` | `available()`
    `protected byte[]` | `getChunk()`
    `protected int` | `getChunkMask()`
    `protected byte[]` | `getPlain()`
    `long` | `getPos()`
    `protected abstract javax.crypto.Cipher` | `initCipherForBlock(javax.crypto.Cipher existing, int block)`
    `javax.crypto.Cipher` | `initCipherForBlock(int block)`
    `protected int` | `invokeCipher(int totalBytes, boolean doFinal)` Helper function for overriding the cipher invocation, i.e.
    `void` | `mark(int readlimit)`
    `boolean` | `markSupported()`
    `int` | `read()`
    `int` | `read(byte[] b, int off, int len)`
    `void` | `readPlain(byte[] b, int off, int len)` Used when BIFF header fields (sid, size) are being read.
    `void` | `reset()`
    `void` | `setNextRecordSize(int recordSize)` Some ciphers (actually just XOR) are based on the record size, which needs to be set before decryption
    `long` | `skip(long n)`

    - ### Methods inherited from class org.apache.poi.util.LittleEndianInputStream

      `getReadIndex, readByte, readDouble, readFloat, readFully, readFully, readInt, readLong, readShort, readUByte, readUInt, readUShort, skipFully`

    - ### Methods inherited from class java.io.FilterInputStream

      `close, read`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### ChunkedCipherInputStream

          public ChunkedCipherInputStream(java.io.InputStream stream,
                                          long size,
                                          int chunkSize)
                                   throws java.security.GeneralSecurityException

      Throws:
        `java.security.GeneralSecurityException`

    - #### ChunkedCipherInputStream

          public ChunkedCipherInputStream(java.io.InputStream stream,
                                          long size,
                                          int chunkSize,
                                          int initialPos)
                                   throws java.security.GeneralSecurityException

      Throws:
        `java.security.GeneralSecurityException`

  - ### Method Detail

    - #### initCipherForBlock

          public final javax.crypto.Cipher initCipherForBlock(int block)
                                                       throws java.io.IOException,
                                                              java.security.GeneralSecurityException

      Throws:
        `java.io.IOException`
        `java.security.GeneralSecurityException`

    - #### initCipherForBlock

          protected abstract javax.crypto.Cipher initCipherForBlock(javax.crypto.Cipher existing,
                                                                    int block)
                                                             throws java.security.GeneralSecurityException

      Throws:
        `java.security.GeneralSecurityException`

    - #### read

          public int read()
                   throws java.io.IOException

      Overrides:
        `read` in class `java.io.FilterInputStream`
      Throws:
        `java.io.IOException`

    - #### read

          public int read(byte[] b,
                          int off,
                          int len)
                   throws java.io.IOException

      Overrides:
        `read` in class `LittleEndianInputStream`
      Throws:
        `java.io.IOException`

    - #### skip

          public long skip(long n)

      Overrides:
        `skip` in class `java.io.FilterInputStream`

    - #### available

          public int available()

      Specified by:
        `available` in interface `LittleEndianInput`
      Overrides:
        `available` in class `LittleEndianInputStream`

    - #### markSupported

          public boolean markSupported()

      Overrides:
        `markSupported` in class `java.io.FilterInputStream`

    - #### mark

          public void mark(int readlimit)

      Overrides:
        `mark` in class `LittleEndianInputStream`

    - #### reset

          public void reset()

      Overrides:
        `reset` in class `LittleEndianInputStream`

    - #### getChunkMask

          protected int getChunkMask()

    - #### invokeCipher

          protected int invokeCipher(int totalBytes,
                                     boolean doFinal)
                              throws java.security.GeneralSecurityException

      Helper function for overriding the cipher invocation, i.e. XOR doesn't use a cipher and uses it's own implementation
      Throws:
        `java.security.GeneralSecurityException`

    - #### readPlain

          public void readPlain(byte[] b,
                                int off,
                                int len)

      Used when BIFF header fields (sid, size) are being read. The internal `Cipher` instance must step even when unencrypted bytes are read
      Specified by:
        `readPlain` in interface `LittleEndianInput`
      Overrides:
        `readPlain` in class `LittleEndianInputStream`
      Parameters:
        `b` - the byte array to receive the bytes
        `off` - the start offset into the byte array
        `len` - the amount of bytes to fill

    - #### setNextRecordSize

          public void setNextRecordSize(int recordSize)

      Some ciphers (actually just XOR) are based on the record size, which needs to be set before decryption
      Parameters:
        `recordSize` - the size of the next record

    - #### getChunk

          protected byte[] getChunk()

      Returns:
        the chunk bytes

    - #### getPlain

          protected byte[] getPlain()

      Returns:
        the plain bytes

    - #### getPos

          public long getPos()

      Returns:
        the absolute position in the stream

Copyright 2020 The Apache Software Foundation or its licensors, as applicable.