// Author: redlineo, romanov.pd@gmail.com #ifndef RED_CRYPTO_H #define RED_CRYPTO_H #include QMK_KEYBOARD_H #include "quantum.h" // includes of red_crypto #include "kc_to_ascii.h" #include "utils.h" #include "red_menu.h" // includes for EEPROM, tested on STM32L432xx #ifdef STM32L432xx # include "eeprom.h" # include "eeprom_stm32_defs.h" # include "eeprom_stm32_l4.h" #endif // not tested!!! // #ifdef USE_RED_KUZNECHIK_128 // #include "kuznechik_128bit.h" // #endif #define MASTER_KEY_LEN 32 #ifdef USE_RED_KUZNECHIK_8 # include "kuznechik_8bit.h" # ifdef USE_SHA256_KEY # undef MASTER_KEY_LEN # define MASTER_KEY_LEN 128 # include "sha256.h" # endif #endif #ifdef USE_RED_AES_256 # include "aes.h" #endif #define MAX_KEY_LEN 128 #define BLOCK_SIZE 16 #ifndef INIT_STORAGE_SIZE # define INIT_STORAGE_SIZE 5 #endif #ifndef INIT_STORAGE_PASS_LEN # define INIT_STORAGE_PASS_LEN 64 #endif #ifdef INIT_STORAGE_PASS_LEN # if (INIT_STORAGE_PASS_LEN % 16 != 0) # error "Password length must be multiply of 16 (16,32,64...)" # endif #endif // example for encrypted 64 byte password // const uint8_t red_enc_pass[STORAGE_SIZE][STORAGE_PASS_LEN] = { // {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // }; enum red_crypto_keys { RED_CRY_M = SAFE_RANGE + 0x80, // added safe range offset RED_MENU, RED_RNG, RED_TEST, RED_LOCK, // TODO: add autolock feature RED_RST_EE, // resetting EEPROM by clearing RED bytes RED_PASS1, RED_PASS2, RED_PASS3, RED_PASS4, RED_PASS5, RED_PASS6, RED_PASS7, RED_PASS8, RED_PASS9, RED_PASS10, }; enum red_crypto_states { RED_IDLE = 0, RED_KEY_READ, RED_MENU_EXIT, }; // uint8_t storage_size = INIT_STORAGE_SIZE; // uint8_t storage_pass_len = INIT_STORAGE_PASS_LEN; #define EEPROM_PASS_OFFSET 3 + 3 + 1 + 1 + 4 + 1 #define STORAGE_SIZE (EEPROM_PASS_OFFSET + INIT_STORAGE_SIZE * INIT_STORAGE_PASS_LEN) typedef union { uint8_t raw[STORAGE_SIZE]; struct { uint8_t init_var[3]; // if in eeprom is bytes "RED", then it's not first flash or first power-on, or in eeprom is old red_crypto uint8_t version[3]; // red_crypto library version uint8_t storage_size; uint8_t storage_pass_len; uint32_t memory_usage; uint8_t password_count; uint8_t passwords[INIT_STORAGE_SIZE * INIT_STORAGE_PASS_LEN]; }; } red_crypto_storage_eeprom; red_crypto_storage_eeprom enc_pass; uint8_t crypto_process_record_user(uint16_t keycode, keyrecord_t *record); uint8_t *encrypt_pass_kuzn(const uint8_t *new_pass, const uint8_t new_pass_length, const uint8_t password_index); void crypto_eeprom_init(void); #endif