class protocolThread(threading.Thread): def __init__(self, host, port, vk, sk): threading.Thread.__init__(self) self.messages = Messages() self.mailbox = Mailbox(host, port, timeout=None) self.vk = vk self.sk = sk self.session = None self.number = None self.number_of_players = None self.players = {} def run(self): crypto = Crypto() crypto.generate_key_pair() enc_key = crypto.export_public_key() self.mailbox.connect() self.messages.make_greeting(self.vk) msg = self.messages.packets.SerializeToString() self.mailbox.send(msg) req = self.mailbox.recv() self.messages.packets.ParseFromString(req) self.session = self.messages.packets.packet[-1].packet.session self.number = self.messages.packets.packet[-1].packet.number if self.session != '': print("Player #" + str(self.number) + " get session number.\n") # Here is when announcment should begin req = self.mailbox.recv() self.messages.packets.ParseFromString(req) phase = self.messages.get_phase() number = self.messages.get_number() time.sleep(1) if phase == 1 and number > 0: print("player #" + str(self.number) + " is about to share verification key with " + str(number) + " players.\n") self.number_of_players = number #Share the keys self.messages.clear_packets() self.messages.packets.packet.add() self.messages.packets.packet[-1].packet.from_key.key = self.vk self.messages.packets.packet[-1].packet.session = self.session self.messages.packets.packet[-1].packet.number = self.number shared_key_message = self.messages.packets.SerializeToString() messages = self.mailbox.share(shared_key_message, self.number, self.number_of_players) self.messages.packets.ParseFromString(messages) self.players = { packet.packet.number: str(packet.packet.from_key.key) for packet in self.messages.packets.packet } print("Player #" + str(self.number) + " got players " + str(self.players) + '\n') # crypto = Crypto() # crypto.generate_key_pair() # enc_key = crypto.export_public_key() # clear old messages self.messages.clear_packets() # add encrytion key self.messages.add_encryption_key(enc_key, None) # self.messages.add_str('x') self.messages.packets.packet[-1].packet.from_key.key = self.players[ self.number] self.messages.packets.packet[-1].packet.session = self.session self.messages.packets.packet[-1].packet.number = self.number # self.messages.packets.packet[-1].signature.signature = '1234' # for the packet # self.messages.form_last_packet(self.sk, self.session, self.number, self.vk, None) # # share the keys outcome_message = self.messages.packets.SerializeToString() print("Player " + str(self.number) + " is about to share encrytion key.\n") msgs = self.mailbox.share(outcome_message, self.number, self.number_of_players) # self.mailbox.send(outcome_message) # print(self.mailbox.send(outcome_message)) # # parse the result # try: # self.messages.packets.ParseFromString(msgs) # except DecodeError: # print('Decoding Error!') # # get encryption keys # if (self.messages.encryption_keys_count() == self.number_of_players): # self.encryption_keys = self.messages.get_encryption_keys() # print('Player '+ str(self.number) + ' recieved all keys for test\n') # else: # raise Exception('Not get encryption keys!') # time.sleep(10) self.mailbox.close()