docs: def encrypt_block(self, block):
      """
      Return a :obj:`bytes` object containing the encrypted bytes of a `block`.
      
      `block` should be a :obj:`bytes`-like object with exactly 8 bytes.
      If it is not, a :exc:`ValueError` exception is raised.
      """
      S0, S1, S2, S3 = self.S
      P = self.P
      
      u4_1_pack = self._u4_1_pack
      u1_4_unpack = self._u1_4_unpack
      
      try:
        L, R = self._u4_2_unpack(block)
      except struct_error:
        raise ValueError("block is not 8 bytes in length")
      
      for p1, p2 in P[:-1]:
        L ^= p1
        a, b, c, d = u1_4_unpack(u4_1_pack(L))
        R ^= (S0[a] + S1[b] ^ S2[c]) + S3[d] & 0xffffffff
        R ^= p2
        a, b, c, d = u1_4_unpack(u4_1_pack(R))
        L ^= (S0[a] + S1[b] ^ S2[c]) + S3[d] & 0xffffffff
      p_penultimate, p_last = P[-1]
      return self._u4_2_pack(R ^ p_last, L ^ p_penultimate)