# 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: [12463 12679 30383 52780 48100 5096 61398 5750 59949 16574 25395 8158
51151 56863 52932 11578 50839 38005 12741 42227 40877 7172 53174 60400
12356 13971 19389 64980 16810 26389 39074 63833 12649 64422 4920 54703
62742 25787 26216 4453 38866 27951 36713 37903 22497 4454 55622 38346
31982 51225 48698 29699 36128 33748]
- position key: [56601 6465 12615 40545 49643 37783 59315 4335 13897]
---
## User Cipher
- property key: [14898 49243 46261 43286 743 60989 43535 48626 62301 50822 24597 10059
48516 48141 42915 36062 3286 11914 44159 34414 20879 14779 26916 49959
52279 29970 35884 62523 22453 25290 37000 30416 6102 20665 42719 23156
54785 3366 46811 57278 42429 58327 26021 27943 614 26543 63962 45468
15599 34845 22766 44215 32257 43746]
- passcode key: [ 4981 30039 31839 45969 48275 35799 10819 2121 61259 48949]
- combined position key: [58180 35354 39081 61964 32045 26428 24571 62221 62362]
- mask key: [ 3841 58027 55280 33679 39465 22075 10291 60287 27680 15384]
### Combined Postion Key
```mermaid
block-beta
columns 2
user_pos["user position key:\n[57725 11307 31071 28372 27611 49409 15121 51933 25996]"]
customer_pos["customer position key:\n[56601 6465 12615 40545 49643 37783 59315 4335 13897]"]
space:2
xor(("XOR")):2
user_pos --> xor
customer_pos --> xor
space:2
comb_pos["combined position key\n[58180 35354 39081 61964 32045 26428 24571 62221 62362]"]:2
xor --> comb_pos
```
## User Keypad
- keypad example:
Key 0: [18 19 2 21 31 5 6 43 17]
Key 1: [ 9 46 29 30 49 32 42 52 35]
Key 2: [27 10 20 48 40 14 33 34 44]
Key 3: [45 28 47 12 4 23 51 25 26]
Key 4: [ 0 1 38 3 22 41 24 16 53]
Key 5: [36 37 11 39 13 50 15 7 8]
- user passcode indices: [6, 43, 53, 9]
## nKode Cipher
### Passcode Hash
```mermaid
block-beta
columns 2
cprop["customer_property_key\n[12463 12679 30383 52780 48100 5096 61398 5750 59949 16574 25395 8158
51151 56863 52932 11578 50839 38005 12741 42227 40877 7172 53174 60400
12356 13971 19389 64980 16810 26389 39074 63833 12649 64422 4920 54703
62742 25787 26216 4453 38866 27951 36713 37903 22497 4454 55622 38346
31982 51225 48698 29699 36128 33748]"]
uprop["user_property_key\n[14898 49243 46261 43286 743 60989 43535 48626 62301 50822 24597 10059
48516 48141 42915 36062 3286 11914 44159 34414 20879 14779 26916 49959
52279 29970 35884 62523 22453 25290 37000 30416 6102 20665 42719 23156
54785 3366 46811 57278 42429 58327 26021 27943 614 26543 63962 45468
15599 34845 22766 44215 32257 43746]"]
space:2
xor1(("XOR")):2
cprop --> xor1
uprop --> xor1
space:2
prop["combined_property_key\n[ 2598 13817 3743 55138 48519 14914 34131 3917 24848 29635 52388 57749
31090 24065 22959 61051 34121 30393 691 47015 26630 54959 13562 20862
31358 35382 39584 57405 53720 45712 49496 53667 35073 25844 36156 57792
30240 21451 23037 3839 61742 34083 35502 63962 25413 50263 31741 63116
30806 16519 51243 8712 32194 8269]"]
xor1 --> prop
pass["user_passcode_indices\n[6, 43, 53, 9]"]
space:2
sel(("select\nproperties")):2
pass --> sel
prop --> sel
space:2
passcode["user passcode properties:\n[34131 63962 8269 29635]"]:2
sel --> passcode
space:2
pad["zero pad to\nmax nkode length: 10"]:2
passcode -->pad
space:2
paddedpasscode["padded passcode:\n[34131 63962 8269 29635 0 0 0 0 0 0]"]
pad --> paddedpasscode
passkey["passcode key:\n[ 4981 30039 31839 45969 48275 35799 10819 2121 61259 48949]"]
space:2
xor2(("XOR")):2
passkey --> xor2
paddedpasscode --> xor2
space:2
cipheredpass["ciphered passcode:\n[38438 35981 23570 49234 48275 35799 10819 2121 61259 48949]"]:2
xor2 --> cipheredpass
space:2
hash(("hash")):2
cipheredpass --> hash
space:2
cipheredhashed["hashed ciphered passcode:\n$2b$12$rF1TSRHSHfOTE4V/7ZCv3.Plqb1AysifW1KvR96K7CbC1sPt1ungK"]:2
hash --> cipheredhashed
```
### Mask Encipher
```mermaid
block-beta
columns 3
passcode_idx["passcode indices:\n[6, 43, 53, 9]"]
comb_pos["combined position key:\n[58180 35354 39081 61964 32045 26428 24571 62221 62362]"]
cust_pos["customer position key:\n[56601 6465 12615 40545 49643 37783 59315 4335 13897]"]
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[6, 7, 8, 0]"]
propidx --> passcode_position_idx
space:5
pad1(("Pad with\nrandom indices"))
passcode_position_idx --> pad1
space:5
posidx["Padded Passcode Position Indices:\n[6, 7, 8, 0, 1, 1, 2, 3, 0, 5]"]
pad1 --> posidx
space:1
user_pos["user position key:\n[57725 11307 31071 28372 27611 49409 15121 51933 25996]"]
xor1 --> user_pos
space:4
sel(("select positions"))
user_pos --> sel
posidx --> sel
space:5
passcode_pos["ordered user passcode positions:\n[15121 51933 25996 57725 11307 11307 31071 28372 57725 49409]"]
sel --> passcode_pos
mask_key["mask key\n[ 3841 58027 55280 33679 39465 22075 10291 60287 27680 15384]"]
space:4
xor2(("XOR"))
mask_key --> xor2
passcode_pos --> xor2
space:5
mask["enciphered mask:\n [13328 10358 45692 25330 46594 31248 20844 34219 36189 64793]"]
xor2 --> mask
```
### Validate nKode
```mermaid
block-beta
columns 3
selected_keys["selected keys:\n[0, 0, 4, 1]"]
login_keypad["login keypad:\nKey 0: [18 19 2 21 31 5 6 43 17]
Key 1: [ 9 46 29 30 49 32 42 52 35]
Key 2: [27 10 20 48 40 14 33 34 44]
Key 3: [45 28 47 12 4 23 51 25 26]
Key 4: [ 0 1 38 3 22 41 24 16 53]
Key 5: [36 37 11 39 13 50 15 7 8]
"]
space:4
selectkeys(("select keys"))
mask["enciphered mask:\n [13328 10358 45692 25330 46594 31248 20844 34219 36189 64793]"]
mask_key["mask key:\n[ 3841 58027 55280 33679 39465 22075 10291 60287 27680 15384]"]
space:2
xor1(("XOR"))
mask --> xor1
mask_key --> xor1
selected_keys --> selectkeys
login_keypad --> selectkeys
space:3
ordered_keys["ordered keys:\n[[18 19 2 21 31 5 6 43 17]
[18 19 2 21 31 5 6 43 17]
[ 0 1 38 3 22 41 24 16 53]
[ 9 46 29 30 49 32 42 52 35]]"]
user_position_key["user position key:\n[57725 11307 31071 28372 27611 49409 15121 51933 25996]"]
passcode_pos["ordered user passcode positions:\n[15121 51933 25996 57725 11307 11307 31071 28372 57725 49409]"]
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[6, 7, 8, 0, 1, 1, 2, 3, 0, 5]"]
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[6, 43, 53, 9]"]
prop["combined_property_key\n[ 2598 13817 3743 55138 48519 14914 34131 3917 24848 29635 52388 57749
31090 24065 22959 61051 34121 30393 691 47015 26630 54959 13562 20862
31358 35382 39584 57405 53720 45712 49496 53667 35073 25844 36156 57792
30240 21451 23037 3839 61742 34083 35502 63962 25413 50263 31741 63116
30806 16519 51243 8712 32194 8269]"]
cipheredhashed["hashed ciphered passcode:\n$2b$12$rF1TSRHSHfOTE4V/7ZCv3.Plqb1AysifW1KvR96K7CbC1sPt1ungK"]
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[34131 63962 8269 29635]"]
sel --> passcode_prop
space:5
cipher(("encipher"))
passcode_prop --> cipher
space:5
cipheredpass["ciphered passcode:\n[38438 35981 23570 49234 48275 35799 10819 2121 61259 48949]"]
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 Keys
2. Intermediate User Keys
3. Renew User Keys on Login
```mermaid
flowchart
subgraph Renew Customer Keys
old_prop["`old customer property key:
[12308 62882 47658 32372 48992 54399 12124 45759 37453 46405 44209 50910
50422 57868 65036 25253 35231 22579 44748 12745 14729 61204 24030 37465
46665 65316 5772 5126 34413 53338 20944 42867 40663 13389 11235 48052
40993 24301 61222 53569 21651 26356 61195 38141 24867 41976 33319 18192
17593 51354 37061 36543 963 35503]`"]
new_prop["`new customer property key:
[12463 12679 30383 52780 48100 5096 61398 5750 59949 16574 25395 8158
51151 56863 52932 11578 50839 38005 12741 42227 40877 7172 53174 60400
12356 13971 19389 64980 16810 26389 39074 63833 12649 64422 4920 54703
62742 25787 26216 4453 38866 27951 36713 37903 22497 4454 55622 38346
31982 51225 48698 29699 36128 33748]`"]
old_pos["`old customer position key:
[ 569 42545 57846 40152 5878 42557 25834 14800 38422]`"]
new_pos["`new customer position key:
[56601 6465 12615 40545 49643 37783 59315 4335 13897]`"]
xor1(("XOR"))
xor2(("XOR"))
xor_prop["`xor property key:
[ 187 50213 52357 45144 1156 51095 49290 42185 30816 62971 53122 55552
825 15379 12488 20383 20232 52294 40713 38202 42532 62224 37480 31145
34317 51639 23857 59858 51143 46927 51570 24106 44990 53227 14555 28187
21815 14934 35150 49188 49985 3035 24674 242 14018 45726 23393 53978
14423 131 12031 64188 36579 2427]`"]
xor_pos["`xor position key:
[57120 49008 53425 697 55069 13738 33625 10559 41055]`"]
old_prop --> xor1
new_prop --> xor1
xor1 --> xor_prop
old_pos --> xor2
new_pos --> xor2
xor2 --> xor_pos
end
subgraph Intermediate User Keys
users@{shape: procs, label: "users"}
users --> eachuser
subgraph eachuser [for each user]
subgraph old user keys
old_user_pos["`combined position key:
[57725 11307 31071 28372 27611 49409 15121 51933 25996]`"]
old_user_prop["`property key:
[14898 49243 46261 43286 743 60989 43535 48626 62301 50822 24597 10059
48516 48141 42915 36062 3286 11914 44159 34414 20879 14779 26916 49959
52279 29970 35884 62523 22453 25290 37000 30416 6102 20665 42719 23156
54785 3366 46811 57278 42429 58327 26021 27943 614 26543 63962 45468
15599 34845 22766 44215 32257 43746]`"]
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:
[15460 13674 18456 61621 43568 21142 56482 55858 21445]`"]
inter_user_prop["`property key:
[14985 1150 30768 6478 1635 10666 27269 6459 35645 13181 44951 65099
48829 32798 38763 49985 17374 58060 13174 4948 63403 51883 64332 47758
19002 48293 53533 7657 36978 54661 23034 10490 47208 40786 40452 13423
33590 14192 16277 8090 26364 59404 1479 28117 13476 54577 41659 25414
1208 34974 30225 22027 61666 41881]`"]
inter_renew["renew: True"]
end
end
end
subgraph Renew User Keys on Login
login["First login post renew"]
inter_user --> login
subgraph new_user [New User Keys]
new_user_pos["`combined position key:
[47033 63959 2503 19274 39057 42505 33376 18119 33917]`"]
new_user_prop["`property key:
[39652 18270 5028 34303 6339 45092 14652 39608 18788 7857 4800 6775
27243 640 51816 11487 16139 34341 38485 4249 44601 62920 30209 8343
19333 26092 3947 16867 32616 6792 36914 19857 1483 51567 23049 15969
48502 8758 26851 13558 39754 23725 1217 61491 64601 5714 32155 53045
11055 63186 5924 56720 60612 13766]`"]
new_renew["renew: False"]
end
login --> new_user
end
```