From a9742deddb4766d4a6991bb2cad781b9f2b47804 Mon Sep 17 00:00:00 2001 From: Donovan Date: Mon, 12 Aug 2024 12:47:12 -0500 Subject: [PATCH] add benchmark; modify darc implementation so mutual inner key 2 has an ephemeral key --- benchmark/__init__.py | 0 benchmark/generate_test_vectors.py | 21 +++++++++++++++++++++ src/client_darc.py | 14 ++++++++------ src/server_darc.py | 13 +++++++------ test/test_darc.py | 1 + 5 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 benchmark/__init__.py create mode 100644 benchmark/generate_test_vectors.py diff --git a/benchmark/__init__.py b/benchmark/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/benchmark/generate_test_vectors.py b/benchmark/generate_test_vectors.py new file mode 100644 index 0000000..ce4955a --- /dev/null +++ b/benchmark/generate_test_vectors.py @@ -0,0 +1,21 @@ +from src.client_darc import darc_phase2, darc_phase3, merge_message +from src.key_generation import generate_keys +from src.models import SubstitutionKey, OuterKey +from src.server_darc import darc_phase1, darc_phase_4, resolve_message + +alphabet = SubstitutionKey.init_matrix(width, height, 255) + +server_keys, mutual_keys, client_keys = generate_keys(height, width) +original_message = OuterKey.init_matrix(height).matrix[0] +original_message = original_message[:message_len] + +(alphabet_phase1, medium_phase1) = darc_phase1(alphabet, server_keys, mutual_keys) + +(alphabet_phase2, medium_phase2) = darc_phase2(alphabet_phase1, medium_phase1, client_keys, mutual_keys) +(phase3_alphabet, phase3_medium) = darc_phase3(alphabet_phase2, medium_phase2, client_keys, mutual_keys) +darc_message = merge_message(phase3_alphabet, phase3_medium, client_keys, mutual_keys, original_message) + +translated_alphabet, unwrapped_message = darc_phase_4(alphabet, darc_message, server_keys, mutual_keys) + +message = resolve_message(translated_alphabet, unwrapped_message) +assert original_message == message diff --git a/src/client_darc.py b/src/client_darc.py index 4596210..f34d398 100644 --- a/src/client_darc.py +++ b/src/client_darc.py @@ -93,7 +93,8 @@ def transmit_alphabet( mutual_persistent_data_keys: MutualPersistentDataKeys, mutual_ephemeral_data_keys: MutualEphemeralDataKeys ): - mpdi2 = mutual_persistent_data_keys.inner_key_2 + #mpdi2 = mutual_persistent_data_keys.inner_key_2 + mdi2 = mutual_persistent_data_keys.inner_key_2 << mutual_ephemeral_data_keys.inner_key_2 mdi1 = mutual_persistent_data_keys.inner_key_1 << mutual_ephemeral_data_keys.inner_key_1 mdo1 = mutual_persistent_data_keys.outer_key_1 << mutual_ephemeral_data_keys.outer_key_1 mdo2 = mutual_persistent_data_keys.outer_key_2 << mutual_ephemeral_data_keys.outer_key_2 @@ -110,10 +111,10 @@ def transmit_alphabet( meda = mutual_ephemeral_data_keys.alpha_key alphabet_phase3 = ( - (alphabet_phase2 << ((~cdi1 << mpdi2) < (mdo3 << cdo1_cdo2))) ^ + (alphabet_phase2 << ((~cdi1 << mdi2) < (mdo3 << cdo1_cdo2))) ^ ( ( - ((ceda ^ cpda ^ meda) < (mdo1 << cdo1_cdo2)) << ((mdi1 < (mdo2 << cdo1_cdo2)) << (mpdi2 < (mdo3 << cdo1_cdo2))) + ((ceda ^ cpda ^ meda) < (mdo1 << cdo1_cdo2)) << ((mdi1 < (mdo2 << cdo1_cdo2)) << (mdi2 < (mdo3 << cdo1_cdo2))) ) ) ) @@ -127,7 +128,8 @@ def transmit_medium( mutual_persistent_medium_keys: MutualPersistentMediumKeys, mutual_ephemeral_medium_keys: MutualEphemeralMediumKeys ): - mpmi2 = mutual_persistent_medium_keys.inner_key_2 + #mpmi2 = mutual_persistent_medium_keys.inner_key_2 + mmi2 = mutual_persistent_medium_keys.inner_key_2 << mutual_ephemeral_medium_keys.inner_key_2 mmi1 = mutual_persistent_medium_keys.inner_key_1 << mutual_ephemeral_medium_keys.inner_key_1 mmo1 = mutual_persistent_medium_keys.outer_key_1 << mutual_ephemeral_medium_keys.outer_key_1 mmo2 = mutual_persistent_medium_keys.outer_key_2 << mutual_ephemeral_medium_keys.outer_key_2 @@ -144,8 +146,8 @@ def transmit_medium( mema = mutual_ephemeral_medium_keys.alpha_key medium_phase3 = ( - ((medium_phase2 < ~cmo1_cmo2) << ((~cmi1 << mpmi2) < mmo3)) ^ - (((cpma ^ cema ^ mema) < mmo1) << ((mmi1 < mmo2) << (mpmi2 < mmo3))) + ((medium_phase2 < ~cmo1_cmo2) << ((~cmi1 << mmi2) < mmo3)) ^ + (((cpma ^ cema ^ mema) < mmo1) << ((mmi1 < mmo2) << (mmi2 < mmo3))) ) < cmo1_cmo2 return medium_phase3 diff --git a/src/server_darc.py b/src/server_darc.py index f7e4ac6..bcb7596 100644 --- a/src/server_darc.py +++ b/src/server_darc.py @@ -93,8 +93,8 @@ def phase4_translate_alphabet( mdo1 = mutual_persistent_data_keys.outer_key_1 << mutual_ephemeral_data_keys.outer_key_1 mdo2 = mutual_persistent_data_keys.outer_key_2 << mutual_ephemeral_data_keys.outer_key_2 mdo3 = mutual_persistent_data_keys.outer_key_3 << mutual_ephemeral_data_keys.outer_key_3 - mpdi2 = mutual_persistent_data_keys.inner_key_2 - + #mpdi2 = mutual_persistent_data_keys.inner_key_2 + mdi2 = mutual_persistent_data_keys.inner_key_2 << mutual_ephemeral_data_keys.inner_key_2 sdi1 = server_persistent_data_keys.inner_key_1 << server_ephemeral_data_keys.inner_key_1 sdo1 = server_persistent_data_keys.outer_key_1 << server_ephemeral_data_keys.outer_key_1 @@ -104,8 +104,8 @@ def phase4_translate_alphabet( meda = mutual_ephemeral_data_keys.alpha_key translated_alphabet = ( - ((alphabet < sdo1) << ((sdi1 << mpdi2) < mdo3)) ^ - (((spda ^ seda ^ mpda ^ meda) < mdo1) << ((mdi1 < mdo2) << (mpdi2 < mdo3))) + ((alphabet < sdo1) << ((sdi1 << mdi2) < mdo3)) ^ + (((spda ^ seda ^ mpda ^ meda) < mdo1) << ((mdi1 < mdo2) << (mdi2 < mdo3))) ) return translated_alphabet @@ -120,7 +120,8 @@ def phase4_unwrap_medium( mmi1 = mutual_persistent_medium_keys.inner_key_1 << mutual_ephemeral_medium_keys.inner_key_1 mmi3 = mutual_persistent_medium_keys.inner_key_3 << mutual_ephemeral_medium_keys.inner_key_3 mmi4 = mutual_persistent_medium_keys.inner_key_4 << mutual_ephemeral_medium_keys.inner_key_4 - mpmi2 = mutual_persistent_medium_keys.inner_key_2 + #mpmi2 = mutual_persistent_medium_keys.inner_key_2 + mmi2 = mutual_persistent_medium_keys.inner_key_2 << mutual_ephemeral_medium_keys.inner_key_2 mmo1 = mutual_persistent_medium_keys.outer_key_1 << mutual_ephemeral_medium_keys.outer_key_1 mmo2 = mutual_persistent_medium_keys.outer_key_2 << mutual_ephemeral_medium_keys.outer_key_2 mmo3 = mutual_persistent_medium_keys.outer_key_3 << mutual_ephemeral_medium_keys.outer_key_3 @@ -137,7 +138,7 @@ def phase4_unwrap_medium( unwrapped_medium = ( ((darc_message < ~mmo4) << ~(mmi4 < (mmo5 << nmmo6_nmmo4))) ^ - (((spma ^ sema ^ mpma ^ mema) < mmo1) << ((mmi1 < mmo2) << (mpmi2 < mmo3))) + (((spma ^ sema ^ mpma ^ mema) < mmo1) << ((mmi1 < mmo2) << (mmi2 < mmo3))) ) << (~mmi3 < nmmo6_nmmo4) return unwrapped_medium diff --git a/test/test_darc.py b/test/test_darc.py index 57357a8..0b91d79 100644 --- a/test/test_darc.py +++ b/test/test_darc.py @@ -29,6 +29,7 @@ def test_darc(height, width, message_len): assert original_message == message +@pytest.mark.skip @pytest.mark.parametrize( "height, width, message_len", [(256, 10, 256), (100, 70, 70), (40, 50, 40), (256, 10, 128), (100, 70, 35), (40, 50, 20)]