# Encipher and Decipher nKode
## Customer Policy
- max nkode length: {{ max_nkode_len }}
- number of keys: {{ numb_of_keys }}
- properties per key: {{ props_per_key }}
- total number of properties: {{ numb_of_keys * props_per_key }}
## Customer Cipher
- property key: {{ customer_property_key }}
- position key: {{ customer_position_key }}
---
## User Cipher
- property key: {{ user_property_key }}
- passcode key: {{ pass_key }}
- combined position key: {{ combined_position_key }}
- mask key: {{ mask_key }}
### Combined Postion Key
```mermaid
block-beta
columns 2
user_pos["user position key:\n{{user_position_key}}"]
customer_pos["customer position key:\n{{customer_position_key}}"]
space:2
xor(("XOR")):2
user_pos --> xor
customer_pos --> xor
space:2
comb_pos["combined position key\n{{combined_position_key}}"]:2
xor --> comb_pos
```
## User Keypad
- keypad example:
{{ login_keypad_md }}
- user passcode indices: {{ user_passcode_idxs}}
## nKode Cipher
### Passcode Hash
```mermaid
block-beta
columns 2
cprop["customer_property_key\n{{customer_property_key}}"]
uprop["user_property_key\n{{user_property_key}}"]
space:2
xor1(("XOR")):2
cprop --> xor1
uprop --> xor1
space:2
prop["combined_property_key\n{{combined_property_key}}"]
xor1 --> prop
pass["user_passcode_indices\n{{user_passcode_idxs}}"]
space:2
sel(("select\nproperties")):2
pass --> sel
prop --> sel
space:2
passcode["user passcode properties:\n{{user_passcode_props}}"]:2
sel --> passcode
space:2
pad["zero pad to\nmax nkode length: {{max_nkode_len}}"]:2
passcode -->pad
space:2
paddedpasscode["padded passcode:\n{{padded_passcode}}"]
pad --> paddedpasscode
passkey["passcode key:\n{{pass_key}}"]
space:2
xor2(("XOR")):2
passkey --> xor2
paddedpasscode --> xor2
space:2
cipheredpass["ciphered passcode:\n{{ciphered_passcode}}"]:2
xor2 --> cipheredpass
space:2
hash(("hash")):2
cipheredpass --> hash
space:2
cipheredhashed["hashed ciphered passcode:\n{{code}}"]:2
hash --> cipheredhashed
```
### Mask Encipher
```mermaid
block-beta
columns 3
passcode_idx["passcode indices:\n{{user_passcode_idxs}}"]
comb_pos["combined position key:\n{{combined_position_key}}"]
cust_pos["customer position key:\n{{customer_position_key}}"]
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{{passcode_position_idxs}}"]
propidx --> passcode_position_idx
space:5
pad1(("Pad with\nrandom indices"))
passcode_position_idx --> pad1
space:5
posidx["Padded Passcode Position Indices:\n{{pad_user_passcode_idxs}}"]
pad1 --> posidx
space:1
user_pos["user position key:\n{{user_position_key}}"]
xor1 --> user_pos
space:4
sel(("select positions"))
user_pos --> sel
posidx --> sel
space:5
passcode_pos["ordered user passcode positions:\n{{ordered_user_position_key}}"]
sel --> passcode_pos
mask_key["mask key\n{{mask_key}}"]
space:4
xor2(("XOR"))
mask_key --> xor2
passcode_pos --> xor2
space:5
mask["enciphered mask:\n {{mask}}"]
xor2 --> mask
```
### Validate nKode
```mermaid
block-beta
columns 3
pass["user_passcode_indices\n{{user_passcode_idxs}}"]
login_keypad["login keypad:\n{{login_keypad}}"]
space:4
selectkeys(("select keys"))
mask["enciphered mask:\n {{mask}}"]
mask_key["mask key:\n{{mask_key}}"]
space:2
xor1(("XOR"))
mask --> xor1
mask_key --> xor1
pass --> selectkeys
login_keypad --> selectkeys
space:3
ordered_keys["ordered keys:\n{{ordered_keys}}"]
user_position_key["user position key:\n{{user_position_key}}"]
passcode_pos["ordered user passcode positions:\n{{ordered_user_position_key}}"]
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{{pad_user_passcode_idxs}}"]
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{{user_passcode_idxs}}"]
prop["combined_property_key\n{{combined_property_key}}"]
cipheredhashed["hashed ciphered passcode:\n{{code}}"]
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{{user_passcode_props}}"]
sel --> passcode_prop
space:5
cipher(("encipher"))
passcode_prop --> cipher
space:5
cipheredpass["ciphered passcode:\n{{ciphered_passcode}}"]
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
{% set md_tick = '`' %}
```mermaid
flowchart
subgraph Renew Customer Keys
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 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:
{{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 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:
{{new_user_position}}`"]
new_user_prop["`property key:
{{new_user_property_key}}`"]
new_renew["renew: False"]
end
login --> new_user
end
```