rename attribute to property

This commit is contained in:
2025-03-14 09:35:19 -05:00
parent 1e2dfa9c9c
commit 1162bd54e1
12 changed files with 187 additions and 188 deletions

View File

@@ -44,8 +44,8 @@
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T11:14:49.006056Z", "end_time": "2025-03-14T14:34:55.702615Z",
"start_time": "2025-03-14T11:14:48.964902Z" "start_time": "2025-03-14T14:34:55.694963Z"
} }
}, },
"outputs": [ "outputs": [
@@ -60,7 +60,7 @@
"output_type": "display_data" "output_type": "display_data"
} }
], ],
"execution_count": 1 "execution_count": 4
}, },
{ {
"cell_type": "code", "cell_type": "code",
@@ -73,8 +73,8 @@
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T11:15:32.023001Z", "end_time": "2025-03-14T14:34:55.718161Z",
"start_time": "2025-03-14T11:15:32.009838Z" "start_time": "2025-03-14T14:34:55.714512Z"
} }
}, },
"outputs": [ "outputs": [
@@ -83,13 +83,13 @@
"text/plain": [ "text/plain": [
"<IPython.core.display.Markdown object>" "<IPython.core.display.Markdown object>"
], ],
"text/markdown": "|key|set0|set1|set2|set3|\n|-|-|-|-|-|\n|key1|4|40|44|400|\n|key2|3|30|33|300|\n|key3|2|20|22|200|\n|key4|1|10|11|100|\n|key5|5|50|55|500|" "text/markdown": "|key|set0|set1|set2|set3|\n|-|-|-|-|-|\n|key1|1|10|11|100|\n|key2|4|40|44|400|\n|key3|3|30|33|300|\n|key4|2|20|22|200|\n|key5|5|50|55|500|"
}, },
"metadata": {}, "metadata": {},
"output_type": "display_data" "output_type": "display_data"
} }
], ],
"execution_count": 3 "execution_count": 5
}, },
{ {
"cell_type": "code", "cell_type": "code",
@@ -105,8 +105,8 @@
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T11:17:30.317806Z", "end_time": "2025-03-14T14:34:55.731332Z",
"start_time": "2025-03-14T11:17:30.313082Z" "start_time": "2025-03-14T14:34:55.728135Z"
} }
}, },
"outputs": [ "outputs": [
@@ -115,13 +115,13 @@
"text/plain": [ "text/plain": [
"<IPython.core.display.Markdown object>" "<IPython.core.display.Markdown object>"
], ],
"text/markdown": "|key|set0|set1|set2|set3|\n|-|-|-|-|-|\n|key1|2|50|33|100|\n|key2|1|40|22|500|\n|key3|5|30|11|400|\n|key4|4|20|55|300|\n|key5|3|10|44|200|" "text/markdown": "|key|set0|set1|set2|set3|\n|-|-|-|-|-|\n|key1|5|30|44|100|\n|key2|1|20|33|400|\n|key3|4|50|22|300|\n|key4|3|10|55|200|\n|key5|2|40|11|500|"
}, },
"metadata": {}, "metadata": {},
"output_type": "display_data" "output_type": "display_data"
} }
], ],
"execution_count": 5 "execution_count": 6
} }
], ],
"metadata": { "metadata": {

View File

@@ -12,12 +12,12 @@
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.423890Z", "end_time": "2025-03-14T14:35:01.634660Z",
"start_time": "2025-03-14T14:18:14.420788Z" "start_time": "2025-03-14T14:35:01.631713Z"
} }
}, },
"outputs": [], "outputs": [],
"execution_count": 23 "execution_count": 67
}, },
{ {
"cell_type": "code", "cell_type": "code",
@@ -26,26 +26,26 @@
" 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: list[int], keypad: np.ndarray, attrs_per_key: int) -> list[int]:\n", "def select_keys_with_passcode_values(user_passcode: list[int], keypad: np.ndarray, props_per_key: int) -> list[int]:\n",
" indices = [np.where(keypad == attr)[0][0] for attr in user_passcode]\n", " indices = [np.where(keypad == prop)[0][0] for prop in user_passcode]\n",
" return [int(index // attrs_per_key) for index in indices]\n", " return [int(index // props_per_key) for index in indices]\n",
"\n", "\n",
"\n", "\n",
"def keypad_view(keypad: np.ndarray, attrs_per_key: int):\n", "def keypad_view(keypad: np.ndarray, props_per_key: int):\n",
" print(\"Keypad View\")\n", " print(\"Keypad View\")\n",
" interface_keypad = keypad.reshape(-1, attrs_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",
" print(f\"Key {idx}: {key_vals}\")\n" " print(f\"Key {idx}: {key_vals}\")\n"
], ],
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.434459Z", "end_time": "2025-03-14T14:35:01.653961Z",
"start_time": "2025-03-14T14:18:14.430679Z" "start_time": "2025-03-14T14:35:01.650229Z"
} }
}, },
"outputs": [], "outputs": [],
"execution_count": 24 "execution_count": 68
}, },
{ {
"cell_type": "code", "cell_type": "code",
@@ -55,12 +55,12 @@
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.453086Z", "end_time": "2025-03-14T14:35:01.663429Z",
"start_time": "2025-03-14T14:18:14.451030Z" "start_time": "2025-03-14T14:35:01.661723Z"
} }
}, },
"outputs": [], "outputs": [],
"execution_count": 25 "execution_count": 69
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
@@ -100,12 +100,12 @@
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.461793Z", "end_time": "2025-03-14T14:35:01.675378Z",
"start_time": "2025-03-14T14:18:14.457601Z" "start_time": "2025-03-14T14:35:01.671221Z"
} }
}, },
"outputs": [], "outputs": [],
"execution_count": 26 "execution_count": 70
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
@@ -138,8 +138,8 @@
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.472200Z", "end_time": "2025-03-14T14:35:01.692557Z",
"start_time": "2025-03-14T14:18:14.469516Z" "start_time": "2025-03-14T14:35:01.689797Z"
} }
}, },
"outputs": [ "outputs": [
@@ -147,17 +147,17 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Customer Set Key: [57513 39162 37238 40595 30029 8573]\n", "Customer Set Key: [21871 61274 2713 19029 26505 50649]\n",
"Customer properties Key:\n", "Customer properties Key:\n",
"[14659 8841 6728 32702 39675 63074]\n", "[42655 23174 1254 25551 11488 27210]\n",
"[19274 15250 33729 24532 34839 38348]\n", "[60953 53938 20104 25057 1695 3339]\n",
"[ 2539 51139 60808 11045 55452 61221]\n", "[32918 29164 48427 35503 41361 24040]\n",
"[55550 11904 10001 59259 26026 26740]\n", "[44451 37655 36339 20189 49770 11581]\n",
"[59910 49698 45525 62003 49414 40644]\n" "[31824 8094 2501 29432 12778 20956]\n"
] ]
} }
], ],
"execution_count": 27 "execution_count": 71
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
@@ -171,14 +171,14 @@
"source": [ "source": [
"set_properties_dict = dict(zip(customer.cipher.set_key, customer_prop_keypad.T))\n", "set_properties_dict = dict(zip(customer.cipher.set_key, customer_prop_keypad.T))\n",
"print(f\"Set to Properties Map:\")\n", "print(f\"Set to Properties Map:\")\n",
"for set_val, attrs in set_properties_dict.items():\n", "for set_val, props in set_properties_dict.items():\n",
" print(f\"{set_val}: {attrs}\")" " print(f\"{set_val}: {props}\")"
], ],
"metadata": { "metadata": {
"collapsed": false, "collapsed": false,
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.486583Z", "end_time": "2025-03-14T14:35:01.702167Z",
"start_time": "2025-03-14T14:18:14.484301Z" "start_time": "2025-03-14T14:35:01.699777Z"
} }
}, },
"outputs": [ "outputs": [
@@ -187,16 +187,16 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Set to Properties Map:\n", "Set to Properties Map:\n",
"57513: [14659 19274 2539 55550 59910]\n", "21871: [42655 60953 32918 44451 31824]\n",
"39162: [ 8841 15250 51139 11904 49698]\n", "61274: [23174 53938 29164 37655 8094]\n",
"37238: [ 6728 33729 60808 10001 45525]\n", "2713: [ 1254 20104 48427 36339 2501]\n",
"40595: [32702 24532 11045 59259 62003]\n", "19029: [25551 25057 35503 20189 29432]\n",
"30029: [39675 34839 55452 26026 49414]\n", "26505: [11488 1695 41361 49770 12778]\n",
"8573: [63074 38348 61221 26740 40644]\n" "50649: [27210 3339 24040 11581 20956]\n"
] ]
} }
], ],
"execution_count": 28 "execution_count": 72
}, },
{ {
"metadata": {}, "metadata": {},
@@ -218,8 +218,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.510067Z", "end_time": "2025-03-14T14:35:01.722470Z",
"start_time": "2025-03-14T14:18:14.507204Z" "start_time": "2025-03-14T14:35:01.719357Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -232,15 +232,15 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"[[ 1 7 13 19 25]\n", "[[24 0 12 6 18]\n",
" [ 0 6 12 18 24]\n", " [28 4 16 10 22]\n",
" [ 5 11 17 23 29]\n", " [27 3 15 9 21]\n",
" [ 2 8 14 20 26]\n", " [26 2 14 8 20]\n",
" [ 4 10 16 22 28]]\n" " [25 1 13 7 19]]\n"
] ]
} }
], ],
"execution_count": 29 "execution_count": 73
}, },
{ {
"metadata": {}, "metadata": {},
@@ -253,8 +253,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.535581Z", "end_time": "2025-03-14T14:35:01.746158Z",
"start_time": "2025-03-14T14:18:14.531909Z" "start_time": "2025-03-14T14:35:01.742671Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -266,8 +266,8 @@
"selected_keys_set = select_keys_with_passcode_values(user_passcode, signup_keypad, keypad_size.numb_of_keys)\n", "selected_keys_set = select_keys_with_passcode_values(user_passcode, signup_keypad, keypad_size.numb_of_keys)\n",
"print(f\"User Passcode: {user_passcode}\")\n", "print(f\"User Passcode: {user_passcode}\")\n",
"print(f\"Selected Keys\\n{selected_keys_set}\")\n", "print(f\"Selected Keys\\n{selected_keys_set}\")\n",
"server_side_attr = [int(customer.cipher.prop_key[idx]) for idx in user_passcode]\n", "server_side_prop = [int(customer.cipher.prop_key[idx]) for idx in user_passcode]\n",
"print(f\"User Passcode Server-side properties: {server_side_attr}\")" "print(f\"User Passcode Server-side properties: {server_side_prop}\")"
], ],
"outputs": [ "outputs": [
{ {
@@ -275,25 +275,25 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Keypad View\n", "Keypad View\n",
"Key 0: [ 1 7 13 19 25]\n", "Key 0: [24 0 12 6 18]\n",
"Key 1: [ 0 6 12 18 24]\n", "Key 1: [28 4 16 10 22]\n",
"Key 2: [ 5 11 17 23 29]\n", "Key 2: [27 3 15 9 21]\n",
"Key 3: [ 2 8 14 20 26]\n", "Key 3: [26 2 14 8 20]\n",
"Key 4: [ 4 10 16 22 28]\n", "Key 4: [25 1 13 7 19]\n",
"User Passcode: [ 1 7 13 19]\n", "User Passcode: [24 0 12 6]\n",
"Selected Keys\n", "Selected Keys\n",
"[0, 0, 0, 0]\n", "[0, 0, 0, 0]\n",
"User Passcode Server-side properties: [8841, 15250, 51139, 11904]\n" "User Passcode Server-side properties: [31824, 42655, 32918, 60953]\n"
] ]
} }
], ],
"execution_count": 30 "execution_count": 74
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.556541Z", "end_time": "2025-03-14T14:35:01.770157Z",
"start_time": "2025-03-14T14:18:14.553217Z" "start_time": "2025-03-14T14:35:01.766784Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -309,23 +309,23 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Keypad View\n", "Keypad View\n",
"Key 0: [ 0 11 16 20 25]\n", "Key 0: [26 3 16 6 19]\n",
"Key 1: [ 2 6 13 22 29]\n", "Key 1: [27 0 13 10 20]\n",
"Key 2: [ 4 8 17 19 24]\n", "Key 2: [24 4 14 7 21]\n",
"Key 3: [ 1 10 12 23 26]\n", "Key 3: [28 1 15 8 18]\n",
"Key 4: [ 5 7 14 18 28]\n", "Key 4: [25 2 12 9 22]\n",
"Selected Keys\n", "Selected Keys\n",
"[3, 4, 1, 2]\n" "[2, 1, 4, 0]\n"
] ]
} }
], ],
"execution_count": 31 "execution_count": 75
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.884832Z", "end_time": "2025-03-14T14:35:02.101712Z",
"start_time": "2025-03-14T14:18:14.575902Z" "start_time": "2025-03-14T14:35:01.792851Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -343,7 +343,7 @@
] ]
} }
], ],
"execution_count": 32 "execution_count": 76
}, },
{ {
"metadata": {}, "metadata": {},
@@ -362,8 +362,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.894865Z", "end_time": "2025-03-14T14:35:02.115075Z",
"start_time": "2025-03-14T14:18:14.889948Z" "start_time": "2025-03-14T14:35:02.110397Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -389,22 +389,22 @@
" max_nkode_len=customer.nkode_policy.max_nkode_len, \n", " max_nkode_len=customer.nkode_policy.max_nkode_len, \n",
")\n", ")\n",
"\n", "\n",
"passcode_server_attr = [int(customer.cipher.prop_key[idx]) for idx in user_passcode]\n", "passcode_server_prop = [int(customer.cipher.prop_key[idx]) for idx in user_passcode]\n",
"passcode_server_set = [int(customer.cipher.get_prop_set_val(attr)) for attr in passcode_server_attr]\n", "passcode_server_set = [int(customer.cipher.get_prop_set_val(prop)) for prop in passcode_server_prop]\n",
"print(f\"Passcode Set Vals: {passcode_server_set}\")\n", "print(f\"Passcode Set Vals: {passcode_server_set}\")\n",
"print(f\"Passcode Attr Vals: {passcode_server_attr}\")" "print(f\"Passcode prop Vals: {passcode_server_prop}\")"
], ],
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Passcode Set Vals: [39162, 39162, 39162, 39162]\n", "Passcode Set Vals: [21871, 21871, 21871, 21871]\n",
"Passcode Attr Vals: [8841, 15250, 51139, 11904]\n" "Passcode prop Vals: [31824, 42655, 32918, 60953]\n"
] ]
} }
], ],
"execution_count": 33 "execution_count": 77
}, },
{ {
"metadata": {}, "metadata": {},
@@ -426,8 +426,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:14.917821Z", "end_time": "2025-03-14T14:35:02.132228Z",
"start_time": "2025-03-14T14:18:14.914851Z" "start_time": "2025-03-14T14:35:02.129307Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -441,7 +441,7 @@
"mask = user_keys.encode_base64_str(ciphered_mask)" "mask = user_keys.encode_base64_str(ciphered_mask)"
], ],
"outputs": [], "outputs": [],
"execution_count": 34 "execution_count": 78
}, },
{ {
"metadata": {}, "metadata": {},
@@ -450,16 +450,16 @@
"#### Encipher Passcode\n", "#### Encipher Passcode\n",
"UserCipherKeys.encipher_salt_hash_code:\n", "UserCipherKeys.encipher_salt_hash_code:\n",
"\n", "\n",
"- ciphered_customer_attr = alpha_key ^ customer_attr\n", "- ciphered_customer_prop = alpha_key ^ customer_prop\n",
"- ciphered_passcode_i = pass_key_i ^ ciphered_customer_attr_i\n", "- ciphered_passcode_i = pass_key_i ^ ciphered_customer_prop_i\n",
"- code = hash(ciphered_passcode, salt)" "- code = hash(ciphered_passcode, salt)"
] ]
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:15.243102Z", "end_time": "2025-03-14T14:35:02.448903Z",
"start_time": "2025-03-14T14:18:14.937865Z" "start_time": "2025-03-14T14:35:02.143953Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -468,13 +468,13 @@
"import hashlib\n", "import hashlib\n",
"import base64\n", "import base64\n",
"\n", "\n",
"ciphered_customer_attrs = np.bitwise_xor(customer.cipher.prop_key, user_keys.prop_key)\n", "ciphered_customer_props = np.bitwise_xor(customer.cipher.prop_key, user_keys.prop_key)\n",
"passcode_ciphered_attrs = [ciphered_customer_attrs[idx] for idx in user_passcode]\n", "passcode_ciphered_props = [ciphered_customer_props[idx] for idx in user_passcode]\n",
"pad_len = customer.nkode_policy.max_nkode_len - passcode_len\n", "pad_len = customer.nkode_policy.max_nkode_len - passcode_len\n",
"\n", "\n",
"passcode_ciphered_attrs.extend([0 for _ in range(pad_len)])\n", "passcode_ciphered_props.extend([0 for _ in range(pad_len)])\n",
"\n", "\n",
"ciphered_code = np.bitwise_xor(passcode_ciphered_attrs, user_keys.pass_key)\n", "ciphered_code = np.bitwise_xor(passcode_ciphered_props, user_keys.pass_key)\n",
"\n", "\n",
"#passcode_bytes = int_array_to_bytes(ciphered_code)\n", "#passcode_bytes = int_array_to_bytes(ciphered_code)\n",
"passcode_bytes = ciphered_code.tobytes()\n", "passcode_bytes = ciphered_code.tobytes()\n",
@@ -483,13 +483,13 @@
"code = hashed_data.decode(\"utf-8\")" "code = hashed_data.decode(\"utf-8\")"
], ],
"outputs": [], "outputs": [],
"execution_count": 35 "execution_count": 79
}, },
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:15.249186Z", "end_time": "2025-03-14T14:35:02.459349Z",
"start_time": "2025-03-14T14:18:15.247147Z" "start_time": "2025-03-14T14:35:02.457325Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -502,7 +502,7 @@
")" ")"
], ],
"outputs": [], "outputs": [],
"execution_count": 36 "execution_count": 80
}, },
{ {
"metadata": {}, "metadata": {},
@@ -516,8 +516,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:15.563030Z", "end_time": "2025-03-14T14:35:02.775720Z",
"start_time": "2025-03-14T14:18:15.257823Z" "start_time": "2025-03-14T14:35:02.468856Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -535,17 +535,17 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Keypad View\n", "Keypad View\n",
"Key 0: [0 1 2 3 4 5]\n", "Key 0: [24 25 26 27 28 29]\n",
"Key 1: [ 6 7 8 9 10 11]\n", "Key 1: [0 1 2 3 4 5]\n",
"Key 2: [12 13 14 15 16 17]\n", "Key 2: [12 13 14 15 16 17]\n",
"Key 3: [18 19 20 21 22 23]\n", "Key 3: [ 6 7 8 9 10 11]\n",
"Key 4: [24 25 26 27 28 29]\n", "Key 4: [18 19 20 21 22 23]\n",
"Selected Keys: [0, 1, 2, 3]\n", "Selected Keys: [0, 1, 2, 3]\n",
"True\n" "True\n"
] ]
} }
], ],
"execution_count": 37 "execution_count": 81
}, },
{ {
"metadata": {}, "metadata": {},
@@ -577,8 +577,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:15.574718Z", "end_time": "2025-03-14T14:35:02.787442Z",
"start_time": "2025-03-14T14:18:15.571571Z" "start_time": "2025-03-14T14:35:02.784207Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -598,11 +598,11 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"[39162, 39162, 39162, 39162]\n" "[21871, 21871, 21871, 21871]\n"
] ]
} }
], ],
"execution_count": 38 "execution_count": 82
}, },
{ {
"metadata": {}, "metadata": {},
@@ -612,8 +612,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:15.591180Z", "end_time": "2025-03-14T14:35:02.805826Z",
"start_time": "2025-03-14T14:18:15.587992Z" "start_time": "2025-03-14T14:35:02.802523Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -624,8 +624,8 @@
"for idx in range(passcode_len):\n", "for idx in range(passcode_len):\n",
" key_numb = selected_keys_login[idx]\n", " key_numb = selected_keys_login[idx]\n",
" set_idx = set_vals_idx[idx]\n", " set_idx = set_vals_idx[idx]\n",
" selected_attr_idx = customer.users[username].user_keypad.get_prop_idx_by_keynumb_setidx(key_numb, set_idx)\n", " selected_prop_idx = customer.users[username].user_keypad.get_prop_idx_by_keynumb_setidx(key_numb, set_idx)\n",
" presumed_selected_properties_idx.append(selected_attr_idx)\n", " presumed_selected_properties_idx.append(selected_prop_idx)\n",
"\n", "\n",
"print(user_passcode.tolist() == presumed_selected_properties_idx)" "print(user_passcode.tolist() == presumed_selected_properties_idx)"
], ],
@@ -638,7 +638,7 @@
] ]
} }
], ],
"execution_count": 39 "execution_count": 83
}, },
{ {
"metadata": {}, "metadata": {},
@@ -648,8 +648,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:15.916787Z", "end_time": "2025-03-14T14:35:03.129079Z",
"start_time": "2025-03-14T14:18:15.610843Z" "start_time": "2025-03-14T14:35:02.822467Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -666,7 +666,7 @@
] ]
} }
], ],
"execution_count": 40 "execution_count": 84
}, },
{ {
"metadata": {}, "metadata": {},
@@ -682,8 +682,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:16.539065Z", "end_time": "2025-03-14T14:35:03.757448Z",
"start_time": "2025-03-14T14:18:15.926843Z" "start_time": "2025-03-14T14:35:03.142511Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -708,14 +708,14 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"mask: 4NCIa/fFtx0udGaF1ub+O/6oU04=, code: $2b$12$XuGO.allDcb91peVIjwsq./Ba/TZI3wxAc0acgWkApzkzGWfwPQCC\n", "mask: QUR1wAPG8jJh/nG1LbgMIupAY1I=, code: $2b$12$0Ia665myY64l8.UyKRc4tu/OR.0BG6KFLyXcuDdIXrDkpP6cjo7xO\n",
"mask: 4NCIa/fFtx0udGaF1ub+O/6oU04=, code: $2b$12$XuGO.allDcb91peVIjwsq./Ba/TZI3wxAc0acgWkApzkzGWfwPQCC\n", "mask: QUR1wAPG8jJh/nG1LbgMIupAY1I=, code: $2b$12$0Ia665myY64l8.UyKRc4tu/OR.0BG6KFLyXcuDdIXrDkpP6cjo7xO\n",
"True\n", "True\n",
"mask: ceaWZR+hNRpEkj3fq1cfPu1Zyok=, code: $2b$12$q7lqdTj6qBMDDGEog9Pq3.M2Wso0TI8cx4/PhOK/fE1mhsws2FGe.\n" "mask: SB1G0mGYnu2Fy2usk08r9uTTugo=, code: $2b$12$pKJtlWu9gwXqA4b.Q/WEZ.yzz9ntnXnFSindkyVOWa3sNOoVd0LLK\n"
] ]
} }
], ],
"execution_count": 41 "execution_count": 85
}, },
{ {
"metadata": {}, "metadata": {},
@@ -729,8 +729,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:16.551437Z", "end_time": "2025-03-14T14:35:03.770972Z",
"start_time": "2025-03-14T14:18:16.547371Z" "start_time": "2025-03-14T14:35:03.766802Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -742,7 +742,7 @@
"new_sets = customer.cipher.set_key" "new_sets = customer.cipher.set_key"
], ],
"outputs": [], "outputs": [],
"execution_count": 42 "execution_count": 86
}, },
{ {
"metadata": {}, "metadata": {},
@@ -755,8 +755,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:16.568881Z", "end_time": "2025-03-14T14:35:03.781705Z",
"start_time": "2025-03-14T14:18:16.566223Z" "start_time": "2025-03-14T14:35:03.779309Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -769,7 +769,7 @@
" user.cipher.prop_key = np.bitwise_xor(user.cipher.prop_key, props_xor)" " user.cipher.prop_key = np.bitwise_xor(user.cipher.prop_key, props_xor)"
], ],
"outputs": [], "outputs": [],
"execution_count": 43 "execution_count": 87
}, },
{ {
"metadata": {}, "metadata": {},
@@ -779,8 +779,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2025-03-14T14:18:16.884432Z", "end_time": "2025-03-14T14:35:04.107750Z",
"start_time": "2025-03-14T14:18:16.572989Z" "start_time": "2025-03-14T14:35:03.797025Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -794,7 +794,7 @@
"user.renew = False" "user.renew = False"
], ],
"outputs": [], "outputs": [],
"execution_count": 44 "execution_count": 88
} }
], ],
"metadata": { "metadata": {

View File

@@ -38,11 +38,11 @@ class Customer:
for idx in range(passcode_len): for idx in range(passcode_len):
key_numb = selected_keys[idx] key_numb = selected_keys[idx]
set_idx = set_vals_idx[idx] set_idx = set_vals_idx[idx]
selected_attr_idx = user.user_keypad.get_prop_idx_by_keynumb_setidx(key_numb, set_idx) selected_prop_idx = user.user_keypad.get_prop_idx_by_keynumb_setidx(key_numb, set_idx)
presumed_property_idxs.append(selected_attr_idx) presumed_property_idxs.append(selected_prop_idx)
enciphered_attr = user.cipher.encipher_salt_hash_code(presumed_property_idxs, self.cipher) enciphered_prop = user.cipher.encipher_salt_hash_code(presumed_property_idxs, self.cipher)
if enciphered_attr != user.enciphered_passcode.code: if enciphered_prop != user.enciphered_passcode.code:
return False return False
if user.renew: if user.renew:

View File

@@ -12,7 +12,7 @@ class NKodePolicy:
min_nkode_len: int = 4 min_nkode_len: int = 4
distinct_sets: int = 0 distinct_sets: int = 0
distinct_properties: int = 4 distinct_properties: int = 4
byte_len: int = 2 # Todo: this should change the total number of bytes an attribute or set value can be byte_len: int = 2 # Todo: this should change the total number of bytes an properities or set value can be
lock_out: int = 5 lock_out: int = 5
expiration: int = -1 # in seconds -1 means nkode never expires expiration: int = -1 # in seconds -1 means nkode never expires

View File

@@ -74,8 +74,8 @@ class UserCipher:
customer_cipher: CustomerCipher customer_cipher: CustomerCipher
) -> EncipheredNKode: ) -> EncipheredNKode:
passcode_prop_idx_array = np.array(passcode_prop_idx, dtype=np.uint16) passcode_prop_idx_array = np.array(passcode_prop_idx, dtype=np.uint16)
passcode_attrs = np.array([customer_cipher.prop_key[idx] for idx in passcode_prop_idx_array], dtype=np.uint16) passcode_props = np.array([customer_cipher.prop_key[idx] for idx in passcode_prop_idx_array], dtype=np.uint16)
passcode_sets = np.array([customer_cipher.get_prop_set_val(attr) for attr in passcode_attrs], dtype=np.uint16) passcode_sets = np.array([customer_cipher.get_prop_set_val(prop) for prop in passcode_props], dtype=np.uint16)
mask = self.encipher_mask(passcode_sets.tolist(), customer_cipher) mask = self.encipher_mask(passcode_sets.tolist(), customer_cipher)
code = self.encipher_salt_hash_code(passcode_prop_idx, customer_cipher) code = self.encipher_salt_hash_code(passcode_prop_idx, customer_cipher)
return EncipheredNKode( return EncipheredNKode(
@@ -90,24 +90,24 @@ class UserCipher:
) -> str: ) -> str:
passcode_prop_idx_array = np.array(passcode_prop_idx, dtype=np.uint16) passcode_prop_idx_array = np.array(passcode_prop_idx, dtype=np.uint16)
passcode_len = len(passcode_prop_idx_array) passcode_len = len(passcode_prop_idx_array)
passcode_attrs = np.array([customer_prop.prop_key[idx] for idx in passcode_prop_idx_array], dtype=np.uint16) passcode_props = np.array([customer_prop.prop_key[idx] for idx in passcode_prop_idx_array], dtype=np.uint16)
passcode_cipher = self.pass_key.copy() passcode_cipher = self.pass_key.copy()
for idx in range(passcode_len): for idx in range(passcode_len):
attr_idx = passcode_prop_idx_array[idx] prop_idx = passcode_prop_idx_array[idx]
passcode_cipher[idx] = passcode_cipher[idx] ^ self.prop_key[attr_idx] ^ passcode_attrs[idx] passcode_cipher[idx] = passcode_cipher[idx] ^ self.prop_key[prop_idx] ^ passcode_props[idx]
return self._hash_passcode(passcode_cipher) return self._hash_passcode(passcode_cipher)
def encipher_mask( def encipher_mask(
self, self,
passcode_sets: list[int], passcode_sets: list[int],
customer_attributes: CustomerCipher customer_properites: CustomerCipher
) -> str: ) -> str:
padded_passcode_sets = self.pad_user_mask(passcode_sets, customer_attributes.set_key) padded_passcode_sets = self.pad_user_mask(passcode_sets, customer_properites.set_key)
# Get indices of set values # Get indices of set values
set_idx = np.array([customer_attributes.get_set_index(set_val) for set_val in padded_passcode_sets], set_idx = np.array([customer_properites.get_set_index(set_val) for set_val in padded_passcode_sets],
dtype=np.uint16) dtype=np.uint16)
mask_set_keys = np.array([self.set_key[idx] for idx in set_idx], dtype=np.uint16) mask_set_keys = np.array([self.set_key[idx] for idx in set_idx], dtype=np.uint16)

View File

@@ -22,13 +22,12 @@ class UserKeypad:
raise ValueError("Keypad size is dispersable") raise ValueError("Keypad size is dispersable")
self.random_keypad_shuffle() self.random_keypad_shuffle()
keypad_matrix = self.keypad_matrix() keypad_matrix = self.keypad_matrix()
attr_set_view = keypad_matrix.T prop_set_view = keypad_matrix.T
#attr_set_view = secure_fisher_yates_shuffle(attr_set_view) prop_set_view = np.random.permutation(prop_set_view)
attr_set_view = np.random.permutation(attr_set_view) prop_set_view = prop_set_view[:self.keypad_size.numb_of_keys]
attr_set_view = attr_set_view[:self.keypad_size.numb_of_keys] keypad_matrix = prop_set_view.reshape(-1)
keypad_matrix = attr_set_view.reshape(-1)#matrix_transpose(attr_set_view)
return UserKeypad( return UserKeypad(
keypad=keypad_matrix.reshape(-1),#matrix_to_list(keypad_matrix), keypad=keypad_matrix.reshape(-1),
keypad_size=KeypadSize( keypad_size=KeypadSize(
numb_of_keys=self.keypad_size.numb_of_keys, numb_of_keys=self.keypad_size.numb_of_keys,
props_per_key=self.keypad_size.numb_of_keys props_per_key=self.keypad_size.numb_of_keys
@@ -56,10 +55,10 @@ class UserKeypad:
#shuffled_keys = secure_fisher_yates_shuffle(user_keypad_matrix) #shuffled_keys = secure_fisher_yates_shuffle(user_keypad_matrix)
shuffled_keys = rng.permutation(user_keypad_matrix, axis=0) shuffled_keys = rng.permutation(user_keypad_matrix, axis=0)
#prop_rotation = secure_fisher_yates_shuffle(list(range(self.keypad_size.numb_of_keys)))[:self.keypad_size.props_per_key] #prop_rotation = secure_fisher_yates_shuffle(list(range(self.keypad_size.numb_of_keys)))[:self.keypad_size.props_per_key]
attr_rotation = rng.permutation(list(range(self.keypad_size.numb_of_keys)))[:self.keypad_size.props_per_key] prop_rotation = rng.permutation(list(range(self.keypad_size.numb_of_keys)))[:self.keypad_size.props_per_key]
dispersed_keypad = random_property_rotation( dispersed_keypad = random_property_rotation(
shuffled_keys, shuffled_keys,
attr_rotation.tolist(), prop_rotation.tolist(),
) )
self.keypad = dispersed_keypad.reshape(-1) self.keypad = dispersed_keypad.reshape(-1)
@@ -72,11 +71,11 @@ class UserKeypad:
#user_keypad_matrix = self.keypad_matrix() #user_keypad_matrix = self.keypad_matrix()
#shuffled_keys = secure_fisher_yates_shuffle(user_keypad_matrix) #shuffled_keys = secure_fisher_yates_shuffle(user_keypad_matrix)
#keypad_by_sets = [] #keypad_by_sets = []
#for idx, attrs in enumerate(matrix_transpose(shuffled_keys)): #for idx, props in enumerate(matrix_transpose(shuffled_keys)):
# if idx in selected_sets: # if idx in selected_sets:
# keypad_by_sets.append(secure_fisher_yates_shuffle(attrs)) # keypad_by_sets.append(secure_fisher_yates_shuffle(props))
# else: # else:
# keypad_by_sets.append(attrs) # keypad_by_sets.append(props)
#self.keypad = matrix_to_list(matrix_transpose(keypad_by_sets)) #self.keypad = matrix_to_list(matrix_transpose(keypad_by_sets))
pass pass
@@ -85,9 +84,9 @@ class UserKeypad:
user_keypad_keypad = self.keypad_matrix() user_keypad_keypad = self.keypad_matrix()
graph = {} graph = {}
for key in user_keypad_keypad: for key in user_keypad_keypad:
for attr in key: for prop in key:
graph[attr] = set(key) graph[prop] = set(key)
graph[attr].remove(attr) graph[prop].remove(prop)
return graph return graph
def get_prop_idx_by_keynumb_setidx(self, key_numb: int, set_idx: int) -> int: def get_prop_idx_by_keynumb_setidx(self, key_numb: int, set_idx: int) -> int:
@@ -95,5 +94,5 @@ class UserKeypad:
raise ValueError(f"key_numb must be between 0 and {self.keypad_size.numb_of_keys - 1}") raise ValueError(f"key_numb must be between 0 and {self.keypad_size.numb_of_keys - 1}")
if not (0 <= set_idx < self.keypad_size.props_per_key): if not (0 <= set_idx < self.keypad_size.props_per_key):
raise ValueError(f"set_idx must be between 0 and {self.keypad_size.props_per_key - 1}") raise ValueError(f"set_idx must be between 0 and {self.keypad_size.props_per_key - 1}")
keypad_attr_idx = self.keypad_matrix() keypad_prop_idx = self.keypad_matrix()
return int(keypad_attr_idx[key_numb][set_idx]) return int(keypad_prop_idx[key_numb][set_idx])

View File

@@ -19,14 +19,14 @@ class UserSignupSession:
def deduce_passcode(self, confirm_key_entry: list[int]) -> list[int]: def deduce_passcode(self, confirm_key_entry: list[int]) -> list[int]:
if not all(0 <= key <= self.keypad_size.numb_of_keys for key in confirm_key_entry): if not all(0 <= key <= self.keypad_size.numb_of_keys for key in confirm_key_entry):
raise ValueError("Key values must be within valid range") raise ValueError("Key values must be within valid range")
attrs_per_key = self.keypad_size.props_per_key props_per_key = self.keypad_size.props_per_key
set_key_entry = self.set_key_entry set_key_entry = self.set_key_entry
if len(set_key_entry) != len(confirm_key_entry): if len(set_key_entry) != len(confirm_key_entry):
raise ValueError("Key entry lengths must match") raise ValueError("Key entry lengths must match")
set_keypad = self.set_keypad set_keypad = self.set_keypad
confirm_keypad = self.confirm_keypad confirm_keypad = self.confirm_keypad
set_key_vals = [set_keypad[key * attrs_per_key:(key + 1) * attrs_per_key] for key in set_key_entry] set_key_vals = [set_keypad[key * props_per_key:(key + 1) * props_per_key] for key in set_key_entry]
confirm_key_vals = [confirm_keypad[key * attrs_per_key:(key + 1) * attrs_per_key] for key in confirm_key_vals = [confirm_keypad[key * props_per_key:(key + 1) * props_per_key] for key in
confirm_key_entry] confirm_key_entry]
passcode = [] passcode = []
for idx in range(len(set_key_entry)): for idx in range(len(set_key_entry)):

View File

@@ -2,13 +2,13 @@ import numpy as np
def random_property_rotation( def random_property_rotation(
user_keypad: np.ndarray, user_keypad: np.ndarray,
attr_rotation: list[int] prop_rotation: list[int]
) -> np.ndarray: ) -> np.ndarray:
transposed = user_keypad.T transposed = user_keypad.T
if len(attr_rotation) != len(transposed): if len(prop_rotation) != len(transposed):
raise ValueError("prop_rotation must be the same length as the number of attributes") raise ValueError("prop_rotation must be the same length as the number of properties")
for idx, attr_set in enumerate(transposed): for idx, prop_set in enumerate(transposed):
rotation = attr_rotation[idx] rotation = prop_rotation[idx]
rotation = rotation % len(attr_set) if len(attr_set) > 0 else 0 rotation = rotation % len(prop_set) if len(prop_set) > 0 else 0
transposed[idx] = np.roll(attr_set, rotation) transposed[idx] = np.roll(prop_set, rotation)
return transposed.T return transposed.T

View File

@@ -20,7 +20,7 @@ def test_create_new_user_and_renew_keys(nkode_api, keypad_size, passocode_len):
session_id, set_keypad = nkode_api.generate_signup_keypad(customer_id) session_id, set_keypad = nkode_api.generate_signup_keypad(customer_id)
user_passcode = set_keypad[:passocode_len] user_passcode = set_keypad[:passocode_len]
signup_key_selection = lambda keypad: [int(np.where(keypad == attr)[0][0]) // keypad_size.numb_of_keys for attr in user_passcode] signup_key_selection = lambda keypad: [int(np.where(keypad == prop)[0][0]) // keypad_size.numb_of_keys for prop in user_passcode]
set_key_selection = signup_key_selection(set_keypad) set_key_selection = signup_key_selection(set_keypad)
confirm_keypad = nkode_api.set_nkode(username, customer_id, set_key_selection, session_id) confirm_keypad = nkode_api.set_nkode(username, customer_id, set_key_selection, session_id)
@@ -33,7 +33,7 @@ def test_create_new_user_and_renew_keys(nkode_api, keypad_size, passocode_len):
) )
assert successful_confirm assert successful_confirm
sign_in_key_selection = lambda keypad: [int(np.where(keypad ==attr)[0][0]) // keypad_size.props_per_key for attr in user_passcode] sign_in_key_selection = lambda keypad: [int(np.where(keypad ==prop)[0][0]) // keypad_size.props_per_key for prop in user_passcode]
login_keypad = nkode_api.get_login_keypad(username, customer_id) login_keypad = nkode_api.get_login_keypad(username, customer_id)
login_key_selection = sign_in_key_selection(login_keypad) login_key_selection = sign_in_key_selection(login_keypad)
successful_login = nkode_api.login(customer_id, username, login_key_selection) successful_login = nkode_api.login(customer_id, username, login_key_selection)

View File

@@ -7,9 +7,9 @@ from src.models import KeypadSize
"keypad_size", "keypad_size",
[KeypadSize(numb_of_keys=10, props_per_key=11)] [KeypadSize(numb_of_keys=10, props_per_key=11)]
) )
def test_attr_set_idx(keypad_size): def test_prop_set_idx(keypad_size):
user_keypad = UserKeypad.create(keypad_size) user_keypad = UserKeypad.create(keypad_size)
for attr_idx in range(keypad_size.numb_of_props): for prop_idx in range(keypad_size.numb_of_props):
user_keypad_idx = user_keypad.keypad[attr_idx] user_keypad_idx = user_keypad.keypad[prop_idx]
assert (attr_idx % keypad_size.props_per_key == user_keypad_idx % keypad_size.props_per_key) assert (prop_idx % keypad_size.props_per_key == user_keypad_idx % keypad_size.props_per_key)

View File

@@ -35,7 +35,7 @@ def test_decode_mask(keypad_size, max_nkode_len):
user_keys = UserCipher.create(keypad_size, set_vals, max_nkode_len) user_keys = UserCipher.create(keypad_size, set_vals, max_nkode_len)
passcode = user_keys.encipher_nkode(passcode_entry, customer) passcode = user_keys.encipher_nkode(passcode_entry, customer)
orig_passcode_set_vals = [customer.get_prop_set_val(attr) for attr in passcode_values] orig_passcode_set_vals = [customer.get_prop_set_val(prop) for prop in passcode_values]
passcode_set_vals = user_keys.decipher_mask(passcode.mask, set_vals, len(passcode_entry)) passcode_set_vals = user_keys.decipher_mask(passcode.mask, set_vals, len(passcode_entry))
assert (len(passcode_set_vals) == len(orig_passcode_set_vals)) assert (len(passcode_set_vals) == len(orig_passcode_set_vals))
assert (all(orig_passcode_set_vals[idx] == passcode_set_vals[idx] for idx in range(len(passcode_set_vals)))) assert (all(orig_passcode_set_vals[idx] == passcode_set_vals[idx] for idx in range(len(passcode_set_vals))))

View File

@@ -13,15 +13,15 @@ def test_dispersion(user_keypad):
pre_dispersion_graph = user_keypad.property_adjacency_graph() pre_dispersion_graph = user_keypad.property_adjacency_graph()
user_keypad.disperse_keypad() user_keypad.disperse_keypad()
post_dispersion_graph = user_keypad.property_adjacency_graph() post_dispersion_graph = user_keypad.property_adjacency_graph()
for attr, adj_graph in pre_dispersion_graph.items(): for prop, adj_graph in pre_dispersion_graph.items():
assert (adj_graph.isdisjoint(post_dispersion_graph[attr])) assert (adj_graph.isdisjoint(post_dispersion_graph[prop]))
#def test_shuffle_attrs(user_keypad): #def test_shuffle_props(user_keypad):
# """there's no easy way to test this. At some point we'll have to run this code thousands of time to see if we get # """there's no easy way to test this. At some point we'll have to run this code thousands of time to see if we get
# expected statistical outcomes like: # expected statistical outcomes like:
# - every attribute gets to every key with a uniform distribution # - every property gets to every key with a uniform distribution
# - every attribute is adjacent to every other attribute with uniform distribution # - every property is adjacent to every other property with uniform distribution
# - the order in which the cipher move from key to key is random (i.e. the distance traveled is uniform) # - the order in which the cipher move from key to key is random (i.e. the distance traveled is uniform)
# """ # """
# pre_shuffle_keypad = user_keypad.keypad # pre_shuffle_keypad = user_keypad.keypad