'''simple docstring'''


import os
import random
import sys

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







def    _lowerCamelCase  ()   ->    Union[str, Any]:
			print("Making key files..."     )
			make_key_files("rsa"					,  1024     )
			print("Key files generation successful."     )







def    _lowerCamelCase  (__lowerCamelCase  :     Optional[Any]     )   ->    Tuple:
			print("Generating prime p..."     )
			a__     = rabinMiller.generate_large_prime(lowerCAmelCase__     )
			print("Generating prime q..."     )
			a__     = rabinMiller.generate_large_prime(lowerCAmelCase__     )
			a__     = p * q

			print("Generating e that is relatively prime to (p - 1) * (q - 1)..."     )
			while True:
						a__     = 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..."     )
			a__     = cryptoMath.find_mod_inverse(lowerCAmelCase__					,  (p - 1) * (q - 1)     )

			a__     = (n, e)
			a__     = (n, d)
			return (public_key, private_key)







def    _lowerCamelCase  (__lowerCamelCase  :     Any					,  __lowerCamelCase  :     str     )   ->    List[Any]:
			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()

			a__   ,				a__     = 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()










'''simple docstring'''


def    _lowerCamelCase  (__lowerCamelCase  :     str     )   ->    bool:
			a__     = 0
			for ch in input_str:
						a__     = ord(__lowerCamelCase     )
						a__     = pow(2					,  __lowerCamelCase     )

						# If we already turned on bit for current character's unicode
						if bitmap >> ch_unicode & 1 == 1:
									return False
						bitmap |= ch_bit_index_on
			return True


if __name__ == "__main__":
		import doctest

		doctest.testmod()



