Return an iterator that decrypts `data` using the Electronic Codebook (ECB)
    mode of operation.
    
    ECB mode can only operate on `data` that is a multiple of the block-size
    in length.
    
    Each iteration returns a block-sized :obj:`bytes` object (i.e. 8 bytes)
    containing the decrypted bytes of the corresponding block in `data`.
    
    `data` should be a :obj:`bytes`-like object that is a multiple of the
    block-size in length (i.e. 8, 16, 32, etc.).
    If it is not, a :exc:`ValueError` exception is raised.

def decrypt_ecb(self, data):
    """
    Return an iterator that decrypts `data` using the Electronic Codebook (ECB)
    mode of operation.
    
    ECB mode can only operate on `data` that is a multiple of the block-size
    in length.
    
    Each iteration returns a block-sized :obj:`bytes` object (i.e. 8 bytes)
    containing the decrypted bytes of the corresponding block in `data`.
    
    `data` should be a :obj:`bytes`-like object that is a multiple of the
    block-size in length (i.e. 8, 16, 32, etc.).
    If it is not, a :exc:`ValueError` exception is raised.
    """
    S1, S2, S3, S4 = self.S
    P = self.P
    
    u4_1_pack = self._u4_1_pack
    u1_4_unpack = self._u1_4_unpack
    decrypt = self._decrypt
    
    u4_2_pack = self._u4_2_pack
    
    try:
      LR_iter = self._u4_2_iter_unpack(data)
    except struct_error:
      raise ValueError("data is not a multiple of the block-size in length")
    
    for cipher_L, cipher_R in LR_iter:
      yield u4_2_pack(
        *decrypt(cipher_L, cipher_R, P, S1, S2, S3, S4, u4_1_pack, u1_4_unpack)
      )