# 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: {{ user_keypad}} - 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:
{{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 ```