def receiveThread(): global authenticated, user while True: msge = receive(client_socket, raw=True) try: msg = msge.decode('utf8') except: msg = "" if (checkCMD('!login success', msg) or checkCMD('!signup success', msg)): action = "login" if checkCMD('!login success', msg) else "signup" infodump = receive(client_socket, raw=True) info = pickle.loads(infodump) if (action == "login"): with open("./data/" + info["id"], 'rb') as userfile: user = pickle.load(userfile) else: user = User(info['id'], info['p'], info['g']) with open("./data/" + user.id, 'wb+') as userfile: pickle.dump(user, userfile) send(str(user.publicKey), client_socket) elif checkCMD("!new user", msg): send("!new user", client_socket) display("Adding user, please wait...") while (True): try: publicKeys = pickle.loads(receive(client_socket, raw=True)) if (user.id not in publicKeys): publicKeys[user.id] = user.publicKey keyExchange(user, publicKeys) send(pickle.dumps(user.encryptedSenderKeys), client_socket, raw=True) tmp = receive(client_socket, raw=True) otherSenderKeys = pickle.loads(tmp) user.decryptSenderKeys(otherSenderKeys) with open("./data/" + user.id, 'wb+') as userfile: pickle.dump(user, userfile) authenticated = True break except: display("Waiting for server, please wait...") time.sleep(0.5) elif checkCMD('!quit', msg): user.encryptSenderKeys() with open("./data/" + user.id, 'wb+') as userfile: pickle.dump(user, userfile) display("Terminating connection") client_socket.close() os._exit(1) elif checkCMD('!broadcast', msg): display(msg[len("!broadcast"):]) else: if (authenticated): fromUser = msge[:USERNAME_LENGTH].decode('utf8').strip() nonceRec, msgRec, tagRec = pickle.loads(msge[USERNAME_LENGTH:]) if fromUser == user.id: decipher = AES.new(user.senderKey, AES.MODE_EAX, nonce=nonceRec) else: decipher = AES.new(user.decryptedSenderKeys[fromUser], AES.MODE_EAX, nonce=nonceRec) decMsgRec = decipher.decrypt(msgRec) try: decipher.verify(tagRec) except ValueError: display( "MAC verification failed. Message may have been tampered with or ratcheting got out of sync" ) if (fromUser != user.id): display(fromUser + ": " + decMsgRec.decode('utf8')) user.decryptedSenderKeys[fromUser] = KDF( user.decryptedSenderKeys[fromUser], RATCHETING_STEPS) else: display(fromUser + ": " + decMsgRec.decode('utf8')) user.senderKey = KDF(user.senderKey, RATCHETING_STEPS) else: display(msg)