Пример #1
0
    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)
Пример #2
0
    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:]