add enrollment diagrams

This commit is contained in:
2025-03-24 04:49:39 -05:00
parent 5031062e87
commit 1f188e82ed
6 changed files with 340 additions and 162 deletions

View File

@@ -0,0 +1,37 @@
# nKode Enrollment
```mermaid
sequenceDiagram
participant User
participant Client
participant Server
Note over User,Client: Enrollment
Client->>User: Signup Form
Note left of User: email: user@example.com
User->>Client: Submit Email
Client->>+Server: Signup Session: user@example.com
Server->>Server: Create Signup Session
Note over User,Client: Set nKode
Server-->>-Client: signup_session_id, set_keypad, icons
Note left of Server: signup_session_id:<br/>92a2a1c6-3146-4d47-ac00-5160a7ebf104
Note left of Server: set_keypad:<br/>Key 0: [ 7 14 3 28 23]<br/>Key 1: [ 1 26 15 10 5]<br/>Key 2: [13 20 27 4 29]<br/>Key 3: [25 8 21 16 11]<br/>Key 4: [19 2 9 22 17]<br/>
Note left of Server: Icons:<br/>[😀,😂,🥳,😍,🤓<br/>😎,🥺,😡,😱,🤯<br/>🥰,😴,🤔,🙃,😇<br/>🤖,👽,👾,🐱,🐶<br/>🦁,🐻,🐸,🐙,🦄<br/>🌟,⚡,🔥,🍕,🎉]
Client->>Client: Order Icons by keypad
Client->>User: Display Keypad
Note left of Client: Key 0: ['😡' '😇' '😍' '🍕' '🐙']<br/>Key 1: ['😂' '⚡' '🤖' '🥰' '😎']<br/>Key 2: ['🙃' '🦁' '🔥' '🤓' '🎉']<br/>Key 3: ['🌟' '😱' '🐻' '👽' '😴']<br/>Key 4: ['🐶' '🥳' '🤯' '🐸' '👾']<br/>
Note left of User: User icons: ['😍' '🤓' '😇' '😡']
User->>Client: Set Key Selection: [0, 2, 0, 0]
Client->>+Server: Set nKode:<br/>92a2a1c6-3146-4d47-ac00-5160a7ebf104<br/>[0, 2, 0, 0]
Server->>Server: Disperse Set Keypad
Note over User,Client: Confirm nKode
Server-->>-Client: signup_session_id, confirm_keypad, icons
Note left of Server: signup_session_id:<br/>92a2a1c6-3146-4d47-ac00-5160a7ebf104
Note left of Server: confirm_keypad:<br/>Key 0: [ 7 26 21 4 17]<br/>Key 1: [19 20 3 16 5]<br/>Key 2: [ 1 8 9 28 29]<br/>Key 3: [13 14 15 22 11]<br/>Key 4: [25 2 27 10 23]<br/>
Client->>Client: Order Icons by keypad
Client->>User: Display Keypad
Note left of Client: Key 0: ['😡' '⚡' '🐻' '🤓' '👾']<br/>Key 1: ['🐶' '🦁' '😍' '👽' '😎']<br/>Key 2: ['😂' '😱' '🤯' '🍕' '🎉']<br/>Key 3: ['🙃' '😇' '🤖' '🐸' '😴']<br/>Key 4: ['🌟' '🥳' '🔥' '🥰' '🐙']<br/>
Note left of User: User icons: ['😍' '🤓' '😇' '😡']
User->>Client: Key Selection: [1, 0, 3, 0]
Client->>+Server: Confirm nKode:<br/>92a2a1c6-3146-4d47-ac00-5160a7ebf104<br/>[1, 0, 3, 0]
Server->>Server: Create User
Server-->-Client: Success
```

View File

@@ -0,0 +1,37 @@
# nKode Enrollment
```mermaid
sequenceDiagram
participant User
participant Client
participant Server
Note over User,Client: Enrollment
Client->>User: Signup Form
Note left of User: email: {{ email }}
User->>Client: Submit Email
Client->>+Server: Signup Session: {{ email }}
Server->>Server: Create Signup Session
Note over User,Client: Set nKode
Server-->>-Client: signup_session_id, set_keypad, icons
Note left of Server: signup_session_id:<br/>{{ signup_session_id }}
Note left of Server: set_keypad:<br/>{{set_keypad}}
Note left of Server: Icons:<br/>{{icon_matrix}}
Client->>Client: Order Icons by keypad
Client->>User: Display Keypad
Note left of Client: {{ ordered_keypad }}
Note left of User: User icons: {{ passcode_user_icons }}
User->>Client: Set Key Selection: {{ selected_keys_set }}
Client->>+Server: Set nKode:<br/>{{ signup_session_id }}<br/>{{ selected_keys_set }}
Server->>Server: Disperse Set Keypad
Note over User,Client: Confirm nKode
Server-->>-Client: signup_session_id, confirm_keypad, icons
Note left of Server: signup_session_id:<br/>{{ signup_session_id }}
Note left of Server: confirm_keypad:<br/>{{confirm_keypad}}
Client->>Client: Order Icons by keypad
Client->>User: Display Keypad
Note left of Client: {{ confirm_ordered_keypad }}
Note left of User: User icons: {{ passcode_user_icons }}
User->>Client: Key Selection: {{ confirm_key_selection }}
Client->>+Server: Confirm nKode:<br/>{{ signup_session_id }}<br/>{{ confirm_key_selection }}
Server->>Server: Create User
Server-->-Client: Success
```

View File

@@ -0,0 +1,107 @@
# Render markdown template for nKode enrollment
from pathlib import Path
import numpy as np
from jinja2 import Environment, FileSystemLoader, select_autoescape
from secrets import choice
from string import ascii_lowercase
from src.models import NKodePolicy, KeypadSize
from src.nkode_api import NKodeAPI
from src.utils import select_keys_with_passcode_values
def render_markdown_template(template_path, output_path, context):
"""
Render a Jinja2 markdown template with the given context and save to output_path.
Args:
template_path (Path): Path to the template file
output_path (Path): Path where the rendered file will be saved
context (dict): Template variables
"""
template_dir = template_path.parent
template_file = template_path.name
env = Environment(
loader=FileSystemLoader(template_dir),
autoescape=select_autoescape(['html', 'xml']),
trim_blocks=True,
lstrip_blocks=True
)
template = env.get_template(template_file)
rendered = template.render(**context)
with open(output_path, 'w') as f:
f.write(rendered)
print(f"Template rendered to {output_path}")
def display_icons(icons_array: np.ndarray, kp: KeypadSize) -> str:
icons = "["
for row in icons_array.reshape(-1, kp.numb_of_keys):
icons += ",".join(row)
icons += "<br/>"
icons = icons[:-5]
icons += "]"
return icons
def display_icons_keypad(icons_array: np.ndarray, kp: KeypadSize) -> str:
icons = ""
for idx, row in enumerate(icons_array.reshape(-1, kp.numb_of_keys)):
icons += f"Key {idx}: "
icons += str(row)
icons += "<br/>"
return icons
if __name__ == "__main__":
api = NKodeAPI()
user_icons = np.array([
"😀", "😂", "🥳", "😍", "🤓",
"😎", "🥺", "😡", "😱", "🤯",
"🥰", "😴", "🤔", "🙃", "😇",
"🤖", "👽", "👾", "🐱", "🐶",
"🦁", "🐻", "🐸", "🐙", "🦄",
"🌟", "", "🔥", "🍕", "🎉"
])
policy = NKodePolicy(
max_nkode_len=10,
min_nkode_len=4,
distinct_positions=0,
distinct_properties=4,
)
keypad_size = KeypadSize(
numb_of_keys=5,
props_per_key=6
)
customer_id = api.create_new_customer(keypad_size, policy)
signup_session_id, set_signup_keypad = api.generate_signup_keypad(customer_id)
ordered_set_icons = user_icons[set_signup_keypad]
username = "test_username" + "".join([choice(ascii_lowercase) for _ in range(6)])
passcode_len = 4
passcode_property_indices = np.random.choice(set_signup_keypad.reshape(-1), size=passcode_len,
replace=False).tolist()
selected_keys_set = select_keys_with_passcode_values(passcode_property_indices, set_signup_keypad,
keypad_size.numb_of_keys)
confirm_keypad = api.set_nkode(username, customer_id, selected_keys_set, signup_session_id)
selected_keys_confirm = select_keys_with_passcode_values(passcode_property_indices, confirm_keypad,
keypad_size.numb_of_keys)
ordered_confirm_icons = user_icons[confirm_keypad]
print(f"Selected Keys\n{selected_keys_confirm}")
success = api.confirm_nkode(username, customer_id, selected_keys_confirm, signup_session_id)
context = {
"email": "user@example.com",
"signup_session_id": signup_session_id,
"set_keypad": display_icons_keypad(set_signup_keypad.reshape(-1, keypad_size.numb_of_keys), keypad_size),
"icon_matrix": display_icons(user_icons, keypad_size),
"ordered_keypad": display_icons_keypad(ordered_set_icons, keypad_size),
"passcode_user_icons": str(user_icons[passcode_property_indices]),
"selected_keys_set": str(selected_keys_set),
"confirm_keypad": display_icons_keypad(confirm_keypad.reshape(-1, keypad_size.numb_of_keys), keypad_size),
"confirm_ordered_keypad": display_icons_keypad(ordered_confirm_icons.reshape(-1, keypad_size.numb_of_keys), keypad_size),
"confirm_key_selection": selected_keys_confirm
}
# Render the template
render_markdown_template(Path("./enrollment_diagram.template.md"), Path("./enrollment_diagram.md"), context)

View File

@@ -8,6 +8,7 @@
"sys.path.append(os.path.abspath('..')) # Adds the parent directory to path\n", "sys.path.append(os.path.abspath('..')) # Adds the parent directory to path\n",
"from src.nkode_api import NKodeAPI\n", "from src.nkode_api import NKodeAPI\n",
"from src.models import NKodePolicy, KeypadSize\n", "from src.models import NKodePolicy, KeypadSize\n",
"from src.utils import select_keys_with_passcode_values\n",
"from secrets import choice\n", "from secrets import choice\n",
"from string import ascii_lowercase\n", "from string import ascii_lowercase\n",
"import numpy as np\n", "import numpy as np\n",
@@ -20,11 +21,6 @@
" return \"test_username\" + \"\".join([choice(ascii_lowercase) for _ in range(6)])\n", " return \"test_username\" + \"\".join([choice(ascii_lowercase) for _ in range(6)])\n",
"\n", "\n",
"\n", "\n",
"def select_keys_with_passcode_values(user_passcode_idxs: list[int], keypad: np.ndarray, props_per_key: int) -> list[int]:\n",
" indices = [np.where(keypad == prop)[0][0] for prop in user_passcode_idxs]\n",
" return [int(index // props_per_key) for index in indices]\n",
"\n",
"\n",
"def keypad_view(keypad: np.ndarray, props_per_key: int):\n", "def keypad_view(keypad: np.ndarray, props_per_key: int):\n",
" interface_keypad = keypad.reshape(-1, props_per_key)\n", " interface_keypad = keypad.reshape(-1, props_per_key)\n",
" for idx, key_vals in enumerate(interface_keypad):\n", " for idx, key_vals in enumerate(interface_keypad):\n",
@@ -33,12 +29,12 @@
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.080558Z", "end_time": "2025-03-24T09:48:10.442598Z",
"start_time": "2025-03-20T15:13:44.076372Z" "start_time": "2025-03-24T09:48:10.410209Z"
} }
}, },
"outputs": [], "outputs": [],
"execution_count": 41 "execution_count": 1
}, },
{ {
"cell_type": "code", "cell_type": "code",
@@ -56,12 +52,12 @@
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.090939Z", "end_time": "2025-03-24T09:48:10.450851Z",
"start_time": "2025-03-20T15:13:44.088281Z" "start_time": "2025-03-24T09:48:10.448737Z"
} }
}, },
"outputs": [], "outputs": [],
"execution_count": 42 "execution_count": 2
}, },
{ {
"metadata": {}, "metadata": {},
@@ -115,8 +111,8 @@
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.107060Z", "end_time": "2025-03-24T09:48:10.468165Z",
"start_time": "2025-03-20T15:13:44.100773Z" "start_time": "2025-03-24T09:48:10.456820Z"
} }
}, },
"outputs": [ "outputs": [
@@ -124,30 +120,30 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Customer Position Key: [22504 45127 46010 30773 46509 63084]\n", "Customer Position Key: [ 4136 64524 15410 9988 20496 18918]\n",
"Customer Properties Key:\n", "Customer Properties Key:\n",
"[38076 5253 43656 24035 57980 18197]\n", "[46103 19687 10938 59248 5143 27050]\n",
"[56754 21362 27799 42374 57145 46164]\n", "[26684 7431 59668 28699 6929 18710]\n",
"[56031 10476 13741 23847 57450 42577]\n", "[12853 35476 62914 24111 36473 25394]\n",
"[63205 55476 58864 29925 9463 58182]\n", "[63988 14898 1879 44350 53666 23249]\n",
"[61997 24583 9269 19956 55576 32892]\n", "[23805 45848 21514 8782 7583 36157]\n",
"Position to Properties Map:\n", "Position to Properties Map:\n",
"22504: [38076 56754 56031 63205 61997]\n", "4136: [46103 26684 12853 63988 23805]\n",
"45127: [ 5253 21362 10476 55476 24583]\n", "64524: [19687 7431 35476 14898 45848]\n",
"46010: [43656 27799 13741 58864 9269]\n", "15410: [10938 59668 62914 1879 21514]\n",
"30773: [24035 42374 23847 29925 19956]\n", "9988: [59248 28699 24111 44350 8782]\n",
"46509: [57980 57145 57450 9463 55576]\n", "20496: [ 5143 6929 36473 53666 7583]\n",
"63084: [18197 46164 42577 58182 32892]\n" "18918: [27050 18710 25394 23249 36157]\n"
] ]
} }
], ],
"execution_count": 43 "execution_count": 3
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.127687Z", "end_time": "2025-03-24T09:48:10.593687Z",
"start_time": "2025-03-20T15:13:44.125028Z" "start_time": "2025-03-24T09:48:10.591235Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -164,16 +160,16 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Position Value to Icons Map:\n", "Position Value to Icons Map:\n",
"22504: ['😀' '🥺' '🤔' '🐱' '🦄']\n", "4136: ['😀' '🥺' '🤔' '🐱' '🦄']\n",
"45127: ['😂' '😡' '🙃' '🐶' '🌟']\n", "64524: ['😂' '😡' '🙃' '🐶' '🌟']\n",
"46010: ['🥳' '😱' '😇' '🦁' '⚡']\n", "15410: ['🥳' '😱' '😇' '🦁' '⚡']\n",
"30773: ['😍' '🤯' '🤖' '🐻' '🔥']\n", "9988: ['😍' '🤯' '🤖' '🐻' '🔥']\n",
"46509: ['🤓' '🥰' '👽' '🐸' '🍕']\n", "20496: ['🤓' '🥰' '👽' '🐸' '🍕']\n",
"63084: ['😎' '😴' '👾' '🐙' '🎉']\n" "18918: ['😎' '😴' '👾' '🐙' '🎉']\n"
] ]
} }
], ],
"execution_count": 44 "execution_count": 4
}, },
{ {
"metadata": {}, "metadata": {},
@@ -197,8 +193,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.156638Z", "end_time": "2025-03-24T09:48:10.653252Z",
"start_time": "2025-03-20T15:13:44.150222Z" "start_time": "2025-03-24T09:48:10.646267Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -226,11 +222,11 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Key 0: ['🦄' '🦁' '🐻' '🤓' '👾']\n", "Key 0: ['😂' '🥳' '🐻' '🍕' '😎']\n",
"Key 1: ['🥺' '⚡' '🔥' '🍕' '🎉']\n", "Key 1: ['🐶' '⚡' '🤖' '🥰' '🎉']\n",
"Key 2: ['🐱' '😱' '🤖' '👽' '🐙']\n", "Key 2: ['🌟' '😇' '😍' '🤓' '🐙']\n",
"Key 3: ['😀' '🥳' '😍' '🐸' '😴']\n", "Key 3: ['😡' '😱' '🔥' '👽' '😴']\n",
"Key 4: ['🤔' '😇' '🤯' '🥰' '😎']\n" "Key 4: ['🙃' '🦁' '🤯' '🐸' '👾']\n"
] ]
}, },
{ {
@@ -247,11 +243,11 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Key 0: [24 20 21 4 17]\n", "Key 0: [ 1 2 21 28 5]\n",
"Key 1: [ 6 26 27 28 29]\n", "Key 1: [19 26 15 10 29]\n",
"Key 2: [18 8 15 16 23]\n", "Key 2: [25 14 3 4 23]\n",
"Key 3: [ 0 2 3 22 11]\n", "Key 3: [ 7 8 27 16 11]\n",
"Key 4: [12 14 9 10 5]\n" "Key 4: [13 20 9 22 17]\n"
] ]
}, },
{ {
@@ -268,15 +264,15 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Key 0: [61997 58864 29925 57980 42577]\n", "Key 0: [19687 10938 44350 7583 27050]\n",
"Key 1: [56754 9269 19956 55576 32892]\n", "Key 1: [14898 21514 24111 6929 36157]\n",
"Key 2: [63205 27799 23847 57450 58182]\n", "Key 2: [45848 62914 59248 5143 23249]\n",
"Key 3: [38076 43656 24035 9463 46164]\n", "Key 3: [ 7431 59668 8782 36473 18710]\n",
"Key 4: [56031 13741 42374 57145 18197]\n" "Key 4: [35476 1879 28699 53666 25394]\n"
] ]
} }
], ],
"execution_count": 45 "execution_count": 5
}, },
{ {
"metadata": {}, "metadata": {},
@@ -289,8 +285,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.190448Z", "end_time": "2025-03-24T09:48:10.726327Z",
"start_time": "2025-03-20T15:13:44.187214Z" "start_time": "2025-03-24T09:48:10.723046Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -309,14 +305,14 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"User Passcode Indices: [4, 9, 5, 18]\n", "User Passcode Indices: [8, 15, 17, 7]\n",
"User Passcode Icons: ['🤓' '🤯' '😎' '🐱']\n", "User Passcode Icons: ['😱' '🤖' '👾' '😡']\n",
"User Passcode Server-side properties: [57980 42374 18197 63205]\n", "User Passcode Server-side properties: [59668 24111 25394 7431]\n",
"Selected Keys: [0, 4, 4, 2]\n" "Selected Keys: [3, 1, 4, 3]\n"
] ]
} }
], ],
"execution_count": 46 "execution_count": 6
}, },
{ {
"metadata": {}, "metadata": {},
@@ -329,8 +325,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.516570Z", "end_time": "2025-03-24T09:48:11.002815Z",
"start_time": "2025-03-20T15:13:44.208909Z" "start_time": "2025-03-24T09:48:10.759840Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -347,17 +343,17 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Key 0: [18 20 27 10 11]\n", "Key 0: [ 1 26 9 4 11]\n",
"Key 1: [24 14 15 22 29]\n", "Key 1: [19 8 3 28 17]\n",
"Key 2: [12 2 21 28 23]\n", "Key 2: [ 7 20 21 10 23]\n",
"Key 3: [ 0 26 9 16 17]\n", "Key 3: [13 14 15 16 5]\n",
"Key 4: [6 8 3 4 5]\n", "Key 4: [25 2 27 22 29]\n",
"Selected Keys\n", "Selected Keys\n",
"[4, 3, 4, 0]\n" "[1, 3, 1, 2]\n"
] ]
} }
], ],
"execution_count": 47 "execution_count": 7
}, },
{ {
"metadata": {}, "metadata": {},
@@ -367,8 +363,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.527802Z", "end_time": "2025-03-24T09:48:11.011978Z",
"start_time": "2025-03-20T15:13:44.524844Z" "start_time": "2025-03-24T09:48:11.009413Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -387,22 +383,22 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Set Key 0: ['🦄' '🦁' '🐻' '🤓' '👾']\n", "Set Key 0: ['😡' '😱' '🔥' '👽' '😴']\n",
"Confirm Key 0: ['🥺' '😱' '😍' '🤓' '😎']\n", "Confirm Key 0: ['🐶' '😱' '😍' '🍕' '👾']\n",
"Overlapping icon 🤓\n", "Overlapping icon 😱\n",
"Set Key 1: ['🤔' '😇' '🤯' '🥰' '😎']\n", "Set Key 1: ['🐶' '' '🤖' '🥰' '🎉']\n",
"Confirm Key 1: ['😀' '' '🤯' '👽' '👾']\n", "Confirm Key 1: ['🙃' '😇' '🤖' '👽' '😎']\n",
"Overlapping icon 🤯\n", "Overlapping icon 🤖\n",
"Set Key 2: ['🤔' '😇' '🤯' '🥰' '😎']\n", "Set Key 2: ['🙃' '🦁' '🤯' '🐸' '👾']\n",
"Confirm Key 2: ['🥺' '😱' '😍' '🤓' '😎']\n", "Confirm Key 2: ['🐶' '😱' '😍' '🍕' '👾']\n",
"Overlapping icon 😎\n", "Overlapping icon 👾\n",
"Set Key 3: ['🐱' '😱' '🤖' '👽' '🐙']\n", "Set Key 3: ['😡' '😱' '🔥' '👽' '😴']\n",
"Confirm Key 3: ['🐱' '🦁' '🔥' '🥰' '😴']\n", "Confirm Key 3: ['😡' '🦁' '🐻' '🥰' '🐙']\n",
"Overlapping icon 🐱\n" "Overlapping icon 😡\n"
] ]
} }
], ],
"execution_count": 48 "execution_count": 8
}, },
{ {
"metadata": {}, "metadata": {},
@@ -422,8 +418,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.546871Z", "end_time": "2025-03-24T09:48:11.030598Z",
"start_time": "2025-03-20T15:13:44.540903Z" "start_time": "2025-03-24T09:48:11.025452Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -433,13 +429,13 @@
"user_prop_key_keypad = user_cipher.property_key.reshape(-1, keypad_size.props_per_key)" "user_prop_key_keypad = user_cipher.property_key.reshape(-1, keypad_size.props_per_key)"
], ],
"outputs": [], "outputs": [],
"execution_count": 49 "execution_count": 9
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.565168Z", "end_time": "2025-03-24T09:48:11.049702Z",
"start_time": "2025-03-20T15:13:44.562664Z" "start_time": "2025-03-24T09:48:11.047621Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -450,21 +446,21 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Property Key:\n", "Property Key:\n",
"[[21364 17750 43270 40570 2897 64106]\n", "[[12284 15976 959 23676 56686 51545]\n",
" [64901 60553 23487 56910 22974 27412]\n", " [ 8349 41940 14857 24411 28369 47234]\n",
" [49276 36687 58910 60854 56432 64908]\n", " [42434 47287 23836 29864 11461 30858]\n",
" [17816 7963 33663 13564 43318 39697]\n", " [39973 19733 43467 29927 8960 22628]\n",
" [ 6300 40793 34908 48633 47026 16580]]\n" " [26608 3550 57761 58209 11329 828]]\n"
] ]
} }
], ],
"execution_count": 50 "execution_count": 10
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.583641Z", "end_time": "2025-03-24T09:48:11.080213Z",
"start_time": "2025-03-20T15:13:44.581757Z" "start_time": "2025-03-24T09:48:11.077878Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -474,17 +470,17 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Passcode Key: [65482 44549 30799 45221 44404 5844 32654 14244 48015 17243]\n" "Passcode Key: [43421 54264 31716 41010 25784 51749 8406 27083 36329 63965]\n"
] ]
} }
], ],
"execution_count": 51 "execution_count": 11
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.624946Z", "end_time": "2025-03-24T09:48:11.120295Z",
"start_time": "2025-03-20T15:13:44.622774Z" "start_time": "2025-03-24T09:48:11.118074Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -494,17 +490,17 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Mask Key: [36463 57168 30740 46459 21013 40282 33046 14986 26644 13]\n" "Mask Key: [27744 6339 46141 38859 23071 28613 2855 48530 24494 59329]\n"
] ]
} }
], ],
"execution_count": 52 "execution_count": 12
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.653291Z", "end_time": "2025-03-24T09:48:11.158895Z",
"start_time": "2025-03-20T15:13:44.651215Z" "start_time": "2025-03-24T09:48:11.156729Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -514,17 +510,17 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Combined Position Key: [32765 21433 32527 38517 27021 45380]\n" "Combined Position Key: [42763 65304 30825 5938 4970 58530]\n"
] ]
} }
], ],
"execution_count": 53 "execution_count": 13
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.682695Z", "end_time": "2025-03-24T09:48:11.183517Z",
"start_time": "2025-03-20T15:13:44.680482Z" "start_time": "2025-03-24T09:48:11.181587Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -534,17 +530,17 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"User Position Key = combined_pos_key XOR customer_pos_key: [10261 58366 52405 60992 56352 18216]\n" "User Position Key = combined_pos_key XOR customer_pos_key: [46883 788 17499 12342 17274 44356]\n"
] ]
} }
], ],
"execution_count": 54 "execution_count": 14
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.713223Z", "end_time": "2025-03-24T09:48:11.207260Z",
"start_time": "2025-03-20T15:13:44.710535Z" "start_time": "2025-03-24T09:48:11.204729Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -560,16 +556,16 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Combined Position to Properties Map:\n", "Combined Position to Properties Map:\n",
"32765: [21364 64901 49276 17816 6300]\n", "42763: [12284 8349 42434 39973 26608]\n",
"21433: [17750 60553 36687 7963 40793]\n", "65304: [15976 41940 47287 19733 3550]\n",
"32527: [43270 23487 58910 33663 34908]\n", "30825: [ 959 14857 23836 43467 57761]\n",
"38517: [40570 56910 60854 13564 48633]\n", "5938: [23676 24411 29864 29927 58209]\n",
"27021: [ 2897 22974 56432 43318 47026]\n", "4970: [56686 28369 11461 8960 11329]\n",
"45380: [64106 27412 64908 39697 16580]\n" "58530: [51545 47234 30858 22628 828]\n"
] ]
} }
], ],
"execution_count": 55 "execution_count": 15
}, },
{ {
"metadata": {}, "metadata": {},
@@ -586,8 +582,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:44.732450Z", "end_time": "2025-03-24T09:48:11.235048Z",
"start_time": "2025-03-20T15:13:44.729920Z" "start_time": "2025-03-24T09:48:11.232871Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -599,7 +595,7 @@
"encoded_mask = user_cipher.encode_base64_str(mask)" "encoded_mask = user_cipher.encode_base64_str(mask)"
], ],
"outputs": [], "outputs": [],
"execution_count": 56 "execution_count": 16
}, },
{ {
"metadata": {}, "metadata": {},
@@ -616,8 +612,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:45.055535Z", "end_time": "2025-03-24T09:48:11.484858Z",
"start_time": "2025-03-20T15:13:44.751147Z" "start_time": "2025-03-24T09:48:11.252168Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -631,7 +627,7 @@
"passcode_hash = bcrypt.hashpw(passcode_prehash, bcrypt.gensalt(rounds=12)).decode(\"utf-8\")" "passcode_hash = bcrypt.hashpw(passcode_prehash, bcrypt.gensalt(rounds=12)).decode(\"utf-8\")"
], ],
"outputs": [], "outputs": [],
"execution_count": 57 "execution_count": 17
}, },
{ {
"metadata": {}, "metadata": {},
@@ -645,8 +641,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:45.367717Z", "end_time": "2025-03-24T09:48:11.722985Z",
"start_time": "2025-03-20T15:13:45.061644Z" "start_time": "2025-03-24T09:48:11.488809Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -664,20 +660,20 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Key 0: [24 13 20 21 4 17]\n", "Key 0: [18 1 2 21 28 5]\n",
"Key 1: [ 6 1 26 27 28 29]\n", "Key 1: [12 19 26 15 10 29]\n",
"Key 2: [18 7 8 15 16 23]\n", "Key 2: [ 0 25 14 3 4 23]\n",
"Key 3: [ 0 19 2 3 22 11]\n", "Key 3: [ 6 7 8 27 16 11]\n",
"Key 4: [12 25 14 9 10 5]\n", "Key 4: [24 13 20 9 22 17]\n",
"User Passcode: [4, 9, 5, 18]\n", "User Passcode: [8, 15, 17, 7]\n",
"\n", "\n",
"Selected Keys:\n", "Selected Keys:\n",
" [0, 4, 4, 2]\n", " [3, 1, 4, 3]\n",
"\n" "\n"
] ]
} }
], ],
"execution_count": 58 "execution_count": 18
}, },
{ {
"metadata": {}, "metadata": {},
@@ -704,8 +700,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:45.379898Z", "end_time": "2025-03-24T09:48:11.731909Z",
"start_time": "2025-03-20T15:13:45.377353Z" "start_time": "2025-03-24T09:48:11.729517Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -718,7 +714,7 @@
"user_position_key = customer.cipher.position_key ^ user.cipher.combined_position_key" "user_position_key = customer.cipher.position_key ^ user.cipher.combined_position_key"
], ],
"outputs": [], "outputs": [],
"execution_count": 59 "execution_count": 19
}, },
{ {
"metadata": {}, "metadata": {},
@@ -732,8 +728,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:45.391901Z", "end_time": "2025-03-24T09:48:11.750757Z",
"start_time": "2025-03-20T15:13:45.389499Z" "start_time": "2025-03-24T09:48:11.748661Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -743,7 +739,7 @@
"assert passcode_property_indices == presumed_property_indices\n" "assert passcode_property_indices == presumed_property_indices\n"
], ],
"outputs": [], "outputs": [],
"execution_count": 60 "execution_count": 20
}, },
{ {
"metadata": {}, "metadata": {},
@@ -753,8 +749,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:45.711702Z", "end_time": "2025-03-24T09:48:11.995883Z",
"start_time": "2025-03-20T15:13:45.407474Z" "start_time": "2025-03-24T09:48:11.760909Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -763,7 +759,7 @@
"assert valid_nkode" "assert valid_nkode"
], ],
"outputs": [], "outputs": [],
"execution_count": 61 "execution_count": 21
}, },
{ {
"metadata": {}, "metadata": {},
@@ -779,8 +775,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:46.331470Z", "end_time": "2025-03-24T09:48:12.479529Z",
"start_time": "2025-03-20T15:13:45.715778Z" "start_time": "2025-03-24T09:48:12.009222Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -806,15 +802,15 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Old User Cipher and Mask\n", "Old User Cipher and Mask\n",
"mask: xetVN/8taK1lhtrDjt4w0M4pprQ=, code: $2b$12$6JzDrPs.dAb0iOIvm8afKuwf.Z8qKtg89Nnhx..tlBOD5y1MYMR4y\n", "mask: nheBuPsWD2zInvscNhsJO6Wy0kU=, code: $2b$12$bsV3i1BsLH6nHCZOPVHns.b1ARmpuJETxFPZohcPG2OKO9Mr3B1du\n",
"\n", "\n",
"New User Cipher and Mask\n", "New User Cipher and Mask\n",
"mask: WsKTIcZVngijEKlMfoF2UG5Rz9I=, code: $2b$12$jvQ..z4tPFII5dLXP0D2LOPrypDSB7yoRH6E0SZPO/yIIcZVtgCTS\n", "mask: ionSnD9+/0DS5ul8+wMyi3PNCRA=, code: $2b$12$MZejDYT1GDoyE0w1TdFGCedyBD4BY2n6VjLQW73TwJPLyjiimdpA2\n",
"\n" "\n"
] ]
} }
], ],
"execution_count": 62 "execution_count": 22
}, },
{ {
"metadata": {}, "metadata": {},
@@ -827,8 +823,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:46.344092Z", "end_time": "2025-03-24T09:48:12.490144Z",
"start_time": "2025-03-20T15:13:46.339802Z" "start_time": "2025-03-24T09:48:12.486157Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -841,7 +837,7 @@
"new_pos = customer.cipher.position_key" "new_pos = customer.cipher.position_key"
], ],
"outputs": [], "outputs": [],
"execution_count": 63 "execution_count": 23
}, },
{ {
"metadata": {}, "metadata": {},
@@ -861,8 +857,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:46.361420Z", "end_time": "2025-03-24T09:48:12.503462Z",
"start_time": "2025-03-20T15:13:46.359046Z" "start_time": "2025-03-24T09:48:12.501409Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -875,7 +871,7 @@
" user.cipher.property_key = user.cipher.property_key ^ props_xor" " user.cipher.property_key = user.cipher.property_key ^ props_xor"
], ],
"outputs": [], "outputs": [],
"execution_count": 64 "execution_count": 24
}, },
{ {
"metadata": {}, "metadata": {},
@@ -888,8 +884,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-20T15:13:46.679562Z", "end_time": "2025-03-24T09:48:12.759002Z",
"start_time": "2025-03-20T15:13:46.371777Z" "start_time": "2025-03-24T09:48:12.522251Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -904,7 +900,7 @@
" user.renew = False" " user.renew = False"
], ],
"outputs": [], "outputs": [],
"execution_count": 65 "execution_count": 25
} }
], ],
"metadata": { "metadata": {

View File

@@ -1,8 +1,5 @@
from dataclasses import dataclass from dataclasses import dataclass
from uuid import UUID, uuid4 from uuid import UUID, uuid4
import numpy as np
from src.customer_cipher import CustomerCipher from src.customer_cipher import CustomerCipher
from src.models import NKodePolicy from src.models import NKodePolicy
from src.user import User from src.user import User

View File

@@ -28,3 +28,7 @@ def keypad_md_table(keypad_list: np.ndarray, keypad_size: KeypadSize) -> str:
table += "|".join([str(prop) for prop in keypad[key]]) table += "|".join([str(prop) for prop in keypad[key]])
table += "|" table += "|"
return table return table
def select_keys_with_passcode_values(user_passcode_idxs: list[int], keypad: np.ndarray, props_per_key: int) -> list[int]:
indices = [np.where(keypad == prop)[0][0] for prop in user_passcode_idxs]
return [int(index // props_per_key) for index in indices]