fix nkode api; username should be specified at the beginning of the enrollment

This commit is contained in:
2025-03-24 15:24:53 -05:00
parent 1846dc1065
commit 3a9fadfc03
10 changed files with 281 additions and 199 deletions

View File

@@ -15,6 +15,9 @@ class NKodeAPI:
customers: dict[UUID, Customer] = field(default_factory=dict)
signup_sessions: dict[UUID, UserSignupSession] = field(default_factory=dict)
def get_customer(self, customer_id: UUID) -> Customer:
return self.customers[customer_id]
def create_new_customer(self, keypad_size: KeypadSize, nkode_policy: NKodePolicy) -> UUID:
new_customer = Customer.create(
cipher=CustomerCipher.create(keypad_size),
@@ -23,13 +26,17 @@ class NKodeAPI:
self.customers[new_customer.customer_id] = new_customer
return new_customer.customer_id
def generate_signup_keypad(self, customer_id: UUID) -> tuple[UUID, np.ndarray]:
def generate_signup_keypad(self, customer_id: UUID, username: str) -> tuple[UUID, np.ndarray]:
if customer_id not in self.customers.keys():
raise ValueError(f"Customer with ID '{customer_id}' does not exist")
customer = self.customers[customer_id]
if username in customer.users.keys():
raise ValueError(f"Username '{username}' already exists for this customer")
customer = self.customers[customer_id]
login_keypad = UserKeypad.create(customer.cipher.keypad_size)
set_keypad = login_keypad.sign_up_keypad()
new_session = UserSignupSession(
username=username,
session_id=uuid4(),
login_keypad=login_keypad,
set_keypad=set_keypad.keypad,
@@ -41,24 +48,20 @@ class NKodeAPI:
def set_nkode(
self,
username: str,
customer_id: UUID,
key_selection: list[int],
session_id: UUID
) -> np.ndarray:
if customer_id not in self.customers.keys():
raise ValueError(f"Customer ID {customer_id} not found")
customer = self.customers[customer_id]
if username in customer.users.keys():
raise ValueError(f"Username '{username}' already exists for this customer")
if session_id not in self.signup_sessions.keys():
raise ValueError(f"Session ID {session_id} not found")
self.signup_sessions[session_id].set_user_nkode(username, key_selection)
session = self.signup_sessions[session_id]
self.signup_sessions[session_id].set_user_nkode(session.username, key_selection)
return self.signup_sessions[session_id].confirm_keypad
def confirm_nkode(
self,
username: str,
customer_id: UUID,
confirm_key_entry: list[int],
session_id: UUID
@@ -68,8 +71,6 @@ class NKodeAPI:
session = self.signup_sessions[session_id]
if customer_id != session.customer_id:
raise AssertionError(f"Customer ID mismatch: {customer_id} vs {session.customer_id}")
if username != session.username:
raise AssertionError(f"Username mismatch: {username} vs {session.username}")
customer = self.customers[customer_id]
passcode = self.signup_sessions[session_id].deduce_passcode(confirm_key_entry)
new_user_keys = UserCipher.create(
@@ -79,7 +80,7 @@ class NKodeAPI:
)
enciphered_passcode = new_user_keys.encipher_nkode(passcode, customer.cipher)
new_user = User(
username=username,
username=session.username,
enciphered_passcode=enciphered_passcode,
cipher=new_user_keys,
user_keypad=self.signup_sessions[session_id].login_keypad,