275 lines
7.4 KiB
Markdown
275 lines
7.4 KiB
Markdown
# 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:<br/>{{ 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
|
|
selected_keys["selected keys:\n{{selected_keys}}"]
|
|
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
|
|
selected_keys --> 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:<br/>{{old_props}}`"]
|
|
new_prop["`new customer property key:<br/>{{new_props}}`"]
|
|
old_pos["`old customer position key:<br/>{{old_pos}}`"]
|
|
new_pos["`new customer position key:<br/>{{new_pos}}`"]
|
|
xor1(("XOR"))
|
|
xor2(("XOR"))
|
|
xor_prop["`xor property key:<br/>{{xor_props}}`"]
|
|
xor_pos["`xor position key:<br/>{{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:<br/>{{user_position_key}}`"]
|
|
old_user_prop["`property key:<br/>{{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:<br/>{{inter_user_position}}`"]
|
|
inter_user_prop["`property key:<br/>{{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:<br/>{{new_user_position}}`"]
|
|
new_user_prop["`property key:<br/>{{new_user_property_key}}`"]
|
|
new_renew["renew: False"]
|
|
end
|
|
login --> new_user
|
|
end
|
|
|
|
```
|