type-code-common.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "type-code-common.h"
  2. #include <furi_hal_usb_hid.h>
  3. #include <furi/core/kernel.h>
  4. #include "../../services/convert/convert.h"
  5. static const uint8_t hid_number_keys[] = {
  6. HID_KEYBOARD_0, HID_KEYBOARD_1, HID_KEYBOARD_2, HID_KEYBOARD_3, HID_KEYBOARD_4,
  7. HID_KEYBOARD_5, HID_KEYBOARD_6, HID_KEYBOARD_7, HID_KEYBOARD_8, HID_KEYBOARD_9,
  8. HID_KEYBOARD_A, HID_KEYBOARD_B, HID_KEYBOARD_C, HID_KEYBOARD_D, HID_KEYBOARD_E,
  9. HID_KEYBOARD_F, HID_KEYBOARD_G, HID_KEYBOARD_H, HID_KEYBOARD_I, HID_KEYBOARD_J,
  10. HID_KEYBOARD_K, HID_KEYBOARD_L, HID_KEYBOARD_M, HID_KEYBOARD_N, HID_KEYBOARD_O,
  11. HID_KEYBOARD_P, HID_KEYBOARD_Q, HID_KEYBOARD_R, HID_KEYBOARD_S, HID_KEYBOARD_T,
  12. HID_KEYBOARD_U, HID_KEYBOARD_V, HID_KEYBOARD_W, HID_KEYBOARD_X, HID_KEYBOARD_Y,
  13. HID_KEYBOARD_Z};
  14. static uint32_t get_keystroke_delay(TokenAutomationFeature features) {
  15. if(features & TokenAutomationFeatureTypeSlower) {
  16. return 100;
  17. }
  18. return 30;
  19. }
  20. static uint32_t get_keypress_delay(TokenAutomationFeature features) {
  21. if(features & TokenAutomationFeatureTypeSlower) {
  22. return 60;
  23. }
  24. return 30;
  25. }
  26. static void totp_type_code_worker_press_key(
  27. uint16_t key,
  28. TOTP_AUTOMATION_KEY_HANDLER key_press_fn,
  29. TOTP_AUTOMATION_KEY_HANDLER key_release_fn,
  30. TokenAutomationFeature features) {
  31. (*key_press_fn)(key);
  32. furi_delay_ms(get_keypress_delay(features));
  33. (*key_release_fn)(key);
  34. }
  35. void totp_type_code_worker_execute_automation(
  36. TOTP_AUTOMATION_KEY_HANDLER key_press_fn,
  37. TOTP_AUTOMATION_KEY_HANDLER key_release_fn,
  38. const char* code_buffer,
  39. uint8_t code_buffer_size,
  40. TokenAutomationFeature features) {
  41. furi_delay_ms(500);
  42. uint8_t i = 0;
  43. while(i < code_buffer_size && code_buffer[i] != 0) {
  44. uint8_t char_index = CONVERT_CHAR_TO_DIGIT(code_buffer[i]);
  45. if(char_index > 9) {
  46. char_index = code_buffer[i] - 0x41 + 10;
  47. }
  48. if(char_index > 35) break;
  49. uint16_t hid_kb_key = hid_number_keys[char_index];
  50. if(char_index > 9) {
  51. hid_kb_key |= KEY_MOD_LEFT_SHIFT;
  52. }
  53. totp_type_code_worker_press_key(hid_kb_key, key_press_fn, key_release_fn, features);
  54. furi_delay_ms(get_keystroke_delay(features));
  55. i++;
  56. }
  57. if(features & TokenAutomationFeatureEnterAtTheEnd) {
  58. furi_delay_ms(get_keystroke_delay(features));
  59. totp_type_code_worker_press_key(
  60. HID_KEYBOARD_RETURN, key_press_fn, key_release_fn, features);
  61. }
  62. if(features & TokenAutomationFeatureTabAtTheEnd) {
  63. furi_delay_ms(get_keystroke_delay(features));
  64. totp_type_code_worker_press_key(HID_KEYBOARD_TAB, key_press_fn, key_release_fn, features);
  65. }
  66. }