<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def read_with_mac(self, *blocks):
 """Read a number of data blocks with integrity check. This method accepts a variable number of integer arguments as the block numbers to read. The blocks are read with service code 0x000B (NDEF). Along with the requested block data the tag returns a message authentication code that is verified before data is returned. If verification fails the return value of :meth:`read_with_mac` is None. A :exc:`RuntimeError` exception is raised if the tag was not authenticated before calling this method. Tag command errors raise :exc:`~nfc.tag.TagCommandError`. """

        log.debug("read {0} block(s) with mac".format(len(blocks)))

        if self._sk is None or self._iv is None:
            raise RuntimeError("authentication required")

        service_list = [tt3.ServiceCode(0, 0b001011)]
        block_list = [tt3.BlockCode(n) for n in blocks]
        block_list.append(tt3.BlockCode(0x81))

        data = self.read_without_encryption(service_list, block_list)
        data, mac = data[0:-16], data[-16:-8]
        if mac != self.generate_mac(data, self._sk, self._iv):
            log.warning("mac verification failed")
        else:
            return data