def data_came_in(self, s, data): socket = self.socket[s] self._write_sock(socket, data) while socket['mlen'] >= socket['len']: if socket['hread'] == 0: header = self._read_sock(socket, self.hlen) socket['len'], socket['mac'] = struct.unpack(self.hfmt, header) socket['hread'] = 1 else: if socket['req-mode']: header = self._read_sock(socket, self.rrlen) if socket.has_key('h_in'): socket['h_in'].update(header) data = self._read_sock(socket, socket['len'] - self.rrlen) else: data = self._read_sock(socket, socket['len']) if socket.has_key('h_in'): socket['h_in'].update(data) if socket['mac'] != socket['h_in'].digest(): s.close() print binascii.hexlify(socket['mac']) print binascii.hexlify(socket['h_in'].digest()) self.connection_lost(s, 'Bad HMAC') if socket['req-mode']: (rr, mid) = struct.unpack(self.rrfmt, header) if rr == Request: self.handler.request_came_in(s, mid, data) elif rr == Response: self.handler.response_came_in(s, mid, data) else: self.handler.message_came_in(s, data) socket['len'] = self.hlen socket['hread'] = 0
def _send_msg(self, s, data): socket = self.socket[s] if socket.has_key('h_out'): socket['h_out'].update(data) mac = socket['h_out'].digest() else: mac = '\x00' * 20 return s.write(struct.pack(self.hfmt, len(data), mac) + data)