from src.models import ( SubstitutionKey, ClientKeys, MutualKeys, ClientPersistentDataKeys, ClientEphemeralDataKeys, MutualPersistentDataKeys, MutualEphemeralDataKeys, ClientPersistentMediumKeys, ClientEphemeralMediumKeys, MutualPersistentMediumKeys, MutualEphemeralMediumKeys, DarcKey, OuterKey, Mask ) def darc_phase2( alphabet_phase1: SubstitutionKey, medium_phase1: SubstitutionKey, client_keys: ClientKeys, mutual_keys: MutualKeys ): alphabet_phase2 = receive_alphabet( alphabet_phase1, client_keys.persistent.data, client_keys.ephemeral.data, mutual_keys.persistent.data, mutual_keys.ephemeral.data ) medium_phase2 = receive_medium( medium_phase1, client_keys.persistent.medium, client_keys.ephemeral.medium, mutual_keys.persistent.medium, mutual_keys.ephemeral.medium ) return alphabet_phase2, medium_phase2 def receive_alphabet( alphabet_phase1: SubstitutionKey, client_persistent_data_keys: ClientPersistentDataKeys, client_ephemeral_data_keys: ClientEphemeralDataKeys, mutual_persistent_data_keys: MutualPersistentDataKeys, mutual_ephemeral_data_keys: MutualEphemeralDataKeys ): 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 mdo3 = mutual_persistent_data_keys.outer_key_3 << mutual_ephemeral_data_keys.outer_key_3 cdi1 = client_persistent_data_keys.inner_key_1 << client_ephemeral_data_keys.inner_key_1 cdo1 = client_persistent_data_keys.outer_key_1 << client_ephemeral_data_keys.outer_key_1 cdo2 = client_persistent_data_keys.outer_key_2 << client_ephemeral_data_keys.outer_key_2 ceda = client_ephemeral_data_keys.alpha_key cpda = client_persistent_data_keys.alpha_key mpda = mutual_persistent_data_keys.alpha_key alphabet_phase2 = (((( alphabet_phase1 ^ (((ceda ^ cpda ^ mpda) < mdo1) << (mdi1 < mdo2)) ) < ~mdo3)) << cdi1) < (mdo3 << cdo1 << cdo2) return alphabet_phase2 def receive_medium( medium_phase1: SubstitutionKey, client_persistent_medium_keys: ClientPersistentMediumKeys, client_ephemeral_medium_keys: ClientEphemeralMediumKeys, mutual_persistent_medium_keys: MutualPersistentMediumKeys, mutual_ephemeral_medium_keys: MutualEphemeralMediumKeys ): 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 mmo3 = mutual_persistent_medium_keys.outer_key_3 << mutual_ephemeral_medium_keys.outer_key_3 cmi1 = client_persistent_medium_keys.inner_key_1 << client_ephemeral_medium_keys.inner_key_1 cmo1 = client_persistent_medium_keys.outer_key_1 << client_ephemeral_medium_keys.outer_key_1 cmo2 = client_persistent_medium_keys.outer_key_2 << client_ephemeral_medium_keys.outer_key_2 cema = client_ephemeral_medium_keys.alpha_key cpma = client_persistent_medium_keys.alpha_key mpma = mutual_persistent_medium_keys.alpha_key medium_phase2 = ( ( medium_phase1 ^ (((cema ^ cpma ^ mpma) < mmo1) << (mmi1 < mmo2)) ) << (cmi1 < mmo3) ) < (cmo1 << cmo2) return medium_phase2 def transmit_alphabet( alphabet_phase2: DarcKey, client_persistent_data_keys: ClientPersistentDataKeys, client_ephemeral_data_keys: ClientEphemeralDataKeys, mutual_persistent_data_keys: MutualPersistentDataKeys, mutual_ephemeral_data_keys: MutualEphemeralDataKeys ): #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 mdo3 = mutual_persistent_data_keys.outer_key_3 << mutual_ephemeral_data_keys.outer_key_3 cdi1 = client_persistent_data_keys.inner_key_1 << client_ephemeral_data_keys.inner_key_1 cdo1 = client_persistent_data_keys.outer_key_1 << client_ephemeral_data_keys.outer_key_1 cdo2 = client_persistent_data_keys.outer_key_2 << client_ephemeral_data_keys.outer_key_2 cdo1_cdo2 = cdo1 << cdo2 ceda = client_ephemeral_data_keys.alpha_key cpda = client_persistent_data_keys.alpha_key meda = mutual_ephemeral_data_keys.alpha_key alphabet_phase3 = ( (alphabet_phase2 << ((~cdi1 << mdi2) < (mdo3 << cdo1_cdo2))) ^ ( ( ((ceda ^ cpda ^ meda) < (mdo1 << cdo1_cdo2)) << ((mdi1 < (mdo2 << cdo1_cdo2)) << (mdi2 < (mdo3 << cdo1_cdo2))) ) ) ) return alphabet_phase3 def transmit_medium( medium_phase2: DarcKey, client_persistent_medium_keys: ClientPersistentMediumKeys, client_ephemeral_medium_keys: ClientEphemeralMediumKeys, mutual_persistent_medium_keys: MutualPersistentMediumKeys, mutual_ephemeral_medium_keys: MutualEphemeralMediumKeys ): #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 mmo3 = mutual_persistent_medium_keys.outer_key_3 << mutual_ephemeral_medium_keys.outer_key_3 cmi1 = client_persistent_medium_keys.inner_key_1 << client_ephemeral_medium_keys.inner_key_1 cmo1 = client_persistent_medium_keys.outer_key_1 << client_ephemeral_medium_keys.outer_key_1 cmo2 = client_persistent_medium_keys.outer_key_2 << client_ephemeral_medium_keys.outer_key_2 cmo1_cmo2 = cmo1 << cmo2 cpma = client_persistent_medium_keys.alpha_key cema = client_ephemeral_medium_keys.alpha_key mema = mutual_ephemeral_medium_keys.alpha_key medium_phase3 = ( ((medium_phase2 < ~cmo1_cmo2) << ((~cmi1 << mmi2) < mmo3)) ^ (((cpma ^ cema ^ mema) < mmo1) << ((mmi1 < mmo2) << (mmi2 < mmo3))) ) < cmo1_cmo2 return medium_phase3 def darc_phase3( alphabet_phase2: SubstitutionKey, medium_phase2: SubstitutionKey, client_keys: ClientKeys, mutual_keys: MutualKeys ): alphabet_phase3 = transmit_alphabet( alphabet_phase2, client_keys.persistent.data, client_keys.ephemeral.data, mutual_keys.persistent.data, mutual_keys.ephemeral.data ) medium_phase3 = transmit_medium( medium_phase2, client_keys.persistent.medium, client_keys.ephemeral.medium, mutual_keys.persistent.medium, mutual_keys.ephemeral.medium ) return alphabet_phase3, medium_phase3 def merge_message( alphabet_phase3: SubstitutionKey, medium_phase3: SubstitutionKey, client_keys: ClientKeys, mutual_keys: MutualKeys, message: list[int] ): height = len(alphabet_phase3.matrix) width = len(alphabet_phase3.matrix[0]) msg_len = len(message) eof_msg_mask = Mask.init_matrix(width, height, msg_len) padded_input_sequence = OuterKey.init_matrix(height) padded_input_sequence.matrix = [message + padded_input_sequence.matrix[0][msg_len:]] 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 mmi3 = mutual_keys.persistent.medium.inner_key_3 << mutual_keys.ephemeral.medium.inner_key_3 mmi4 = mutual_keys.persistent.medium.inner_key_4 << mutual_keys.ephemeral.medium.inner_key_4 mmo4 = mutual_keys.persistent.medium.outer_key_4 << mutual_keys.ephemeral.medium.outer_key_4 mmo5 = mutual_keys.persistent.medium.outer_key_5 << mutual_keys.ephemeral.medium.outer_key_5 mmo6 = mutual_keys.persistent.medium.outer_key_6 << mutual_keys.ephemeral.medium.outer_key_6 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 cmo1_cmo2 = cmo1 << cmo2 cdo1_cdo2 = cdo1 << cdo2 nmmo6_nmmo4 = ~(mmo4 << mmo6) darc_message = (( ( (medium_phase3 < ~cmo1_cmo2) ^ ((((alphabet_phase3 < ~cdo1_cdo2) < padded_input_sequence) ^ eof_msg_mask) << ( mmi3 < nmmo6_nmmo4)) ) ) << (mmi4 < (mmo5 << nmmo6_nmmo4))) < mmo4 return darc_message