


'''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   _UpperCamelCase				(						)						->None:
   print("""Making key files..."""   )
   make_key_files("""rsa"""  ,						1_0_2_4   )
   print("""Key files generation successful."""   )
def   _UpperCamelCase				(						lowerCAmelCase_   )						->tuple[tuple[int, int], tuple[int, int]]:
   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				(						lowerCAmelCase_  ,						lowerCAmelCase_   )						->None:
   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				,  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()







def   _UpperCamelCase				(						lowerCAmelCase_  ,						lowerCAmelCase_   )						->int:
   return int((input_a, input_a).count(0   ) == 0   )
def   _UpperCamelCase				(						)						->None:
   assert and_gate(0  ,						0   ) == 0
   assert and_gate(0  ,						1   ) == 0
   assert and_gate(1  ,						0   ) == 0
   assert and_gate(1  ,						1   ) == 1


if __name__ == "__main__":
 test_and_gate()
 print(and_gate(1, 0))
 print(and_gate(0, 0))
 print(and_gate(0, 1))
 print(and_gate(1, 1))



