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
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()])
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)
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(' <<< ')
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