code: def read_with_mac(self, *blocks):
          
          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
docs: 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`.