code: @Override
    public int read (@Nonnull final byte [] aBuf,
                     @Nonnegative final int nOfs,
                     @Nonnegative final int nLen) throws IOException
    {
      final int result = in.read (aBuf, nOfs, nLen);
      if (m_bOn && result != -1)
      {
        m_aMac.update (aBuf, nOfs, result);
      }
      return result;
    }
docs: Reads into a byte array, and updates the Mac (if the function is on). That
  is, this method reads up to {@code len} bytes from the input stream into
  the array {@code b}, starting at offset {@code off}. This method blocks
  until the data is actually read. If the function is on (see
  {@link #setOn(boolean) on}), this method will then call {@code update} on
  the Mac associated with this stream, passing it the data.
  
  @param aBuf
  the array into which the data is read.
  @param nOfs
  the starting offset into {@code b} of where the data should be
  placed.
  @param nLen
  the maximum number of bytes to be read from the input stream into b,
  starting at offset {@code off}.
  @return the actual number of bytes read. This is less than {@code len} if
  the end of the stream is reached prior to reading {@code len}
  bytes. -1 is returned if no bytes were read because the end of the
  stream had already been reached when the call was made.
  @exception IOException
  if an I/O error occurs.
  @see Mac#update(byte[], int, int)