code: public final byte[] update(byte[] input, int inputOffset, int inputLen) {
          checkCipherState();
  
          // Input sanity check
          if (input == null || inputOffset < 0
              || inputLen > (input.length - inputOffset) || inputLen < 0) {
              throw new IllegalArgumentException("Bad arguments");
          }
  
          updateProviderIfNeeded();
          if (inputLen == 0) {
              return null;
          }
          return spi.engineUpdate(input, inputOffset, inputLen);
      }
docs: Continues a multiple-part encryption or decryption operation
  (depending on how this cipher was initialized), processing another data
  part.
  
  <p>The first <code>inputLen</code> bytes in the <code>input</code>
  buffer, starting at <code>inputOffset</code> inclusive, are processed,
  and the result is stored in a new buffer.
  
  <p>If <code>inputLen</code> is zero, this method returns
  <code>null</code>.
  
  @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, or null if the underlying
  cipher is a block cipher and the input data is too short to result in a
  new block.
  
  @exception IllegalStateException if this cipher is in a wrong state
  (e.g., has not been initialized)