aboutsummaryrefslogtreecommitdiff
path: root/test/format_test_vectors.py
diff options
context:
space:
mode:
authorPavel V. Shatov (Meister) <meisterpaul1@yandex.ru>2017-06-24 23:29:33 +0300
committerPavel V. Shatov (Meister) <meisterpaul1@yandex.ru>2017-06-24 23:29:33 +0300
commit22f6cc0496f29d909c3f777d7c9b59559ab5723d (patch)
tree779db563405e37528019eb5bc34ad2ed20ca2ffd /test/format_test_vectors.py
parent53e92c5355aca120eab8d59e6904282c9e3b4ab1 (diff)
Improved the model:
* added CRT support * fixed bug in systolic array when operand width is not a multiple of array width
Diffstat (limited to 'test/format_test_vectors.py')
-rw-r--r--test/format_test_vectors.py99
1 files changed, 84 insertions, 15 deletions
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)