from src.models import ServerEphemeralKeys, ServerPersistentKeys, ClientEphemeralKeys, ClientPersistentKeys, \ MutualEphemeralKeys, AlphabetKey, DarcKey, OuterShuffleKey, MutualPersistentKeys, ClientKeys, ServerKeys, \ MutualKeys, ServerPersistentDataKeys, ServerEphemeralDataKeys, MutualPersistentDataKeys, MutualEphemeralDataKeys, \ ServerPersistentMediumKeys, ServerEphemeralMediumKeys, MutualPersistentMediumKeys, MutualEphemeralMediumKeys, \ ClientPersistentDataKeys, ClientEphemeralDataKeys, ClientEphemeralMediumKeys, ClientPersistentMediumKeys import json height = 10 width = 7 block_size = 10 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 = translate_medium(server_keys.Persistent.Medium, server_keys.Ephemeral.Medium, mutual_keys.Persistent.Medium, mutual_keys.Ephemeral.Medium) return alphabet_phase1, medium def translate_data(alphabet: AlphabetKey, server_persistent_keys: ServerPersistentDataKeys, server_ephemeral_keys: ServerEphemeralDataKeys, mutual_persistent_keys: MutualPersistentDataKeys, mutual_ephemeral_keys: MutualEphemeralDataKeys): function_ephemeral_key_applied = mutual_persistent_keys.Inner1 << mutual_ephemeral_keys.Inner1 outer_function_ephemeral_key_applied = mutual_persistent_keys.OuterFunctionKey << mutual_ephemeral_keys.OuterFunctionKey outer_function_function_ephemeral_key_applied = mutual_persistent_keys.OuterFunctionFunctionKey << mutual_ephemeral_keys.OuterFunctionFunctionKey outer_server_shuffle_ephemeral_key_applied = server_persistent_keys.OuterServerShuffleKey << server_ephemeral_keys.OuterServerShuffleEphemeralKey outer_server_shuffle_function_ephemeral_key_applied = mutual_persistent_keys.OuterServerShuffleFunctionKey << mutual_ephemeral_keys.OuterServerShuffleFunctionKey input_data = alphabet < outer_server_shuffle_ephemeral_key_applied server_shuffle_ephemeral_key_applied = server_ephemeral_keys.ServerShuffleEphemeralKey << server_persistent_keys.ServerShuffleKey # TODO: should this be the other way around? server_shuffle_ephemeral_key_applied = server_shuffle_ephemeral_key_applied < outer_server_shuffle_function_ephemeral_key_applied input_data = input_data << server_shuffle_ephemeral_key_applied # substitute_function_operands outer_function_function = outer_function_function_ephemeral_key_applied inner_function = function_ephemeral_key_applied outer_function = outer_function_ephemeral_key_applied operand = input_data operand1 = server_persistent_keys.ServerKey < outer_function operand2 = server_ephemeral_keys.ServerEphemeralKey < outer_function inner_function_shuffled = inner_function < outer_function_function operand = operand ^ (operand1 << inner_function_shuffled) ^ (operand2 << inner_function_shuffled) return operand def translate_medium(server_persistent_keys: ServerPersistentMediumKeys, server_ephemeral_keys: ServerEphemeralMediumKeys, mutual_persistent_keys: MutualPersistentMediumKeys, mutual_ephemeral_keys: MutualEphemeralMediumKeys): function_ephemeral_key_applied = mutual_persistent_keys.FunctionMediumKey << mutual_ephemeral_keys.FunctionMediumKey outer_function_ephemeral_key_applied = mutual_persistent_keys.OuterFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionMediumEphemeralKey outer_function_function_ephemeral_key_applied = mutual_persistent_keys.OuterFunctionFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionFunctionMediumEphemeralKey input_data = AlphabetKey(matrix=[[0 for _ in range(width)] for _ in range(height)]) # substitute_function_operands outer_function_function = outer_function_function_ephemeral_key_applied inner_function = function_ephemeral_key_applied outer_function = outer_function_ephemeral_key_applied operand = input_data operand1 = server_persistent_keys.ServerMediumKey < outer_function operand2 = server_ephemeral_keys.ServerMediumEphemeralKey < outer_function inner_function_shuffled = inner_function < outer_function_function operand = operand ^ (operand1 << inner_function_shuffled) ^ (operand2 << inner_function_shuffled) return operand def darc_phase2(alphabet: AlphabetKey, medium: AlphabetKey, client_keys: ClientKeys, mutual_keys: MutualKeys): alphabet_phase2 = receive_alphabet(alphabet, client_keys.Persistent.Data, client_keys.Ephemeral.Data, mutual_keys.Persistent.Data , mutual_keys.Ephemeral.Data) medium = receive_medium(medium, client_keys.Persistent.Medium, client_keys.Ephemeral.Medium, mutual_keys.Persistent.Medium, mutual_keys.Ephemeral.Medium) return alphabet_phase2, medium def receive_alphabet(alphabet: AlphabetKey, client_persistent_keys: ClientPersistentDataKeys, client_ephemeral_keys: ClientEphemeralDataKeys, mutual_persistent_keys: MutualPersistentDataKeys, mutual_ephemeral_keys: MutualEphemeralDataKeys): function_key_applied = mutual_persistent_keys.Inner1 << mutual_ephemeral_keys.Inner1 outer_function_key_applied = mutual_persistent_keys.OuterFunctionKey << mutual_ephemeral_keys.OuterFunctionKey outer_function_function_key_applied = mutual_persistent_keys.OuterFunctionFunctionKey << mutual_ephemeral_keys.OuterFunctionFunctionKey inner_function_key_applied = function_key_applied < outer_function_function_key_applied operand = alphabet operand1 = client_ephemeral_keys.ClientEphemeralKey < outer_function_key_applied operand2 = client_persistent_keys.ClientKey < outer_function_key_applied operand3 = mutual_persistent_keys.MutualKey < outer_function_key_applied result = operand ^ (operand1 << inner_function_key_applied) ^ (operand2 << inner_function_key_applied) ^ (operand3 << inner_function_key_applied) outer_server_shuffle_function_key_applied = mutual_persistent_keys.OuterServerShuffleFunctionKey << mutual_ephemeral_keys.OuterServerShuffleFunctionKey client_shuffle_key_a_applied = client_persistent_keys.ClientShuffleKeyA << client_ephemeral_keys.ClientShuffleEphemeralKeyA result = result << (client_shuffle_key_a_applied < outer_server_shuffle_function_key_applied) outer_client_shuffle_key_applied = client_persistent_keys.OuterClientShuffleKey << client_ephemeral_keys.OuterClientShuffleEphemeralKey outer_client_shuffle_function_key_applied = client_persistent_keys.OuterClientShuffleFunctionKey << client_ephemeral_keys.OuterClientShuffleFunctionEphemeralKey outer_client_shuffle_key_applied = outer_client_shuffle_key_applied << outer_client_shuffle_function_key_applied result = result < outer_client_shuffle_key_applied return result def receive_medium(medium: AlphabetKey, client_persistent_keys: ClientPersistentMediumKeys, client_ephemeral_keys: ClientEphemeralMediumKeys, mutual_persistent_keys: MutualPersistentMediumKeys, mutual_ephemeral_keys: MutualEphemeralMediumKeys): function_key_applied = mutual_persistent_keys.FunctionMediumKey << mutual_ephemeral_keys.FunctionMediumKey outer_function_key_applied = mutual_persistent_keys.OuterFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionMediumEphemeralKey outer_function_function_key_applied = mutual_persistent_keys.OuterFunctionFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionFunctionMediumEphemeralKey inner_function_key_applied = function_key_applied < outer_function_function_key_applied operand = medium operand1 = client_ephemeral_keys.ClientMediumEphemeralKey < outer_function_key_applied operand2 = client_persistent_keys.ClientMediumKey < outer_function_key_applied operand3 = mutual_persistent_keys.MutualMediumKey < outer_function_key_applied result = operand ^ (operand1 << inner_function_key_applied) ^ (operand2 << inner_function_key_applied) ^ (operand3 << inner_function_key_applied) client_shuffle_key_a_applied = client_persistent_keys.ClientShuffleMediumKeyA << client_ephemeral_keys.ClientShuffleMediumEphemeralKeyA outer_server_shuffle_function_key_applied = mutual_persistent_keys.OuterServerShuffleFunctionMediumKey << mutual_ephemeral_keys.OuterServerShuffleFunctionMediumEphemeralKey client_shuffle_key_a_applied = client_shuffle_key_a_applied < outer_server_shuffle_function_key_applied result = result << client_shuffle_key_a_applied outer_client_shuffle_key_applied = client_persistent_keys.OuterClientShuffleMediumKey << client_ephemeral_keys.OuterClientShuffleMediumEphemeralKey outer_client_shuffle_function_key_applied = client_persistent_keys.OuterClientShuffleFunctionMediumKey << client_ephemeral_keys.OuterClientShuffleFunctionMediumEphemeralKey outer_client_shuffle_key_applied = outer_client_shuffle_key_applied << outer_client_shuffle_function_key_applied result = result < outer_client_shuffle_key_applied return result def darc_phase3(alphabet: AlphabetKey, medium: AlphabetKey, client_keys: ClientKeys, mutual_keys: MutualKeys): alphabet_phase3 = transmit_alphabet(alphabet, client_keys.Persistent.Data, client_keys.Ephemeral.Data, mutual_keys.Persistent.Data, mutual_keys.Ephemeral.Data) medium = transmit_medium(medium, client_keys.Persistent.Medium, client_keys.Ephemeral.Medium, mutual_keys.Persistent.Medium, mutual_keys.Ephemeral.Medium) return alphabet_phase3, medium def transmit_alphabet(alphabet: DarcKey, client_persistent_keys: ClientPersistentDataKeys, client_ephemeral_keys: ClientEphemeralDataKeys, mutual_persistent_keys: MutualPersistentDataKeys, mutual_ephemeral_keys: MutualEphemeralDataKeys): outer_server_shuffle_function_key_applied = mutual_persistent_keys.OuterServerShuffleFunctionKey << mutual_ephemeral_keys.OuterServerShuffleFunctionKey outer_client_shuffle_key_applied = client_persistent_keys.OuterClientShuffleKey << client_ephemeral_keys.OuterClientShuffleEphemeralKey outer_client_shuffle_function_key_applied = client_persistent_keys.OuterClientShuffleFunctionKey << client_ephemeral_keys.OuterClientShuffleFunctionEphemeralKey input_outer_client_shuffle_key = outer_client_shuffle_key_applied << outer_client_shuffle_function_key_applied input_outer_server_shuffle_function_key = outer_server_shuffle_function_key_applied << input_outer_client_shuffle_key outer_function_function_key_applied = mutual_persistent_keys.OuterFunctionFunctionKey << mutual_ephemeral_keys.OuterFunctionFunctionKey outer_function_function_key_applied = outer_function_function_key_applied << input_outer_client_shuffle_key function_key_applied = mutual_persistent_keys.Inner1 << mutual_ephemeral_keys.Inner1 function_key_applied = function_key_applied < outer_function_function_key_applied reordered_shuffle_key_x = mutual_persistent_keys.ClientShuffleKeyX < input_outer_server_shuffle_function_key function_ephemeral_key_applied = function_key_applied << reordered_shuffle_key_x client_shuffle_key_b = (~client_persistent_keys.ClientShuffleKeyA) << mutual_persistent_keys.ClientShuffleKeyX client_shuffle_ephemeral_key_b = ~client_ephemeral_keys.ClientShuffleEphemeralKeyA input_client_shuffle_key_b = client_shuffle_ephemeral_key_b << client_shuffle_key_b input_client_shuffle_key_b = input_client_shuffle_key_b < input_outer_server_shuffle_function_key shuffled_items = alphabet << input_client_shuffle_key_b outer_function_key_applied = mutual_persistent_keys.OuterFunctionKey << mutual_ephemeral_keys.OuterFunctionKey input_outer_function_key = outer_function_key_applied << input_outer_client_shuffle_key inner_function_key_applied = function_ephemeral_key_applied operand = shuffled_items operand1 = client_ephemeral_keys.ClientEphemeralKey < input_outer_function_key operand2 = client_persistent_keys.ClientKey < input_outer_function_key operand3 = mutual_ephemeral_keys.MutualKey < input_outer_function_key result = operand ^ (operand1 << inner_function_key_applied) ^ (operand2 << inner_function_key_applied) ^ (operand3 << inner_function_key_applied) return result def transmit_medium(medium: DarcKey, client_persistent_keys: ClientPersistentMediumKeys, client_ephemeral_keys: ClientEphemeralMediumKeys, mutual_persistent_keys: MutualPersistentMediumKeys, mutual_ephemeral_keys: MutualEphemeralMediumKeys): client_shuffle_ephemeral_key_b = ~client_ephemeral_keys.ClientShuffleMediumEphemeralKeyA outer_server_shuffle_function_key_applied = mutual_persistent_keys.OuterServerShuffleFunctionMediumKey << mutual_ephemeral_keys.OuterServerShuffleFunctionMediumEphemeralKey outer_client_shuffle_key_applied = client_persistent_keys.OuterClientShuffleMediumKey << client_ephemeral_keys.OuterClientShuffleMediumEphemeralKey outer_client_suffle_function_key_applied = client_persistent_keys.OuterClientShuffleFunctionMediumKey << client_ephemeral_keys.OuterClientShuffleFunctionMediumEphemeralKey input_outer_client_shuffle_key = outer_client_shuffle_key_applied << outer_client_suffle_function_key_applied input_outer_server_shuffle_function_key = outer_server_shuffle_function_key_applied << input_outer_client_shuffle_key outer_function_function_key_applied = mutual_persistent_keys.OuterFunctionFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionFunctionMediumEphemeralKey outer_function_function_key_applied = outer_function_function_key_applied << input_outer_client_shuffle_key function_key_applied = mutual_persistent_keys.FunctionMediumKey << mutual_ephemeral_keys.FunctionMediumKey function_key_applied = function_key_applied < outer_function_function_key_applied reordered_shuffle_key_x = mutual_persistent_keys.ClientShuffleMediumKeyX < input_outer_server_shuffle_function_key function_ephemeral_key_applied = function_key_applied << reordered_shuffle_key_x client_shuffle_key_b = (~client_persistent_keys.ClientShuffleMediumKeyA) << mutual_persistent_keys.ClientShuffleMediumKeyX input_client_shuffle_key_b = client_shuffle_ephemeral_key_b << client_shuffle_key_b input_client_shuffle_key_b = input_client_shuffle_key_b < input_outer_server_shuffle_function_key shuffled_items = medium << input_client_shuffle_key_b outer_function_key_applied = mutual_persistent_keys.OuterFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionMediumEphemeralKey input_outer_function_key = outer_function_key_applied << input_outer_client_shuffle_key inner_function_key_applied = function_ephemeral_key_applied operand = shuffled_items operand1 = client_ephemeral_keys.ClientMediumEphemeralKey < input_outer_function_key operand2 = client_persistent_keys.ClientMediumKey < input_outer_function_key operand3 = mutual_ephemeral_keys.MutualMediumKey < input_outer_function_key result = operand ^ (operand1 << inner_function_key_applied) ^ (operand2 << inner_function_key_applied) ^ (operand3 << inner_function_key_applied) return result def merge_message(alphabet: DarcKey, medium: DarcKey, client_keys: ClientKeys, mutual_keys: MutualKeys, input_sequence: list[int]): outer_client_shuffle_alphabet_key_applied = client_keys.Persistent.Data.OuterClientShuffleKey << client_keys.Ephemeral.Data.OuterClientShuffleEphemeralKey outer_client_shuffle_function_alphabet_key_applied = client_keys.Persistent.Data.OuterClientShuffleFunctionKey << client_keys.Ephemeral.Data.OuterClientShuffleFunctionEphemeralKey outer_client_shuffle_alphabet_key_applied = ~(outer_client_shuffle_alphabet_key_applied << outer_client_shuffle_function_alphabet_key_applied) msg_len = len(input_sequence) eof_arr = AlphabetKey.init_matrix(width, height, 255).matrix[0] if msg_len < height: padded_input_sequence = OuterShuffleKey.init_matrix(height) padded_input_sequence.matrix = [input_sequence + padded_input_sequence.matrix[0][msg_len:]] else: padded_input_sequence = OuterShuffleKey(matrix=[input_sequence]) input_sequence_applied = outer_client_shuffle_alphabet_key_applied << padded_input_sequence outer_client_shuffle_medium_key_applied = client_keys.Persistent.Medium.OuterClientShuffleMediumKey << client_keys.Ephemeral.Medium.OuterClientShuffleMediumEphemeralKey outer_client_shuffle_function_medium_key_applied = client_keys.Persistent.Medium.OuterClientShuffleFunctionMediumKey << client_keys.Ephemeral.Medium.OuterClientShuffleFunctionMediumEphemeralKey outer_client_shuffle_medium_key_applied = outer_client_shuffle_medium_key_applied << outer_client_shuffle_function_medium_key_applied input_sequence_applied = input_sequence_applied << outer_client_shuffle_medium_key_applied message = alphabet < input_sequence_applied message_pad_key = ~outer_client_shuffle_medium_key_applied if msg_len < height: message.matrix[message_pad_key.matrix[0][msg_len]] = eof_arr position_function_key_applied = mutual_keys.Persistent.Medium.PositionFunctionMediumKey << mutual_keys.Ephemeral.Medium.PositionFunctionMediumEphemeralKey outer_position_function_key_applied = mutual_keys.Persistent.Medium.OuterPositionFunctionMediumKey << mutual_keys.Ephemeral.Medium.OuterPositionFunctionMediumEphemeralKey outer_position_shuffle_key_applied = mutual_keys.Persistent.Medium.OuterPositionShuffleMediumKey << mutual_keys.Ephemeral.Medium.OuterPositionShuffleMediumEphemeralKey outer_position_function_key_applied = outer_position_shuffle_key_applied << outer_position_function_key_applied outer_client_shuffle_medium_key_applied = ~outer_client_shuffle_medium_key_applied outer_position_function_key_applied = ~(outer_client_shuffle_medium_key_applied << outer_position_function_key_applied) inner_function_key_applied = position_function_key_applied < outer_position_function_key_applied operand = medium operand1 = message message = operand ^ (operand1 << inner_function_key_applied) outer_position_shuffle_function_key_applied = mutual_keys.Persistent.Medium.OuterPositionShuffleFunctionMediumKey << mutual_keys.Ephemeral.Medium.OuterPositionShuffleFunctionMediumEphemeralKey position_shuffle_key_applied = mutual_keys.Persistent.Medium.PositionShuffleMediumKey << mutual_keys.Ephemeral.Medium.PositionShuffleMediumEphemeralKey outer_position_shuffle_key_applied = outer_client_shuffle_medium_key_applied << outer_position_shuffle_key_applied outer_position_shuffle_function_key_applied = outer_position_shuffle_function_key_applied << outer_position_function_key_applied message = message << (position_shuffle_key_applied < outer_position_shuffle_function_key_applied) message = message < outer_position_shuffle_key_applied return message def darc_phase_4(alphabet: AlphabetKey, darc_message: AlphabetKey, server_keys: ServerKeys, mutual_keys: MutualKeys): outer_position_function_ephemeral_key_applied = mutual_keys.Persistent.Medium.OuterPositionFunctionMediumKey << mutual_keys.Ephemeral.Medium.OuterPositionFunctionMediumEphemeralKey outer_position_shuffle_ephemeral_key_applied = mutual_keys.Persistent.Medium.OuterPositionShuffleMediumKey << mutual_keys.Ephemeral.Medium.OuterPositionShuffleMediumEphemeralKey outer_position_function_ephemeral_key_applied = ~(outer_position_shuffle_ephemeral_key_applied << outer_position_function_ephemeral_key_applied) outer_position_shuffle_ephemeral_key_applied = ~outer_position_shuffle_ephemeral_key_applied outer_position_shuffle_function_ephemeral_key_applied = mutual_keys.Persistent.Medium.OuterPositionShuffleFunctionMediumKey << mutual_keys.Ephemeral.Medium.OuterPositionShuffleFunctionMediumEphemeralKey outer_position_shuffle_function_ephemeral_key_applied = outer_position_shuffle_function_ephemeral_key_applied << outer_position_function_ephemeral_key_applied outer_function_function_medium_ephemeral_key_applied = mutual_keys.Persistent.Medium.OuterFunctionFunctionMediumKey << mutual_keys.Ephemeral.Medium.OuterFunctionFunctionMediumEphemeralKey outer_server_shuffle_function_ephemeral_key_applied = mutual_keys.Persistent.Data.OuterServerShuffleFunctionKey << mutual_keys.Ephemeral.Data.OuterServerShuffleFunctionKey outer_server_shuffle_function_medium_ephemeral_key_applied = mutual_keys.Persistent.Medium.OuterServerShuffleFunctionMediumKey << mutual_keys.Ephemeral.Medium.OuterServerShuffleFunctionMediumEphemeralKey function_medium_ephemeral_key_applied = mutual_keys.Persistent.Medium.FunctionMediumKey << mutual_keys.Ephemeral.Medium.FunctionMediumKey client_shuffle_medium_key_x = mutual_keys.Persistent.Medium.ClientShuffleMediumKeyX < outer_server_shuffle_function_medium_ephemeral_key_applied client_shuffle_medium_key_x = (function_medium_ephemeral_key_applied < outer_function_function_medium_ephemeral_key_applied) << client_shuffle_medium_key_x position_shuffle_ephemeral_key_applied = mutual_keys.Persistent.Medium.PositionShuffleMediumKey << mutual_keys.Ephemeral.Medium.PositionShuffleMediumEphemeralKey position_shuffle_ephemeral_key_applied = position_shuffle_ephemeral_key_applied < outer_position_shuffle_function_ephemeral_key_applied client_shuffle_medium_key_x = client_shuffle_medium_key_x << position_shuffle_ephemeral_key_applied outer_function_medium_ephemeral_key_applied = mutual_keys.Persistent.Medium.OuterFunctionMediumKey << mutual_keys.Ephemeral.Medium.OuterFunctionMediumEphemeralKey rx_data = darc_message < outer_position_shuffle_ephemeral_key_applied inner_key = client_shuffle_medium_key_x operand = rx_data operand1 = server_keys.Persistent.Medium.ServerMediumKey < outer_function_medium_ephemeral_key_applied operand2 = server_keys.Ephemeral.Medium.ServerMediumEphemeralKey < outer_function_medium_ephemeral_key_applied operand3 = mutual_keys.Persistent.Medium.MutualMediumKey < outer_function_medium_ephemeral_key_applied operand4 = mutual_keys.Ephemeral.Medium.MutualMediumKey < outer_function_medium_ephemeral_key_applied rx_data = operand ^ (operand1 << inner_key) ^ (operand2 << inner_key) ^ (operand3 << inner_key) ^ (operand4 << inner_key) position_function_ephemeral_key_applied = mutual_keys.Persistent.Medium.PositionFunctionMediumKey << mutual_keys.Ephemeral.Medium.PositionFunctionMediumEphemeralKey rx_data = rx_data << (~(position_shuffle_ephemeral_key_applied) << (~position_function_ephemeral_key_applied < outer_position_function_ephemeral_key_applied)) client_shuffle_key_x = mutual_keys.Persistent.Data.ClientShuffleKeyX < outer_server_shuffle_function_ephemeral_key_applied outer_function_function_ephemeral_key_applied = mutual_keys.Persistent.Data.OuterFunctionFunctionKey << mutual_keys.Ephemeral.Data.OuterFunctionFunctionKey function_ephemeral_key_applied = mutual_keys.Persistent.Data.Inner1 << mutual_keys.Ephemeral.Data.Inner1 function_ephemeral_key_applied = (function_ephemeral_key_applied < outer_function_function_ephemeral_key_applied) << client_shuffle_key_x server_shuffle_ephemeral_key_applied = ~(server_keys.Persistent.Data.ServerShuffleKey << mutual_keys.Persistent.Data.ClientShuffleKeyX) << ~(server_keys.Ephemeral.Data.ServerShuffleEphemeralKey) server_shuffle_ephemeral_key_applied = ~(server_shuffle_ephemeral_key_applied < outer_server_shuffle_function_ephemeral_key_applied) outer_server_shuffle_ephemeral_key_applied = server_keys.Persistent.Data.OuterServerShuffleKey << server_keys.Ephemeral.Data.OuterServerShuffleEphemeralKey alpha_prep = (alphabet < outer_server_shuffle_ephemeral_key_applied) << server_shuffle_ephemeral_key_applied outer_function_ephemeral_key_applied = mutual_keys.Persistent.Data.OuterFunctionKey << mutual_keys.Ephemeral.Data.OuterFunctionKey inner_key = function_ephemeral_key_applied operand = alpha_prep operand1 = server_keys.Persistent.Data.ServerKey < outer_function_ephemeral_key_applied operand2 = server_keys.Ephemeral.Data.ServerEphemeralKey < outer_function_ephemeral_key_applied operand3 = mutual_keys.Persistent.Data.MutualKey < outer_function_ephemeral_key_applied operand4 = mutual_keys.Ephemeral.Data.MutualKey < outer_function_ephemeral_key_applied alpha_prep = operand ^ (operand1 << inner_key) ^ (operand2 << inner_key) ^ (operand3 << inner_key) ^ (operand4 << inner_key) return resolve_message(alpha_prep.matrix, rx_data.matrix) 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] message = [] for alpha in encoded_message: if alpha in alphabet_map.keys(): message.append(alphabet_map[alpha]) else: break return message if __name__ == "__main__": #with open("../darc_key_json/client_persistent_keys.json") as fp: # client_persistent_keys = json.load(fp) #with open("../darc_key_json/client_ephemeral_keys.json") as fp: # client_ephemeral_keys = json.load(fp) #with open("../darc_key_json/server_persistent_keys.json") as fp: # server_persistent_keys = json.load(fp) #with open("../darc_key_json/server_ephemeral_keys.json") as fp: # server_ephemeral_keys = json.load(fp) #with open("../darc_key_json/mutual_ephemeral_keys.json") as fp: # mutual_ephemeral_keys = json.load(fp) #client_persistent_keys = {k: {"matrix": v} for k, v in client_persistent_keys.items()} #client_ephemeral_keys = {k: {"matrix": v} for k, v in client_ephemeral_keys.items()} #server_persistent_keys = {k: {"matrix": v} for k, v in server_persistent_keys.items()} #server_ephemeral_keys = {k: {"matrix": v} for k, v in server_ephemeral_keys.items()} #mutual_ephemeral_keys = {k: {"matrix": v} for k, v in mutual_ephemeral_keys.items()} #client_keys = ClientKeys( # Persistent=ClientPersistentKeys( # Data=ClientPersistentDataKeys( # OuterClientShuffleKey=client_persistent_keys["OuterClientShuffleKey"], # OuterClientShuffleFunctionKey=client_persistent_keys["OuterClientShuffleFunctionKey"], # ClientKey=client_persistent_keys["ClientKey"], # ClientShuffleKeyA=client_persistent_keys["ClientShuffleKeyA"] # ), # Medium=ClientPersistentMediumKeys( # OuterClientShuffleMediumKey=client_persistent_keys["OuterClientShuffleMediumKey"], # OuterClientShuffleFunctionMediumKey=client_persistent_keys["OuterClientShuffleFunctionMediumKey"], # ClientShuffleMediumKeyA=client_persistent_keys["ClientShuffleMediumKeyA"], # ClientMediumKey=client_persistent_keys["ClientMediumKey"] # ) # ), # Ephemeral=ClientEphemeralKeys( # Data=ClientEphemeralDataKeys( # OuterClientShuffleEphemeralKey=client_ephemeral_keys["OuterClientShuffleEphemeralKey"], # OuterClientShuffleFunctionEphemeralKey=client_ephemeral_keys["OuterClientShuffleFunctionEphemeralKey"], # ClientEphemeralKey=client_ephemeral_keys["ClientEphemeralKey"], # ClientShuffleEphemeralKeyA=client_ephemeral_keys["ClientShuffleEphemeralKeyA"] # ), # Medium=ClientEphemeralMediumKeys( # OuterClientShuffleMediumEphemeralKey=client_ephemeral_keys["OuterClientShuffleMediumEphemeralKey"], # OuterClientShuffleFunctionMediumEphemeralKey=client_ephemeral_keys["OuterClientShuffleFunctionMediumEphemeralKey"], # ClientShuffleMediumEphemeralKeyA=client_ephemeral_keys["ClientShuffleMediumEphemeralKeyA"], # ClientMediumEphemeralKey=client_ephemeral_keys["ClientMediumEphemeralKey"] # ) # ) #) #server_keys = ServerKeys( # Persistent=ServerPersistentKeys( # Data=ServerPersistentDataKeys( # OuterServerShuffleKey=server_persistent_keys["OuterServerShuffleKey"], # ServerKey=server_persistent_keys["ServerKey"], # ServerShuffleKey=server_persistent_keys["ServerShuffleKey"] # ), # Medium=ServerPersistentMediumKeys( # ServerMediumKey=server_persistent_keys["ServerMediumKey"], # ) # ), # Ephemeral=ServerEphemeralKeys( # Data=ServerEphemeralDataKeys( # OuterServerShuffleEphemeralKey=server_ephemeral_keys["OuterServerShuffleEphemeralKey"], # ServerEphemeralKey=server_ephemeral_keys["ServerEphemeralKey"], # ServerShuffleEphemeralKey=server_ephemeral_keys["ServerShuffleEphemeralKey"] # ), # Medium=ServerEphemeralMediumKeys( # ServerMediumEphemeralKey=server_ephemeral_keys["ServerMediumEphemeralKey"], # ) # ) #) #mutual_keys = MutualKeys( # Persistent=MutualPersistentKeys( # Data=MutualPersistentDataKeys( # OuterFunctionKey=server_persistent_keys["OuterFunctionKey"], # OuterFunctionFunctionKey=server_persistent_keys["OuterFunctionFunctionKey"], # OuterServerShuffleFunctionKey=server_persistent_keys["OuterServerShuffleFunctionKey"], # MutualKey=server_persistent_keys["MutualKey"], # Inner1=server_persistent_keys["FunctionKey"], # ClientShuffleKeyX=server_persistent_keys["ClientShuffleKeyX"], # ), # Medium=MutualPersistentMediumKeys( # MutualMediumKey=server_persistent_keys["MutualMediumKey"], # OuterFunctionMediumKey=server_persistent_keys["OuterFunctionMediumKey"], # OuterFunctionFunctionMediumKey=server_persistent_keys["OuterFunctionFunctionMediumKey"], # OuterServerShuffleFunctionMediumKey=server_persistent_keys["OuterServerShuffleFunctionMediumKey"], # FunctionMediumKey=server_persistent_keys["FunctionMediumKey"], # ClientShuffleMediumKeyX=server_persistent_keys["ClientShuffleMediumKeyX"], # OuterPositionShuffleMediumKey=server_persistent_keys["OuterPositionShuffleMediumKey"], # OuterPositionShuffleFunctionMediumKey=server_persistent_keys["OuterPositionShuffleFunctionMediumKey"], # OuterPositionFunctionMediumKey=server_persistent_keys["OuterPositionFunctionMediumKey"], # PositionFunctionMediumKey=server_persistent_keys["PositionFunctionMediumKey"], # PositionShuffleMediumKey=server_persistent_keys["PositionShuffleMediumKey"], # ) # ), # Ephemeral=MutualEphemeralKeys( # Data=MutualEphemeralDataKeys( # MutualKey=mutual_ephemeral_keys["MutualEphemeralKey"], # Inner1=mutual_ephemeral_keys["FunctionEphemeralKey"], # OuterFunctionKey=mutual_ephemeral_keys["OuterFunctionEphemeralKey"], # OuterFunctionFunctionKey=mutual_ephemeral_keys["OuterFunctionFunctionEphemeralKey"], # OuterServerShuffleFunctionKey=mutual_ephemeral_keys["OuterServerShuffleFunctionEphemeralKey"] # ), # Medium=MutualEphemeralMediumKeys( # MutualMediumKey=mutual_ephemeral_keys["MutualMediumEphemeralKey"], # FunctionMediumKey=mutual_ephemeral_keys["FunctionMediumEphemeralKey"], # PositionFunctionMediumEphemeralKey=mutual_ephemeral_keys["PositionFunctionMediumEphemeralKey"], # OuterFunctionMediumEphemeralKey=mutual_ephemeral_keys["OuterFunctionMediumEphemeralKey"], # OuterFunctionFunctionMediumEphemeralKey=mutual_ephemeral_keys["OuterFunctionFunctionMediumEphemeralKey"], # OuterPositionFunctionMediumEphemeralKey=mutual_ephemeral_keys["OuterPositionFunctionMediumEphemeralKey"], # OuterServerShuffleFunctionMediumEphemeralKey=mutual_ephemeral_keys["OuterServerShuffleFunctionMediumEphemeralKey"], # OuterPositionShuffleFunctionMediumEphemeralKey=mutual_ephemeral_keys["OuterPositionShuffleFunctionMediumEphemeralKey"], # PositionShuffleMediumEphemeralKey=mutual_ephemeral_keys["PositionShuffleMediumEphemeralKey"], # OuterPositionShuffleMediumEphemeralKey=mutual_ephemeral_keys["OuterPositionShuffleMediumEphemeralKey"] # ) # ) #) #alphabet = AlphabetKey(**server_ephemeral_keys["Alphabet"]) server_keys = ServerKeys.random_init(height, width) mutual_keys = MutualKeys.random_init(height, width) client_keys = ClientKeys.random_init(height, width) alphabet = AlphabetKey.init_matrix(width, height, 255) server_keys.Persistent.Data.ServerKey = server_keys.Persistent.Data.ServerKey ^ mutual_keys.Persistent.Data.MutualKey server_keys.Persistent.Medium.ServerMediumKey = server_keys.Persistent.Medium.ServerMediumKey ^ mutual_keys.Persistent.Medium.MutualMediumKey mutual_keys.Persistent.Data.MutualKey = mutual_keys.Persistent.Data.MutualKey ^ client_keys.Persistent.Data.ClientKey mutual_keys.Persistent.Medium.MutualMediumKey = mutual_keys.Persistent.Medium.MutualMediumKey ^ client_keys.Persistent.Medium.ClientMediumKey (phase1_alphabet, phase1_medium) = darc_phase1(alphabet, server_keys, mutual_keys) (phase2_alphabet, phase2_medium) = darc_phase2(phase1_alphabet, phase1_medium, client_keys, mutual_keys) (phase3_alphabet, phase3_medium) = darc_phase3(phase2_alphabet, phase2_medium, client_keys, mutual_keys) original_message = [ 0, 2, 4, 6, 0, 5, 9, 9, 1, 7 ] 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) print(original_message) print(message)