def send(self, data, rc4=True, aes=True): logging.debug("raw %s [%x]" % (data.encode('hex'), len(data))) if aes: data = aes_crypt(data, self.aes_seq, sid=self.aes_sid, key=self.aes_key) crc = calc_scrc32(data) data += struct.pack('<H', crc ^ self.aes_seq) self.aes_seq += 1 logging.debug("encrypted %s [%x]" % (data.encode('hex'), len(data))) if aes and True: # first byte correction sz = len(data) + 3 sz *= 2 sz += 1 header = d41.encode_to_7bit(sz) header.append(5) fmt = '<%dB' % len(header) str_header = struct.pack(fmt, *header) crc = calc_scrc32(data) str_header += struct.pack('>H', crc ^ (self.remote_sid<<1)) data = str_header + data logging.debug("with header %s [%x]" % (data.encode('hex'), len(data))) if rc4: data = self.local_rc4.crypt(data) logging.debug("rc4 %s [%x]" % (data.encode('hex'), len(data))) logging.debug("send %s [%x]" % (data.encode('hex'), len(data))) self.con.sendall(data)
def deseq(self, data): while len(data) > 2: ct, n = d41.decode_7bit(data[:5]) if data[n] != '\x05': raise IOError("Protocol mismatch, header %s" % data[:5].encode('hex')) [crc] = struct.unpack_from('>H', data, n+1) skip = n + 3 sid = 0xFFFFFFFF ^ self.aes_sid if self.aes_sid else 0 yield aes_crypt(data[skip:], self.aes_seq_r, sid=sid, key=self.aes_key) self.aes_seq_r += 1 ct /= 2 ct += 1 data = data[ct:]