code: byte[] doFinal(byte[] input, int inputOffset, int inputLen)
              throws IllegalBlockSizeException, BadPaddingException {
          return cipher.doFinal(input, inputOffset, inputLen);
      }
docs: Encrypts or decrypts data in a single-part operation, or finishes a
  multiple-part operation. The data is encrypted or decrypted, depending on
  how the underlying cipher was initialized.
  
  <p>
  The first <code>inputLen</code> bytes in the <code>input</code> buffer,
  starting at <code>inputOffset</code> inclusive, and any input bytes that
  may have been buffered during a previous <code>update</code> operation,
  are processed, with padding (if requested) being applied. If an AEAD mode
  such as GCM/CCM is being used, the authentication tag is appended in the
  case of encryption, or verified in the case of decryption. The result is
  stored in a new buffer.
  
  <p>
  Note: if any exception is thrown, a new instance of this cipher lite
  object may need to be constructed before it can be used again.
  
  @param input
  the input buffer
  @param inputOffset
  the offset in <code>input</code> where the input starts
  @param inputLen
  the input length
  
  @return the new buffer with the result
  
  @exception IllegalStateException
  if this cipher is in a wrong state (e.g., has not been
  initialized)
  @exception IllegalBlockSizeException
  if this cipher is a block cipher, no padding has been
  requested (only in encryption mode), and the total input
  length of the data processed by this cipher is not a
  multiple of block size; or if this encryption algorithm is
  unable to process the input data provided.
  @exception BadPaddingException
  if this cipher is in decryption mode, and (un)padding has
  been requested, but the decrypted data is not bounded by
  the appropriate padding bytes; or if this cipher is
  decrypting in an AEAD mode (such as GCM/CCM), and the
  received authentication tag does not match the calculated
  value