file = open('numtests.txt', mode = 'r', encoding = 'utf-8-sig') lines = file.readlines() file.close() commands = {"Sum", "Product", "LShift", "LShift1", "ModExp", "Remainder"} command = "" result = 0 A = 0 E = 0 B = 0 N = 0 M = 0 ctr = 0 def print_mpint(a, A): print(a + " dd " + str((A.bit_length() + 7) // 8)) print(" db ", end='') for byte in A.to_bytes(((A.bit_length() + 7) // 8),"little"): print(hex(byte) + ", ", end='') print("0x0") print(" rb MPINT_MAX_LEN - " + str(max((((A.bit_length() + 7) // 8) + 1), 0))) for line in lines: words = line.split() if line[0] == '#': print(";" + line[1:], end='') elif words[0] in commands: command = words[0] result = int(words[2], 16) ctr+=1 elif words[0] == 'A': A = int(words[2], 16) if (command == 'LShift1'): if (A >= 0): print("stdcall mpint_shl1, mpint_A" + str(ctr)) print("stdcall mpint_cmp, mpint_A" + str(ctr) + ", mpint_result" + str(ctr)) print("je @f") print("mov eax, " + str(ctr)) print("int3") print("@@:") print("iglobal") print_mpint(str("mpint_A" + str(ctr)), A) print_mpint(str("mpint_result" + str(ctr)), result) print("endg") print() elif words[0] == 'B': B = int(words[2], 16) if (command == 'Sum'): if (A >= 0) & (B >= 0): print("stdcall mpint_add, mpint_B" + str(ctr) + ", mpint_A" + str(ctr)) print("stdcall mpint_cmp, mpint_B" + str(ctr) + ", mpint_result" + str(ctr)) print("je @f") print("mov eax, " + str(ctr)) print("int3") print("@@:") print("iglobal") print_mpint(str("mpint_A" + str(ctr)), A) print_mpint(str("mpint_B" + str(ctr)), B) print_mpint(str("mpint_result" + str(ctr)), result) print("endg") print() elif (A <= 0) & (B >= 0) & (result >= 0): print("stdcall mpint_sub, mpint_B" + str(ctr) + ", mpint_A" + str(ctr)) print("stdcall mpint_cmp, mpint_B" + str(ctr) + ", mpint_result" + str(ctr)) print("je @f") print("mov eax, " + str(ctr)) print("int3") print("@@:") print("iglobal") print_mpint(str("mpint_A" + str(ctr)), -A) print_mpint(str("mpint_B" + str(ctr)), B) print_mpint(str("mpint_result" + str(ctr)), result) print("endg") print() elif (A >= 0) & (B <= 0) & (result >= 0): print("stdcall mpint_sub, mpint_A" + str(ctr) + ", mpint_B" + str(ctr)) print("stdcall mpint_cmp, mpint_A" + str(ctr) + ", mpint_result" + str(ctr)) print("je @f") print("mov eax, " + str(ctr)) print("int3") print("@@:") print("iglobal") print_mpint(str("mpint_A" + str(ctr)), A) print_mpint(str("mpint_B" + str(ctr)), -B) print_mpint(str("mpint_result" + str(ctr)), result) print("endg") print() if (command == 'Product'): if (A >= 0) & (B >= 0): print("stdcall mpint_mul, mpint_tmp, mpint_B" + str(ctr) + ", mpint_A" + str(ctr)) print("stdcall mpint_cmp, mpint_tmp, mpint_result" + str(ctr)) print("je @f") print("mov eax, " + str(ctr)) print("int3") print("@@:") print("iglobal") print_mpint(str("mpint_A" + str(ctr)), A) print_mpint(str("mpint_B" + str(ctr)), B) print_mpint(str("mpint_result" + str(ctr)), result) print("endg") print() if (command == 'Remainder'): if (A >= 0) & (B >= 0): print("stdcall mpint_mod, mpint_A" + str(ctr) + ", mpint_B" + str(ctr)) print("stdcall mpint_cmp, mpint_A" + str(ctr) + ", mpint_result" + str(ctr)) print("je @f") print("mov eax, " + str(ctr)) print("int3") print("@@:") print("iglobal") print_mpint(str("mpint_A" + str(ctr)), A) print_mpint(str("mpint_B" + str(ctr)), B) print_mpint(str("mpint_result" + str(ctr)), result) print("endg") print() elif words[0] == 'N': N = int(words[2], 16) if (command == 'LShift'): if (A >= 0): print("stdcall mpint_shlmov, mpint_tmp, mpint_A" + str(ctr) + ", " + str(N)) print("stdcall mpint_cmp, mpint_tmp, mpint_result" + str(ctr)) print("je @f") print("mov eax, " + str(ctr)) print("int3") print("@@:") print("stdcall mpint_shl, mpint_A" + str(ctr) + ", " + str(N)) print("stdcall mpint_cmp, mpint_A" + str(ctr) + ", mpint_result" + str(ctr)) print("je @f") print("mov eax, " + str(ctr)) print("int3") print("@@:") print("iglobal") print_mpint(str("mpint_A" + str(ctr)), A) print_mpint(str("mpint_result" + str(ctr)), result) print("endg") print() elif words[0] == 'E': E = int(words[2], 16) elif words[0] == 'M': M = int(words[2], 16) if (command == 'ModExp'): if (A >= 0) & (B >= 0): print("stdcall mpint_modexp, mpint_tmp, mpint_A" + str(ctr) + ", mpint_E" + str(ctr) + ", mpint_M" + str(ctr)) print("stdcall mpint_cmp, mpint_tmp, mpint_result" + str(ctr)) print("je @f") print("mov eax, " + str(ctr)) print("int3") print("@@:") print("iglobal") print_mpint(str("mpint_A" + str(ctr)), A) print_mpint(str("mpint_E" + str(ctr)), E) print_mpint(str("mpint_M" + str(ctr)), M) print_mpint(str("mpint_result" + str(ctr)), result) print("endg") print() else: command = ''