From 5684a3747af8247a6203ad8993478d7240fc80ea Mon Sep 17 00:00:00 2001 From: redlineo Date: Mon, 20 Jan 2025 07:15:04 +0000 Subject: [PATCH] try to expose transcoding key codes to ascii into kc_to_ascii --- README.md | 3 ++- kc_to_ascii.c | 37 +++++++++++++++++++++++++++++-------- kc_to_ascii.h | 8 ++++++++ red_crypto.c | 36 +++++++++++++++++++----------------- red_crypto.h | 8 ++++---- red_crypto.mk | 4 ++-- 6 files changed, 64 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 506bba4..647894a 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,8 @@ include keyboards///red_crypto/red_crypto. 5. Encrypt your passwords with chosen algorithm (AES, Kuznechik). Now available only Kuznechik. You can use `CyberChef`. Don't use web version! We are here for security, right? Choose `GOST Cipher`, then choose type `Kuznechik 34.12-2014`, not Magma. Choose mode ECB. Now, there is no CBC or CTR. -> Don't forget IV for GOST, get it from kuznechik_8bit.c. +> Don't forget IV for GOST +> ```94208510C2C001FB01C0C21085209401``` 6. Add your encrypted passwords in "keymap.c". Now you can encrypt 2 passwords with length <=16 byte. Keep this information in secret. Even if there are no plaintext. diff --git a/kc_to_ascii.c b/kc_to_ascii.c index 5767276..7dc072f 100644 --- a/kc_to_ascii.c +++ b/kc_to_ascii.c @@ -1,13 +1,34 @@ +// Author: redlineo, romanov.pd@gmail.com + #include "kc_to_ascii.h" -void crypto_process_record_user(uint16_t keycode, keyrecord_t *record, uint8_t readed_key) { - switch (keycode) { - case KC_1: - if (record->event.pressed) { +uint8_t shift_tracker = 0; + +uint8_t kc_to_ascii(uint16_t keycode, keyrecord_t *record, uint8_t readed_key[]) { + switch (keycode) { + case KC_LEFT_SHIFT: + if (record->event.pressed) { + register_code(KC_LEFT_SHIFT); + shift_tracker = 1; + } + return 1; + break; + case KC_1: + if (record->event.pressed) { + if (shift_tracker == 1) { + unregister_code(KC_LEFT_SHIFT); + shift_tracker = 0; + readed_key[count_char_key] = ASCII_UP_1; + } else { readed_key[count_char_key] = ASCII_LOW_1; - count_char_key++; } - break; - default: - break; + dprintf("%d",readed_key[count_char_key]); + count_char_key++; + } + return 1; + break; + default: + break; + } + return 0; } diff --git a/kc_to_ascii.h b/kc_to_ascii.h index 8d08aa7..8de0574 100644 --- a/kc_to_ascii.h +++ b/kc_to_ascii.h @@ -1,8 +1,16 @@ +// Author: redlineo, romanov.pd@gmail.com + +#include QMK_KEYBOARD_H +#include "quantum.h" + #ifndef KC_TO_ASCII_H #define KC_TO_ASCII_H +uint8_t kc_to_ascii(uint16_t keycode, keyrecord_t *record, uint8_t readed_key[32]); + /****************************** ASCII TABLE ******************************/ +// clang-format off #define ASCII_NON_PRINTABLE 0x00 // #define ASCII_SOH 0x01 // #define ASCII_STX 0x02 // diff --git a/red_crypto.c b/red_crypto.c index 8f69e78..0d48f34 100644 --- a/red_crypto.c +++ b/red_crypto.c @@ -1,7 +1,7 @@ +// Author: redlineo, romanov.pd@gmail.com + #include "red_crypto.h" - - uint8_t dec_pass[2][16] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; uint8_t readed_key[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; @@ -46,6 +46,11 @@ void decrypt_pass_kuzn(const uint8_t encrypted_passwords[2][16]) { } } +}; + +// TODO: add encrypt new passwords with binding on new keys +// and storing all these to EEPROM +// void encrypt_pass_kuzn(){ // kuz_set_encrypt_key(&key,readed_key); // for (uint8_t i=0; i<16; i++) { // x.b[i] = pass[i]; @@ -53,7 +58,7 @@ void decrypt_pass_kuzn(const uint8_t encrypted_passwords[2][16]) { // kuz_encrypt_block(&key,&x); // printf("encrypted\t="); print_w128(&x); // print_chars_w128(&x); -}; +// } void send_chars_pass(uint8_t *out) { for (uint8_t i = 0; i < 16 && out[i] != 0; i++) { @@ -61,26 +66,24 @@ void send_chars_pass(uint8_t *out) { } }; -void crypto_process_record_user(uint16_t keycode, keyrecord_t *record, const uint8_t encrypted_passwords[2][16]) { +uint8_t crypto_process_record_user(uint16_t keycode, keyrecord_t *record, const uint8_t encrypted_passwords[2][16]) { if (crypto_mode) { switch (keycode) { - // TODO: write all ASCII printable keys - // may be not printable, because we can use any byte of ASCII with QMK, HA-HA - // transcode_keycode_to_ascii(); // case KC_1: // if (record->event.pressed) { // readed_key[count_char_key] = ASCII_LOW_1; // count_char_key++; // } + // return 1; // break; - case GET_PASS: + case RED_CRY_M: if (record->event.pressed) { crypto_mode = 0; count_char_key = 0; decrypt_pass_kuzn(encrypted_passwords); } default: - kc_to_ascii(keycode, record, &readed_key); + return kc_to_ascii(keycode, record, readed_key, count_char_key); break; } } else { @@ -88,41 +91,40 @@ void crypto_process_record_user(uint16_t keycode, keyrecord_t *record, const uin case RED_PASS1: if (record->event.pressed) { send_chars_pass(dec_pass[0]); - // SEND_STRING(dec_pass[0]); } break; case RED_PASS2: if (record->event.pressed) { send_chars_pass(dec_pass[1]); - // SEND_STRING(dec_pass[1]); } break; case RED_RNG: if (record->event.pressed) { - //TODO: change seed - for (uint8_t i = 0; i < 32; i++){ + // TODO: change seed + for (uint8_t i = 0; i < 32; i++) { tap_random_base64(); } } break; case RED_TEST: - #ifdef TEST_FUNCTIONS_ENABLED +#ifdef TEST_FUNCTIONS_ENABLED if (record->event.pressed) { exec_sha256_test(); exec_kuznechik_test(); exec_aes_test(); } - #endif +#endif break; - case GET_PASS: + case RED_CRY_M: if (record->event.pressed) { crypto_mode = 1; for (uint8_t i = 0; i < 32; i++) { readed_key[i] = 0; } - dprintf("%d", keycode); + // dprintf("%d", keycode); } break; } } + return 0; } diff --git a/red_crypto.h b/red_crypto.h index 9d4d53d..957f882 100644 --- a/red_crypto.h +++ b/red_crypto.h @@ -1,4 +1,4 @@ - +// Author: redlineo, romanov.pd@gmail.com #include QMK_KEYBOARD_H #include "quantum.h" @@ -7,7 +7,7 @@ #ifndef RED_CRYPTO_H #define RED_CRYPTO_H -#include "ascii_table.c" +#include "kc_to_ascii.h" // #ifdef USE_RED_KUZNECHIK_128 // #include "kuznechik_128bit.h" @@ -26,14 +26,14 @@ enum red_crypto_keys { - GET_PASS = SAFE_RANGE, + RED_CRY_M = SAFE_RANGE+0x80, // added safe range offset RED_PASS1, RED_PASS2, RED_RNG, RED_TEST }; -void crypto_process_record_user(uint16_t keycode, keyrecord_t *record, const uint8_t encrypted_passwords[2][16]); +uint8_t crypto_process_record_user(uint16_t keycode, keyrecord_t *record, const uint8_t encrypted_passwords[2][16]); #endif diff --git a/red_crypto.mk b/red_crypto.mk index 2cb6d25..78e5997 100644 --- a/red_crypto.mk +++ b/red_crypto.mk @@ -4,8 +4,8 @@ SRC += red_crypto/red_crypto.c SRC += red_crypto/sha256.c SRC += red_crypto/aes.c SRC += red_crypto/kuznechik_8bit.c -SRC += red_crypto/ascii_table.c +SRC += red_crypto/kc_to_ascii.c # SRC += red_crypto/kuznechik_128bit.c # you can't include this, because you may not have ARMv8 and upper, check this # TODO: do something like this: -# ifneq ($(findstring HAL_USE_CRY TRUE,$(HALCONF)),) \ No newline at end of file +# ifneq ($(findstring HAL_USE_CRY TRUE,$(HALCONF)),)