initial commit

This commit is contained in:
2024-05-17 14:30:26 -05:00
commit 63f561e1fa
22 changed files with 15642 additions and 0 deletions

361
src/models.py Normal file
View File

@@ -0,0 +1,361 @@
import secrets
from enum import Enum
from pydantic import BaseModel
class DarcKeyTypes(str, Enum):
outer_shuffle = "outer_shuffle"
inner_shuffle = "inner_shuffle"
alphabet = "alphabet"
other = "other"
class DarcKey(BaseModel):
matrix: list[list[int]]
key_type: DarcKeyTypes
@classmethod
def _random_shuffle(cls, array: list[int]) -> list[int]:
for i in range(len(array) - 1, 0, -1):
j = cls._random_number(0, i)
array[i], array[j] = array[j], array[i]
return array
@classmethod
def _random_mask(cls, array_len: int, max_val: int) -> list[int]:
return [cls._random_number(0, max_val) for _ in range(array_len)]
@staticmethod
def _random_number(min_val: int, max_val: int) -> int:
""" originally secure_rand """
return min_val + secrets.randbelow(max_val - min_val + 1)
def __lshift__(self, other):
assert len(self.matrix) == len(other.matrix)
assert len(self.matrix[0]) == len(other.matrix[0])
assert other.key_type == DarcKeyTypes.inner_shuffle or other.key_type == DarcKeyTypes.outer_shuffle
output = []
for i, el in enumerate(self.matrix):
row = []
for j, el2 in enumerate(el):
other_el = other.matrix[i][j]
row.append(self.matrix[i][other_el])
output.append(row)
return DarcKey(
matrix=output,
key_type=self.key_type
)
def __lt__(self, other):
assert len(other.matrix) == 1
assert len(self.matrix) == len(other.matrix[0])
assert other.key_type == DarcKeyTypes.outer_shuffle
output = []
for i, _ in enumerate(self.matrix):
output.append(self.matrix[other.matrix[0][i]])
return DarcKey(
matrix=output,
key_type=self.key_type
)
def __xor__(self, other):
assert len(self.matrix) == len(other.matrix)
assert len(self.matrix[0]) == len(other.matrix[0])
assert self.key_type == DarcKeyTypes.alphabet
assert other.key_type == DarcKeyTypes.alphabet
output = []
for i, el in enumerate(self.matrix):
row = []
for j, el2 in enumerate(el):
row.append(el2 ^ other.matrix[i][j])
output.append(row)
return DarcKey(
matrix=output,
key_type=self.key_type
)
def __invert__(self):
assert self.key_type == DarcKeyTypes.inner_shuffle or self.key_type == DarcKeyTypes.outer_shuffle
output = []
for i, el in enumerate(self.matrix):
row = [(j, el2) for j, el2 in enumerate(el)]
row.sort(key=lambda x: x[1])
output.append([el2[0] for el2 in row])
return DarcKey(
matrix=output,
key_type=self.key_type
)
def column_substitution(self, column: int, substitution: list[int]):
assert len(substitution) == len(self.matrix)
assert len(self.matrix[0]) > column >= 0
output = []
for i, el in enumerate(self.matrix):
row = []
for j, el2 in enumerate(el):
if j == column:
row.append(substitution[i])
else:
row.append(el2)
output.append(row)
return DarcKey(
matrix=output,
key_type=self.key_type
)
class OuterShuffleKey(DarcKey):
key_type = DarcKeyTypes.outer_shuffle
@classmethod
def init_matrix(cls, row_length: int):
""" originally buildRandom """
matrix = [cls._random_shuffle(list(range(row_length)))]
return OuterShuffleKey(
matrix=matrix,
)
class InnerShuffleKey(DarcKey):
key_type = DarcKeyTypes.inner_shuffle
@classmethod
def init_matrix(cls, row_length: int, column_length: int):
""" originally buildRandom """
matrix = [cls._random_shuffle(list(range(row_length))) for _ in range(column_length)]
return InnerShuffleKey(
matrix=matrix,
)
class AlphabetKey(DarcKey):
key_type = DarcKeyTypes.alphabet
max_value: int = 255
@classmethod
def init_matrix(cls, row_length: int, column_length: int, max_value: int):
""" originally buildScramble """
matrix = [cls._random_mask(row_length, max_value) for _ in range(column_length)]
return AlphabetKey(
matrix=matrix,
max_value=max_value
)
class EphemeralKeys(BaseModel):
serverEphemeralKey: AlphabetKey
sharedEphemeralKey: AlphabetKey
functionEphemeralKey: InnerShuffleKey
outerFunctionEphemeralKey: OuterShuffleKey
outerFunctionFunctionEphemeralKey: OuterShuffleKey
outerServerShuffleFunctionEphemeralKey: OuterShuffleKey
serverShuffleEphemeralKey: InnerShuffleKey
outerServerShuffleEphemeralKey: OuterShuffleKey
serverMediumEphemeralKey: AlphabetKey
sharedMediumEphemeralKey: AlphabetKey
functionMediumEphemeralKey: InnerShuffleKey
positionFunctionMediumEphemeralKey: InnerShuffleKey
outerFunctionMediumEphemeralKey: OuterShuffleKey
outerFunctionFunctionMediumEphemeralKey: OuterShuffleKey
outerPositionFunctionMediumEphemeralKey: OuterShuffleKey
outerServerShuffleFunctionMediumEphemeralKey: OuterShuffleKey
outerServerShuffleMediumEphemeralKey: OuterShuffleKey
outerPositionShuffleMediumEphemeralKey: OuterShuffleKey
interfaceConfig: AlphabetKey
outerClientShuffleKey: OuterShuffleKey
outerClientShuffleMediumKey: OuterShuffleKey
outerClientShuffleFunctionKey: OuterShuffleKey
outerClientShuffleFunctionMediumKey: OuterShuffleKey
clientEphemeral: AlphabetKey
clientEphemeralMedium: AlphabetKey
clientShuffleEphemeralA: InnerShuffleKey
clientShuffleEphemeralMediumA: InnerShuffleKey
class PersistentKeys(BaseModel):
serverKey: AlphabetKey
functionKey: InnerShuffleKey
serverShuffleKey: InnerShuffleKey
outerFunctionKey: OuterShuffleKey
outerFunctionFunctionKey: OuterShuffleKey
outerServerShuffleKey: OuterShuffleKey
outerServerShuffleFunctionKey: OuterShuffleKey
clientKey: AlphabetKey
sharedKey: AlphabetKey
clientShuffleKeyX: InnerShuffleKey
clientShuffleKeyA: InnerShuffleKey
functionMediumKey: InnerShuffleKey
clientShuffleMediumKeyX: InnerShuffleKey
inputMediumData: AlphabetKey
serverMediumKey: OuterShuffleKey
outerFunctionMediumKey: OuterShuffleKey
outerFunctionFunctionMediumKey: OuterShuffleKey
outerServerShuffleMediumKey: OuterShuffleKey
outerServerShuffleFunctionMediumKey: OuterShuffleKey
sharedMediumKey: AlphabetKey
outerPositionFunctionMediumKey: OuterShuffleKey
outerPositionShuffleMediumKey: OuterShuffleKey
clientMediumKey: AlphabetKey
positionFunctionMediumKey: InnerShuffleKey
clientShuffleMediumKeyA: InnerShuffleKey
class Session(BaseModel):
guid: str
interfaceConfig: AlphabetKey
serverEphemeralKey: AlphabetKey
functionEphemeralKey: InnerShuffleKey
serverShuffleEphemeralKey: InnerShuffleKey
outerServerShuffleEphemeralKey: OuterShuffleKey
outerFunctionEphemeralKey: OuterShuffleKey
outerFunctionFunctionEphemeralKey: OuterShuffleKey
outerServerShuffleFunctionEphemeralKey: OuterShuffleKey
serverMediumEphemeralKey: AlphabetKey
functionMediumEphemeralKey: InnerShuffleKey
outerServerShuffleMediumEphemeralKey: OuterShuffleKey
outerFunctionMediumEphemeralKey: OuterShuffleKey
outerFunctionFunctionMediumEphemeralKey: OuterShuffleKey
outerServerShuffleFunctionMediumEphemeralKey: OuterShuffleKey
positionFunctionMediumEphemeralKey: InnerShuffleKey
outerPositionFunctionMediumEphemeralKey: OuterShuffleKey
sharedEphemeralKey: AlphabetKey
sharedMediumEphemeralKey: AlphabetKey
outerPositionShuffleMediumEphemeralKey: OuterShuffleKey
class TxData(BaseModel):
data: AlphabetKey
functionEphemeralKey: InnerShuffleKey
outerServerShuffleEphemeralKey: OuterShuffleKey
outerFunctionFunctionEphemeralKey: OuterShuffleKey
outerFunctionEphemeralKey: OuterShuffleKey
outerServerShuffleFunctionEphemeralKey: OuterShuffleKey
sharedEphemeralKey: AlphabetKey
outerClientShuffleKey: OuterShuffleKey
outerClientShuffleFunctionKey: OuterShuffleKey
clientEphemeral: AlphabetKey
clientShuffleEphemeralA: InnerShuffleKey
clientShuffleEphemeralB: InnerShuffleKey
class Medium(BaseModel):
data: AlphabetKey
functionEphemeralKey: InnerShuffleKey
outerServerShuffleEphemeralKey: OuterShuffleKey
outerFunctionFunctionEphemeralKey: OuterShuffleKey
outerFunctionEphemeralKey: OuterShuffleKey
outerServerShuffleFunctionEphemeralKey: OuterShuffleKey
sharedEphemeralKey: AlphabetKey
positionFunctionMediumEphemeralKey: InnerShuffleKey
outerPositionFunctionMediumEphemeralKey: OuterShuffleKey
outerPositionShuffleMediumEphemeralKey: OuterShuffleKey
outerClientShuffleMediumKey: OuterShuffleKey
outerClientShuffleFunctionMediumKey: OuterShuffleKey
clientEphemeralMedium: AlphabetKey
clientShuffleEphemeralMediumA: InnerShuffleKey
clientShuffleEphemeralMediumB: InnerShuffleKey
class Phase1Session(BaseModel):
session: Session
tx_data: TxData
medium: Medium
alphabet: list[list[int]] | None = None
class ServerPersistentKeys(BaseModel):
OuterFunctionKey: OuterShuffleKey
OuterFunctionFunctionKey: OuterShuffleKey
OuterServerShuffleFunctionKey: OuterShuffleKey
MutualKey: AlphabetKey
FunctionKey: InnerShuffleKey
ClientShuffleKeyX: InnerShuffleKey
MutualMediumKey: AlphabetKey
OuterFunctionMediumKey: OuterShuffleKey
OuterFunctionFunctionMediumKey: OuterShuffleKey
OuterServerShuffleFunctionMediumKey: OuterShuffleKey
FunctionMediumKey: InnerShuffleKey
ClientShuffleMediumKeyX: InnerShuffleKey
OuterPositionShuffleMediumKey: OuterShuffleKey
OuterPositionShuffleFunctionMediumKey: OuterShuffleKey
OuterPositionFunctionMediumKey: OuterShuffleKey
PositionFunctionMediumKey: InnerShuffleKey
PositionShuffleMediumKey: InnerShuffleKey
OuterServerShuffleKey: OuterShuffleKey
ServerKey: AlphabetKey
ServerShuffleKey: InnerShuffleKey
ServerMediumKey: AlphabetKey
class ClientPersistentKeys(BaseModel):
OuterFunctionKey: OuterShuffleKey
OuterFunctionFunctionKey: OuterShuffleKey
OuterServerShuffleFunctionKey: OuterShuffleKey
MutualKey: AlphabetKey
FunctionKey: InnerShuffleKey
ClientShuffleKeyX: InnerShuffleKey
MutualMediumKey: AlphabetKey
OuterFunctionMediumKey: OuterShuffleKey
OuterFunctionFunctionMediumKey: OuterShuffleKey
OuterServerShuffleFunctionMediumKey: OuterShuffleKey
FunctionMediumKey: InnerShuffleKey
ClientShuffleMediumKeyX: InnerShuffleKey
OuterPositionShuffleMediumKey: OuterShuffleKey
OuterPositionShuffleFunctionMediumKey: OuterShuffleKey
OuterPositionFunctionMediumKey: OuterShuffleKey
PositionFunctionMediumKey: InnerShuffleKey
PositionShuffleMediumKey: InnerShuffleKey
ClientKey: AlphabetKey
ClientShuffleKeyA: InnerShuffleKey
OuterClientShuffleKey: OuterShuffleKey
OuterClientShuffleFunctionKey: OuterShuffleKey
OuterClientShuffleMediumKey: OuterShuffleKey
OuterClientShuffleFunctionMediumKey: OuterShuffleKey
ClientShuffleMediumKeyA: InnerShuffleKey
ClientMediumKey: AlphabetKey
class ServerEphemeralKeys(BaseModel):
OuterServerShuffleEphemeralKey: OuterShuffleKey
ServerEphemeralKey: AlphabetKey
ServerShuffleEphemeralKey: InnerShuffleKey
ServerMediumEphemeralKey: AlphabetKey
Alphabet: AlphabetKey
class MutualEphemeralKeys(BaseModel):
MutualEphemeralKey: AlphabetKey
FunctionEphemeralKey: InnerShuffleKey
OuterFunctionEphemeralKey: OuterShuffleKey
OuterFunctionFunctionEphemeralKey: OuterShuffleKey
OuterServerShuffleFunctionEphemeralKey: OuterShuffleKey
MutualMediumEphemeralKey: AlphabetKey
FunctionMediumEphemeralKey: InnerShuffleKey
PositionFunctionMediumEphemeralKey: InnerShuffleKey
OuterFunctionMediumEphemeralKey: OuterShuffleKey
OuterFunctionFunctionMediumEphemeralKey: OuterShuffleKey
OuterPositionFunctionMediumEphemeralKey: OuterShuffleKey
OuterServerShuffleFunctionMediumEphemeralKey: OuterShuffleKey
OuterPositionShuffleFunctionMediumEphemeralKey: OuterShuffleKey
PositionShuffleMediumEphemeralKey: InnerShuffleKey
OuterPositionShuffleMediumEphemeralKey: OuterShuffleKey
class ClientEphemeralKeys(BaseModel):
OuterClientShuffleEphemeralKey: OuterShuffleKey
OuterClientShuffleFunctionEphemeralKey: OuterShuffleKey
ClientEphemeralKey: AlphabetKey
ClientShuffleEphemeralKeyA: InnerShuffleKey
OuterClientShuffleMediumEphemeralKey: OuterShuffleKey
OuterClientShuffleFunctionMediumEphemeralKey: OuterShuffleKey
ClientShuffleMediumEphemeralKeyA: InnerShuffleKey
ClientMediumEphemeralKey: AlphabetKey