예제 #1
0
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)