From 1951bf6444d4d5cdaaf0eee1b89a462c32b92b38 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Sun, 15 Sep 2013 12:05:43 -0500 Subject: add cryptrec and openssl test vector loaders + tests --- tests/utils.py | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) (limited to 'tests/utils.py') diff --git a/tests/utils.py b/tests/utils.py index 9362464e..bbb4843f 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -59,3 +59,86 @@ def load_nist_vectors_from_file(filename, op, fields): ) with open(os.path.join(base, filename), "r") as vector_file: return load_nist_vectors(vector_file, op, fields) + + +def load_cryptrec_vectors_from_file(filename): + base = os.path.join( + os.path.dirname(__file__), "primitives", "vectors", "CRYPTREC", + ) + with open(os.path.join(base, filename), "r") as vector_file: + return load_cryptrec_vectors(vector_file) + + +def load_cryptrec_vectors(vector_data): + keys, data = [], {} + + for line in vector_data: + line = line.strip() + + # Blank lines and comments are ignored + if not line or line.startswith("#"): + continue + + if line.startswith("K"): + keys.append(line.split(" : ")[1].replace(" ", "")) + # create an array under the key to hold all the P+C pairs + data[keys[-1]] = [] + elif line.startswith("P"): + # create a new dict to hold the next P+C pair + data[keys[-1]].append({}) + data[keys[-1]][-1]["P"] = line.split(" : ")[1].replace(" ", "") + elif line.startswith("C"): + data[keys[-1]][-1]["C"] = line.split(" : ")[1].replace(" ", "") + + cryptrec_list = [] + for key, value in data.items(): + for pair in value: + cryptrec_list.append( + (key.encode("ascii"), + pair["P"].encode("ascii"), + pair["C"].encode("ascii")) + ) + + return cryptrec_list + + +def load_openssl_vectors_from_file(filename, op): + base = os.path.join( + os.path.dirname(__file__), "primitives", "vectors", "OpenSSL", + ) + with open(os.path.join(base, filename), "r") as vector_file: + return load_openssl_vectors(vector_file, op) + + +def load_openssl_vectors(vector_data, op): + encrypt, decrypt = [], [] + + for line in vector_data: + line = line.strip() + + # Blank lines and comments are ignored + if not line or line.startswith("#"): + continue + + vector = line.split(":") + args_list = (vector[1].encode("ascii"), + vector[2].encode("ascii"), + vector[3].encode("ascii"), + vector[4].encode("ascii")) + # some OpenSSL vectors have a final field + # 0 for decrypt, 1 for encrypt + if len(vector) == 6: + if int(vector[5]) == 0: + decrypt.append(args_list) + else: + encrypt.append(args_list) + else: + # if they don't have 1 or 0 they are meant for both enc & dec + # and should be added to both the encrypt and decrypt list + encrypt.append(args_list) + decrypt.append(args_list) + + if op == "ENCRYPT": + return encrypt + else: + return decrypt -- cgit v1.2.3 From e58f83e7c82ca4a20e3172e6eaf8c2b2a9a7c546 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Sun, 15 Sep 2013 13:55:30 -0500 Subject: sort the cryptrec loader dict's items to test reliably --- tests/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests/utils.py') diff --git a/tests/utils.py b/tests/utils.py index bbb4843f..7d4b3a3e 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -91,7 +91,7 @@ def load_cryptrec_vectors(vector_data): data[keys[-1]][-1]["C"] = line.split(" : ")[1].replace(" ", "") cryptrec_list = [] - for key, value in data.items(): + for key, value in sorted(data.items()): for pair in value: cryptrec_list.append( (key.encode("ascii"), -- cgit v1.2.3 From 057b5001adf7bfe0b4fe1c228cf7d1c17c3d00f5 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Mon, 23 Sep 2013 12:49:48 -0500 Subject: simplify and annotate loaders based on review feedback --- tests/utils.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'tests/utils.py') diff --git a/tests/utils.py b/tests/utils.py index 7d4b3a3e..62dfda27 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -70,7 +70,7 @@ def load_cryptrec_vectors_from_file(filename): def load_cryptrec_vectors(vector_data): - keys, data = [], {} + data = {} for line in vector_data: line = line.strip() @@ -80,15 +80,18 @@ def load_cryptrec_vectors(vector_data): continue if line.startswith("K"): - keys.append(line.split(" : ")[1].replace(" ", "")) + key = line.split(" : ")[1].replace(" ", "") # create an array under the key to hold all the P+C pairs - data[keys[-1]] = [] + # each key has many p+c pairs + data[key] = [] elif line.startswith("P"): # create a new dict to hold the next P+C pair - data[keys[-1]].append({}) - data[keys[-1]][-1]["P"] = line.split(" : ")[1].replace(" ", "") + pc_pair = {} + pc_pair["P"] = line.split(" : ")[1].replace(" ", "") elif line.startswith("C"): - data[keys[-1]][-1]["C"] = line.split(" : ")[1].replace(" ", "") + pc_pair["C"] = line.split(" : ")[1].replace(" ", "") + # after a C is found the P+C pair is complete + data[key].append(pc_pair) cryptrec_list = [] for key, value in sorted(data.items()): @@ -121,22 +124,22 @@ def load_openssl_vectors(vector_data, op): continue vector = line.split(":") - args_list = (vector[1].encode("ascii"), - vector[2].encode("ascii"), - vector[3].encode("ascii"), - vector[4].encode("ascii")) + params = (vector[1].encode("ascii"), # key + vector[2].encode("ascii"), # iv + vector[3].encode("ascii"), # ciphertext + vector[4].encode("ascii")) # plaintext # some OpenSSL vectors have a final field # 0 for decrypt, 1 for encrypt if len(vector) == 6: if int(vector[5]) == 0: - decrypt.append(args_list) + decrypt.append(params) else: - encrypt.append(args_list) + encrypt.append(params) else: # if they don't have 1 or 0 they are meant for both enc & dec # and should be added to both the encrypt and decrypt list - encrypt.append(args_list) - decrypt.append(args_list) + encrypt.append(params) + decrypt.append(params) if op == "ENCRYPT": return encrypt -- cgit v1.2.3 From 6b99a1b6d2e55e41bda5a42357e1b92f2e38d2ab Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Tue, 24 Sep 2013 16:50:21 -0500 Subject: remove distinction between encrypt/decrypt in the openssl loader * This was done because all the OpenSSL test vectors we're currently using are identical between encrypt/decrypt. * Removed a bunch of unneeded unit tests that checked the encrypt/decrypt vectors --- tests/utils.py | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) (limited to 'tests/utils.py') diff --git a/tests/utils.py b/tests/utils.py index 62dfda27..48a32ebe 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -105,16 +105,16 @@ def load_cryptrec_vectors(vector_data): return cryptrec_list -def load_openssl_vectors_from_file(filename, op): +def load_openssl_vectors_from_file(filename): base = os.path.join( os.path.dirname(__file__), "primitives", "vectors", "OpenSSL", ) with open(os.path.join(base, filename), "r") as vector_file: - return load_openssl_vectors(vector_file, op) + return load_openssl_vectors(vector_file) -def load_openssl_vectors(vector_data, op): - encrypt, decrypt = [], [] +def load_openssl_vectors(vector_data): + vectors = [] for line in vector_data: line = line.strip() @@ -130,18 +130,5 @@ def load_openssl_vectors(vector_data, op): vector[4].encode("ascii")) # plaintext # some OpenSSL vectors have a final field # 0 for decrypt, 1 for encrypt - if len(vector) == 6: - if int(vector[5]) == 0: - decrypt.append(params) - else: - encrypt.append(params) - else: - # if they don't have 1 or 0 they are meant for both enc & dec - # and should be added to both the encrypt and decrypt list - encrypt.append(params) - decrypt.append(params) - - if op == "ENCRYPT": - return encrypt - else: - return decrypt + vectors.append(params) + return vectors -- cgit v1.2.3 From e580598228caa28544fdd4fa53a29bb870858421 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Fri, 27 Sep 2013 11:26:01 -0500 Subject: simplify cryptrec loader, improve comments --- tests/utils.py | 44 +++++++++++++++++--------------------------- 1 file changed, 17 insertions(+), 27 deletions(-) (limited to 'tests/utils.py') diff --git a/tests/utils.py b/tests/utils.py index 48a32ebe..d06c9e3b 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -70,7 +70,7 @@ def load_cryptrec_vectors_from_file(filename): def load_cryptrec_vectors(vector_data): - data = {} + cryptrec_list = [] for line in vector_data: line = line.strip() @@ -80,28 +80,14 @@ def load_cryptrec_vectors(vector_data): continue if line.startswith("K"): - key = line.split(" : ")[1].replace(" ", "") - # create an array under the key to hold all the P+C pairs - # each key has many p+c pairs - data[key] = [] + key = line.split(" : ")[1].replace(" ", "").encode("ascii") elif line.startswith("P"): - # create a new dict to hold the next P+C pair - pc_pair = {} - pc_pair["P"] = line.split(" : ")[1].replace(" ", "") + pt = line.split(" : ")[1].replace(" ", "").encode("ascii") elif line.startswith("C"): - pc_pair["C"] = line.split(" : ")[1].replace(" ", "") - # after a C is found the P+C pair is complete - data[key].append(pc_pair) - - cryptrec_list = [] - for key, value in sorted(data.items()): - for pair in value: - cryptrec_list.append( - (key.encode("ascii"), - pair["P"].encode("ascii"), - pair["C"].encode("ascii")) - ) - + ct = line.split(" : ")[1].replace(" ", "").encode("ascii") + # after a C is found the K+P+C tuple is complete + # there are many P+C pairs for each K + cryptrec_list.append((key, pt, ct)) return cryptrec_list @@ -124,11 +110,15 @@ def load_openssl_vectors(vector_data): continue vector = line.split(":") - params = (vector[1].encode("ascii"), # key - vector[2].encode("ascii"), # iv - vector[3].encode("ascii"), # ciphertext - vector[4].encode("ascii")) # plaintext - # some OpenSSL vectors have a final field - # 0 for decrypt, 1 for encrypt + params = ( + # key + vector[1].encode("ascii"), + # iv + vector[2].encode("ascii"), + # plaintext + vector[3].encode("ascii"), + # ciphertext + vector[4].encode("ascii") + ) vectors.append(params) return vectors -- cgit v1.2.3