diff --git a/src/client_darc.py b/src/client_darc.py index f68e4e8..7468d26 100644 --- a/src/client_darc.py +++ b/src/client_darc.py @@ -99,7 +99,7 @@ def transmit_medium(medium_phase2: DarcKey, client_persistent_keys: ClientPersis ncei1_ncpi2 = ~(client_persistent_keys.inner_key_1 << client_ephemeral_keys.inner_key_1) << mutual_persistent_keys.inner_key_2 ncei1_ncpi2__mo3 = ncei1_ncpi2 < mo3 - result = (medium_phase2 < ~co1_co2) << ncei1_ncpi2__mo3 + result = ((medium_phase2 < ~co1_co2) << ncei1_ncpi2__mo3) mo1 = mutual_persistent_keys.outer_key_1 << mutual_ephemeral_keys.outer_key_1 sub = client_persistent_keys.alpha_key ^ client_ephemeral_keys.alpha_key ^ mutual_ephemeral_keys.alpha_key @@ -116,12 +116,9 @@ def darc_phase3(alphabet_phase2: AlphabetKey, medium_phase2: AlphabetKey, client return alphabet_phase3, medium_phase3 -def merge_message(alphabet: DarcKey, medium: DarcKey, client_keys: ClientKeys, mutual_keys: MutualKeys, input_sequence: list[int]): - client_outer_key_1 = client_keys.persistent.data.outer_key_1 << client_keys.ephemeral.data.outer_key_1 - client_outer_key_2 = client_keys.persistent.data.outer_key_2 << client_keys.ephemeral.data.outer_key_2 - client_outer_key_1 = ~(client_outer_key_1 << client_outer_key_2) - height = len(alphabet.matrix) - width = len(alphabet.matrix[0]) +def merge_message(alphabet_phase3: AlphabetKey, medium_phase3: AlphabetKey, client_keys: ClientKeys, mutual_keys: MutualKeys, input_sequence: list[int]): + height = len(alphabet_phase3.matrix) + width = len(alphabet_phase3.matrix[0]) msg_len = len(input_sequence) eof_arr = AlphabetKey.init_matrix(width, height, 255).matrix[0] @@ -131,40 +128,29 @@ def merge_message(alphabet: DarcKey, medium: DarcKey, client_keys: ClientKeys, m else: padded_input_sequence = OuterKey(matrix=[input_sequence]) - client_outer_key_1 = client_outer_key_1 << padded_input_sequence + cdo1 = client_keys.persistent.data.outer_key_1 << client_keys.ephemeral.data.outer_key_1 + cdo2 = client_keys.persistent.data.outer_key_2 << client_keys.ephemeral.data.outer_key_2 + ncdo1_ncdo2 = ~(cdo1 << cdo2) - client_med_outer_key_1 = client_keys.persistent.medium.outer_key_1 << client_keys.ephemeral.medium.outer_key_1 - client_med_outer_key_2 = client_keys.persistent.medium.outer_key_2 << client_keys.ephemeral.medium.outer_key_2 + ncdo1_ncdo2_inp = ncdo1_ncdo2 << padded_input_sequence - client_med_outer_key_1 = client_med_outer_key_1 << client_med_outer_key_2 + cmo1 = client_keys.persistent.medium.outer_key_1 << client_keys.ephemeral.medium.outer_key_1 + cmo2 = client_keys.persistent.medium.outer_key_2 << client_keys.ephemeral.medium.outer_key_2 - client_outer_key_1 = client_outer_key_1 << client_med_outer_key_1 - message = alphabet < client_outer_key_1 - - message_pad_key = ~client_med_outer_key_1 + alpha_ncdo1_ncdo2_inp = alphabet_phase3 < ncdo1_ncdo2_inp + ncmo2_ncmo1 = ~(cmo1 << cmo2) if msg_len < height: - message.matrix[message_pad_key.matrix[0][msg_len]] = eof_arr + alpha_ncdo1_ncdo2_inp.matrix[msg_len] = eof_arr - mutual_inner_key_3 = mutual_keys.persistent.medium.inner_key_3 << mutual_keys.ephemeral.medium.inner_key_3 - mutual_outer_key_6 = mutual_keys.persistent.medium.outer_key_6 << mutual_keys.ephemeral.medium.outer_key_6 - mutual_outer_key_4 = mutual_keys.persistent.medium.outer_key_4 << mutual_keys.ephemeral.medium.outer_key_4 + mmi3 = mutual_keys.persistent.medium.inner_key_3 << mutual_keys.ephemeral.medium.inner_key_3 + mmo6 = mutual_keys.persistent.medium.outer_key_6 << mutual_keys.ephemeral.medium.outer_key_6 + mmo4 = mutual_keys.persistent.medium.outer_key_4 << mutual_keys.ephemeral.medium.outer_key_4 - outer_key_1 = mutual_outer_key_4 << mutual_outer_key_6 + mmi3_nmmo6_nmmo4 = mmi3 < ~(mmo4 << mmo6) - client_med_outer_key_1 = ~client_med_outer_key_1 - outer_key_1 = ~(client_med_outer_key_1 << outer_key_1) - - mutual_inner_key_3 = mutual_inner_key_3 < outer_key_1 - - message = medium ^ (message << mutual_inner_key_3) - - mutual_outer_key_5 = mutual_keys.persistent.medium.outer_key_5 << mutual_keys.ephemeral.medium.outer_key_5 - mutual_inner_key = mutual_keys.persistent.medium.inner_key_4 << mutual_keys.ephemeral.medium.inner_key_4 - - mutual_outer_key_4 = client_med_outer_key_1 << mutual_outer_key_4 - outer_key_2 = mutual_outer_key_5 << outer_key_1 - - message = message << (mutual_inner_key < outer_key_2) - message = message < mutual_outer_key_4 - return message + mmo5 = mutual_keys.persistent.medium.outer_key_5 << mutual_keys.ephemeral.medium.outer_key_5 + mmi4 = mutual_keys.persistent.medium.inner_key_4 << mutual_keys.ephemeral.medium.inner_key_4 + + darc_message = (((medium_phase3 < ncmo2_ncmo1) ^ (alpha_ncdo1_ncdo2_inp << mmi3_nmmo6_nmmo4)) < mmo4) << (mmi4 < (mmo5 << ~mmo6)) + return darc_message diff --git a/src/key_generation.py b/src/key_generation.py new file mode 100644 index 0000000..f409f44 --- /dev/null +++ b/src/key_generation.py @@ -0,0 +1,14 @@ +from src.models import ServerKeys, MutualKeys, ClientKeys + + +def generate_keys(height, width): + server_keys = ServerKeys.random_init(height, width) + mutual_keys = MutualKeys.random_init(height, width) + client_keys = ClientKeys.random_init(height, width) + + server_keys.persistent.data.alpha_key = server_keys.persistent.data.alpha_key ^ mutual_keys.persistent.data.alpha_key + server_keys.persistent.medium.alpha_key = server_keys.persistent.medium.alpha_key ^ mutual_keys.persistent.medium.alpha_key + + mutual_keys.persistent.data.alpha_key = mutual_keys.persistent.data.alpha_key ^ client_keys.persistent.data.alpha_key + mutual_keys.persistent.medium.alpha_key = mutual_keys.persistent.medium.alpha_key ^ client_keys.persistent.medium.alpha_key + return server_keys, mutual_keys, client_keys diff --git a/src/server_darc.py b/src/server_darc.py index 1ed828f..3488ed7 100644 --- a/src/server_darc.py +++ b/src/server_darc.py @@ -1,15 +1,21 @@ from src.models import AlphabetKey, ServerPersistentDataKeys, ServerEphemeralDataKeys, MutualPersistentDataKeys, \ - MutualEphemeralDataKeys, InnerKey, ServerKeys, MutualKeys, ServerPersistentMediumKeys, ServerEphemeralMediumKeys, \ + MutualEphemeralDataKeys, ServerKeys, MutualKeys, ServerPersistentMediumKeys, ServerEphemeralMediumKeys, \ MutualPersistentMediumKeys, MutualEphemeralMediumKeys, DarcKey +def darc_phase1(alphabet: AlphabetKey, server_keys: ServerKeys, mutual_keys: MutualKeys): + alphabet_phase1 = translate_data(alphabet, server_keys.persistent.data, server_keys.ephemeral.data, mutual_keys.persistent.data, mutual_keys.ephemeral.data) + medium_phase1 = translate_medium(server_keys.persistent.medium, server_keys.ephemeral.medium, mutual_keys.persistent.medium, mutual_keys.ephemeral.medium) + return alphabet_phase1, medium_phase1 + + def translate_data(alphabet: AlphabetKey, server_persistent_keys: ServerPersistentDataKeys, server_ephemeral_keys: ServerEphemeralDataKeys, mutual_persistent_keys: MutualPersistentDataKeys, mutual_ephemeral_keys: MutualEphemeralDataKeys): so1 = server_persistent_keys.outer_key_1 << server_ephemeral_keys.outer_key_1 mo3 = mutual_persistent_keys.outer_key_3 << mutual_ephemeral_keys.outer_key_3 - si1_mo3: InnerKey = (server_persistent_keys.inner_key_1 << server_ephemeral_keys.inner_key_1) < mo3 + si1_mo3 = (server_persistent_keys.inner_key_1 << server_ephemeral_keys.inner_key_1) < mo3 mo2 = mutual_persistent_keys.outer_key_2 << mutual_ephemeral_keys.outer_key_2 - mi1_mo2: InnerKey = (mutual_persistent_keys.inner_key_1 << mutual_ephemeral_keys.inner_key_1) < mo2 + mi1_mo2 = (mutual_persistent_keys.inner_key_1 << mutual_ephemeral_keys.inner_key_1) < mo2 mo1 = mutual_persistent_keys.outer_key_1 << mutual_ephemeral_keys.outer_key_1 substitution = server_persistent_keys.alpha_key ^ server_ephemeral_keys.alpha_key @@ -20,11 +26,14 @@ def translate_data(alphabet: AlphabetKey, server_persistent_keys: ServerPersiste return alpha_phase1 -def translate_medium(height, width, server_persistent_keys: ServerPersistentMediumKeys, server_ephemeral_keys: ServerEphemeralMediumKeys, mutual_persistent_keys: MutualPersistentMediumKeys, mutual_ephemeral_keys: MutualEphemeralMediumKeys): + +def translate_medium(server_persistent_keys: ServerPersistentMediumKeys, server_ephemeral_keys: ServerEphemeralMediumKeys, mutual_persistent_keys: MutualPersistentMediumKeys, mutual_ephemeral_keys: MutualEphemeralMediumKeys): mutual_inner_key = mutual_persistent_keys.inner_key_1 << mutual_ephemeral_keys.inner_key_1 mutual_outer_key_1 = mutual_persistent_keys.outer_key_1 << mutual_ephemeral_keys.outer_key_1 mutual_outer_key_2 = mutual_persistent_keys.outer_key_2 << mutual_ephemeral_keys.outer_key_2 + height = len(mutual_inner_key.matrix) + width = len(mutual_inner_key.matrix[0]) medium = AlphabetKey(matrix=[[0 for _ in range(width)] for _ in range(height)]) operand1 = server_persistent_keys.alpha_key < mutual_outer_key_1 @@ -35,18 +44,60 @@ def translate_medium(height, width, server_persistent_keys: ServerPersistentMedi return operand -def darc_phase1(alphabet: AlphabetKey, server_keys: ServerKeys, mutual_keys: MutualKeys): - height = len(alphabet.matrix) - width = len(alphabet.matrix[0]) - alphabet_phase1 = translate_data(alphabet, server_keys.persistent.data, server_keys.ephemeral.data, mutual_keys.persistent.data, mutual_keys.ephemeral.data) - medium = translate_medium(height, width, server_keys.persistent.medium, server_keys.ephemeral.medium, mutual_keys.persistent.medium, mutual_keys.ephemeral.medium) - return alphabet_phase1, medium +def darc_phase_4(alphabet: AlphabetKey, darc_message: AlphabetKey, server_keys: ServerKeys, mutual_keys: MutualKeys): + medium_unwrapped = phase4_unwrap_medium(darc_message, server_keys.persistent.medium, server_keys.ephemeral.medium, mutual_keys.persistent.medium, mutual_keys.ephemeral.medium) + translated_alpha = phase4_translate_alphabet(alphabet, server_keys.persistent.data, server_keys.ephemeral.data, mutual_keys.persistent.data, mutual_keys.ephemeral.data) + return translated_alpha, medium_unwrapped +def phase4_translate_alphabet(alphabet: AlphabetKey, server_persistent_keys: ServerPersistentDataKeys, server_ephemeral_keys: ServerEphemeralDataKeys, mutual_persistent_keys: MutualPersistentDataKeys, mutual_ephemeral_keys: MutualEphemeralDataKeys): + mdo3 = mutual_persistent_keys.outer_key_3 << mutual_ephemeral_keys.outer_key_3 + mpi2_mdo3 = mutual_persistent_keys.inner_key_2 < mdo3 + mdo2 = mutual_persistent_keys.outer_key_2 << mutual_ephemeral_keys.outer_key_2 -def resolve_message(translated_alphabet, translated_messasge): - alphabet_map = {str(key): idx for idx, key in enumerate(translated_alphabet)} - encoded_message = [str(alpha) for alpha in translated_messasge] + mdi1 = mutual_persistent_keys.inner_key_1 << mutual_ephemeral_keys.inner_key_1 + mdi1_mdo2_mpi2_mdo3 = (mdi1 < mdo2) << mpi2_mdo3 + sdi1_mpdi2__mdo3 = (server_persistent_keys.inner_key_1 << server_ephemeral_keys.inner_key_1 << mutual_persistent_keys.inner_key_2) < mdo3 + + sdo1 = server_persistent_keys.outer_key_1 << server_ephemeral_keys.outer_key_1 + mdo1 = mutual_persistent_keys.outer_key_1 << mutual_ephemeral_keys.outer_key_1 + + sub_mdo1 = (server_persistent_keys.alpha_key ^ server_ephemeral_keys.alpha_key ^ mutual_persistent_keys.alpha_key ^ mutual_ephemeral_keys.alpha_key) < mdo1 + translated_alpha = ((alphabet < sdo1) << sdi1_mpdi2__mdo3) ^ (sub_mdo1 << mdi1_mdo2_mpi2_mdo3) + return translated_alpha + + +def phase4_unwrap_medium(darc_message: AlphabetKey, server_persistent_keys: ServerPersistentMediumKeys, server_ephemeral_keys: ServerEphemeralMediumKeys, mutual_persistent_keys: MutualPersistentMediumKeys, mutual_ephemeral_keys: MutualEphemeralMediumKeys): + mmo6 = mutual_persistent_keys.outer_key_6 << mutual_ephemeral_keys.outer_key_6 + mmo4 = mutual_persistent_keys.outer_key_4 << mutual_ephemeral_keys.outer_key_4 + + nmmo6_nmmo4 = ~(mmo4 << mmo6) + + mmo5 = mutual_persistent_keys.outer_key_5 << mutual_ephemeral_keys.outer_key_5 + mmo5_nmmo6_nmmo4 = mmo5 << nmmo6_nmmo4 + + mmo2 = mutual_persistent_keys.outer_key_2 << mutual_ephemeral_keys.outer_key_2 + + mmo3 = mutual_persistent_keys.outer_key_3 << mutual_ephemeral_keys.outer_key_3 + + mmi3 = mutual_persistent_keys.inner_key_3 << mutual_ephemeral_keys.inner_key_3 + mmi1 = mutual_persistent_keys.inner_key_1 << mutual_ephemeral_keys.inner_key_1 + + mpmi2 = mutual_persistent_keys.inner_key_2 < mmo3 + + mmi4 = mutual_persistent_keys.inner_key_4 << mutual_ephemeral_keys.inner_key_4 + + mmo1 = mutual_persistent_keys.outer_key_1 << mutual_ephemeral_keys.outer_key_1 + + sub_med_mmo1 = (server_persistent_keys.alpha_key ^ server_ephemeral_keys.alpha_key ^ mutual_persistent_keys.alpha_key ^ mutual_ephemeral_keys.alpha_key) < mmo1 + + medium_unwrapped = (((darc_message < ~mmo4) << ~(mmi4 < mmo5_nmmo6_nmmo4)) ^ (sub_med_mmo1 << ((mmi1 < mmo2) << mpmi2))) << (~mmi3 < nmmo6_nmmo4) + return medium_unwrapped + + +def resolve_message(translated_alphabet: AlphabetKey, translated_messasge: AlphabetKey): + alphabet_map = {str(key): idx for idx, key in enumerate(translated_alphabet.matrix)} + encoded_message = [str(alpha) for alpha in translated_messasge.matrix] message = [] for alpha in encoded_message: @@ -56,52 +107,3 @@ def resolve_message(translated_alphabet, translated_messasge): break return message - - -def darc_phase_4(alphabet: AlphabetKey, darc_message: AlphabetKey, server_keys: ServerKeys, mutual_keys: MutualKeys) -> DarcKey: - mmo6 = mutual_keys.persistent.medium.outer_key_6 << mutual_keys.ephemeral.medium.outer_key_6 - mmo4 = mutual_keys.persistent.medium.outer_key_4 << mutual_keys.ephemeral.medium.outer_key_4 - - nmmo6_nmmo4 = ~(mmo4 << mmo6) - - mmo5 = mutual_keys.persistent.medium.outer_key_5 << mutual_keys.ephemeral.medium.outer_key_5 - mmo5_nmmo6_nmmo4 = mmo5 << nmmo6_nmmo4 - - mmo2 = mutual_keys.persistent.medium.outer_key_2 << mutual_keys.ephemeral.medium.outer_key_2 - - mmo3 = mutual_keys.persistent.medium.outer_key_3 << mutual_keys.ephemeral.medium.outer_key_3 - - mmi3 = mutual_keys.persistent.medium.inner_key_3 << mutual_keys.ephemeral.medium.inner_key_3 - mmi1 = mutual_keys.persistent.medium.inner_key_1 << mutual_keys.ephemeral.medium.inner_key_1 - - mpmi2 = mutual_keys.persistent.medium.inner_key_2 < mmo3 - - mmi4 = mutual_keys.persistent.medium.inner_key_4 << mutual_keys.ephemeral.medium.inner_key_4 - - mmo1 = mutual_keys.persistent.medium.outer_key_1 << mutual_keys.ephemeral.medium.outer_key_1 - - sub_med_mmo1 = (server_keys.persistent.medium.alpha_key ^ server_keys.ephemeral.medium.alpha_key ^ mutual_keys.persistent.medium.alpha_key ^ mutual_keys.ephemeral.medium.alpha_key) < mmo1 - - medium_unwrapped = (((darc_message < ~mmo4) << ~(mmi4 < mmo5_nmmo6_nmmo4)) ^ (sub_med_mmo1 << ((mmi1 < mmo2) << mpmi2))) << (~mmi3 < nmmo6_nmmo4) - - - mdo3 = mutual_keys.persistent.data.outer_key_3 << mutual_keys.ephemeral.data.outer_key_3 - mpi2_mdo3 = mutual_keys.persistent.data.inner_key_2 < mdo3 - mdo2 = mutual_keys.persistent.data.outer_key_2 << mutual_keys.ephemeral.data.outer_key_2 - - mdi1 = mutual_keys.persistent.data.inner_key_1 << mutual_keys.ephemeral.data.inner_key_1 - mdi1_mdo2_mpi2_mdo3 = (mdi1 < mdo2) << mpi2_mdo3 - sdi1_mpdi2__mdo3 = (server_keys.persistent.data.inner_key_1 << server_keys.ephemeral.data.inner_key_1 << mutual_keys.persistent.data.inner_key_2) < mdo3 - - sdo1 = server_keys.persistent.data.outer_key_1 << server_keys.ephemeral.data.outer_key_1 - alpha_sdo1__sdi1_mpdi2__mdo3 = (alphabet < sdo1) << sdi1_mpdi2__mdo3 - - mdo1 = mutual_keys.persistent.data.outer_key_1 << mutual_keys.ephemeral.data.outer_key_1 - - sub_mdo1 = (server_keys.persistent.data.alpha_key ^ server_keys.ephemeral.data.alpha_key ^ mutual_keys.persistent.data.alpha_key ^ mutual_keys.ephemeral.data.alpha_key) < mdo1 - translated_alpha = alpha_sdo1__sdi1_mpdi2__mdo3 ^ (sub_mdo1 << mdi1_mdo2_mpi2_mdo3) - - return resolve_message( - translated_alpha.matrix, - medium_unwrapped.matrix - ) diff --git a/test/test_darc.py b/test/test_darc.py index 1c9eb1c..357a7ce 100644 --- a/test/test_darc.py +++ b/test/test_darc.py @@ -1,25 +1,20 @@ from src.client_darc_noclient import merge_message_no_client, darc_phase_2_3 from src.client_darc import merge_message, darc_phase2, darc_phase3 +from src.key_generation import generate_keys from src.models import (AlphabetKey, OuterKey, ClientKeys, ServerKeys, MutualKeys) -from src.server_darc import darc_phase1, darc_phase_4 +from src.server_darc import darc_phase1, darc_phase_4, resolve_message import pytest -@pytest.mark.parametrize("height, width", [(256, 10), (100, 70), (40, 50)]) -def test_darc(height, width): - server_keys = ServerKeys.random_init(height, width) - mutual_keys = MutualKeys.random_init(height, width) - client_keys = ClientKeys.random_init(height, width) + +@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)]) +def test_darc(height, width, message_len): alphabet = AlphabetKey.init_matrix(width, height, 255) - server_keys.persistent.data.alpha_key = server_keys.persistent.data.alpha_key ^ mutual_keys.persistent.data.alpha_key - server_keys.persistent.medium.alpha_key = server_keys.persistent.medium.alpha_key ^ mutual_keys.persistent.medium.alpha_key - - mutual_keys.persistent.data.alpha_key = mutual_keys.persistent.data.alpha_key ^ client_keys.persistent.data.alpha_key - mutual_keys.persistent.medium.alpha_key = mutual_keys.persistent.medium.alpha_key ^ client_keys.persistent.medium.alpha_key - + 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) @@ -27,29 +22,23 @@ def test_darc(height, width): (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) - message = darc_phase_4(alphabet, darc_message, server_keys, mutual_keys) + 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 -@pytest.mark.parametrize("height, width", [(256, 10), (100, 70), (40, 50)]) -def test_darc_no_client(height, width): - server_keys = ServerKeys.random_init(height, width) - mutual_keys = MutualKeys.random_init(height, width) - client_keys = ClientKeys.random_init(height, width) +@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)]) +def test_darc_no_client(height, width, message_len): alphabet = AlphabetKey.init_matrix(width, height, 255) - - server_keys.persistent.data.alpha_key = server_keys.persistent.data.alpha_key ^ mutual_keys.persistent.data.alpha_key - server_keys.persistent.medium.alpha_key = server_keys.persistent.medium.alpha_key ^ mutual_keys.persistent.medium.alpha_key - - mutual_keys.persistent.data.alpha_key = mutual_keys.persistent.data.alpha_key ^ client_keys.persistent.data.alpha_key - mutual_keys.persistent.medium.alpha_key = mutual_keys.persistent.medium.alpha_key ^ client_keys.persistent.medium.alpha_key + 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) (phase3_alphabet, phase3_medium) = darc_phase_2_3(alphabet_phase1, medium_phase1, mutual_keys) darc_message = merge_message_no_client(phase3_alphabet, phase3_medium, mutual_keys, original_message) - message = darc_phase_4(alphabet, darc_message, server_keys, mutual_keys) - assert original_message == message \ No newline at end of file + 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