import os
from multiprocessing import Process, Lock
import uuid

def work(lock, num, stri):
	case_insensitive = False
	comment = stri
	os.system("mkdir /tmp/ram/{} 2> /dev/null".format(num))
	key_name = "/tmp/ram/{num}/key_{num}".format(num=num)
	while True:
		os.system("rm {}* 2> /dev/null".format(key_name))
		os.system("ssh-keygen -t ed25519 -f {} -C {} -N '' 2>&1 > /dev/null".format(key_name, comment))
		k = open("{}.pub".format(key_name),"r").read().split(" ")[1]
		a = stri.lower() if case_insensitive else stri
		b = k[-1*len(stri):].lower() if case_insensitive else k[-1*len(stri):]
		if a == b:
			os.system("mkdir -p /tmp/keys/{uid}_{last_char};cp {key_name}* /tmp/keys/{uid}_{last_char}/".format(uid=str(uuid.uuid4()),key_name=key_name, last_char=k[-1*len(stri):]));
			with lock:
				print("FOUND KEY ENDING WITH {}".format(k[-1*len(stri):]))
				print("Public Key")
				print(open("{}.pub".format(key_name),"r").read())
			break


if __name__ == '__main__':
    if len(sys.argv) != 2:
        print("Please provide search string")
    else:
        stri = sys.argv[1]
        threads = 60
        lock = Lock()
        os.system("mkdir /tmp/ram/ 2> /dev/null")
        try:
            os.system("mount -t tmpfs -o size=200M none  /tmp/ram")
            for num in range(threads):
                Process(target=work, args=(lock,num, stri)).start()
            x=input("Press Enter to Exit\n")
            sys.exit()
        finally:
            os.system("umount /tmp/ram")