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.

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)