almost done

This commit is contained in:
redlineo committed 2025-01-30 10:25:03 +00:00
1 parent c1bf11fea6
commit 731d890cc9
2 files changed
+56 -49

No files matched your search

+43 -40
View File
@@ -2,22 +2,29 @@
#include "red_crypto.h" #include "red_crypto.h"
uint8_t eeprom_inited = 0;
void crypto_eeprom_init() { void crypto_eeprom_init() {
uint8_t red_var[3] = {'R', 'E', 'D'}; uint8_t red_var[3] = {'R', 'E', 'D'};
// TODO: don't work with this var,copy it to global var in RAM // TODO: don't work with this var,copy it to global var in RAM
eeconfig_read_user_datablock(enc_pass.raw); // TODO: write code for not emulated EEPROM
// eeconfig_read_user_datablock(enc_pass.raw);
// for (uint8_t i = 0; i < EECONFIG_USER_DATA_SIZE; i++) { // for (uint8_t i = 0; i < EECONFIG_USER_DATA_SIZE; i++) {
// dprintf("%x ", enc_pass.raw[i]); // dprintf("%x ", enc_pass.raw[i]);
// } // }
if (memcmp(enc_pass.init_var, red_var, 3)) { // not empty eeprom red_read_from_storage();
if (enc_pass.init_var[0] == red_var[0] && enc_pass.init_var[1] == red_var[1] && enc_pass.init_var[2] == red_var[2] && enc_pass.password_count > 0) { // not empty eeprom
dprintf("Not empty EEPROM\n"); dprintf("Not empty EEPROM\n");
#undef INIT_STORAGE_SIZE eeprom_inited = 1;
#define INIT_STORAGE_SIZE enc_pass.storage_size // #undef INIT_STORAGE_SIZE
#undef INIT_STORAGE_PASS_LEN // #define INIT_STORAGE_SIZE enc_pass.storage_size
#define INIT_STORAGE_PASS_LEN enc_pass.storage_pass_len // #undef INIT_STORAGE_PASS_LEN
// #define INIT_STORAGE_PASS_LEN enc_pass.storage_pass_len
} else { // empty eeprom } else { // empty eeprom
dprintf("Empty EEPROM\n"); dprintf("Empty EEPROM\n");
eeprom_inited = 0;
enc_pass.init_var[0] = 'R'; enc_pass.init_var[0] = 'R';
enc_pass.init_var[1] = 'E'; enc_pass.init_var[1] = 'E';
enc_pass.init_var[2] = 'D'; enc_pass.init_var[2] = 'D';
@@ -33,7 +40,8 @@ void crypto_eeprom_init() {
enc_pass.passwords[password_index * enc_pass.storage_pass_len + password_byte] = 0x00; enc_pass.passwords[password_index * enc_pass.storage_pass_len + password_byte] = 0x00;
} }
} }
eeconfig_update_user_datablock(enc_pass.raw); // eeconfig_update_user_datablock(enc_pass.raw);
red_write_to_storage();
} }
} }
@@ -94,12 +102,6 @@ uint8_t *encrypt_pass_kuzn(const uint8_t *new_pass, const uint8_t new_pass_lengt
kuz_set_decrypt_key(&key, master_key); kuz_set_decrypt_key(&key, master_key);
#endif #endif
#ifdef USE_RED_CRY_DEBUG
for (i = 0; i < 10; i++) {
print_w128(&key.k[i]);
}
#endif
#ifdef USE_RED_CRY_DEBUG #ifdef USE_RED_CRY_DEBUG
print_w128(&x); print_w128(&x);
#endif #endif
@@ -194,9 +196,10 @@ uint8_t crypto_process_record_user(uint16_t keycode, keyrecord_t *record) {
#endif #endif
crypto_mode = 0; crypto_mode = 0;
count_char_key = 0; count_char_key = 0;
decrypt_pass_kuzn(); if (eeprom_inited == 1) decrypt_pass_kuzn();
decrypted_mode = 1; decrypted_mode = 1;
} }
break;
default: default:
// reading key // reading key
return kc_to_ascii(keycode, record, master_key, &count_char_key); return kc_to_ascii(keycode, record, master_key, &count_char_key);
@@ -211,6 +214,28 @@ uint8_t crypto_process_record_user(uint16_t keycode, keyrecord_t *record) {
} }
} else if (decrypted_mode) { } else if (decrypted_mode) {
switch (keycode) { switch (keycode) {
case RED_TEST:
#ifdef TEST_FUNCTIONS_ENABLED
if (record->event.pressed) {
exec_sha256_test();
exec_kuznechik_test();
exec_aes_test();
}
#endif
break;
case RED_RNG:
if (record->event.pressed) {
// TODO: change seed
for (uint8_t i = 0; i < 32; i++) {
tap_random_base64();
}
}
break;
case RED_MENU:
if (record->event.pressed) {
red_menu_mode = 1; // to enter in menu mode block code above
}
break;
case RED_PASS1: case RED_PASS1:
if (record->event.pressed && enc_pass.password_count <= 1) { if (record->event.pressed && enc_pass.password_count <= 1) {
red_send_chars_pass(decrypted_passwords[0]); red_send_chars_pass(decrypted_passwords[0]);
@@ -268,27 +293,12 @@ uint8_t crypto_process_record_user(uint16_t keycode, keyrecord_t *record) {
// } // }
// break; // break;
} }
} else { // by default } else {
// by default
switch (keycode) { switch (keycode) {
case RED_RNG:
if (record->event.pressed) {
// TODO: change seed
for (uint8_t i = 0; i < 32; i++) {
tap_random_base64();
}
}
break;
case RED_TEST:
#ifdef TEST_FUNCTIONS_ENABLED
if (record->event.pressed) {
exec_sha256_test();
exec_kuznechik_test();
exec_aes_test();
}
#endif
break;
case RED_CRY_M: case RED_CRY_M:
if (record->event.pressed) { if (record->event.pressed) {
crypto_eeprom_init();
crypto_mode = 1; // to enter in crypto mode block code above crypto_mode = 1; // to enter in crypto mode block code above
// clearing readed key // clearing readed key
for (uint8_t i = 0; i < 32; i++) { for (uint8_t i = 0; i < 32; i++) {
@@ -297,14 +307,7 @@ uint8_t crypto_process_record_user(uint16_t keycode, keyrecord_t *record) {
// dprintf("%d", keycode); // dprintf("%d", keycode);
} }
break; break;
case RED_MENU:
if (record->event.pressed) {
if (decrypted_mode == 1) {
red_menu_mode = 1; // to enter in menu mode block code above
}
}
break;
} }
} }
return 1; // for capturing entering of all keys from red_crypto return 0;
} }
+13 -9
View File
@@ -1,15 +1,19 @@
// Author: redlineo, romanov.pd@gmail.com // Author: redlineo, romanov.pd@gmail.com
#include QMK_KEYBOARD_H
#include "quantum.h"
#ifndef RED_CRYPTO_H #ifndef RED_CRYPTO_H
# define RED_CRYPTO_H # define RED_CRYPTO_H
#include QMK_KEYBOARD_H
#include "quantum.h"
// includes of red_crypto // includes of red_crypto
# include "kc_to_ascii.h" # include "kc_to_ascii.h"
# include "utils.h" # include "utils.h"
# include "red_menu.h" # include "red_menu.h"
// includes for EEPROM, tested on STM32L432xx
# include "eeprom.h"
# include "eeprom_stm32_defs.h"
# include "eeprom_stm32_l4.h"
// #ifdef USE_RED_KUZNECHIK_128 // #ifdef USE_RED_KUZNECHIK_128
// #include "kuznechik_128bit.h" // #include "kuznechik_128bit.h"
@@ -30,11 +34,11 @@
# define BLOCK_SIZE 16 # define BLOCK_SIZE 16
# ifndef INIT_STORAGE_SIZE # ifndef INIT_STORAGE_SIZE
# define INIT_STORAGE_SIZE 4 # define INIT_STORAGE_SIZE 5
# endif # endif
# ifndef INIT_STORAGE_PASS_LEN # ifndef INIT_STORAGE_PASS_LEN
# define INIT_STORAGE_PASS_LEN 128 # define INIT_STORAGE_PASS_LEN 64
# endif # endif
# ifdef INIT_STORAGE_PASS_LEN # ifdef INIT_STORAGE_PASS_LEN
@@ -72,11 +76,11 @@ enum red_crypto_keys {
// uint8_t storage_size = INIT_STORAGE_SIZE; // uint8_t storage_size = INIT_STORAGE_SIZE;
// uint8_t storage_pass_len = INIT_STORAGE_PASS_LEN; // uint8_t storage_pass_len = INIT_STORAGE_PASS_LEN;
# define EEPROM_PASS_OFFSET 3 + 3 + 1 + 1 + 4 + 1 # 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 { typedef union {
uint8_t raw[EECONFIG_BASE_SIZE + EEPROM_PASS_OFFSET + INIT_STORAGE_SIZE * INIT_STORAGE_PASS_LEN]; uint8_t raw[STORAGE_SIZE];
struct { struct {
uint8_t qmk_core[34];
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 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 version[3]; // red_crypto library version
uint8_t storage_size; uint8_t storage_size;
@@ -89,8 +93,8 @@ typedef union {
red_crypto_storage_eeprom enc_pass; red_crypto_storage_eeprom enc_pass;
uint8_t crypto_process_record_user(uint16_t keycode, keyrecord_t *record); 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); uint8_t *encrypt_pass_kuzn(const uint8_t *new_pass, const uint8_t new_pass_length);
void crypto_eeprom_init(void); void crypto_eeprom_init(void);
#endif #endif