From 22f6cc0496f29d909c3f777d7c9b59559ab5723d Mon Sep 17 00:00:00 2001 From: "Pavel V. Shatov (Meister)" Date: Sat, 24 Jun 2017 23:29:33 +0300 Subject: Improved the model: * added CRT support * fixed bug in systolic array when operand width is not a multiple of array width --- test/format_test_vectors.py | 99 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 84 insertions(+), 15 deletions(-) (limited to 'test/format_test_vectors.py') diff --git a/test/format_test_vectors.py b/test/format_test_vectors.py index dd8670d..21b9262 100644 --- a/test/format_test_vectors.py +++ b/test/format_test_vectors.py @@ -79,6 +79,46 @@ def read_secret(key): openssl_secret = openssl_secret.replace(" ", "") return openssl_secret +# +# read part of private key from file +# +def read_prime1(key): + openssl_command = ["openssl", "rsa", "-in", key + ".key", "-noout", "-text"] + openssl_stdout = subprocess.check_output(openssl_command).decode("utf-8") + openssl_secret = string_between(openssl_stdout, "prime1", "prime2") + openssl_secret = openssl_secret.replace(":", "") + openssl_secret = openssl_secret.replace("\n", "") + openssl_secret = openssl_secret.replace(" ", "") + return openssl_secret +def read_prime2(key): + openssl_command = ["openssl", "rsa", "-in", key + ".key", "-noout", "-text"] + openssl_stdout = subprocess.check_output(openssl_command).decode("utf-8") + openssl_secret = string_between(openssl_stdout, "prime2", "exponent1") + openssl_secret = openssl_secret.replace(":", "") + openssl_secret = openssl_secret.replace("\n", "") + openssl_secret = openssl_secret.replace(" ", "") + return openssl_secret + +# +# read prive exponent from file +# +def read_exponent1(key): + openssl_command = ["openssl", "rsa", "-in", key + ".key", "-noout", "-text"] + openssl_stdout = subprocess.check_output(openssl_command).decode("utf-8") + openssl_secret = string_between(openssl_stdout, "exponent1", "exponent2") + openssl_secret = openssl_secret.replace(":", "") + openssl_secret = openssl_secret.replace("\n", "") + openssl_secret = openssl_secret.replace(" ", "") + return openssl_secret +def read_exponent2(key): + openssl_command = ["openssl", "rsa", "-in", key + ".key", "-noout", "-text"] + openssl_stdout = subprocess.check_output(openssl_command).decode("utf-8") + openssl_secret = string_between(openssl_stdout, "exponent2", "coefficient") + openssl_secret = openssl_secret.replace(":", "") + openssl_secret = openssl_secret.replace("\n", "") + openssl_secret = openssl_secret.replace(" ", "") + return openssl_secret + # # https://en.wikibooks.org/wiki/Algorithm_Implementation/Mathematics/Extended_Euclidean_algorithm # @@ -99,13 +139,19 @@ def modinv(a, m): # # format one test vector # -def format_c_header(f, key, n, m, d, s): +def format_c_header(f, key, n, m, d, s, p, q, dp, dq, mp, mq): # write all numbers in vector - format_c_array(f, n, "#define N_" + str(key) + " \\\n") - format_c_array(f, m, "#define M_" + str(key) + " \\\n") - format_c_array(f, d, "#define D_" + str(key) + " \\\n") - format_c_array(f, s, "#define S_" + str(key) + " \\\n") + format_c_array(f, n, "#define N_" + str(key) + " \\\n") + format_c_array(f, m, "#define M_" + str(key) + " \\\n") + format_c_array(f, d, "#define D_" + str(key) + " \\\n") + format_c_array(f, s, "#define S_" + str(key) + " \\\n") + format_c_array(f, p, "#define P_" + str(key) + " \\\n") + format_c_array(f, q, "#define Q_" + str(key) + " \\\n") + format_c_array(f, dp, "#define DP_" + str(key) + " \\\n") + format_c_array(f, dq, "#define DQ_" + str(key) + " \\\n") + format_c_array(f, mp, "#define MP_" + str(key) + " \\\n") + format_c_array(f, mq, "#define MQ_" + str(key) + " \\\n") # # calculate Montgomery factor @@ -274,20 +320,43 @@ if __name__ == "__main__": for key in keys: # prepare all the numbers - modulus = int(read_modulus(key), 16) # read number n from .key file - message = int(read_message(key), 16) # read number m from .txt file - secret = int(read_secret(key), 16) # read number d from .key file - signature = pow(message, secret, modulus) # calculate signature + modulus = int(read_modulus(key), 16) # read number n from .key file + message = int(read_message(key), 16) # read number m from .txt file + secret = int(read_secret(key), 16) # read number d from .key file + signature = pow(message, secret, modulus) # calculate signature + prime1 = int(read_prime1(key), 16) # read p + prime2 = int(read_prime2(key), 16) # read q + exponent1 = int(read_exponent1(key), 16) # read dp + exponent2 = int(read_exponent2(key), 16) # read dq + message1 = pow(message, exponent1, prime1) # calculate mp = m ^ dp mod p + message2 = pow(message, exponent2, prime2) # calculate mq = m ^ dq mod q + coefficient = modinv(prime2, prime1) # calculate + + # do CRT to make sure everything is correct + h = coefficient * (message1 - message2) % prime1 + crt = message2 + h * prime2 # print all the numbers print("key = " + key) - print(" modulus = " + hex(modulus)) - print(" message = " + hex(message)) - print(" secret = " + hex(secret)) - print(" signature = " + hex(signature)) - + print(" modulus = " + hex(modulus)) + print(" message = " + hex(message)) + print(" secret = " + hex(secret)) + print(" signature = " + hex(signature)) + print(" prime1 = " + hex(prime1)) + print(" prime2 = " + hex(prime2)) + print(" exponent1 = " + hex(exponent1)) + print(" exponent2 = " + hex(exponent2)) + print(" message1 = " + hex(message1)) + print(" message2 = " + hex(message2)) + print(" coefficient = " + hex(coefficient)) + print(" crt = " + hex(crt)) + + # check + if crt != signature: + raise Exception("Error, crt != signature (?)") + # format numbers and write to file - format_c_header(file_h, key, modulus, message, secret, signature) + format_c_header(file_h, key, modulus, message, secret, signature, prime1, prime2, exponent1, exponent2, message1, message2) format_verilog_include(file_v, key, modulus, message) -- cgit v1.2.3