From de1edb946ac74ae5ab93bf0d288942aee1f59835 Mon Sep 17 00:00:00 2001 From: Donovan Date: Wed, 26 Mar 2025 08:02:10 -0500 Subject: [PATCH] add renew --- docs/encipher_decipher_nkode.md | 241 ------------- docs/encipher_decipher_renew_nkode.md | 330 ++++++++++++++++++ .../render_encipher_decipher_diagrams.py | 24 +- ...encipher_decipher_renew_nkode.template.md} | 66 ++++ 4 files changed, 419 insertions(+), 242 deletions(-) delete mode 100644 docs/encipher_decipher_nkode.md create mode 100644 docs/encipher_decipher_renew_nkode.md rename docs/templates/{encipher_decipher_nkode.template.md => encipher_decipher_renew_nkode.template.md} (71%) diff --git a/docs/encipher_decipher_nkode.md b/docs/encipher_decipher_nkode.md deleted file mode 100644 index 45f89ad..0000000 --- a/docs/encipher_decipher_nkode.md +++ /dev/null @@ -1,241 +0,0 @@ -# Encipher and Decipher nKode - -## Customer Policy -- max nkode length: 10 -- number of keys: 6 -- properties per key: 9 -- total number of properties: 54 - -## Customer Cipher -- property key: [ 7528 63893 43548 25423 47744 42591 13947 15495 44997 9610 32248 3295 - 37638 6583 51113 60339 43861 22578 25507 20049 10766 50355 36708 37036 - 12276 25874 63870 49205 70 53112 40483 39973 24671 4447 24361 43982 - 1997 23736 6951 9733 7407 48242 57341 7624 5578 22071 51177 20155 - 2441 15688 7417 935 33982 43009] -- position key: [41987 59995 38795 29405 53271 32296 44523 10502 49338] - - ---- - -## User Cipher -- property key: [25869 62495 1734 362 37984 51592 32568 34493 13441 35472 33999 41683 - 20426 4369 47735 37538 8392 1425 8176 40966 37766 22326 21576 20608 - 6581 21051 52337 10975 19283 32306 52352 6318 26386 36937 16351 38760 - 36505 9636 58306 38636 14299 36502 59745 33866 61255 12802 63463 64177 - 38614 28129 16937 786 31611 60757] -- passcode key: [28207 53281 58835 9812 48933 51588 25408 62022 36721 9334] -- combined position key: [60340 19752 2334 9189 29138 61771 17595 21364 54614] -- mask key: [43734 31472 30293 34641 24055 5782 14606 48388 2666 19217] - -### Combined Postion Key -```mermaid -block-beta - columns 2 - user_pos["user position key:\n[20407 42867 40597 20792 41413 36707 59728 31346 5612]"] - customer_pos["customer position key:\n[41987 59995 38795 29405 53271 32296 44523 10502 49338]"] - space:2 - xor(("XOR")):2 - user_pos --> xor - customer_pos --> xor - space:2 - comb_pos["combined position key\n[60340 19752 2334 9189 29138 61771 17595 21364 54614]"]:2 - xor --> comb_pos -``` - -## User Keypad -- keypad: -- user passcode indices: [37, 38, 40, 10] - -## nKode Cipher - -### Passcode Hash -```mermaid -block-beta - columns 2 - cprop["customer_property_key\n[ 7528 63893 43548 25423 47744 42591 13947 15495 44997 9610 32248 3295 - 37638 6583 51113 60339 43861 22578 25507 20049 10766 50355 36708 37036 - 12276 25874 63870 49205 70 53112 40483 39973 24671 4447 24361 43982 - 1997 23736 6951 9733 7407 48242 57341 7624 5578 22071 51177 20155 - 2441 15688 7417 935 33982 43009]"] - uprop["user_property_key\n[25869 62495 1734 362 37984 51592 32568 34493 13441 35472 33999 41683 - 20426 4369 47735 37538 8392 1425 8176 40966 37766 22326 21576 20608 - 6581 21051 52337 10975 19283 32306 52352 6318 26386 36937 16351 38760 - 36505 9636 58306 38636 14299 36502 59745 33866 61255 12802 63463 64177 - 38614 28129 16937 786 31611 60757]"] - space:2 - xor1(("XOR")):2 - cprop --> xor1 - uprop --> xor1 - space:2 - prop["combined_property_key\n[30821 3466 44250 25125 12000 28631 18755 47674 39748 44826 63799 44556 - 56524 2214 32222 30993 35741 23971 31827 61015 47496 37765 56108 49196 - 13889 14121 13583 60138 19221 45386 21155 33931 1869 33046 24822 15526 - 35156 31004 63717 45289 11060 13028 13980 39298 64141 25653 12302 46090 - 40799 20649 24272 181 65477 17748]"] - xor1 --> prop - pass["user_passcode_indices\n[37, 38, 40, 10]"] - space:2 - sel(("select\nproperties")):2 - pass --> sel - prop --> sel - space:2 - passcode["user passcode properties:\n[31004 63717 11060 63799]"]:2 - sel --> passcode - space:2 - pad["zero pad to\nmax nkode length: 10"]:2 - passcode -->pad - space:2 - paddedpasscode["padded passcode:\n[31004 63717 11060 63799 0 0 0 0 0 0]"] - pad --> paddedpasscode - passkey["passcode key:\n[28207 53281 58835 9812 48933 51588 25408 62022 36721 9334]"] - space:2 - xor2(("XOR")):2 - passkey --> xor2 - paddedpasscode --> xor2 - space:2 - cipheredpass["ciphered passcode:\n[ 5939 10436 52967 57187 48933 51588 25408 62022 36721 9334]"]:2 - xor2 --> cipheredpass - space:2 - hash(("hash")):2 - cipheredpass --> hash - space:2 - cipheredhashed["hashed ciphered passcode:\n$2b$12$am68CvhXvNZFJE1qsmLSL.gC5I.cykt7LbisLcuUNkoFZ18vV1DPO"]:2 - hash --> cipheredhashed -``` - -### Mask Encipher -```mermaid -block-beta - columns 3 - passcode_idx["passcode indices:\n[37, 38, 40, 10]"] - comb_pos["combined position key:\n[60340 19752 2334 9189 29138 61771 17595 21364 54614]"] - cust_pos["customer position key:\n[41987 59995 38795 29405 53271 32296 44523 10502 49338]"] - - space:3 - propidx(["Get Position Idx:\nmap each to element mod props_per_key"]) - passcode_idx-->propidx - space:1 - xor1(("XOR")) - comb_pos --> xor1 - cust_pos --> xor1 - - space:3 - passcode_position_idx["passcode poition indices:\n[1, 2, 4, 1]"] - propidx --> passcode_position_idx - - space:5 - pad1(("Pad with\nrandom indices")) - passcode_position_idx --> pad1 - - space:5 - posidx["Padded Passcode Position Indices:\n[1, 2, 4, 1, 4, 6, 4, 8, 4, 2]"] - pad1 --> posidx - space:1 - user_pos["user position key:\n[20407 42867 40597 20792 41413 36707 59728 31346 5612]"] - xor1 --> user_pos - - space:4 - sel(("select positions")) - user_pos --> sel - posidx --> sel - space:5 - passcode_pos["ordered user passcode positions:\n[42867 40597 41413 42867 41413 59728 41413 5612 41413 40597]"] - sel --> passcode_pos - mask_key["mask key\n[43734 31472 30293 34641 24055 5782 14606 48388 2666 19217]"] - space:4 - xor2(("XOR")) - mask_key --> xor2 - passcode_pos --> xor2 - space:5 - mask["enciphered mask:\n [ 3493 58469 55184 8226 64562 65478 39115 43240 43951 54660]"] - xor2 --> mask -``` - -### Validate nKode - -```mermaid -block-beta - columns 3 - selected_keys["selected keys:\n[4, 0, 4, 2]"] - login_keypad["login keypad:\nKey 0: [36 28 38 48 49 32 51 34 17] -Key 1: [ 9 19 2 3 4 41 33 52 8] -Key 2: [18 10 47 39 31 23 24 16 35] -Key 3: [27 46 29 21 22 14 6 43 26] -Key 4: [45 37 11 12 40 5 42 7 53] -Key 5: [ 0 1 20 30 13 50 15 25 44] -"] - space:4 - - selectkeys(("select keys")) - mask["enciphered mask:\n [ 3493 58469 55184 8226 64562 65478 39115 43240 43951 54660]"] - mask_key["mask key:\n[43734 31472 30293 34641 24055 5782 14606 48388 2666 19217]"] - space:2 - - xor1(("XOR")) - mask --> xor1 - mask_key --> xor1 - selected_keys --> selectkeys - login_keypad --> selectkeys - space:3 - - ordered_keys["ordered keys:\n[[45 37 11 12 40 5 42 7 53] - [36 28 38 48 49 32 51 34 17] - [45 37 11 12 40 5 42 7 53] - [18 10 47 39 31 23 24 16 35]]"] - user_position_key["user position key:\n[20407 42867 40597 20792 41413 36707 59728 31346 5612]"] - passcode_pos["ordered user passcode positions:\n[42867 40597 41413 42867 41413 59728 41413 5612 41413 40597]"] - selectkeys --> ordered_keys - xor1 --> passcode_pos - space:8 - - get_passcode_idxs(("recover passcode\nposition indices")) - user_position_key --> get_passcode_idxs - passcode_pos --> get_passcode_idxs - space:8 - - passcode_pos_idxs["padded passcode position indices:\n[1, 2, 4, 1, 4, 6, 4, 8, 4, 2]"] - get_passcode_idxs --> passcode_pos_idxs - space:3 - - get_presumed_idxs(("recover passcode\nproperty indices")) - ordered_keys --> get_presumed_idxs - passcode_pos_idxs --> get_presumed_idxs - space:5 - - passcode_prop_idxs["presumed passcode property indices:\n[37, 38, 40, 10]"] - prop["combined_property_key\n[30821 3466 44250 25125 12000 28631 18755 47674 39748 44826 63799 44556 - 56524 2214 32222 30993 35741 23971 31827 61015 47496 37765 56108 49196 - 13889 14121 13583 60138 19221 45386 21155 33931 1869 33046 24822 15526 - 35156 31004 63717 45289 11060 13028 13980 39298 64141 25653 12302 46090 - 40799 20649 24272 181 65477 17748]"] - cipheredhashed["hashed ciphered passcode:\n$2b$12$am68CvhXvNZFJE1qsmLSL.gC5I.cykt7LbisLcuUNkoFZ18vV1DPO"] - get_presumed_idxs --> passcode_prop_idxs - space:3 - - sel(("select\nproperties")) - passcode_prop_idxs --> sel - prop --> sel - space:5 - - passcode_prop["presumed passcode properties:\n[31004 63717 11060 63799]"] - sel --> passcode_prop - space:5 - - cipher(("encipher")) - passcode_prop --> cipher - space:5 - - cipheredpass["ciphered passcode:\n[ 5939 10436 52967 57187 48933 51588 25408 62022 36721 9334]"] - cipher --> cipheredpass - space:7 - - - comp{"compare"} - cipheredpass --> comp - cipheredhashed --> comp - space:5 - - suc(("success")) - comp --"Equal"--> suc - -``` \ No newline at end of file diff --git a/docs/encipher_decipher_renew_nkode.md b/docs/encipher_decipher_renew_nkode.md new file mode 100644 index 0000000..2c15365 --- /dev/null +++ b/docs/encipher_decipher_renew_nkode.md @@ -0,0 +1,330 @@ +# Encipher and Decipher nKode + +## Customer Policy +- max nkode length: 10 +- number of keys: 6 +- properties per key: 9 +- total number of properties: 54 + +## Customer Cipher +- property key: [40493 16536 22567 8632 16931 48077 38465 62133 61510 60074 30483 15029 + 32328 35555 12264 4839 56666 52299 23010 54024 11530 38809 33384 9334 + 53340 25808 36388 7068 48724 2963 19292 41164 31037 24848 7109 29039 + 26458 18532 7462 19458 51071 45191 60228 22739 41943 36765 29356 35589 + 3387 28997 31698 23822 30837 4299] +- position key: [ 8625 16938 65018 7492 24125 667 1225 54737 47670] + + +--- + +## User Cipher +- property key: [57486 43228 16207 60359 59029 6255 7588 52492 24710 2551 40990 56898 + 56863 1051 48892 2945 40292 31660 45216 53538 40537 15451 52595 37467 + 3706 19342 38794 33132 21407 3639 12679 9190 10068 50771 64668 35246 + 60714 28831 4623 8674 56989 23715 57671 23914 51409 36438 10577 34976 + 29440 9581 47915 29410 39979 5656] +- passcode key: [21257 32848 55275 58059 52662 31196 41361 14925 10153 11854] +- combined position key: [34963 12677 35658 5478 60936 17345 54640 40685 50309] +- mask key: [23832 11427 59440 48739 10483 30872 4800 48753 55621 53879] + +### Combined Postion Key +```mermaid +block-beta + columns 2 + user_pos["user position key:\n[58068 33848 20979 58547 24202 53969 27574 25558 64861]"] + customer_pos["customer position key:\n[ 8625 16938 65018 7492 24125 667 1225 54737 47670]"] + space:2 + xor(("XOR")):2 + user_pos --> xor + customer_pos --> xor + space:2 + comb_pos["combined position key\n[34963 12677 35658 5478 60936 17345 54640 40685 50309]"]:2 + xor --> comb_pos +``` + +## User Keypad +- keypad: +- user passcode indices: [22, 34, 45, 43] + +## nKode Cipher + +### Passcode Hash +```mermaid +block-beta + columns 2 + cprop["customer_property_key\n[40493 16536 22567 8632 16931 48077 38465 62133 61510 60074 30483 15029 + 32328 35555 12264 4839 56666 52299 23010 54024 11530 38809 33384 9334 + 53340 25808 36388 7068 48724 2963 19292 41164 31037 24848 7109 29039 + 26458 18532 7462 19458 51071 45191 60228 22739 41943 36765 29356 35589 + 3387 28997 31698 23822 30837 4299]"] + uprop["user_property_key\n[57486 43228 16207 60359 59029 6255 7588 52492 24710 2551 40990 56898 + 56863 1051 48892 2945 40292 31660 45216 53538 40537 15451 52595 37467 + 3706 19342 38794 33132 21407 3639 12679 9190 10068 50771 64668 35246 + 60714 28831 4623 8674 56989 23715 57671 23914 51409 36438 10577 34976 + 29440 9581 47915 29410 39979 5656]"] + space:2 + xor1(("XOR")):2 + cprop --> xor1 + uprop --> xor1 + space:2 + prop["combined_property_key\n[62032 50130 36776 54558 8506 61182 6770 6684 21325 58903 51619 53457 + 24017 10096 25891 36737 43828 60364 23965 63299 43548 43762 63289 61210 + 16490 21923 14215 6365 4383 48550 62830 53206 5237 2426 49278 33751 + 21542 2104 49342 42984 62776 19754 59167 25211 60 58461 118 9841 + 52387 3482 40915 54740 30225 8961]"] + xor1 --> prop + pass["user_passcode_indices\n[22, 34, 45, 43]"] + space:2 + sel(("select\nproperties")):2 + pass --> sel + prop --> sel + space:2 + passcode["user passcode properties:\n[63289 49278 58461 25211]"]:2 + sel --> passcode + space:2 + pad["zero pad to\nmax nkode length: 10"]:2 + passcode -->pad + space:2 + paddedpasscode["padded passcode:\n[63289 49278 58461 25211 0 0 0 0 0 0]"] + pad --> paddedpasscode + passkey["passcode key:\n[21257 32848 55275 58059 52662 31196 41361 14925 10153 11854]"] + space:2 + xor2(("XOR")):2 + passkey --> xor2 + paddedpasscode --> xor2 + space:2 + cipheredpass["ciphered passcode:\n[42032 16430 13238 32944 52662 31196 41361 14925 10153 11854]"]:2 + xor2 --> cipheredpass + space:2 + hash(("hash")):2 + cipheredpass --> hash + space:2 + cipheredhashed["hashed ciphered passcode:\n$2b$12$c62ezzyLW3QzUMjYUPSioexdMtSuJKzSM4KLkdKhWIiuNzcxOfT8m"]:2 + hash --> cipheredhashed +``` + +### Mask Encipher +```mermaid +block-beta + columns 3 + passcode_idx["passcode indices:\n[22, 34, 45, 43]"] + comb_pos["combined position key:\n[34963 12677 35658 5478 60936 17345 54640 40685 50309]"] + cust_pos["customer position key:\n[ 8625 16938 65018 7492 24125 667 1225 54737 47670]"] + + space:3 + propidx(["Get Position Idx:\nmap each to element mod props_per_key"]) + passcode_idx-->propidx + space:1 + xor1(("XOR")) + comb_pos --> xor1 + cust_pos --> xor1 + + space:3 + passcode_position_idx["passcode poition indices:\n[4, 7, 0, 7]"] + propidx --> passcode_position_idx + + space:5 + pad1(("Pad with\nrandom indices")) + passcode_position_idx --> pad1 + + space:5 + posidx["Padded Passcode Position Indices:\n[4, 7, 0, 7, 2, 2, 0, 3, 7, 8]"] + pad1 --> posidx + space:1 + user_pos["user position key:\n[58068 33848 20979 58547 24202 53969 27574 25558 64861]"] + xor1 --> user_pos + + space:4 + sel(("select positions")) + user_pos --> sel + posidx --> sel + space:5 + passcode_pos["ordered user passcode positions:\n[24202 25558 58068 25558 20979 20979 58068 58547 25558 64861]"] + sel --> passcode_pos + mask_key["mask key\n[23832 11427 59440 48739 10483 30872 4800 48753 55621 53879]"] + space:4 + xor2(("XOR")) + mask_key --> xor2 + passcode_pos --> xor2 + space:5 + mask["enciphered mask:\n [ 914 20341 2788 56757 30976 10603 61460 23234 47763 12074]"] + xor2 --> mask +``` + +### Validate nKode + +```mermaid +block-beta + columns 3 + selected_keys["selected keys:\n[5, 3, 2, 2]"] + login_keypad["login keypad:\nKey 0: [18 19 11 30 40 41 24 52 26] +Key 1: [36 1 47 12 49 32 42 25 35] +Key 2: [45 46 29 39 13 50 33 43 17] +Key 3: [27 37 2 3 31 5 6 34 8] +Key 4: [ 9 10 20 21 4 23 15 7 53] +Key 5: [ 0 28 38 48 22 14 51 16 44] +"] + space:4 + + selectkeys(("select keys")) + mask["enciphered mask:\n [ 914 20341 2788 56757 30976 10603 61460 23234 47763 12074]"] + mask_key["mask key:\n[23832 11427 59440 48739 10483 30872 4800 48753 55621 53879]"] + space:2 + + xor1(("XOR")) + mask --> xor1 + mask_key --> xor1 + selected_keys --> selectkeys + login_keypad --> selectkeys + space:3 + + ordered_keys["ordered keys:\n[[ 0 28 38 48 22 14 51 16 44] + [27 37 2 3 31 5 6 34 8] + [45 46 29 39 13 50 33 43 17] + [45 46 29 39 13 50 33 43 17]]"] + user_position_key["user position key:\n[58068 33848 20979 58547 24202 53969 27574 25558 64861]"] + passcode_pos["ordered user passcode positions:\n[24202 25558 58068 25558 20979 20979 58068 58547 25558 64861]"] + selectkeys --> ordered_keys + xor1 --> passcode_pos + space:8 + + get_passcode_idxs(("recover passcode\nposition indices")) + user_position_key --> get_passcode_idxs + passcode_pos --> get_passcode_idxs + space:8 + + passcode_pos_idxs["padded passcode position indices:\n[4, 7, 0, 7, 2, 2, 0, 3, 7, 8]"] + get_passcode_idxs --> passcode_pos_idxs + space:3 + + get_presumed_idxs(("recover passcode\nproperty indices")) + ordered_keys --> get_presumed_idxs + passcode_pos_idxs --> get_presumed_idxs + space:5 + + passcode_prop_idxs["presumed passcode property indices:\n[22, 34, 45, 43]"] + prop["combined_property_key\n[62032 50130 36776 54558 8506 61182 6770 6684 21325 58903 51619 53457 + 24017 10096 25891 36737 43828 60364 23965 63299 43548 43762 63289 61210 + 16490 21923 14215 6365 4383 48550 62830 53206 5237 2426 49278 33751 + 21542 2104 49342 42984 62776 19754 59167 25211 60 58461 118 9841 + 52387 3482 40915 54740 30225 8961]"] + cipheredhashed["hashed ciphered passcode:\n$2b$12$c62ezzyLW3QzUMjYUPSioexdMtSuJKzSM4KLkdKhWIiuNzcxOfT8m"] + get_presumed_idxs --> passcode_prop_idxs + space:3 + + sel(("select\nproperties")) + passcode_prop_idxs --> sel + prop --> sel + space:5 + + passcode_prop["presumed passcode properties:\n[63289 49278 58461 25211]"] + sel --> passcode_prop + space:5 + + cipher(("encipher")) + passcode_prop --> cipher + space:5 + + cipheredpass["ciphered passcode:\n[42032 16430 13238 32944 52662 31196 41361 14925 10153 11854]"] + cipher --> cipheredpass + space:7 + + + comp{"compare"} + cipheredpass --> comp + cipheredhashed --> comp + space:5 + + suc(("success")) + comp --"Equal"--> suc +``` + +### Renew nKode + +nKode renewal is a three step process: +1. Renew Customer Properties +2. Renew User Keys +3. Refresh User on Login + + +```mermaid + flowchart + subgraph Renew Customer Properties + old_prop["`old customer property key:
[ 4830 27406 45287 16089 51119 63121 2006 55056 13259 61408 27069 3731 + 33742 9067 56287 33792 13904 36960 60733 9825 13381 38569 14922 32065 + 19984 7725 40973 39345 17024 45969 50409 60464 13089 53033 15586 2681 + 47372 30887 53937 34314 11173 4489 1624 16145 51437 27147 10535 44753 + 49059 10487 9464 42806 59962 13593]`"] + new_prop["`new customer property key:
[40493 16536 22567 8632 16931 48077 38465 62133 61510 60074 30483 15029 + 32328 35555 12264 4839 56666 52299 23010 54024 11530 38809 33384 9334 + 53340 25808 36388 7068 48724 2963 19292 41164 31037 24848 7109 29039 + 26458 18532 7462 19458 51071 45191 60228 22739 41943 36765 29356 35589 + 3387 28997 31698 23822 30837 4299]`"] + old_pos["`old customer position key:
[27207 46525 55993 61909 45186 37136 48838 64827 14808]`"] + new_pos["`new customer position key:
[ 8625 16938 65018 7492 24125 667 1225 54737 47670]`"] + xor1(("XOR")) + xor2(("XOR")) + xor_prop["`xor property key:
[36083 11158 59584 8033 34188 19804 37271 9637 50061 1354 7854 13350 + 64902 43400 62519 38631 60170 23595 46303 62825 6479 304 47138 22839 + 40524 31485 11817 33325 64724 47106 36789 19708 18972 44601 10023 31510 + 56918 12483 53143 51720 60634 41230 60700 26562 27450 58774 23435 9684 + 45720 22962 24362 64056 37455 9682]`"] + xor_pos["`xor position key:
[19446 63383 10051 60561 61119 37771 47631 10474 33774]`"] + old_prop --> xor1 + new_prop --> xor1 + xor1 --> xor_prop + old_pos --> xor2 + new_pos --> xor2 + xor2 --> xor_pos + end + + subgraph Renew User Keys + users@{shape: procs, label: "users"} + users --> eachuser + subgraph eachuser [for each user] + subgraph old user keys + old_user_pos["`combined position key:
[58068 33848 20979 58547 24202 53969 27574 25558 64861]`"] + old_user_prop["`property key:
[57486 43228 16207 60359 59029 6255 7588 52492 24710 2551 40990 56898 + 56863 1051 48892 2945 40292 31660 45216 53538 40537 15451 52595 37467 + 3706 19342 38794 33132 21407 3639 12679 9190 10068 50771 64668 35246 + 60714 28831 4623 8674 56989 23715 57671 23914 51409 36438 10577 34976 + 29440 9581 47915 29410 39979 5656]`"] + old_renew["renew: False"] + end + xor3(("XOR")) + xor4(("XOR")) + old_user_pos --> xor3 + xor_pos --> xor3 + xor3 --> inter_user_pos + old_user_prop --> xor4 + xor_prop --> xor4 + xor4 --> inter_user_prop + subgraph inter_user[intermediate user keys] + inter_user_pos["`combined position key:
[50021 50706 44041 63991 183 53322 28543 46599 18283]`"] + inter_user_prop["`property key:
[27773 33610 55183 62630 25369 21811 35891 59561 41739 3261 48816 60004 + 9113 44435 19147 40294 30318 10119 1151 9291 34582 15723 30033 52076 + 36918 12659 47523 833 44875 46645 48690 28442 27976 26730 56251 62136 + 13180 16476 56728 60394 12871 64941 3163 15016 41963 27584 29402 44404 + 49560 31967 58369 35034 3684 13258]`"] + inter_renew["renew: True"] + end + end + + end + + subgraph Refresh User on Login + login["First login post renew"] + inter_user --> login + subgraph new_user [New User Keys] + new_user_pos["`combined position key:
[41920 44706 35397 43292 52009 11204 43818 26002 28955]`"] + new_user_prop["`property key:
[50355 56723 59762 39268 44255 59491 12736 62545 3731 51049 48946 10598 + 23999 55461 35771 20498 38352 13185 17075 30409 22199 3533 32360 12423 + 10680 48407 6174 11559 44174 8103 37520 52514 30628 49367 7063 8839 + 30149 1724 51332 64105 26257 48370 17405 42481 4953 43432 15038 37511 + 62432 22826 16312 39525 13907 33285]`"] + new_renew["renew: False"] + end + login --> new_user + end + +``` \ No newline at end of file diff --git a/docs/scripts/render_encipher_decipher_diagrams.py b/docs/scripts/render_encipher_decipher_diagrams.py index 18e84d4..466b853 100644 --- a/docs/scripts/render_encipher_decipher_diagrams.py +++ b/docs/scripts/render_encipher_decipher_diagrams.py @@ -9,6 +9,7 @@ from string import ascii_lowercase from docs.scripts.utils import render_markdown_template, emojis from src.models import NKodePolicy, KeypadSize from src.nkode_api import NKodeAPI +from src.user_cipher import UserCipher from src.utils import select_keys_with_passcode_values def display_keypad(icons_array: np.ndarray, props_per_key: int) -> str: @@ -65,6 +66,17 @@ if __name__ == "__main__": login_keypad = api.get_login_keypad(username, customer_id) selected_keys_login = select_keys_with_passcode_values(passcode_property_indices, login_keypad, keypad_size.props_per_key) + + old_props = customer.cipher.property_key.copy() + old_pos = customer.cipher.position_key.copy() + customer.cipher.property_key = np.random.choice(2 ** 16, size=keypad_size.total_props, replace=False) + customer.cipher.position_key = np.random.choice(2 ** 16, size=keypad_size.props_per_key, replace=False) + new_props = customer.cipher.property_key + new_pos = customer.cipher.position_key + props_xor = new_props ^ old_props + pos_xor = new_pos ^ old_pos + user = customer.users[username] + new_user_cipher = UserCipher.create(keypad_size, customer.cipher.position_key, policy.max_nkode_len) context = { "max_nkode_len": policy.max_nkode_len, "numb_of_keys": keypad_size.numb_of_keys, @@ -89,5 +101,15 @@ if __name__ == "__main__": "selected_keys": selected_keys_login, "login_keypad": display_keypad(login_keypad, keypad_size.props_per_key), "ordered_keys": login_keypad.reshape(-1, keypad_size.props_per_key)[selected_keys_login], + "old_props": old_props, + "new_props": new_props, + "old_pos": old_pos, + "new_pos": new_pos, + "xor_props": props_xor, + "xor_pos": pos_xor, + "inter_user_position": user.cipher.combined_position_key ^ pos_xor, + "inter_user_property_key": user.cipher.property_key ^ props_xor, + "new_user_position": new_user_cipher.combined_position_key, + "new_user_property_key": new_user_cipher.property_key, } - render_markdown_template(Path("../templates/encipher_decipher_nkode.template.md"), Path("../encipher_decipher_nkode.md"), context) + render_markdown_template(Path("../templates/encipher_decipher_renew_nkode.template.md"), Path("../encipher_decipher_renew_nkode.md"), context) diff --git a/docs/templates/encipher_decipher_nkode.template.md b/docs/templates/encipher_decipher_renew_nkode.template.md similarity index 71% rename from docs/templates/encipher_decipher_nkode.template.md rename to docs/templates/encipher_decipher_renew_nkode.template.md index 9ca9bf6..bfaa360 100644 --- a/docs/templates/encipher_decipher_nkode.template.md +++ b/docs/templates/encipher_decipher_renew_nkode.template.md @@ -204,5 +204,71 @@ block-beta suc(("success")) comp --"Equal"--> suc +``` + +### Renew nKode + +nKode renewal is a three step process: +1. Renew Customer Properties +2. Renew User Keys +3. Refresh User on Login + + +{% set md_tick = '`' %} +```mermaid + flowchart + subgraph Renew Customer Properties + old_prop["`old customer property key:
{{old_props}}`"] + new_prop["`new customer property key:
{{new_props}}`"] + old_pos["`old customer position key:
{{old_pos}}`"] + new_pos["`new customer position key:
{{new_pos}}`"] + xor1(("XOR")) + xor2(("XOR")) + xor_prop["`xor property key:
{{xor_props}}`"] + xor_pos["`xor position key:
{{xor_pos}}`"] + old_prop --> xor1 + new_prop --> xor1 + xor1 --> xor_prop + old_pos --> xor2 + new_pos --> xor2 + xor2 --> xor_pos + end + + subgraph Renew User Keys + users@{shape: procs, label: "users"} + users --> eachuser + subgraph eachuser [for each user] + subgraph old user keys + old_user_pos["`combined position key:
{{user_position_key}}`"] + old_user_prop["`property key:
{{user_property_key}}`"] + old_renew["renew: False"] + end + xor3(("XOR")) + xor4(("XOR")) + old_user_pos --> xor3 + xor_pos --> xor3 + xor3 --> inter_user_pos + old_user_prop --> xor4 + xor_prop --> xor4 + xor4 --> inter_user_prop + subgraph inter_user[intermediate user keys] + inter_user_pos["`combined position key:
{{inter_user_position}}`"] + inter_user_prop["`property key:
{{inter_user_property_key}}`"] + inter_renew["renew: True"] + end + end + + end + + subgraph Refresh User on Login + login["First login post renew"] + inter_user --> login + subgraph new_user [New User Keys] + new_user_pos["`combined position key:
{{new_user_position}}`"] + new_user_prop["`property key:
{{new_user_property_key}}`"] + new_renew["renew: False"] + end + login --> new_user + end ```