def request_authentication(username, sock, sip, sport, password): a = util.get_random_number() A = util.get_public_ephemeral(a) message = {} message.update({'username': username}) message.update({'A': A}) try: msg = util.encrypt_message_PSK(message, SERVER_KEY) except Exception as e: print "An error occured while encrypting the text message - ", message, "! %s" %e try: #start_new_thread(receiveMessages, (sock,)) sock.connect((sip, int(sport))) send_message(sock, msg, sip, sport) progress[username] = 1 t1 = Thread(target=receiveMessages, args=(sock, username, sip, sport, A, password, a)) t1.start() t1.join() if(EXIT_IN_ERROR): sys.exit() except ServerConnectionBroken: print 'Connection broken !!' sys.exit()
def receiveMessages(sock, username, sip, sport, A, password, a): while(1): try: # try to receive messages from the server msg = sock.recv(40960) # changed here akshay if msg != '': msg1 = pickle.loads(msg) #print("Received message:%s" %(msg1)) status = progress[username] if(status == 1): if(msg1 == 'ERROR'): global EXIT_IN_ERROR EXIT_IN_ERROR = True sys.exit() value = find_value_from_hash(msg1) send_message(sock, value, sip, sport) progress[username] = 2 if(status == 2): challenge_pk_data = {} data_for_kas = {} final_to_server = {} global shared_key shared_key = compute_shared_key(A, msg1, username, password, a) final_kas = util.MD5_HASH(shared_key) challenge = util.get_random_number() global NONCE_SENT NONCE_SENT = challenge data_for_kas.update({'CHALLENGE': challenge , 'PK_CLIENT': CLIENT_PUBLIC_KEY_STR}) Kas_encrypted_data = util.encrypt_message_KAS(data_for_kas, final_kas, GENERATED_IV) # add IV here challenge_pk_data.update({'CHALLENGE_PK': Kas_encrypted_data, 'CHALLENGE': challenge, 'IV': GENERATED_IV}) data_to_server = util.encrypt_message_PSK(challenge_pk_data, SERVER_KEY) send_message(sock, data_to_server, sip, sport) progress[username] = 3 if(status == 3): hash_shared_key = util.MD5_HASH(shared_key) nonce = util.decrypt_using_Kas(msg1, hash_shared_key, GENERATED_IV) incremented_nonce = long(nonce) + 1 if incremented_nonce == NONCE_SENT: print ("Login Success !") return True else: print("Authentication pending!") return False else: print("Connection with server is broken...") sys.exit() except KeyboardInterrupt: sock.close() # handling socket errors except socket.error, s_error: sock.close() error_code = s_error[0] error_message = s_error[1] print('Error in reading messages: ', error_code, ' - ', error_message) except Exception as e: print('Error occured:', e) sock.close() sys.exit()