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)