Files
pynkode/docs/templates/encipher_decipher_renew_nkode.template.md
2025-03-26 09:01:39 -05:00

7.4 KiB

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

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

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

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

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 = '`' %}

    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