


import os
import random
import sys

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

def 						_UpperCAmelCase				(			):
     print('Making key files...'				)
     make_key_files('rsa'			,     10_24				)
     print('Key files generation successful.'				)

def 						_UpperCAmelCase				(			SCREAMING_SNAKE_CASE__			:					List[str]				):
     print('Generating prime p...'				)
     __UpperCamelCase    							=rabinMiller.generate_large_prime(__lowerCamelCase				)
     print('Generating prime q...'				)
     __UpperCamelCase    							=rabinMiller.generate_large_prime(__lowerCamelCase				)
     __UpperCamelCase    							=p * q

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

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

def 						_UpperCAmelCase				(			SCREAMING_SNAKE_CASE__			:					Tuple			,     SCREAMING_SNAKE_CASE__			:					Optional[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()

     __UpperCamelCase    							=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      __UpperCAmelCase      (    __lowerCamelCase = 50	)							->      int:
		lowercase__   :    int				=			[[0] * 3 for _ in range(length + 1	)]

		for row_length in range(length + 1	):
				for tile_length in range(2						,     5	):
						for tile_start in range(row_length - tile_length + 1	):
								different_colour_ways_number[row_length][tile_length - 2] += (
								    different_colour_ways_number[row_length - tile_start - tile_length][
								        tile_length - 2
								    ]
								    + 1
								)

		return sum(different_colour_ways_number[length]	)


if __name__ == "__main__":
							print(F'''{solution() = }''')
