Refactor AlphabetKet to SubstitutionKey

This commit is contained in:
2024-07-03 11:44:26 -05:00
parent 18991b3516
commit 8527caced0
8 changed files with 544 additions and 343 deletions

View File

@@ -1,13 +1,13 @@
from src.models import (
AlphabetKey, ClientKeys, MutualKeys, ClientPersistentDataKeys, ClientEphemeralDataKeys,
SubstitutionKey, ClientKeys, MutualKeys, ClientPersistentDataKeys, ClientEphemeralDataKeys,
MutualPersistentDataKeys, MutualEphemeralDataKeys, ClientPersistentMediumKeys, ClientEphemeralMediumKeys,
MutualPersistentMediumKeys, MutualEphemeralMediumKeys, DarcKey, OuterKey, Mask
)
def darc_phase2(
alphabet_phase1: AlphabetKey,
medium_phase1: AlphabetKey,
alphabet_phase1: SubstitutionKey,
medium_phase1: SubstitutionKey,
client_keys: ClientKeys,
mutual_keys: MutualKeys
):
@@ -29,7 +29,7 @@ def darc_phase2(
def receive_alphabet(
alphabet_phase1: AlphabetKey,
alphabet_phase1: SubstitutionKey,
client_persistent_data_keys: ClientPersistentDataKeys,
client_ephemeral_data_keys: ClientEphemeralDataKeys,
mutual_persistent_data_keys: MutualPersistentDataKeys,
@@ -57,7 +57,7 @@ def receive_alphabet(
def receive_medium(
medium_phase1: AlphabetKey,
medium_phase1: SubstitutionKey,
client_persistent_medium_keys: ClientPersistentMediumKeys,
client_ephemeral_medium_keys: ClientEphemeralMediumKeys,
mutual_persistent_medium_keys: MutualPersistentMediumKeys,
@@ -152,8 +152,8 @@ def transmit_medium(
def darc_phase3(
alphabet_phase2: AlphabetKey,
medium_phase2: AlphabetKey,
alphabet_phase2: SubstitutionKey,
medium_phase2: SubstitutionKey,
client_keys: ClientKeys,
mutual_keys: MutualKeys
):
@@ -175,8 +175,8 @@ def darc_phase3(
def merge_message(
alphabet_phase3: AlphabetKey,
medium_phase3: AlphabetKey,
alphabet_phase3: SubstitutionKey,
medium_phase3: SubstitutionKey,
client_keys: ClientKeys,
mutual_keys: MutualKeys,
message: list[int]

View File

@@ -1,4 +1,4 @@
from src.models import DarcKey, MutualKeys, OuterKey, AlphabetKey, \
from src.models import DarcKey, MutualKeys, OuterKey, SubstitutionKey, \
MutualPersistentDataKeys, MutualEphemeralDataKeys
@@ -16,7 +16,7 @@ def merge_message_no_client(alphabet: DarcKey, medium: DarcKey, mutual_keys: Mut
input_seq = padded_input_sequence
a_i = alphabet < input_seq
eof_arr = AlphabetKey.init_matrix(width, height, 255).matrix[0]
eof_arr = SubstitutionKey.init_matrix(width, height, 255).matrix[0]
if msg_len < height:
a_i.matrix[msg_len] = eof_arr
@@ -36,7 +36,7 @@ def merge_message_no_client(alphabet: DarcKey, medium: DarcKey, mutual_keys: Mut
return message
def darc_phase_2_3(alphabet_phase1: AlphabetKey, medium_phase1: AlphabetKey, mutual_keys: MutualKeys) -> AlphabetKey:
def darc_phase_2_3(alphabet_phase1: SubstitutionKey, medium_phase1: SubstitutionKey, mutual_keys: MutualKeys) -> SubstitutionKey:
phase3_alphabet = transceive_alphabet(alphabet_phase1, mutual_keys.persistent.data, mutual_keys.ephemeral.data)
phase3_medium = transceive_medium(medium_phase1, mutual_keys.persistent.medium, mutual_keys.ephemeral.medium)
return (phase3_alphabet, phase3_medium)

View File

@@ -6,7 +6,7 @@ from pydantic import BaseModel
class DarcKeyType(str, Enum):
outer_shuffle = "outer_shuffle"
inner_shuffle = "inner_shuffle"
alphabet = "alphabet"
substitution = "substitution"
other = "other"
@@ -61,8 +61,8 @@ class DarcKey(BaseModel):
def __xor__(self, other):
assert len(self.matrix) == len(other.matrix)
assert len(self.matrix[0]) == len(other.matrix[0])
assert self.key_type == DarcKeyType.alphabet
assert other.key_type == DarcKeyType.alphabet
assert self.key_type == DarcKeyType.substitution
assert other.key_type == DarcKeyType.substitution
output = []
for i, el in enumerate(self.matrix):
row = []
@@ -129,21 +129,21 @@ class InnerKey(DarcKey):
)
class AlphabetKey(DarcKey):
key_type: DarcKeyType = DarcKeyType.alphabet
class SubstitutionKey(DarcKey):
key_type: DarcKeyType = DarcKeyType.substitution
@classmethod
def init_matrix(cls, width: int, height: int, max_value: int):
def init_matrix(cls, width: int, height: int, max_value: int = 255):
""" originally buildScramble """
matrix = [cls._random_mask(width, max_value) for _ in range(height)]
return AlphabetKey(
return SubstitutionKey(
matrix=matrix,
max_value=max_value
)
class Mask(DarcKey):
key_type: DarcKeyType = DarcKeyType.alphabet
key_type: DarcKeyType = DarcKeyType.substitution
@classmethod
def init_matrix(cls, width: int, height: int, col_mask: int):
@@ -162,7 +162,7 @@ class Mask(DarcKey):
class ClientEphemeralDataKeys(BaseModel):
outer_key_1: OuterKey
outer_key_2: OuterKey
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
inner_key_1: InnerKey
@classmethod
@@ -170,7 +170,7 @@ class ClientEphemeralDataKeys(BaseModel):
return ClientEphemeralDataKeys(
outer_key_1=OuterKey.init_matrix(height),
outer_key_2=OuterKey.init_matrix(height),
alpha_key=AlphabetKey.init_matrix(width, height, 255),
alpha_key=SubstitutionKey.init_matrix(width, height, 255),
inner_key_1=InnerKey.init_matrix(width, height),
)
@@ -179,7 +179,7 @@ class ClientEphemeralMediumKeys(BaseModel):
outer_key_1: OuterKey
outer_key_2: OuterKey
inner_key_1: InnerKey
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
@classmethod
def random_init(cls, height: int, width: int):
@@ -187,12 +187,12 @@ class ClientEphemeralMediumKeys(BaseModel):
outer_key_1=OuterKey.init_matrix(height),
outer_key_2=OuterKey.init_matrix(height),
inner_key_1=InnerKey.init_matrix(width, height),
alpha_key=AlphabetKey.init_matrix(width, height, 255)
alpha_key=SubstitutionKey.init_matrix(width, height, 255)
)
class ClientPersistentDataKeys(BaseModel):
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
inner_key_1: InnerKey
outer_key_1: OuterKey
outer_key_2: OuterKey
@@ -200,7 +200,7 @@ class ClientPersistentDataKeys(BaseModel):
@classmethod
def random_init(cls, height: int, width: int):
return ClientPersistentDataKeys(
alpha_key=AlphabetKey.init_matrix(width, height, 255),
alpha_key=SubstitutionKey.init_matrix(width, height, 255),
inner_key_1=InnerKey.init_matrix(width, height),
outer_key_1=OuterKey.init_matrix(height),
outer_key_2=OuterKey.init_matrix(height),
@@ -211,7 +211,7 @@ class ClientPersistentMediumKeys(BaseModel):
outer_key_1: OuterKey
outer_key_2: OuterKey
inner_key_1: InnerKey
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
@classmethod
def random_init(cls, height: int, width: int):
@@ -219,60 +219,60 @@ class ClientPersistentMediumKeys(BaseModel):
outer_key_1=OuterKey.init_matrix(height),
outer_key_2=OuterKey.init_matrix(height),
inner_key_1=InnerKey.init_matrix(width, height),
alpha_key=AlphabetKey.init_matrix(width, height, 255)
alpha_key=SubstitutionKey.init_matrix(width, height, 255)
)
class ServerEphemeralDataKeys(BaseModel):
outer_key_1: OuterKey
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
inner_key_1: InnerKey
@classmethod
def random_init(cls, height: int, width: int):
return ServerEphemeralDataKeys(
outer_key_1=OuterKey.init_matrix(height),
alpha_key=AlphabetKey.init_matrix(width, height, 255),
alpha_key=SubstitutionKey.init_matrix(width, height, 255),
inner_key_1=InnerKey.init_matrix(width, height),
)
class ServerEphemeralMediumKeys(BaseModel):
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
@classmethod
def random_init(cls, height: int, width: int):
return ServerEphemeralMediumKeys(
alpha_key=AlphabetKey.init_matrix(width, height, 255)
alpha_key=SubstitutionKey.init_matrix(width, height, 255)
)
class ServerPersistentDataKeys(BaseModel):
outer_key_1: OuterKey
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
inner_key_1: InnerKey
@classmethod
def random_init(cls, height: int, width: int):
return ServerPersistentDataKeys(
outer_key_1=OuterKey.init_matrix(height),
alpha_key=AlphabetKey.init_matrix(width, height, 255),
alpha_key=SubstitutionKey.init_matrix(width, height, 255),
inner_key_1=InnerKey.init_matrix(width, height),
)
class ServerPersistentMediumKeys(BaseModel):
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
@classmethod
def random_init(cls, height: int, width: int):
return ServerPersistentMediumKeys(
alpha_key=AlphabetKey.init_matrix(width, height, 255)
alpha_key=SubstitutionKey.init_matrix(width, height, 255)
)
class MutualEphemeralDataKeys(BaseModel):
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
inner_key_1: InnerKey
outer_key_1: OuterKey
outer_key_2: OuterKey
@@ -281,7 +281,7 @@ class MutualEphemeralDataKeys(BaseModel):
@classmethod
def random_init(cls, height: int, width: int):
return MutualEphemeralDataKeys(
alpha_key=AlphabetKey.init_matrix(width, height, 255),
alpha_key=SubstitutionKey.init_matrix(width, height, 255),
inner_key_1=InnerKey.init_matrix(width, height),
outer_key_1=OuterKey.init_matrix(height),
outer_key_2=OuterKey.init_matrix(height),
@@ -290,7 +290,7 @@ class MutualEphemeralDataKeys(BaseModel):
class MutualEphemeralMediumKeys(BaseModel):
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
outer_key_1: OuterKey
outer_key_2: OuterKey
@@ -306,7 +306,7 @@ class MutualEphemeralMediumKeys(BaseModel):
@classmethod
def random_init(cls, height: int, width: int):
return MutualEphemeralMediumKeys(
alpha_key=AlphabetKey.init_matrix(width, height, 255),
alpha_key=SubstitutionKey.init_matrix(width, height, 255),
outer_key_1=OuterKey.init_matrix(height),
outer_key_2=OuterKey.init_matrix(height),
outer_key_3=OuterKey.init_matrix(height),
@@ -323,7 +323,7 @@ class MutualPersistentDataKeys(BaseModel):
outer_key_1: OuterKey
outer_key_2: OuterKey
outer_key_3: OuterKey
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
inner_key_1: InnerKey
inner_key_2: InnerKey
@@ -333,14 +333,14 @@ class MutualPersistentDataKeys(BaseModel):
outer_key_1=OuterKey.init_matrix(height),
outer_key_2=OuterKey.init_matrix(height),
outer_key_3=OuterKey.init_matrix(height),
alpha_key=AlphabetKey.init_matrix(width, height, 255),
alpha_key=SubstitutionKey.init_matrix(width, height, 255),
inner_key_1=InnerKey.init_matrix(width, height),
inner_key_2=InnerKey.init_matrix(width, height),
)
class MutualPersistentMediumKeys(BaseModel):
alpha_key: AlphabetKey
alpha_key: SubstitutionKey
outer_key_1: OuterKey
outer_key_2: OuterKey
@@ -357,7 +357,7 @@ class MutualPersistentMediumKeys(BaseModel):
@classmethod
def random_init(cls, height: int, width: int):
return MutualPersistentMediumKeys(
alpha_key=AlphabetKey.init_matrix(width, height, 255),
alpha_key=SubstitutionKey.init_matrix(width, height, 255),
outer_key_1=OuterKey.init_matrix(height),
outer_key_2=OuterKey.init_matrix(height),
outer_key_3=OuterKey.init_matrix(height),

View File

@@ -1,11 +1,11 @@
from src.models import (
AlphabetKey, ServerPersistentDataKeys, ServerEphemeralDataKeys, MutualPersistentDataKeys,
SubstitutionKey, ServerPersistentDataKeys, ServerEphemeralDataKeys, MutualPersistentDataKeys,
MutualEphemeralDataKeys, ServerKeys, MutualKeys, ServerPersistentMediumKeys, ServerEphemeralMediumKeys,
MutualPersistentMediumKeys, MutualEphemeralMediumKeys
)
def darc_phase1(alphabet: AlphabetKey, medium: AlphabetKey, server_keys: ServerKeys, mutual_keys: MutualKeys):
def darc_phase1(alphabet: SubstitutionKey, medium: SubstitutionKey, server_keys: ServerKeys, mutual_keys: MutualKeys):
alphabet_phase1 = translate_data(
alphabet,
server_keys.persistent.data,
@@ -24,7 +24,7 @@ def darc_phase1(alphabet: AlphabetKey, medium: AlphabetKey, server_keys: ServerK
def translate_data(
alphabet: AlphabetKey,
alphabet: SubstitutionKey,
server_persistent_data_keys: ServerPersistentDataKeys,
server_ephemeral_data_keys: ServerEphemeralDataKeys,
mutual_persistent_data_keys: MutualPersistentDataKeys,
@@ -49,7 +49,7 @@ def translate_data(
def translate_medium(
medium: AlphabetKey,
medium: SubstitutionKey,
server_persistent_medium_keys: ServerPersistentMediumKeys,
server_ephemeral_medium_keys: ServerEphemeralMediumKeys,
mutual_persistent_medium_keys: MutualPersistentMediumKeys,
@@ -65,7 +65,7 @@ def translate_medium(
return medium_phase1
def darc_phase_4(alphabet: AlphabetKey, darc_message: AlphabetKey, server_keys: ServerKeys, mutual_keys: MutualKeys):
def darc_phase_4(alphabet: SubstitutionKey, darc_message: SubstitutionKey, server_keys: ServerKeys, mutual_keys: MutualKeys):
medium_unwrapped = phase4_unwrap_medium(
darc_message,
server_keys.persistent.medium,
@@ -84,7 +84,7 @@ def darc_phase_4(alphabet: AlphabetKey, darc_message: AlphabetKey, server_keys:
def phase4_translate_alphabet(
alphabet: AlphabetKey,
alphabet: SubstitutionKey,
server_persistent_data_keys: ServerPersistentDataKeys,
server_ephemeral_data_keys: ServerEphemeralDataKeys,
mutual_persistent_data_keys: MutualPersistentDataKeys,
@@ -113,7 +113,7 @@ def phase4_translate_alphabet(
def phase4_unwrap_medium(
darc_message: AlphabetKey,
darc_message: SubstitutionKey,
server_persistent_medium_keys: ServerPersistentMediumKeys,
server_ephemeral_medium_keys: ServerEphemeralMediumKeys,
mutual_persistent_medium_keys: MutualPersistentMediumKeys,
@@ -144,7 +144,7 @@ def phase4_unwrap_medium(
return unwrapped_medium
def resolve_message(translated_alphabet: AlphabetKey, unwrapped_medium: AlphabetKey) -> list[int]:
def resolve_message(translated_alphabet: SubstitutionKey, unwrapped_medium: SubstitutionKey) -> list[int]:
alphabet_map = {str(key): idx for idx, key in enumerate(translated_alphabet.matrix)}
encoded_message = [str(alpha) for alpha in unwrapped_medium.matrix]