code: protected int engineUpdate(ByteBuffer input, ByteBuffer output)
              throws ShortBufferException {
          try {
              return bufferCrypt(input, output, true);
          } catch (IllegalBlockSizeException e) {
              // never thrown for engineUpdate()
              throw new ProviderException("Internal error in update()");
          } catch (BadPaddingException e) {
              // never thrown for engineUpdate()
              throw new ProviderException("Internal error in update()");
          }
      }
docs: Continues a multiple-part encryption or decryption operation
  (depending on how this cipher was initialized), processing another data
  part.
  
  <p>All <code>input.remaining()</code> bytes starting at
  <code>input.position()</code> are processed. The result is stored
  in the output buffer.
  Upon return, the input buffer's position will be equal
  to its limit; its limit will not have changed. The output buffer's
  position will have advanced by n, where n is the value returned
  by this method; the output buffer's limit will not have changed.
  
  <p>If <code>output.remaining()</code> bytes are insufficient to
  hold the result, a <code>ShortBufferException</code> is thrown.
  
  <p>Subclasses should consider overriding this method if they can
  process ByteBuffers more efficiently than byte arrays.
  
  @param input the input ByteBuffer
  @param output the output ByteByffer
  
  @return the number of bytes stored in <code>output</code>
  
  @exception ShortBufferException if there is insufficient space in the
  output buffer
  
  @throws NullPointerException if either parameter is <CODE>null</CODE>
  @since 1.5