initial commit
This commit is contained in:
361
src/models.py
Normal file
361
src/models.py
Normal 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
|
||||
Reference in New Issue
Block a user