Ejemplo n.º 1
0
def log_out_client(socket, username, key, iv):
    msg_logout = protobuf_pb2.MyProtocol()
    msg_logout.TypeNumber = 99
    msg_logout.Type = "Logout"

    cha1 = random.randint(1, 10001)
    msg_logout.C1 = cha1
    msg_logout.Sender_name = username
    socket.send_multipart([util.rsa_en(msg_logout.SerializeToString())])

    msg_logout_r = socket.recv_multipart()
    s_msg = msg_logout_r[0]
    o_msg = util.aes_de(key, iv, s_msg)
    msg_logout_rp = protobuf_pb2.MyProtocol()
    msg_logout_rp.ParseFromString(o_msg)

    if msg_logout_rp.TypeNumber == 102:  # Success
        if msg_logout_rp.C1 == cha1 + 1:
            msg_logout_confirm = protobuf_pb2.MyProtocol()
            msg_logout_confirm.TypeNumber = 103
            msg_logout_confirm.C2 = msg_logout_rp.C2 + 1
            socket.send_multipart(
                [util.rsa_en(msg_logout_confirm.SerializeToString())])
            print 'You have logged out successfully'
            time.sleep(1)  # sleep 1s, waiting for subthread finish
            os._exit(0)

    if msg_logout_rp.TypeNumber == 0:
        print msg_logout_rp.Error
Ejemplo n.º 2
0
def sign_up_client(socket, key, iv):
    flag = 1
    while flag == 1:
        sign_up_rq = protobuf_pb2.MyProtocol()

        name = raw_input('Please enter your username: '******'base-64')
        sign_up_rq.Iv_client = iv.encode('base-64')

        socket.send_multipart([util.rsa_en(sign_up_rq.SerializeToString())])

        message = socket.recv_multipart()
        s_msg = message[0]
        s_msg_sig = message[1]

        if util.rsa_verify(s_msg_sig,
                           s_msg) == True:  # verify server signature
            o_msg = util.aes_de(key, iv, s_msg)

            sign_up_resp = protobuf_pb2.MyProtocol()
            sign_up_resp.ParseFromString(o_msg)

            if sign_up_resp.TypeNumber == 0:  # Error
                print sign_up_resp.Error
                flag = 1

            if sign_up_resp.TypeNumber == 999:  # Have signed up Error
                print sign_up_resp.Error
                flag = 0

            if sign_up_resp.TypeNumber == 11:  # Success
                flag = 0
                if sign_up_resp.C1 == cha1:
                    sign_up_3 = protobuf_pb2.MyProtocol()
                    sign_up_3.TypeNumber = 13
                    sign_up_3.UserName = sign_up_resp.UserName
                    sign_up_3.C2 = sign_up_resp.C2
                    print sign_up_resp.Note
                    socket.send_multipart(
                        [util.rsa_en(sign_up_3.SerializeToString())])
                else:
                    print 'Wrong Challenge, please try it again'
                    sign_up_3 = protobuf_pb2.MyProtocol()
                    sign_up_3.TypeNumber = 14
                    sign_up_3.Error = "Wrong challenge"

                    socket.send_multipart([log_in_3.SerializeToString()])
Ejemplo n.º 3
0
def heartbeat_client(socket, name):
    hb = protobuf_pb2.MyProtocol()
    hb.TypeNumber = 1234
    hb.Sender_name = name
    hb_en = util.rsa_en(logout_response.SerializeToString())
    socket.send_multipart([util.rsa_en(logout_response.SerializeToString())])
    while(True):
        socket.send_multipart([hb_en])
        time.sleep(300) # 5 mins
def list_client(socket, name, key, iv):
    list_request1 = protobuf_pb2.MyProtocol()
    list_request1.TypeNumber = 3
    list_request1.Type = "List"
    list_request1.Sender_name = name
    list_request1.C1 = random.randint(1,10001)
    socket.send_multipart([util.rsa_en(list_request1.SerializeToString())])

    list_rq2 = socket.recv_multipart()
    s_msg = list_rq2[0]
    o_msg = util.aes_de(key, iv, s_msg)

    list_request2 = protobuf_pb2.MyProtocol()
    list_request2.ParseFromString(o_msg)
    print list_request2.Note

    list_request3 = protobuf_pb2.MyProtocol()
    list_request3.Note = "Confirm"
    list_request3.Sender_name = name
    list_request3.C2 = list_request2.C2
    socket.send_multipart([util.rsa_en(list_request3.SerializeToString())])
def log_in_client(socket, bind_port, key, iv):
    flag = 1
    while flag == 1:
        log_in_rq = protobuf_pb2.MyProtocol()

        name = raw_input('Please enter your username: '******'Please enter your password: '******'base-64')
        log_in_rq.Iv_client = iv.encode('base-64')

        socket.send_multipart([util.rsa_en(log_in_rq.SerializeToString())])

        message = socket.recv_multipart()
        s_msg = message[0]
        s_msg_sig = message[1]

        if util.rsa_verify(s_msg_sig, s_msg) == True: # verify the signature from server
            o_msg = util.aes_de(key, iv, s_msg)

            log_in_resp = protobuf_pb2.MyProtocol()
            log_in_resp.ParseFromString(o_msg)

            if log_in_resp.TypeNumber == 0: # Error
                print log_in_resp.Error
                flag = 1

            if log_in_resp.TypeNumber == 21: # Success
                print log_in_resp.Note
                flag = 0
                if log_in_resp.C1 == cha1:
                    log_in_3 = protobuf_pb2.MyProtocol()
                    log_in_3.TypeNumber = 23
                    log_in_3.UserName = log_in_resp.UserName
                    log_in_3.C2 = log_in_resp.C2

                    socket.send_multipart([util.rsa_en(log_in_3.SerializeToString())])
                    return name
                else:
                    print 'Wrong Challenge, please try it again'
                    log_in_3 = protobuf_pb2.MyProtocol()
                    log_in_3.TypeNumber = 24
                    log_in_3.Error = "Wrong challenge"
                    
                    socket.send_multipart([log_in_3.SerializeToString()])

            if log_in_resp.TypeNumber == 22: # Wrong password
                print log_in_resp.Note
                flag = 1

            if log_in_resp.TypeNumber == 25: # Not sign up
                print log_in_resp.Note
                os._exit(0)
Ejemplo n.º 6
0
                    del connect_ident[msg_client.Sender_name]

            if bool(connect_socket) == True:
                if msg_client.Sender_name in connect_socket:
                    del connect_socket[msg_client.Sender_name]

            if bool(session_key_set) == True:
                if msg_client.Sender_name in connect_socket:
                    del session_key_set[msg_client.Sender_name]

            logout_response = protobuf_pb2.MyProtocol()
            logout_response.TypeNumber = 101
            logout_response.Type = "Log out response"
            logout_response.C2 = msg_client.C2 + 1
            socket.send_multipart(
                [util.rsa_en(logout_response.SerializeToString())])

    elif sys.stdin.fileno(
    ) in sock and sock[0] == zmq.POLLIN:  # command type in
        userin = sys.stdin.readline().splitlines()[0]
        cmd = userin.split(' ', 2)  # split max is 3

        if cmd[0] == 'list':
            list1.list_client(socket, username, key_client, iv_client)

        elif cmd[0] == 'send' and len(cmd) > 2:
            connect_name = cmd[1]
            message_to_send = cmd[2]
            if cmd[1] == username:
                print 'You cannot send message to yourself'
                print_prompt(' <<< ')
Ejemplo n.º 7
0
def send_client(socket, name, connect_name, chat_socket, mutex, key, iv, session_key_set, mutex_session_key):
    send_request1 = protobuf_pb2.MyProtocol()
    send_request1.TypeNumber = 4
    send_request1.Type = "Send"
    send_request1.Sender_name = name
    send_request1.Chat_to = connect_name
    socket.send_multipart([util.rsa_en(send_request1.SerializeToString())])

    send_rq2 = socket.recv_multipart()
    send_rq2_de = util.aes_de(key, iv, send_rq2[0])
    send_request2 = protobuf_pb2.MyProtocol()
    send_request2.ParseFromString(send_rq2_de)

    if send_request2.TypeNumber == 0: # Error
        print send_request2.Error
    
    if send_request2.TypeNumber == 42: # Success
        port = send_request2.Port
        context = zmq.Context()
        sub_socket = context.socket(zmq.DEALER)
        server = "localhost"
        sub_socket.connect("tcp://%s:%s" %(server, port))

        mutex.acquire()
        chat_socket[connect_name] = sub_socket
        mutex.release()

        msg1 = protobuf_pb2.MyProtocol()
        msg1.TypeNumber = 10
        msg1.Sender_name = name
        msg1.Chat_to = connect_name
        msg1.Ticket = send_request2.Ticket
        sub_socket.send_multipart([msg1.SerializeToString()])

        message2 = sub_socket.recv_multipart()

        send_request3 = protobuf_pb2.MyProtocol()
        send_request3.TypeNumber = 41
        send_request3.Sender_name = name
        send_request3.Chat_to = connect_name
        nonce_1 = random.randint(1,10001)
        send_request3.N1 = nonce_1
        send_request3.Note = message2[0].encode('base-64')
        socket.send_multipart([util.rsa_en(send_request3.SerializeToString())])

        send_rq4 = socket.recv_multipart()
        send_rq4_de = util.aes_de(key, iv, send_rq4[0])
        send_request4 = protobuf_pb2.MyProtocol()
        send_request4.ParseFromString(send_rq4_de)

        if send_request4.TypeNumber == 0: # Error
            print send_request4.Error

        if send_request4.TypeNumber == 44: # Success
            ticket_to_B = send_request4.Ticket

            key_ab = send_request4.Key_ab.decode('base-64')
            iv_ab = send_request4.Iv_ab.decode('base-64')
            sub_socket.send_multipart([ticket_to_B.decode('base-64')])

            message4 = sub_socket.recv_multipart()
            msg4_de = util.aes_de(key_ab, iv_ab, message4[0])
            msg4 = protobuf_pb2.MyProtocol()
            msg4.ParseFromString(msg4_de)
            msg5 = protobuf_pb2.MyProtocol()
            msg5.TypeNumber = 105
            msg5.N2 = msg4.N2 - 1
            msg5_en = util.aes_en(key_ab, iv_ab, msg5.SerializeToString())
            sub_socket.send_multipart([msg5_en])

            message6 = sub_socket.recv_multipart()
            msg6_de = util.aes_de(key_ab, iv_ab, message6[0])
            msg6 = protobuf_pb2.MyProtocol()
            msg6.ParseFromString(msg6_de)

            public_eckey1 = msg6.Key_ab.decode('base-64')
            iv1 = msg6.Iv_ab.decode('base-64')

            if msg6.TypeNumber == 106: # Success
                private_eckey2, public_eckey2, iv2 = util.generate_eckey()

                msg7 = protobuf_pb2.MyProtocol()
                msg7.TypeNumber == 107
                msg7.Sender_name = name
                msg7.Key_ab = public_eckey2.encode('base-64')
                msg7.Iv_ab = iv2.encode('base-64')
                msg7_en = util.aes_en(key_ab, iv_ab, msg7.SerializeToString())
                sub_socket.send_multipart([msg7_en])
                key_ab_session, iv_ab_session = util.generate_shared_key(private_eckey2, public_eckey1, iv2, iv1)

                session_start_time = int(time.time())
                mutex_session_key.acquire()
                session_key_set[connect_name] = [key_ab_session, iv_ab_session, session_start_time]
                mutex_session_key.release()
                return 1