From 632de48315e0ecc8263865db3aaac70cd9e4f74f Mon Sep 17 00:00:00 2001 From: h114mx001 <21anh.nt@vinuni.edu.vn> Date: Wed, 5 Jun 2024 17:29:04 +0700 Subject: [PATCH] Split testcases into modules --- test/__init__.py | 8 + test/test_LamportSignature.py | 212 ------------------ test/test_task_1_LamportSignature.py | 79 +++++++ test/test_task_2_SignatureChain.py | 46 ++++ test/test_task_3_PseudorandomSignatureTree.py | 69 ++++++ .../test_task_4_DeterministicSignatureTree.py | 39 ++++ 6 files changed, 241 insertions(+), 212 deletions(-) delete mode 100644 test/test_LamportSignature.py create mode 100644 test/test_task_1_LamportSignature.py create mode 100644 test/test_task_2_SignatureChain.py create mode 100644 test/test_task_3_PseudorandomSignatureTree.py create mode 100644 test/test_task_4_DeterministicSignatureTree.py diff --git a/test/__init__.py b/test/__init__.py index e69de29..df8b5c6 100644 --- a/test/__init__.py +++ b/test/__init__.py @@ -0,0 +1,8 @@ +import configparser +from base64 import b64decode + +cfg = configparser.RawConfigParser() +config_path = "setup.cfg" +cfg.read(config_path) +cfg_dict = dict(cfg.items("keys")) +secret_seed = b64decode(cfg_dict["secret_seed"]) \ No newline at end of file diff --git a/test/test_LamportSignature.py b/test/test_LamportSignature.py deleted file mode 100644 index f372189..0000000 --- a/test/test_LamportSignature.py +++ /dev/null @@ -1,212 +0,0 @@ -from LamportSignature.Lamport import LamportSignature, LamportSigningKeyPair, Lamport_ChaCha20_SHA256_keygen -from LamportSignature.SignatureChain import LamportSignatureChain_Signature, LamportSignatureChain -from LamportSignature.PRSignatureTree import LamportPRSignatureTree, LamportSignatureTree_Signature, LamportDeterministicSignatureTree -from os import urandom -import configparser -from base64 import b64decode -from random import randint -import pytest - -cfg = configparser.RawConfigParser() -config_path = "setup.cfg" -cfg.read(config_path) -cfg_dict = dict(cfg.items("keys")) -secret_seed = b64decode(cfg_dict["secret_seed"]) - -@pytest.mark.task1 -def test_Lamport_Primitive(): - message = urandom(32) - sign_key_0 = [urandom(32) for _ in range(256)] - sign_key_1 = [urandom(32) for _ in range(256)] - sign_key = LamportSigningKeyPair(sign_key_0, sign_key_1) - verify_key = sign_key.get_verify_key_pairs() - signature = sign_key.sign_primitive(message) - assert verify_key.verify_primitive(message, signature) == True - -@pytest.mark.task1 -def test_Lamport_Primitive_serialization(): - message = urandom(32) - sign_key_0 = [urandom(32) for _ in range(256)] - sign_key_1 = [urandom(32) for _ in range(256)] - sign_key = LamportSigningKeyPair(sign_key_0, sign_key_1) - verify_key = sign_key.get_verify_key_pairs() - signature = sign_key.sign_primitive(message) - assert verify_key.verify_primitive(message, signature) == True - serialized = signature.serialize() - new_signature = LamportSignature.deserialize(serialized) - assert verify_key.verify_primitive(message, new_signature) == True - -@pytest.mark.task1 -def test_Lamport_ChaCha20_SHA256_256bit_message(): - message = urandom(32) - seed = secret_seed - sign_key = Lamport_ChaCha20_SHA256_keygen(seed) - verify_key = sign_key.get_verify_key_pairs() - signature = sign_key.hash_and_sign(message) - assert verify_key.hash_and_verify(message, signature) == True - serialized = signature.serialize() - new_signature = LamportSignature.deserialize(serialized) - assert verify_key.hash_and_verify(message, new_signature) == True - -@pytest.mark.task1 -def test_Lamport_ChaCha20_SHA256_arbitrary_length_message(): - length = randint(1, 1000) - message = urandom(length) - seed = secret_seed - sign_key = Lamport_ChaCha20_SHA256_keygen(seed) - verify_key = sign_key.get_verify_key_pairs() - signature = sign_key.hash_and_sign(message) - assert verify_key.hash_and_verify(message, signature) == True - serialized = signature.serialize() - new_signature = LamportSignature.deserialize(serialized) - assert verify_key.hash_and_verify(message, new_signature) == True - -@pytest.mark.task1 -def test_Lamport_Primitive_forty_times_256_bit_messages(): - for _ in range(40): - message = urandom(32) - sign_key_0 = [urandom(32) for _ in range(256)] - sign_key_1 = [urandom(32) for _ in range(256)] - sign_key = LamportSigningKeyPair(sign_key_0, sign_key_1) - verify_key = sign_key.get_verify_key_pairs() - signature = sign_key.sign_primitive(message) - assert verify_key.verify_primitive(message, signature) == True - -# @pytest.mark.skip(reason="temporarily disable for debugging") -@pytest.mark.task2 -def test_one_time_signature_chain_256_bit_messages(): - sc = LamportSignatureChain(secret_seed) - message = urandom(32) - signature = sc.sign(message) - assert LamportSignatureChain.verify(1, message, signature) == True - -# @pytest.mark.skip(reason="temporarily disable for debugging") -@pytest.mark.task2 -def test_five_times_signature_chain_256_bit_messages(): - sc = LamportSignatureChain(secret_seed) - for state in range(1, 5+1): - message = urandom(32) - signature = sc.sign(message) - assert LamportSignatureChain.verify(state, message, signature) == True - -# @pytest.mark.skip(reason="temporarily disable for debugging") -@pytest.mark.task2 -def test_forty_times_signature_chain_arbitrary_length_messages(): - sc = LamportSignatureChain(secret_seed) - for state in range(1, 40+1): - message = urandom(randint(1, 1000)) - signature = sc.sign(message) - assert LamportSignatureChain.verify(state, message, signature) == True - -# @pytest.mark.skip(reason="temporarily disable for debugging") -@pytest.mark.task2 -def test_five_times_serialize_deserialize_signature_chain(): - sc = LamportSignatureChain(secret_seed) - for state in range(1, 5+1): - message = urandom(randint(1, 1000)) - signature = sc.sign(message) - assert LamportSignatureChain.verify(state, message, signature) == True - serialized = signature.serialize() - new_signature = LamportSignatureChain_Signature.deserialize(serialized) - assert LamportSignatureChain.verify(state, message, new_signature) == True - -@pytest.mark.task3 -def test_one_time_signature_tree(): - key = urandom(16) - L = 3 - signature_tree = LamportPRSignatureTree(L, key) - message = urandom(32) - signature = signature_tree.sign(message) - result = signature_tree.verify(message, signature) - assert result == True - -@pytest.mark.task3 -def test_one_time_signature_tree_serialization(): - key = urandom(16) - L = 3 - signature_tree = LamportPRSignatureTree(L, key) - message = urandom(32) - signature = signature_tree.sign(message) - result = signature_tree.verify(message, signature) - assert result == True - serialized = signature.serialize() - new_signature = LamportSignatureTree_Signature.deserialize(serialized) - result = signature_tree.verify(message, new_signature) - assert result == True - -@pytest.mark.task3 -def test_five_time_signature_tree_serialization(): - key = urandom(16) - L = 3 - signature_tree = LamportPRSignatureTree(L, key) - for _ in range(0, 5): - message = urandom(32) - signature = signature_tree.sign(message) - result = signature_tree.verify(message, signature) - assert result == True - serialized = signature.serialize() - new_signature = LamportSignatureTree_Signature.deserialize(serialized) - result = signature_tree.verify(message, new_signature) - assert result == True - -@pytest.mark.task3 -def test_forty_time_signature_tree_serialization(): - key = urandom(16) - L = 6 - signature_tree = LamportPRSignatureTree(L, key) - for _ in range(0, 40): - message = urandom(32) - signature = signature_tree.sign(message) - result = signature_tree.verify(message, signature) - assert result == True - serialized = signature.serialize() - new_signature = LamportSignatureTree_Signature.deserialize(serialized) - result = signature_tree.verify(message, new_signature) - assert result == True - -@pytest.mark.task3 -def test_overload_sign_tree(): - key = urandom(16) - L = 1 - signature_tree = LamportPRSignatureTree(L, key) - with pytest.raises(Exception): - for _ in range(100): - message = urandom(32) - signature = signature_tree.sign(message) - result = signature_tree.verify(message, signature) - -@pytest.mark.task4 -def test_one_time_deterministic_tree(): - key = urandom(16) - counter_key = urandom(16) - L = 3 - signature_tree = LamportDeterministicSignatureTree(L, key, counter_key) - message = urandom(32) - signature = signature_tree.sign(message) - result = signature_tree.verify(message, signature) - assert result == True - -@pytest.mark.task4 -def test_five_time_deterministic_tree(): - key = urandom(16) - L = 3 - counter_key = urandom(16) - signature_tree = LamportDeterministicSignatureTree(L, key, counter_key=counter_key) - for i in range(0, 5): - message = urandom(32) - signature = signature_tree.sign(message) - result = signature_tree.verify(message, signature) - assert result == True - -@pytest.mark.task4 -def test_forty_time_deterministic_tree(): - key = urandom(16) - L = 6 - counter_key = urandom(16) - signature_tree = LamportDeterministicSignatureTree(L, key, counter_key) - for i in range(0, 40): - message = urandom(32) - signature = signature_tree.sign(message) - - result = signature_tree.verify(message, signature) - assert result == True diff --git a/test/test_task_1_LamportSignature.py b/test/test_task_1_LamportSignature.py new file mode 100644 index 0000000..5f683d2 --- /dev/null +++ b/test/test_task_1_LamportSignature.py @@ -0,0 +1,79 @@ +from LamportSignature.Lamport import LamportSignature, LamportSigningKeyPair, Lamport_ChaCha20_SHA256_keygen +from test import secret_seed +from os import urandom +from random import randint +import pytest + +# from LamportSignature.PRSignatureTree import LamportPRSignatureTree, LamportSignatureTree_Signature, LamportDeterministicSignatureTree + +@pytest.mark.task1 +def test_Lamport_Primitive(): + message = urandom(32) + sign_key_0 = [urandom(32) for _ in range(256)] + sign_key_1 = [urandom(32) for _ in range(256)] + sign_key = LamportSigningKeyPair(sign_key_0, sign_key_1) + verify_key = sign_key.get_verify_key_pairs() + signature = sign_key.sign_primitive(message) + assert verify_key.verify_primitive(message, signature) == True + +@pytest.mark.task1 +def test_Lamport_malformed_signature(): + message = urandom(32) + sign_key_0 = [urandom(32) for _ in range(256)] + sign_key_1 = [urandom(32) for _ in range(256)] + sign_key = LamportSigningKeyPair(sign_key_0, sign_key_1) + verify_key = sign_key.get_verify_key_pairs() + signature = sign_key.sign_primitive(message) + # signature will be flipped a random bit + rand_bit = randint(0, 32 * 256 - 1) + signature.signature = signature.signature[:rand_bit] + bytes([signature.signature[rand_bit] ^ 1]) + signature.signature[rand_bit + 1:] + assert verify_key.verify_primitive(message, signature) == False + +@pytest.mark.task1 +def test_Lamport_Primitive_serialization(): + message = urandom(32) + sign_key_0 = [urandom(32) for _ in range(256)] + sign_key_1 = [urandom(32) for _ in range(256)] + sign_key = LamportSigningKeyPair(sign_key_0, sign_key_1) + verify_key = sign_key.get_verify_key_pairs() + signature = sign_key.sign_primitive(message) + assert verify_key.verify_primitive(message, signature) == True + serialized = signature.serialize() + new_signature = LamportSignature.deserialize(serialized) + assert verify_key.verify_primitive(message, new_signature) == True + +@pytest.mark.task1 +def test_Lamport_ChaCha20_SHA256_256bit_message(): + message = urandom(32) + seed = secret_seed + sign_key = Lamport_ChaCha20_SHA256_keygen(seed) + verify_key = sign_key.get_verify_key_pairs() + signature = sign_key.hash_and_sign(message) + assert verify_key.hash_and_verify(message, signature) == True + serialized = signature.serialize() + new_signature = LamportSignature.deserialize(serialized) + assert verify_key.hash_and_verify(message, new_signature) == True + +@pytest.mark.task1 +def test_Lamport_ChaCha20_SHA256_arbitrary_length_message(): + length = randint(1, 1000) + message = urandom(length) + seed = secret_seed + sign_key = Lamport_ChaCha20_SHA256_keygen(seed) + verify_key = sign_key.get_verify_key_pairs() + signature = sign_key.hash_and_sign(message) + assert verify_key.hash_and_verify(message, signature) == True + serialized = signature.serialize() + new_signature = LamportSignature.deserialize(serialized) + assert verify_key.hash_and_verify(message, new_signature) == True + +@pytest.mark.task1 +def test_Lamport_Primitive_forty_times_256_bit_messages(): + for _ in range(40): + message = urandom(32) + sign_key_0 = [urandom(32) for _ in range(256)] + sign_key_1 = [urandom(32) for _ in range(256)] + sign_key = LamportSigningKeyPair(sign_key_0, sign_key_1) + verify_key = sign_key.get_verify_key_pairs() + signature = sign_key.sign_primitive(message) + assert verify_key.verify_primitive(message, signature) == True diff --git a/test/test_task_2_SignatureChain.py b/test/test_task_2_SignatureChain.py new file mode 100644 index 0000000..2fdcc10 --- /dev/null +++ b/test/test_task_2_SignatureChain.py @@ -0,0 +1,46 @@ +from LamportSignature.SignatureChain import LamportSignatureChain_Signature, LamportSignatureChain +from test import secret_seed + +from os import urandom +from random import randint +import pytest + + + +# @pytest.mark.skip(reason="temporarily disable for debugging") +@pytest.mark.task2 +def test_one_time_signature_chain_256_bit_messages(): + sc = LamportSignatureChain(secret_seed) + message = urandom(32) + signature = sc.sign(message) + assert LamportSignatureChain.verify(1, message, signature) == True + +# @pytest.mark.skip(reason="temporarily disable for debugging") +@pytest.mark.task2 +def test_five_times_signature_chain_256_bit_messages(): + sc = LamportSignatureChain(secret_seed) + for state in range(1, 5+1): + message = urandom(32) + signature = sc.sign(message) + assert LamportSignatureChain.verify(state, message, signature) == True + +# @pytest.mark.skip(reason="temporarily disable for debugging") +@pytest.mark.task2 +def test_forty_times_signature_chain_arbitrary_length_messages(): + sc = LamportSignatureChain(secret_seed) + for state in range(1, 40+1): + message = urandom(randint(1, 1000)) + signature = sc.sign(message) + assert LamportSignatureChain.verify(state, message, signature) == True + +# @pytest.mark.skip(reason="temporarily disable for debugging") +@pytest.mark.task2 +def test_five_times_serialize_deserialize_signature_chain(): + sc = LamportSignatureChain(secret_seed) + for state in range(1, 5+1): + message = urandom(randint(1, 1000)) + signature = sc.sign(message) + assert LamportSignatureChain.verify(state, message, signature) == True + serialized = signature.serialize() + new_signature = LamportSignatureChain_Signature.deserialize(serialized) + assert LamportSignatureChain.verify(state, message, new_signature) == True diff --git a/test/test_task_3_PseudorandomSignatureTree.py b/test/test_task_3_PseudorandomSignatureTree.py new file mode 100644 index 0000000..a384647 --- /dev/null +++ b/test/test_task_3_PseudorandomSignatureTree.py @@ -0,0 +1,69 @@ +from os import urandom +import pytest + +from LamportSignature.PRSignatureTree import LamportPRSignatureTree, LamportSignatureTree_Signature, LamportDeterministicSignatureTree + +@pytest.mark.task3 +def test_one_time_signature_tree(): + key = urandom(16) + L = 3 + signature_tree = LamportPRSignatureTree(L, key) + message = urandom(32) + signature = signature_tree.sign(message) + result = signature_tree.verify(message, signature) + assert result == True + +@pytest.mark.task3 +def test_one_time_signature_tree_serialization(): + key = urandom(16) + L = 3 + signature_tree = LamportPRSignatureTree(L, key) + message = urandom(32) + signature = signature_tree.sign(message) + result = signature_tree.verify(message, signature) + assert result == True + serialized = signature.serialize() + new_signature = LamportSignatureTree_Signature.deserialize(serialized) + result = signature_tree.verify(message, new_signature) + assert result == True + +@pytest.mark.task3 +def test_five_time_signature_tree_serialization(): + key = urandom(16) + L = 3 + signature_tree = LamportPRSignatureTree(L, key) + for _ in range(0, 5): + message = urandom(32) + signature = signature_tree.sign(message) + result = signature_tree.verify(message, signature) + assert result == True + serialized = signature.serialize() + new_signature = LamportSignatureTree_Signature.deserialize(serialized) + result = signature_tree.verify(message, new_signature) + assert result == True + +@pytest.mark.task3 +def test_forty_time_signature_tree_serialization(): + key = urandom(16) + L = 6 + signature_tree = LamportPRSignatureTree(L, key) + for _ in range(0, 40): + message = urandom(32) + signature = signature_tree.sign(message) + result = signature_tree.verify(message, signature) + assert result == True + serialized = signature.serialize() + new_signature = LamportSignatureTree_Signature.deserialize(serialized) + result = signature_tree.verify(message, new_signature) + assert result == True + +@pytest.mark.task3 +def test_overload_sign_tree(): + key = urandom(16) + L = 1 + signature_tree = LamportPRSignatureTree(L, key) + with pytest.raises(Exception): + for _ in range(100): + message = urandom(32) + signature = signature_tree.sign(message) + result = signature_tree.verify(message, signature) \ No newline at end of file diff --git a/test/test_task_4_DeterministicSignatureTree.py b/test/test_task_4_DeterministicSignatureTree.py new file mode 100644 index 0000000..c61d6b8 --- /dev/null +++ b/test/test_task_4_DeterministicSignatureTree.py @@ -0,0 +1,39 @@ +from os import urandom +import pytest +from LamportSignature.PRSignatureTree import LamportDeterministicSignatureTree + +@pytest.mark.task4 +def test_one_time_deterministic_tree(): + key = urandom(16) + counter_key = urandom(16) + L = 3 + signature_tree = LamportDeterministicSignatureTree(L, key, counter_key) + message = urandom(32) + signature = signature_tree.sign(message) + result = signature_tree.verify(message, signature) + assert result == True + +@pytest.mark.task4 +def test_five_time_deterministic_tree(): + key = urandom(16) + L = 3 + counter_key = urandom(16) + signature_tree = LamportDeterministicSignatureTree(L, key, counter_key=counter_key) + for i in range(0, 5): + message = urandom(32) + signature = signature_tree.sign(message) + result = signature_tree.verify(message, signature) + assert result == True + +@pytest.mark.task4 +def test_forty_time_deterministic_tree(): + key = urandom(16) + L = 6 + counter_key = urandom(16) + signature_tree = LamportDeterministicSignatureTree(L, key, counter_key) + for i in range(0, 40): + message = urandom(32) + signature = signature_tree.sign(message) + + result = signature_tree.verify(message, signature) + assert result == True