From 08bfd08b4a005331e9d77f3fa4b4285fc8b69b23 Mon Sep 17 00:00:00 2001 From: Donovan Date: Sun, 7 Jul 2024 15:17:24 -0500 Subject: [PATCH] implement customer models --- src/models.py | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/utils.py | 25 ++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/models.py create mode 100644 src/utils.py diff --git a/src/models.py b/src/models.py new file mode 100644 index 0000000..6e3c976 --- /dev/null +++ b/src/models.py @@ -0,0 +1,59 @@ +import secrets + +from src.utils import ( + generate_random_list, generate_random_matrix, xor_lists, + random_number_in_range +) +from pydantic import BaseModel + + +class UserEncipherKeys(BaseModel): + alpha_key: list[list[int]] + set_key: list[int] + pass_key: list[int] + mask_key: list[int] + + @staticmethod + def new_user_encipher_keys(height: int, width: int, nkode_set_values: list[int]): + assert len(nkode_set_values) == width + + set_key = generate_random_list(width) + set_key = xor_lists(set_key, nkode_set_values) + + return UserEncipherKeys( + alpha_key=generate_random_matrix(width, height), + pass_key=generate_random_list(height), + mask_key=generate_random_list(height), + set_key=set_key, + ) + + +class CustomerAttribute(BaseModel): + attr_val: int + set_val: int + + +class Customer(BaseModel): + base_interface: dict[ + list[CustomerAttribute]] # { set0: [(val0, set0) ... (valN, set0)], ... setM: [(val0, setM) ... (valN, setM)]} + + @staticmethod + def new_interface(height: int, width: int): + assert(height <= 256) + assert(width <= 256) + + base_interface = {} + possible_set_vals = list(range(256)) + for w in range(width): + cur_set = secrets.choice(possible_set_vals) + possible_attr_values = list(range(256)) + base_interface[cur_set] = [] + for h in range(height): + cur_attr = secrets.choice(possible_attr_values) + base_interface[cur_set].append(CustomerAttribute(attr_val=cur_attr, set_val=cur_set)) + possible_attr_values.remove(cur_attr) + possible_set_vals.remove(cur_set) + + return Customer( + base_interface=base_interface + ) diff --git a/src/utils.py b/src/utils.py new file mode 100644 index 0000000..22d21a5 --- /dev/null +++ b/src/utils.py @@ -0,0 +1,25 @@ +import secrets + + +def random_number_in_range(min_val: int, max_val: int) -> int: + """ originally secure_rand """ + return min_val + secrets.randbelow(max_val - min_val + 1) + + +def random_number_in_range_excluding(min_val: int, max_val: int, exclude: list[int]) -> int: + """ originally secure_rand """ + + return min_val + secrets.randbelow(max_val - min_val + 1) + + +def generate_random_list(list_len: int, min_val: int = 0, max_val: int = 255) -> list[int]: + return [random_number_in_range(min_val, max_val) for _ in range(list_len)] + + +def generate_random_matrix(rows: int, cols: int, min_val: int = 0, max_val: int = 255) -> list[list[int]]: + return [[random_number_in_range(min_val, max_val) for _ in range(rows)] for _ in range(cols)] + + +def xor_lists(l1: list[int], l2: list[int]): + assert len(l1) == len(l2) + return [l2[i] ^ l1[i] for i in range(len(l1))]