diff --git a/nkode_api.py b/nkode_api.py index 6f6f40c..5d9cd4e 100644 --- a/nkode_api.py +++ b/nkode_api.py @@ -53,7 +53,13 @@ class NKodeAPI(BaseModel): self.signup_sessions[session_id].set_user_nkode(username, key_selection) return self.signup_sessions[session_id].confirm_interface - def confirm_nkode(self, username: str, customer_id: UUID, confirm_key_entry: list[int], session_id: UUID) -> bool: + def confirm_nkode( + self, + username: str, + customer_id: UUID, + confirm_key_entry: list[int], + session_id: UUID + ) -> bool: assert ( session_id in self.signup_sessions.keys() and customer_id == self.signup_sessions[session_id].customer_id and diff --git a/src/customer.py b/src/customer.py index 8ee9afb..bc278bf 100644 --- a/src/customer.py +++ b/src/customer.py @@ -20,12 +20,12 @@ class Customer(BaseModel): def valid_key_entry(self, username, selected_keys) -> bool: assert (username in self.users.keys()) - assert (all(key_idx < self.attributes.keypad_size.numb_of_keys for key_idx in selected_keys)) + assert (all(0 <= key_idx < self.attributes.keypad_size.numb_of_keys for key_idx in selected_keys)) passcode_len = len(selected_keys) user = self.users[username] passcode_set_vals = user.user_keys.decipher_mask( - user.enciphered_passcode.mask, self.attributes.set_vals, len(selected_keys)) + user.enciphered_passcode.mask, self.attributes.set_vals, passcode_len) set_vals_idx = [self.attributes.get_set_index(set_val) for set_val in passcode_set_vals] presumed_selected_attributes_idx = [] @@ -54,6 +54,7 @@ class Customer(BaseModel): set_xor = xor_lists(new_sets, old_sets) for user in self.users.values(): user.renew_keys(set_xor, attrs_xor) + self.users[user.username] = user return True def valid_new_nkode(self, passcode_attr_idx: list[int]) -> bool: diff --git a/src/models.py b/src/models.py index 2d4dd7a..475cb0b 100644 --- a/src/models.py +++ b/src/models.py @@ -1,11 +1,6 @@ from pydantic import BaseModel -class NKodeAttribute(BaseModel): - attr_val: int - set_val: int - - class EncipheredNKode(BaseModel): code: str mask: str @@ -17,6 +12,8 @@ class NKodePolicy(BaseModel): distinct_sets: int = 0 distinct_attributes: int = 4 byte_len: int = 2 # Todo: this should change the total number of bytes an attribute or set value can be + lock_out: int = 5 + expiration: int = -1 # in seconds -1 means never expires class KeypadSize(BaseModel): diff --git a/src/user_interface.py b/src/user_interface.py index 223f4b4..673272e 100644 --- a/src/user_interface.py +++ b/src/user_interface.py @@ -98,6 +98,7 @@ class UserInterface(BaseModel): def get_attr_idx_by_keynumb_setidx(self, key_numb: int, set_idx: int) -> int: assert (0 <= key_numb < self.keypad_size.numb_of_keys) + assert (0 <= set_idx < self.keypad_size.attrs_per_key) keypad_attr_idx = self.interface_keypad_matrix() return keypad_attr_idx[key_numb][set_idx] diff --git a/test/test_user_interface.py b/test/test_user_interface.py index b371b1b..d3fd2f3 100644 --- a/test/test_user_interface.py +++ b/test/test_user_interface.py @@ -9,11 +9,10 @@ def user_interface(): def test_dispersion(user_interface): - pre_dispersion_graph = user_interface.attribute_adjacency_graph() - user_interface.disperse_interface() - post_dispersion_graph = user_interface.attribute_adjacency_graph() - for _ in range(10000): + pre_dispersion_graph = user_interface.attribute_adjacency_graph() + user_interface.disperse_interface() + post_dispersion_graph = user_interface.attribute_adjacency_graph() for attr, adj_graph in pre_dispersion_graph.items(): assert (adj_graph.isdisjoint(post_dispersion_graph[attr])) @@ -28,10 +27,9 @@ def test_shuffle_attrs(user_interface): pre_shuffle_interface = user_interface.interface user_interface.partial_interface_shuffle() post_shuffle_interface = user_interface.interface - for i in range(1000): - assert (not all( - post_shuffle_interface[idx] == pre_shuffle_interface[idx] for idx in range(len(post_shuffle_interface)) - )) - assert (not all( - post_shuffle_interface[idx] != pre_shuffle_interface[idx] for idx in range(len(post_shuffle_interface)) - )) + assert (not all( + post_shuffle_interface[idx] == pre_shuffle_interface[idx] for idx in range(len(post_shuffle_interface)) + )) + assert (not all( + post_shuffle_interface[idx] != pre_shuffle_interface[idx] for idx in range(len(post_shuffle_interface)) + ))