refactor substitution and server_darc.py

This commit is contained in:
2024-06-27 15:14:08 -05:00
parent a918de10c1
commit 3ae5445efe
3 changed files with 116 additions and 81 deletions

View File

@@ -44,18 +44,15 @@ def receive_alphabet(
cdo1 = client_persistent_data_keys.outer_key_1 << client_ephemeral_data_keys.outer_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 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
substitution = ( mpda = mutual_persistent_data_keys.alpha_key
client_ephemeral_data_keys.alpha_key ^
client_persistent_data_keys.alpha_key ^
mutual_persistent_data_keys.alpha_key
)
alphabet_phase2 = (((( alphabet_phase2 = ((((
alphabet_phase1 ^ alphabet_phase1 ^
((substitution < mdo1) << (mdi1 < mdo2)) (((ceda ^ cpda ^ mpda) < mdo1) << (mdi1 < mdo2))
) < ~mdo3)) << cdi1) < (mdo3 << cdo1_cdo2) ) < ~mdo3)) << cdi1) < (mdo3 << cdo1 << cdo2)
return alphabet_phase2 return alphabet_phase2
@@ -75,16 +72,14 @@ def receive_medium(
cmo1 = client_persistent_medium_keys.outer_key_1 << client_ephemeral_medium_keys.outer_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 cmo2 = client_persistent_medium_keys.outer_key_2 << client_ephemeral_medium_keys.outer_key_2
substitution = ( cema = client_ephemeral_medium_keys.alpha_key
client_ephemeral_medium_keys.alpha_key ^ cpma = client_persistent_medium_keys.alpha_key
client_persistent_medium_keys.alpha_key ^ mpma = mutual_persistent_medium_keys.alpha_key
mutual_persistent_medium_keys.alpha_key
)
medium_phase2 = ( medium_phase2 = (
( (
medium_phase1 ^ medium_phase1 ^
((substitution < mmo1) << (mmi1 < mmo2)) (((cema ^ cpma ^ mpma) < mmo1) << (mmi1 < mmo2))
) << (cmi1 < mmo3) ) << (cmi1 < mmo3)
) < (cmo1 << cmo2) ) < (cmo1 << cmo2)
@@ -110,15 +105,13 @@ def transmit_alphabet(
cdo1_cdo2 = cdo1 << cdo2 cdo1_cdo2 = cdo1 << cdo2
substitution = ( ceda = client_ephemeral_data_keys.alpha_key
client_ephemeral_data_keys.alpha_key ^ cpda = client_persistent_data_keys.alpha_key
client_persistent_data_keys.alpha_key ^ meda = mutual_ephemeral_data_keys.alpha_key
mutual_ephemeral_data_keys.alpha_key
)
alphabet_phase3 = ( alphabet_phase3 = (
(alphabet_phase2 << ((~cdi1 << mdpi2) < (mdo3 << cdo1_cdo2))) ^ (alphabet_phase2 << ((~cdi1 << mdpi2) < (mdo3 << cdo1_cdo2))) ^
(((substitution < mdo1) << ((mdi1 < mdo2) << (mdpi2 < mdo3))) < cdo1_cdo2) ((((ceda ^ cpda ^ meda) < mdo1) << ((mdi1 < mdo2) << (mdpi2 < mdo3))) < cdo1_cdo2)
) )
return alphabet_phase3 return alphabet_phase3
@@ -142,15 +135,13 @@ def transmit_medium(
cmo1_cmo2 = cmo1 << cmo2 cmo1_cmo2 = cmo1 << cmo2
substitution = ( cpma = client_persistent_medium_keys.alpha_key
client_persistent_medium_keys.alpha_key ^ cema = client_ephemeral_medium_keys.alpha_key
client_ephemeral_medium_keys.alpha_key ^ mema = mutual_ephemeral_medium_keys.alpha_key
mutual_ephemeral_medium_keys.alpha_key
)
medium_phase3 = ( medium_phase3 = (
((medium_phase2 < ~cmo1_cmo2) << ((~cmi1 << mmpi1) < mmo3)) ^ ((medium_phase2 < ~cmo1_cmo2) << ((~cmi1 << mmpi1) < mmo3)) ^
((substitution < mmo1) << ((mmi1 < mmo2) << (mmpi1 < mmo3))) (((cpma ^ cema ^ mema) < mmo1) << ((mmi1 < mmo2) << (mmpi1 < mmo3)))
) < cmo1_cmo2 ) < cmo1_cmo2
return medium_phase3 return medium_phase3

View File

@@ -5,9 +5,21 @@ from src.models import (
) )
def darc_phase1(alphabet: AlphabetKey, server_keys: ServerKeys, mutual_keys: MutualKeys): def darc_phase1(alphabet: AlphabetKey, medium: 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) alphabet_phase1 = translate_data(
medium_phase1 = translate_medium(server_keys.persistent.medium, server_keys.ephemeral.medium, mutual_keys.persistent.medium, mutual_keys.ephemeral.medium) alphabet,
server_keys.persistent.data,
server_keys.ephemeral.data,
mutual_keys.persistent.data,
mutual_keys.ephemeral.data
)
medium_phase1 = translate_medium(
medium,
server_keys.persistent.medium,
server_keys.ephemeral.medium,
mutual_keys.persistent.medium,
mutual_keys.ephemeral.medium
)
return alphabet_phase1, medium_phase1 return alphabet_phase1, medium_phase1
@@ -26,80 +38,109 @@ def translate_data(
mdo2 = mutual_persistent_data_keys.outer_key_2 << mutual_ephemeral_data_keys.outer_key_2 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 mdo3 = mutual_persistent_data_keys.outer_key_3 << mutual_ephemeral_data_keys.outer_key_3
substitution = server_persistent_data_keys.alpha_key ^ server_ephemeral_data_keys.alpha_key spda = server_persistent_data_keys.alpha_key
seda = server_ephemeral_data_keys.alpha_key
alpha_phase1 = ( alpha_phase1 = (
((alphabet < sdo1) << (sdi1 < mdo3)) ^ ((alphabet < sdo1) << (sdi1 < mdo3)) ^
((substitution < mdo1) << (mdi1 < mdo2)) (((spda ^ seda) < mdo1) << (mdi1 < mdo2))
) )
return alpha_phase1 return alpha_phase1
def translate_medium(server_persistent_keys: ServerPersistentMediumKeys, server_ephemeral_keys: ServerEphemeralMediumKeys, mutual_persistent_keys: MutualPersistentMediumKeys, mutual_ephemeral_keys: MutualEphemeralMediumKeys): def translate_medium(
mutual_inner_key = mutual_persistent_keys.inner_key_1 << mutual_ephemeral_keys.inner_key_1 medium: AlphabetKey,
mutual_outer_key_1 = mutual_persistent_keys.outer_key_1 << mutual_ephemeral_keys.outer_key_1 server_persistent_medium_keys: ServerPersistentMediumKeys,
mutual_outer_key_2 = mutual_persistent_keys.outer_key_2 << mutual_ephemeral_keys.outer_key_2 server_ephemeral_medium_keys: ServerEphemeralMediumKeys,
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
spma = server_persistent_medium_keys.alpha_key
sema = server_ephemeral_medium_keys.alpha_key
height = len(mutual_inner_key.matrix) operand = medium ^ (((spma ^ sema) < mmo1) << (mmi1 < mmo2))
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
operand2 = server_ephemeral_keys.alpha_key < mutual_outer_key_1
mutual_inner_key = mutual_inner_key < mutual_outer_key_2
operand = medium ^ (operand1 << mutual_inner_key) ^ (operand2 << mutual_inner_key)
return operand return operand
def darc_phase_4(alphabet: AlphabetKey, darc_message: AlphabetKey, server_keys: ServerKeys, mutual_keys: MutualKeys): 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) medium_unwrapped = phase4_unwrap_medium(
translated_alpha = phase4_translate_alphabet(alphabet, server_keys.persistent.data, server_keys.ephemeral.data, mutual_keys.persistent.data, mutual_keys.ephemeral.data) 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 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): def phase4_translate_alphabet(
mdo3 = mutual_persistent_keys.outer_key_3 << mutual_ephemeral_keys.outer_key_3 alphabet: AlphabetKey,
mpi2_mdo3 = mutual_persistent_keys.inner_key_2 < mdo3 server_persistent_data_keys: ServerPersistentDataKeys,
mdo2 = mutual_persistent_keys.outer_key_2 << mutual_ephemeral_keys.outer_key_2 server_ephemeral_data_keys: ServerEphemeralDataKeys,
mutual_persistent_data_keys: MutualPersistentDataKeys,
mutual_ephemeral_data_keys: MutualEphemeralDataKeys
):
mdi1 = mutual_persistent_keys.inner_key_1 << mutual_ephemeral_keys.inner_key_1 mdi1 = mutual_persistent_data_keys.inner_key_1 << mutual_ephemeral_data_keys.inner_key_1
mdi1_mdo2_mpi2_mdo3 = (mdi1 < mdo2) << mpi2_mdo3 mdo1 = mutual_persistent_data_keys.outer_key_1 << mutual_ephemeral_data_keys.outer_key_1
sdi1_mpdi2__mdo3 = (server_persistent_keys.inner_key_1 << server_ephemeral_keys.inner_key_1 << mutual_persistent_keys.inner_key_2) < mdo3 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
sdo1 = server_persistent_keys.outer_key_1 << server_ephemeral_keys.outer_key_1 sdi1 = server_persistent_data_keys.inner_key_1 << server_ephemeral_data_keys.inner_key_1
mdo1 = mutual_persistent_keys.outer_key_1 << mutual_ephemeral_keys.outer_key_1 sdo1 = server_persistent_data_keys.outer_key_1 << server_ephemeral_data_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 spda = server_persistent_data_keys.alpha_key
translated_alpha = ((alphabet < sdo1) << sdi1_mpdi2__mdo3) ^ (sub_mdo1 << mdi1_mdo2_mpi2_mdo3) seda = server_ephemeral_data_keys.alpha_key
mpda = mutual_persistent_data_keys.alpha_key
meda = mutual_ephemeral_data_keys.alpha_key
translated_alpha = (
((alphabet < sdo1) << ((sdi1 << mpdi2) < mdo3)) ^
(((spda ^ seda ^ mpda ^ meda) < mdo1) << ((mdi1 < mdo2) << (mpdi2 < mdo3)))
)
return translated_alpha 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): def phase4_unwrap_medium(
mmo6 = mutual_persistent_keys.outer_key_6 << mutual_ephemeral_keys.outer_key_6 darc_message: AlphabetKey,
mmo4 = mutual_persistent_keys.outer_key_4 << mutual_ephemeral_keys.outer_key_4 server_persistent_medium_keys: ServerPersistentMediumKeys,
server_ephemeral_medium_keys: ServerEphemeralMediumKeys,
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
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
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
mmo4 = mutual_persistent_medium_keys.outer_key_4 << mutual_ephemeral_medium_keys.outer_key_4
mmo5 = mutual_persistent_medium_keys.outer_key_5 << mutual_ephemeral_medium_keys.outer_key_5
mmo6 = mutual_persistent_medium_keys.outer_key_6 << mutual_ephemeral_medium_keys.outer_key_6
nmmo6_nmmo4 = ~(mmo4 << mmo6) nmmo6_nmmo4 = ~(mmo4 << mmo6)
mmo5 = mutual_persistent_keys.outer_key_5 << mutual_ephemeral_keys.outer_key_5 spma = server_persistent_medium_keys.alpha_key
mmo5_nmmo6_nmmo4 = mmo5 << nmmo6_nmmo4 sema = server_ephemeral_medium_keys.alpha_key
mpma = mutual_persistent_medium_keys.alpha_key
mema = mutual_ephemeral_medium_keys.alpha_key
mmo2 = mutual_persistent_keys.outer_key_2 << mutual_ephemeral_keys.outer_key_2 medium_unwrapped = (
((darc_message < ~mmo4) << ~(mmi4 < (mmo5 << nmmo6_nmmo4))) ^
mmo3 = mutual_persistent_keys.outer_key_3 << mutual_ephemeral_keys.outer_key_3 (((spma ^ sema ^ mpma ^ mema) < mmo1) << ((mmi1 < mmo2) << (mpmi2 < mmo3)))
) << (~mmi3 < nmmo6_nmmo4)
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 return medium_unwrapped

View File

@@ -12,12 +12,13 @@ import pytest
) )
def test_darc(height, width, message_len): def test_darc(height, width, message_len):
alphabet = AlphabetKey.init_matrix(width, height, 255) alphabet = AlphabetKey.init_matrix(width, height, 255)
medium = AlphabetKey(matrix=[[0 for _ in range(width)] for _ in range(height)])
server_keys, mutual_keys, client_keys = generate_keys(height, width) server_keys, mutual_keys, client_keys = generate_keys(height, width)
original_message = OuterKey.init_matrix(height).matrix[0] original_message = OuterKey.init_matrix(height).matrix[0]
original_message = original_message[:message_len] original_message = original_message[:message_len]
(alphabet_phase1, medium_phase1) = darc_phase1(alphabet, server_keys, mutual_keys) (alphabet_phase1, medium_phase1) = darc_phase1(alphabet, medium, server_keys, mutual_keys)
(alphabet_phase2, medium_phase2) = darc_phase2(alphabet_phase1, medium_phase1, client_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) (phase3_alphabet, phase3_medium) = darc_phase3(alphabet_phase2, medium_phase2, client_keys, mutual_keys)
@@ -35,11 +36,13 @@ def test_darc(height, width, message_len):
) )
def test_darc_no_client(height, width, message_len): def test_darc_no_client(height, width, message_len):
alphabet = AlphabetKey.init_matrix(width, height, 255) alphabet = AlphabetKey.init_matrix(width, height, 255)
medium = AlphabetKey(matrix=[[0 for _ in range(width)] for _ in range(height)])
server_keys, mutual_keys, client_keys = generate_keys(height, width) server_keys, mutual_keys, client_keys = generate_keys(height, width)
original_message = OuterKey.init_matrix(height).matrix[0] original_message = OuterKey.init_matrix(height).matrix[0]
original_message = original_message[:message_len] original_message = original_message[:message_len]
(alphabet_phase1, medium_phase1) = darc_phase1(alphabet, server_keys, mutual_keys) (alphabet_phase1, medium_phase1) = darc_phase1(alphabet, medium, server_keys, mutual_keys)
(phase3_alphabet, phase3_medium) = darc_phase_2_3(alphabet_phase1, medium_phase1, 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) darc_message = merge_message_no_client(phase3_alphabet, phase3_medium, mutual_keys, original_message)