From c54765e2464ef2417d9487ae6467e36b562841b2 Mon Sep 17 00:00:00 2001 From: Matthias Fulz Date: Tue, 26 Jul 2022 01:42:24 +0200 Subject: [PATCH 1/2] set key via keyboard --- quantum/enc/enc.c | 232 +++++++++++++++++++++++++++++++++++++++------- quantum/enc/enc.h | 8 +- 2 files changed, 205 insertions(+), 35 deletions(-) diff --git a/quantum/enc/enc.c b/quantum/enc/enc.c index f72a661a40..c078880d78 100644 --- a/quantum/enc/enc.c +++ b/quantum/enc/enc.c @@ -176,11 +176,15 @@ uint8_t *decrypt_cbc(int size, uint8_t *data, uint8_t *key, uint16_t *osize) { void enc_clear_ctx(void) { memset(enc_ctx.state.pw, 0, 32 * sizeof(uint16_t)); memset(enc_ctx.state.pw_check, 0, 32 * sizeof(uint16_t)); + memset(enc_ctx.state.key, 0, 64 * sizeof(uint8_t)); - enc_ctx.state.pw_ready = false; - enc_ctx.state.pw_size = 0; - enc_ctx.state.pw_check_pos = 0; - enc_ctx.state.seed = 0; + enc_ctx.state.pw_ready = false; + enc_ctx.state.pw_check_ready = false; + enc_ctx.state.key_ready = false; + enc_ctx.state.pw_size = 0; + enc_ctx.state.pw_check_size = 0; + enc_ctx.state.key_size = 0; + enc_ctx.state.seed = 0; #ifdef ENC_HW_RND enc_ctx.state.seed_ready = true; #else @@ -320,7 +324,7 @@ void encrypt_keys(void) { /*memset(enc_ctx.cnf.keys.s, 0x00, 64*sizeof(uint8_t));*/ } -int initialize_enc(uint8_t *key, uint8_t *iv) { +int initialize_enc(uint8_t *key, uint8_t *iv, bool use_state_key) { enc_ctx.cnf.flags.max_error = 0; enc_ctx.cnf.flags.error_count = 0; enc_ctx.cnf.flags.paranoia_mode = ENC_FALSE; @@ -356,11 +360,22 @@ int initialize_enc(uint8_t *key, uint8_t *iv) { enc_ctx.cnf.salt[i] = *v; } } - for (int i = 0; i < 32;) { - uint32_t rnd = enc_rnd_get(); - uint8_t *v = (uint8_t *)&rnd; - for (int j = 0; j < 4; j++, v++, i++) { - enc_ctx.keys.key[i] = *v; + if (!use_state_key) { + for (int i = 0; i < 32;) { + uint32_t rnd = enc_rnd_get(); + uint8_t *v = (uint8_t *)&rnd; + for (int j = 0; j < 4; j++, v++, i++) { + enc_ctx.keys.key[i] = *v; + } + } + } else { + char hex[2]; + int ki = 0; + char *ptr; + for (int i = 0; i < 64; i+=2, ki++) { + hex[0] = enc_ctx.state.key[i]; + hex[1] = enc_ctx.state.key[i+1]; + enc_ctx.keys.key[ki] = (uint8_t) strtol(hex, &ptr, 16); } } enc_ctx.keys.seed = enc_ctx.state.seed; @@ -496,6 +511,12 @@ int _enc_handle_request(uint8_t *data) { case ENC_CMD_GET_CFG: _enc_cmd_get_cfg(data); return 0; + default: + if (enc_ctx.mode.mode == ENC_MODE_KEY || enc_ctx.mode.mode == ENC_MODE_INIT || enc_ctx.mode.mode == ENC_MODE_LOAD) { + _enc_set_response_status(ENC_ERR_NOT_ALLOWED, true); + return -1; + } + break; } if (enc_request.req_cmd == ENC_CMD_NONE) { @@ -851,29 +872,112 @@ void enc_read_seed(uint16_t keycode) { } } -void enc_read_pw(uint16_t keycode) { +int enc_read_pw(uint16_t keycode) { if (!enc_ctx.state.pw_ready) { if (keycode != KC_ENT) { + if (enc_ctx.state.pw_size >= 32) { + return -1; + } enc_ctx.state.pw[enc_ctx.state.pw_size] = keycode; enc_ctx.state.pw_size++; - } else { + } else { enc_ctx.state.pw_ready = true; + return 0; } } + return 0; } int enc_read_pw_check(uint16_t keycode) { - if (keycode != KC_ENT) { - enc_ctx.state.pw_check[enc_ctx.state.pw_check_pos] = keycode; - enc_ctx.state.pw_check_pos++; - } else { - if (enc_ctx.state.pw_check_pos != enc_ctx.state.pw_size) { - return -1; - } - if (memcmp(enc_ctx.state.pw, enc_ctx.state.pw_check, enc_ctx.state.pw_size * sizeof(uint16_t)) == 0) { - return 0; + if (!enc_ctx.state.pw_check_ready) { + if (keycode != KC_ENT) { + if (enc_ctx.state.pw_check_size >= 32) { + return -1; + } + enc_ctx.state.pw_check[enc_ctx.state.pw_check_size] = keycode; + enc_ctx.state.pw_check_size++; } else { - return -1; + if (enc_ctx.state.pw_check_size != enc_ctx.state.pw_size) { + return -1; + } + if (memcmp(enc_ctx.state.pw, enc_ctx.state.pw_check, enc_ctx.state.pw_size * sizeof(uint16_t)) == 0) { + enc_ctx.state.pw_check_ready = true; + return 0; + } else { + return -1; + } + } + } + return 0; +} + +int enc_read_key(uint16_t keycode) { + if (!enc_ctx.state.key_ready) { + if (keycode != KC_ENT) { + if (enc_ctx.state.key_size >= 64) { + return -1; + } + switch (keycode) { + case KC_A: + enc_ctx.state.key[enc_ctx.state.key_size] = 'a'; + break; + case KC_B: + enc_ctx.state.key[enc_ctx.state.key_size] = 'b'; + break; + case KC_C: + enc_ctx.state.key[enc_ctx.state.key_size] = 'c'; + break; + case KC_D: + enc_ctx.state.key[enc_ctx.state.key_size] = 'd'; + break; + case KC_E: + enc_ctx.state.key[enc_ctx.state.key_size] = 'e'; + break; + case KC_F: + enc_ctx.state.key[enc_ctx.state.key_size] = 'f'; + break; + case KC_0: + enc_ctx.state.key[enc_ctx.state.key_size] = '0'; + break; + case KC_1: + enc_ctx.state.key[enc_ctx.state.key_size] = '1'; + break; + case KC_2: + enc_ctx.state.key[enc_ctx.state.key_size] = '2'; + break; + case KC_3: + enc_ctx.state.key[enc_ctx.state.key_size] = '3'; + break; + case KC_4: + enc_ctx.state.key[enc_ctx.state.key_size] = '4'; + break; + case KC_5: + enc_ctx.state.key[enc_ctx.state.key_size] = '5'; + break; + case KC_6: + enc_ctx.state.key[enc_ctx.state.key_size] = '6'; + break; + case KC_7: + enc_ctx.state.key[enc_ctx.state.key_size] = '7'; + break; + case KC_8: + enc_ctx.state.key[enc_ctx.state.key_size] = '8'; + break; + case KC_9: + enc_ctx.state.key[enc_ctx.state.key_size] = '9'; + break; + default: + return -1; + + } + enc_ctx.state.key[enc_ctx.state.key_size] = keycode; + enc_ctx.state.key_size++; + } else { + if (enc_ctx.state.key_size != 64) { + return -1; + } + enc_ctx.state.key_ready = true; + return 0; } } return 0; @@ -908,22 +1012,27 @@ bool process_record_enc(uint16_t keycode, keyrecord_t *record) { } if (!enc_ctx.state.pw_ready && enc_ctx.state.seed_ready) { - enc_read_pw(keycode); - return false; - } else { - int ret = enc_read_pw_check(keycode); - if ((ret == 0) && (keycode == KC_ENT)) { - if (initialize_enc(NULL, NULL) != 0) { - enc_switch_mode(ENC_MODE_CLOSED); - } else { - enc_switch_mode(ENC_MODE_OPEN); - } - } + int ret = enc_read_pw(keycode); if (ret != 0) { enc_switch_mode(ENC_MODE_CLOSED); } return false; + } + + if (!enc_ctx.state.pw_check_ready && enc_ctx.state.pw_ready && enc_ctx.state.seed_ready) { + int ret = enc_read_pw_check(keycode); + if (ret != 0) { + enc_switch_mode(ENC_MODE_CLOSED); + } + return false; + } else { + if (initialize_enc(NULL, NULL, false) != 0) { + enc_switch_mode(ENC_MODE_CLOSED); + } else { + enc_switch_mode(ENC_MODE_OPEN); + } } + return false; break; case ENC_MODE_LOAD: if (!record->event.pressed) { @@ -939,7 +1048,57 @@ bool process_record_enc(uint16_t keycode, keyrecord_t *record) { } return false; break; + case ENC_MODE_KEY: + if (!enc_ctx.state.seed_ready) { + enc_ctx.mode.sub_mode = ENC_SUB_MODE_SEED; + } else if (!enc_ctx.state.pw_ready && enc_ctx.state.seed_ready) { + enc_ctx.mode.sub_mode = ENC_SUB_MODE_PASSWORD; + } else if (!enc_ctx.state.pw_check_ready && enc_ctx.state.pw_ready && enc_ctx.state.seed_ready) { + enc_ctx.mode.sub_mode = ENC_SUB_MODE_VERIFY_PASSWORD; + } else { + enc_ctx.mode.sub_mode = ENC_SUB_MODE_KEY; + } + if (!record->event.pressed) { + return true; + } + if (!enc_ctx.state.seed_ready) { + enc_read_seed(keycode); + return false; + } + + if (!enc_ctx.state.pw_ready && enc_ctx.state.seed_ready) { + int ret = enc_read_pw(keycode); + if (ret != 0) { + enc_switch_mode(ENC_MODE_CLOSED); + } + return false; + } + + if (!enc_ctx.state.pw_check_ready && enc_ctx.state.pw_ready && enc_ctx.state.seed_ready) { + int ret = enc_read_pw_check(keycode); + if (ret != 0) { + enc_switch_mode(ENC_MODE_CLOSED); + } + return false; + } + + if (!enc_ctx.state.key_ready && enc_ctx.state.pw_check_ready && enc_ctx.state.pw_ready && enc_ctx.state.seed_ready) { + int ret = enc_read_key(keycode); + if (ret != 0) { + enc_switch_mode(ENC_MODE_CLOSED); + } + return false; + } else { + if (initialize_enc(NULL, NULL, true) != 0) { + enc_switch_mode(ENC_MODE_CLOSED); + } else { + enc_switch_mode(ENC_MODE_OPEN); + } + } + return false; + break; } + switch (keycode) { case ENC_INIT: if (record->event.pressed) { @@ -1142,6 +1301,8 @@ const char *enc_sub_mode_to_str(uint8_t mode) { return "REQUEST ALLOW"; case ENC_SUB_MODE_REQUEST_DENY: return "REQUEST DENY"; + case ENC_SUB_MODE_KEY: + return "KEY"; } return "UNKNOWN"; } @@ -1223,7 +1384,10 @@ void enc_write_oled(bool invert) { case ENC_SUB_MODE_VERIFY_PASSWORD: oled_write_P(PSTR("Enter Password again"), invert); break; - } + case ENC_SUB_MODE_KEY: + oled_write_P(PSTR("Enter Key in hex"), invert); + break; + } oled_write_P(PSTR("\n"), invert); return; default: diff --git a/quantum/enc/enc.h b/quantum/enc/enc.h index dc0891f15c..1338c38a29 100644 --- a/quantum/enc/enc.h +++ b/quantum/enc/enc.h @@ -36,6 +36,7 @@ #define ENC_MODE_OPEN 0x01 #define ENC_MODE_LOAD 0x02 #define ENC_MODE_INIT 0x03 +#define ENC_MODE_KEY 0x04 #define ENC_SUB_MODE_NONE 0x00 #define ENC_SUB_MODE_SEED 0x01 @@ -44,6 +45,7 @@ #define ENC_SUB_MODE_REQUEST 0x04 #define ENC_SUB_MODE_REQUEST_ALLOW 0x05 #define ENC_SUB_MODE_REQUEST_DENY 0x06 +#define ENC_SUB_MODE_KEY 0x07 #define ENC_CFG_PARANOIA 0x00 #define ENC_CFG_SECURE 0x01 @@ -100,8 +102,12 @@ typedef struct { uint16_t pw[32]; uint16_t pw_check[32]; uint16_t pw_size; - uint16_t pw_check_pos; + uint16_t pw_check_size; bool pw_ready; + bool pw_check_ready; + uint8_t key[64]; + uint16_t key_size; + bool key_ready; uint32_t seed; bool seed_ready; uint32_t pw_timer; From 8161c72c75e0375bcf7ce278af3df9c27e1656c3 Mon Sep 17 00:00:00 2001 From: Matthias Fulz Date: Tue, 26 Jul 2022 01:46:33 +0200 Subject: [PATCH 2/2] added keycode --- quantum/enc/enc.c | 8 ++++++++ quantum/quantum_keycodes.h | 1 + 2 files changed, 9 insertions(+) diff --git a/quantum/enc/enc.c b/quantum/enc/enc.c index c078880d78..4be7ccc7ec 100644 --- a/quantum/enc/enc.c +++ b/quantum/enc/enc.c @@ -205,6 +205,7 @@ void enc_switch_mode(uint8_t mode) { enc_clear_ctx(); break; case ENC_MODE_INIT: + case ENC_MODE_KEY: enc_ctx.mode.sub_mode = ENC_SUB_MODE_SEED; break; } @@ -1121,6 +1122,13 @@ bool process_record_enc(uint16_t keycode, keyrecord_t *record) { } return false; break; + case ENC_KEY: + if (record->event.pressed) { + enc_clear_ctx(); + enc_switch_mode(ENC_MODE_KEY); + } + return false; + break; case ENC_PASTE: if (record->event.pressed) { if (!enc_request.data.data) { diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 452fe75df2..05655fa547 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -614,6 +614,7 @@ enum quantum_keycodes { ENC_RESET, ENC_REQ_ALLOW, ENC_REQ_DENY, + ENC_KEY, #endif // Start of custom keycode range for keyboards and keymaps - always leave at the end