



import os
import random
import sys

from . import cryptomath_module as cryptoMath  # noqa: N812
from . import rabin_miller as rabinMiller  # noqa: N812






def      lowerCAmelCase__		(   ):





				'''simple docstring'''

				print('''Making key files...''')
				make_key_files('''rsa'''	,1024)
				print('''Key files generation successful.''')






def      lowerCAmelCase__		(   lowerCamelCase_		:		int):





				'''simple docstring'''

				print('''Generating prime p...''')
				lowerCAmelCase__					:    Optional[int]												=					rabinMiller.generate_large_prime(lowerCamelCase_)
				print('''Generating prime q...''')
				lowerCAmelCase__					:    List[str]												=					rabinMiller.generate_large_prime(lowerCamelCase_)
				lowerCAmelCase__					:    str												=					p * q

				print('''Generating e that is relatively prime to (p - 1) * (q - 1)...''')
				while True:
								lowerCAmelCase__					:    str												=					random.randrange(2 ** (key_size - 1)	,2 ** (key_size))
								if cryptoMath.gcd(lowerCamelCase_	,(p - 1) * (q - 1)) == 1:
												break

				print('''Calculating d that is mod inverse of e...''')
				lowerCAmelCase__					:    Any												=					cryptoMath.find_mod_inverse(lowerCamelCase_	,(p - 1) * (q - 1))

				lowerCAmelCase__					:    Union[str, Any]												=					(n, e)
				lowerCAmelCase__					:    List[Any]												=					(n, d)
				return (public_key, private_key)






def      lowerCAmelCase__		(   lowerCamelCase_		:		str	,lowerCamelCase_		:		int):





				'''simple docstring'''

				if os.path.exists(f"""{name}_pubkey.txt""") or os.path.exists(f"""{name}_privkey.txt"""):
								print('''\nWARNING:''')
								print(
								    f"""\"{name}_pubkey.txt\" or \"{name}_privkey.txt\" already exists. \n"""
								    '''Use a different name or delete these files and re-run this program.''')
								sys.exit()

				lowerCAmelCase__						,		lowerCAmelCase__					:    Tuple												=					generate_key(lowerCamelCase_)
				print(f"""\nWriting public key to file {name}_pubkey.txt...""")
				with open(f"""{name}_pubkey.txt"""	,'''w''') as out_file:
								out_file.write(f"""{key_size},{public_key[0]},{public_key[1]}""")

				print(f"""Writing private key to file {name}_privkey.txt...""")
				with open(f"""{name}_privkey.txt"""	,'''w''') as out_file:
								out_file.write(f"""{key_size},{private_key[0]},{private_key[1]}""")


if __name__ == "__main__":
							main()






def      lowerCAmelCase__		(   lowerCamelCase_		:		int	,lowerCamelCase_		:		int):





				'''simple docstring'''

				while b:
								lowerCAmelCase__						,		lowerCAmelCase__					:    Optional[Any]												=					b, a % b
				return a






def      lowerCAmelCase__		(   lowerCamelCase_		:		int	,lowerCamelCase_		:		int):





				'''simple docstring'''

				return a if b == 0 else euclidean_gcd_recursive(lowerCamelCase_	,a % b)






def      lowerCAmelCase__		(   ):





				'''simple docstring'''

				print(f"""euclidean_gcd(3, 5) = {euclidean_gcd(3	,5)}""")
				print(f"""euclidean_gcd(5, 3) = {euclidean_gcd(5	,3)}""")
				print(f"""euclidean_gcd(1, 3) = {euclidean_gcd(1	,3)}""")
				print(f"""euclidean_gcd(3, 6) = {euclidean_gcd(3	,6)}""")
				print(f"""euclidean_gcd(6, 3) = {euclidean_gcd(6	,3)}""")

				print(f"""euclidean_gcd_recursive(3, 5) = {euclidean_gcd_recursive(3	,5)}""")
				print(f"""euclidean_gcd_recursive(5, 3) = {euclidean_gcd_recursive(5	,3)}""")
				print(f"""euclidean_gcd_recursive(1, 3) = {euclidean_gcd_recursive(1	,3)}""")
				print(f"""euclidean_gcd_recursive(3, 6) = {euclidean_gcd_recursive(3	,6)}""")
				print(f"""euclidean_gcd_recursive(6, 3) = {euclidean_gcd_recursive(6	,3)}""")


if __name__ == "__main__":
							main()

