390 lines
27 KiB
Python
390 lines
27 KiB
Python
from src.models import ServerEphemeralKeys, ServerPersistentKeys, ClientEphemeralKeys, ClientPersistentKeys, \
|
|
MutualEphemeralKeys, AlphabetKey, DarcKey, OuterShuffleKey
|
|
import json
|
|
|
|
height = 10
|
|
width = 7
|
|
block_size = 10
|
|
|
|
|
|
def translate_data(server_persistent_keys: ServerPersistentKeys, server_ephemeral_keys: ServerEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys):
|
|
function_ephemeral_key_applied = server_persistent_keys.FunctionKey << mutual_ephemeral_keys.FunctionEphemeralKey
|
|
outer_function_ephemeral_key_applied = server_persistent_keys.OuterFunctionKey << mutual_ephemeral_keys.OuterFunctionEphemeralKey
|
|
outer_function_function_ephemeral_key_applied = server_persistent_keys.OuterFunctionFunctionKey << mutual_ephemeral_keys.OuterFunctionFunctionEphemeralKey
|
|
outer_server_shuffle_ephemeral_key_applied = server_persistent_keys.OuterServerShuffleKey << server_ephemeral_keys.OuterServerShuffleEphemeralKey
|
|
outer_server_shuffle_function_ephemeral_key_applied = server_persistent_keys.OuterServerShuffleFunctionKey << mutual_ephemeral_keys.OuterServerShuffleFunctionEphemeralKey
|
|
input_data = server_ephemeral_keys.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: ServerPersistentKeys, server_ephemeral_keys: ServerEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys):
|
|
|
|
function_ephemeral_key_applied = server_persistent_keys.FunctionMediumKey << mutual_ephemeral_keys.FunctionMediumEphemeralKey
|
|
outer_function_ephemeral_key_applied = server_persistent_keys.OuterFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionMediumEphemeralKey
|
|
outer_function_function_ephemeral_key_applied = server_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_phase1(server_persistent_keys: ServerPersistentKeys, server_ephemeral_keys: ServerEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys):
|
|
alphabet = translate_data(server_persistent_keys, server_ephemeral_keys, mutual_ephemeral_keys)
|
|
medium = translate_medium(server_persistent_keys, server_ephemeral_keys, mutual_ephemeral_keys)
|
|
return alphabet, medium
|
|
|
|
|
|
def receive_alphabet(alphabet: DarcKey, client_persistent_keys: ClientPersistentKeys, client_ephemeral_keys: ClientEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys):
|
|
function_key_applied = client_persistent_keys.FunctionKey << mutual_ephemeral_keys.FunctionEphemeralKey
|
|
outer_function_key_applied = client_persistent_keys.OuterFunctionKey << mutual_ephemeral_keys.OuterFunctionEphemeralKey
|
|
outer_function_function_key_applied = client_persistent_keys.OuterFunctionFunctionKey << mutual_ephemeral_keys.OuterFunctionFunctionEphemeralKey
|
|
|
|
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 = client_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 = client_persistent_keys.OuterServerShuffleFunctionKey << mutual_ephemeral_keys.OuterServerShuffleFunctionEphemeralKey
|
|
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: DarcKey, client_peristent_keys: ClientPersistentKeys, client_ephemeral_keys: ClientEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys):
|
|
function_key_applied = client_peristent_keys.FunctionMediumKey << mutual_ephemeral_keys.FunctionMediumEphemeralKey
|
|
outer_function_key_applied = client_peristent_keys.OuterFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionMediumEphemeralKey
|
|
outer_function_function_key_applied = client_peristent_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_peristent_keys.ClientMediumKey < outer_function_key_applied
|
|
operand3 = client_peristent_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_peristent_keys.ClientShuffleMediumKeyA << client_ephemeral_keys.ClientShuffleMediumEphemeralKeyA
|
|
outer_server_shuffle_function_key_applied = client_peristent_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_peristent_keys.OuterClientShuffleMediumKey << client_ephemeral_keys.OuterClientShuffleMediumEphemeralKey
|
|
outer_client_shuffle_function_key_applied = client_peristent_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_phase2(alphabet: DarcKey, medium: DarcKey, client_peristent_keys: ClientPersistentKeys, client_ephemeral_keys: ClientEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys):
|
|
alphabet = receive_alphabet(alphabet, client_peristent_keys, client_ephemeral_keys, mutual_ephemeral_keys)
|
|
medium = receive_medium(medium, client_peristent_keys, client_ephemeral_keys, mutual_ephemeral_keys)
|
|
return alphabet, medium
|
|
|
|
|
|
|
|
def transmit_alphabet(alphabet: DarcKey, client_peristent_keys: ClientPersistentKeys, client_ephemeral_keys: ClientEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys):
|
|
outer_server_shuffle_function_key_applied = client_peristent_keys.OuterServerShuffleFunctionKey << mutual_ephemeral_keys.OuterServerShuffleFunctionEphemeralKey
|
|
outer_client_shuffle_key_applied = client_peristent_keys.OuterClientShuffleKey << client_ephemeral_keys.OuterClientShuffleEphemeralKey
|
|
outer_client_shuffle_function_key_applied = client_peristent_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 = client_peristent_keys.OuterFunctionFunctionKey << mutual_ephemeral_keys.OuterFunctionFunctionEphemeralKey
|
|
outer_function_function_key_applied = outer_function_function_key_applied << input_outer_client_shuffle_key
|
|
|
|
function_key_applied = client_peristent_keys.FunctionKey << mutual_ephemeral_keys.FunctionEphemeralKey
|
|
function_key_applied = function_key_applied < outer_function_function_key_applied
|
|
|
|
reordered_shuffle_key_x = client_peristent_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) << client_peristent_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 = client_peristent_keys.OuterFunctionKey << mutual_ephemeral_keys.OuterFunctionEphemeralKey
|
|
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_peristent_keys.ClientKey < input_outer_function_key
|
|
operand3 = mutual_ephemeral_keys.MutualEphemeralKey < 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_peristent_keys: ClientPersistentKeys, client_ephemeral_keys: ClientEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys):
|
|
client_shuffle_ephemeral_key_b = ~client_ephemeral_keys.ClientShuffleMediumEphemeralKeyA
|
|
outer_server_shuffle_function_key_applied = client_peristent_keys.OuterServerShuffleFunctionMediumKey << mutual_ephemeral_keys.OuterServerShuffleFunctionMediumEphemeralKey
|
|
outer_client_shuffle_key_applied = client_peristent_keys.OuterClientShuffleMediumKey << client_ephemeral_keys.OuterClientShuffleMediumEphemeralKey
|
|
|
|
outer_client_suffle_function_key_applied = client_peristent_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 = client_peristent_keys.OuterFunctionFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionFunctionMediumEphemeralKey
|
|
outer_function_function_key_applied = outer_function_function_key_applied << input_outer_client_shuffle_key
|
|
|
|
function_key_applied = client_peristent_keys.FunctionMediumKey << mutual_ephemeral_keys.FunctionMediumEphemeralKey
|
|
function_key_applied = function_key_applied < outer_function_function_key_applied
|
|
|
|
reordered_shuffle_key_x = client_peristent_keys.ClientShuffleMediumKeyX < input_outer_server_shuffle_function_key
|
|
|
|
function_ephemeral_key_applied = function_key_applied << reordered_shuffle_key_x
|
|
|
|
client_shuffle_key_b = (~client_peristent_keys.ClientShuffleMediumKeyA) << client_peristent_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 = client_peristent_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_peristent_keys.ClientMediumKey < input_outer_function_key
|
|
operand3 = mutual_ephemeral_keys.MutualMediumEphemeralKey < input_outer_function_key
|
|
|
|
result = operand ^ (operand1 << inner_function_key_applied) ^ (operand2 << inner_function_key_applied) ^ (operand3 << inner_function_key_applied)
|
|
return result
|
|
|
|
|
|
def darc_phase3(alphabet: DarcKey, medium: DarcKey, client_peristent_keys: ClientPersistentKeys, client_ephemeral_keys: ClientEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys):
|
|
alphabet = transmit_alphabet(alphabet, client_peristent_keys, client_ephemeral_keys, mutual_ephemeral_keys)
|
|
medium = transmit_medium(medium, client_peristent_keys, client_ephemeral_keys, mutual_ephemeral_keys)
|
|
return alphabet, medium
|
|
|
|
def merge_message(alphabet: DarcKey, medium: DarcKey, client_peristent_keys: ClientPersistentKeys, client_ephemeral_keys: ClientEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys, input_sequence: list[int]):
|
|
outer_client_shuffle_alphabet_key_applied = client_peristent_keys.OuterClientShuffleKey << client_ephemeral_keys.OuterClientShuffleEphemeralKey
|
|
outer_client_shuffle_function_alphabet_key_applied = client_peristent_keys.OuterClientShuffleFunctionKey << client_ephemeral_keys.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_peristent_keys.OuterClientShuffleMediumKey << client_ephemeral_keys.OuterClientShuffleMediumEphemeralKey
|
|
outer_client_shuffle_function_medium_key_applied = client_peristent_keys.OuterClientShuffleFunctionMediumKey << client_ephemeral_keys.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 = client_peristent_keys.PositionFunctionMediumKey << mutual_ephemeral_keys.PositionFunctionMediumEphemeralKey
|
|
outer_position_function_key_applied = client_peristent_keys.OuterPositionFunctionMediumKey << mutual_ephemeral_keys.OuterPositionFunctionMediumEphemeralKey
|
|
outer_position_shuffle_key_applied = client_peristent_keys.OuterPositionShuffleMediumKey << mutual_ephemeral_keys.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 = client_peristent_keys.OuterPositionShuffleFunctionMediumKey << mutual_ephemeral_keys.OuterPositionShuffleFunctionMediumEphemeralKey
|
|
position_shuffle_key_applied = client_peristent_keys.PositionShuffleMediumKey << mutual_ephemeral_keys.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(darc_message: DarcKey, server_persistent_keys: ServerPersistentKeys, server_ephemeral_keys: ServerEphemeralKeys, mutual_ephemeral_keys: MutualEphemeralKeys):
|
|
outer_position_function_ephemeral_key_applied = server_persistent_keys.OuterPositionFunctionMediumKey << mutual_ephemeral_keys.OuterPositionFunctionMediumEphemeralKey
|
|
outer_position_shuffle_ephemeral_key_applied = server_persistent_keys.OuterPositionShuffleMediumKey << mutual_ephemeral_keys.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 = server_persistent_keys.OuterPositionShuffleFunctionMediumKey << mutual_ephemeral_keys.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 = server_persistent_keys.OuterFunctionFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionFunctionMediumEphemeralKey
|
|
outer_server_shuffle_function_ephemeral_key_applied = server_persistent_keys.OuterServerShuffleFunctionKey << mutual_ephemeral_keys.OuterServerShuffleFunctionEphemeralKey
|
|
|
|
outer_server_shuffle_function_medium_ephemeral_key_applied = server_persistent_keys.OuterServerShuffleFunctionMediumKey << mutual_ephemeral_keys.OuterServerShuffleFunctionMediumEphemeralKey
|
|
|
|
function_medium_ephemeral_key_applied = server_persistent_keys.FunctionMediumKey << mutual_ephemeral_keys.FunctionMediumEphemeralKey
|
|
|
|
client_shuffle_medium_key_x = server_persistent_keys.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 = server_persistent_keys.PositionShuffleMediumKey << mutual_ephemeral_keys.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 = server_persistent_keys.OuterFunctionMediumKey << mutual_ephemeral_keys.OuterFunctionMediumEphemeralKey
|
|
|
|
rx_data = darc_message < outer_position_shuffle_ephemeral_key_applied
|
|
|
|
inner_key = client_shuffle_medium_key_x
|
|
operand = rx_data
|
|
operand1 = server_persistent_keys.ServerMediumKey < outer_function_medium_ephemeral_key_applied
|
|
operand2 = server_ephemeral_keys.ServerMediumEphemeralKey < outer_function_medium_ephemeral_key_applied
|
|
operand3 = server_persistent_keys.MutualMediumKey < outer_function_medium_ephemeral_key_applied
|
|
operand4 = mutual_ephemeral_keys.MutualMediumEphemeralKey < outer_function_medium_ephemeral_key_applied
|
|
|
|
rx_data = operand ^ (operand1 << inner_key) ^ (operand2 << inner_key) ^ (operand3 << inner_key) ^ (operand4 << inner_key)
|
|
|
|
|
|
"""
|
|
|
|
FunctionTranslation PositionFunctionKey = ServerPersistentKeys.PositionFunctionMediumKey;
|
|
FunctionTranslation PositionFunctionEphemeralKey = MutualEphemeralKeys.PositionFunctionMediumEphemeralKey;
|
|
FunctionTranslation PositionFunctionEphemeralKeyApplied = new FunctionTranslation { Data = Transform.TransformationCompliment(Transform.PermuteInnerTransformation(PositionFunctionKey.Data, PositionFunctionEphemeralKey.Data)) };
|
|
|
|
|
|
#region Inner Shuffle
|
|
|
|
RxData = Transform.PermuteInnerTransformation(
|
|
RxData.Convert<int>(),
|
|
Transform.PermuteInnerTransformation(
|
|
Transform.TransformationCompliment(
|
|
PositionShuffleEphemeralKeyApplied.Data
|
|
),
|
|
Transform.PermuteOuterTransformation(
|
|
PositionFunctionEphemeralKeyApplied.Data.Convert<byte>(),
|
|
OuterPositionFunctionEphemeralKeyApplied.Data).Convert<int>())).Convert<byte>();
|
|
"""
|
|
position_function_ephemeral_key_applied = server_persistent_keys.PositionFunctionMediumKey << mutual_ephemeral_keys.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 = server_persistent_keys.ClientShuffleKeyX < outer_server_shuffle_function_ephemeral_key_applied
|
|
outer_function_function_ephemeral_key_applied = server_persistent_keys.OuterFunctionFunctionKey << mutual_ephemeral_keys.OuterFunctionFunctionEphemeralKey
|
|
|
|
function_ephemeral_key_applied = server_persistent_keys.FunctionKey << mutual_ephemeral_keys.FunctionEphemeralKey
|
|
function_ephemeral_key_applied = (function_ephemeral_key_applied < outer_function_function_ephemeral_key_applied) << client_shuffle_key_x
|
|
server_shuffle_ephemeral_key_applied = ~(server_persistent_keys.ServerShuffleKey << server_persistent_keys.ClientShuffleKeyX) << ~(server_ephemeral_keys.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_persistent_keys.OuterServerShuffleKey << server_ephemeral_keys.OuterServerShuffleEphemeralKey
|
|
alphabet = server_ephemeral_keys.Alphabet
|
|
alpha_prep = (alphabet < outer_server_shuffle_ephemeral_key_applied) << server_shuffle_ephemeral_key_applied
|
|
|
|
outer_function_ephemeral_key_applied = server_persistent_keys.OuterFunctionKey << mutual_ephemeral_keys.OuterFunctionEphemeralKey
|
|
|
|
inner_key = function_ephemeral_key_applied
|
|
operand = alpha_prep
|
|
operand1 = server_persistent_keys.ServerKey < outer_function_ephemeral_key_applied
|
|
operand2 = server_ephemeral_keys.ServerEphemeralKey < outer_function_ephemeral_key_applied
|
|
operand3 = server_persistent_keys.MutualKey < outer_function_ephemeral_key_applied
|
|
operand4 = mutual_ephemeral_keys.MutualEphemeralKey < 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_persistent_keys = ClientPersistentKeys(**client_persistent_keys)
|
|
client_ephemeral_keys = ClientEphemeralKeys(**client_ephemeral_keys)
|
|
server_persistent_keys = ServerPersistentKeys(**server_persistent_keys)
|
|
server_ephemeral_keys = ServerEphemeralKeys(**server_ephemeral_keys)
|
|
mutual_ephemeral_keys = MutualEphemeralKeys(**mutual_ephemeral_keys)
|
|
|
|
(phase1_alphabet, phase1_medium) = darc_phase1(server_persistent_keys, server_ephemeral_keys, mutual_ephemeral_keys)
|
|
(phase2_alphabet, phase2_medium) = darc_phase2(phase1_alphabet, phase1_medium, client_persistent_keys, client_ephemeral_keys, mutual_ephemeral_keys)
|
|
(phase3_alphabet, phase3_medium) = darc_phase3(phase2_alphabet, phase2_medium, client_persistent_keys, client_ephemeral_keys, mutual_ephemeral_keys)
|
|
# original_message = [0, 2, 4, 6, 0, 5, 9, 9, 1, 7]
|
|
|
|
original_message = [0, 2, 4, 6]
|
|
darc_message = merge_message(phase3_alphabet, phase3_medium, client_persistent_keys, client_ephemeral_keys, mutual_ephemeral_keys, original_message)
|
|
|
|
message = darc_phase_4(darc_message, server_persistent_keys, server_ephemeral_keys, mutual_ephemeral_keys)
|
|
print(original_message)
|
|
print(message)
|