71 lines
3.1 KiB
Python
71 lines
3.1 KiB
Python
from pathlib import Path
|
|
import numpy as np
|
|
from docs.scripts.utils import render_markdown_template
|
|
from src.models import NKodePolicy, KeypadSize
|
|
from src.user_keypad import UserKeypad
|
|
from src.nkode_cipher_v2.nkode_cipher import NKodeCipher
|
|
from src.utils import select_keys_with_passcode_values
|
|
|
|
|
|
def display_keypad(icons_array: np.ndarray, props_per_key: int) -> str:
|
|
icons = ""
|
|
for idx, row in enumerate(icons_array.reshape(-1, props_per_key)):
|
|
icons += f"Key {idx}: "
|
|
icons += str(row)
|
|
icons += "\n"
|
|
return icons
|
|
|
|
|
|
if __name__ == "__main__":
|
|
policy = NKodePolicy(
|
|
max_nkode_len=10,
|
|
min_nkode_len=4,
|
|
distinct_positions=0,
|
|
distinct_properties=4,
|
|
)
|
|
keypad_size = KeypadSize(
|
|
numb_of_keys=6,
|
|
props_per_key=9
|
|
)
|
|
user_keys = NKodeCipher.create(keypad_size=keypad_size, max_nkode_len=policy.max_nkode_len)
|
|
passcode_len = 4
|
|
|
|
passcode_property_indices = np.random.choice([i for i in range(keypad_size.total_props)], size=passcode_len,
|
|
replace=False)
|
|
user_passcode = user_keys.property_key[passcode_property_indices]
|
|
pad_len = policy.max_nkode_len - passcode_len
|
|
padded_passcode = np.concatenate((user_passcode, np.zeros(pad_len, dtype=user_passcode.dtype)))
|
|
ciphered_passcode = padded_passcode ^ user_keys.pass_key
|
|
cipher = user_keys.encipher_nkode(passcode_property_indices.tolist())
|
|
padded_passcode_position_indices = user_keys.get_passcode_position_indices_padded(
|
|
passcode_property_indices.tolist())
|
|
|
|
ordered_user_position_key = user_keys.position_key[padded_passcode_position_indices]
|
|
login_keypad = UserKeypad.create(keypad_size)
|
|
selected_keys_login = select_keys_with_passcode_values(passcode_property_indices, login_keypad.keypad,
|
|
keypad_size.props_per_key)
|
|
context = {
|
|
"max_nkode_len": policy.max_nkode_len,
|
|
"numb_of_keys": keypad_size.numb_of_keys,
|
|
"props_per_key": keypad_size.props_per_key,
|
|
"user_property_key": user_keys.property_key,
|
|
"pass_key": user_keys.pass_key,
|
|
"user_position_key": user_keys.position_key,
|
|
"mask_key": user_keys.mask_key,
|
|
"user_passcode_idxs": passcode_property_indices,
|
|
"user_passcode_props": user_passcode,
|
|
"padded_passcode": padded_passcode,
|
|
"ciphered_passcode": ciphered_passcode,
|
|
"code": cipher.code,
|
|
"passcode_position_idxs": padded_passcode_position_indices[:passcode_len],
|
|
"pad_user_passcode_idxs": padded_passcode_position_indices,
|
|
"ordered_user_position_key": ordered_user_position_key,
|
|
"mask": cipher.mask,
|
|
"login_keypad": display_keypad(login_keypad.keypad, keypad_size.props_per_key),
|
|
"selected_keys": selected_keys_login,
|
|
"ordered_keys": login_keypad.keypad.reshape(-1, keypad_size.props_per_key)[selected_keys_login],
|
|
}
|
|
|
|
render_markdown_template(Path("../templates/zero_trust_nkode.template.md"),
|
|
Path("../zero_trust_nkode.md"), context)
|