esubghz_chat_key_display.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "../esubghz_chat_i.h"
  2. void key_display_result_cb(DialogExResult result, void* context)
  3. {
  4. furi_assert(context);
  5. ESubGhzChatState* state = context;
  6. switch(result) {
  7. case DialogExResultLeft:
  8. scene_manager_handle_custom_event(state->scene_manager,
  9. ESubGhzChatEvent_KeyDisplayBack);
  10. break;
  11. default:
  12. break;
  13. }
  14. }
  15. /* Prepares the key display scene. */
  16. void scene_on_enter_key_display(void* context)
  17. {
  18. FURI_LOG_T(APPLICATION_NAME, "scene_on_enter_key_display");
  19. furi_assert(context);
  20. ESubGhzChatState* state = context;
  21. if (state->encrypted) {
  22. uint8_t key[KEY_BITS / 8];
  23. crypto_ctx_get_key(state->crypto_ctx, key);
  24. snprintf(state->key_hex_str, KEY_HEX_STR_SIZE,
  25. "%02hX%02hX%02hX%02hX%02hX%02hX"
  26. "%02hX%02hX%02hX%02hX%02hX\n"
  27. "%02hX%02hX%02hX%02hX%02hX%02hX"
  28. "%02hX%02hX%02hX%02hX%02hX\n"
  29. "%02hX%02hX%02hX%02hX%02hX%02hX"
  30. "%02hX%02hX%02hX%02hX",
  31. key[0], key[1], key[2], key[3], key[4], key[5],
  32. key[6], key[7], key[8], key[9], key[10],
  33. key[11], key[12], key[13], key[14], key[15], key[16],
  34. key[17], key[18], key[19], key[20], key[21],
  35. key[22], key[23], key[24], key[25], key[26], key[27],
  36. key[28], key[29], key[30], key[31]);
  37. crypto_explicit_bzero(key, sizeof(key));
  38. } else {
  39. strcpy(state->key_hex_str, "No Key");
  40. }
  41. dialog_ex_reset(state->key_display);
  42. dialog_ex_set_header(state->key_display, "KEY (HEX)", 64, 2,
  43. AlignCenter, AlignTop);
  44. dialog_ex_set_text(state->key_display, state->key_hex_str, 64, 16,
  45. AlignCenter, AlignTop);
  46. dialog_ex_set_icon(state->key_display, 0, 0, NULL);
  47. dialog_ex_set_left_button_text(state->key_display, "Back");
  48. dialog_ex_set_result_callback(state->key_display,
  49. key_display_result_cb);
  50. dialog_ex_set_context(state->key_display, state);
  51. view_dispatcher_switch_to_view(state->view_dispatcher, ESubGhzChatView_KeyDisplay);
  52. }
  53. /* Handles scene manager events for the key display scene. */
  54. bool scene_on_event_key_display(void* context, SceneManagerEvent event)
  55. {
  56. FURI_LOG_T(APPLICATION_NAME, "scene_on_event_key_display");
  57. furi_assert(context);
  58. ESubGhzChatState* state = context;
  59. bool consumed = false;
  60. switch(event.type) {
  61. case SceneManagerEventTypeCustom:
  62. switch(event.event) {
  63. /* switch to message input scene */
  64. case ESubGhzChatEvent_KeyDisplayBack:
  65. if (!scene_manager_previous_scene(
  66. state->scene_manager)) {
  67. view_dispatcher_stop(state->view_dispatcher);
  68. }
  69. consumed = true;
  70. break;
  71. }
  72. break;
  73. default:
  74. consumed = false;
  75. break;
  76. }
  77. return consumed;
  78. }
  79. /* Cleans up the key display scene. */
  80. void scene_on_exit_key_display(void* context)
  81. {
  82. FURI_LOG_T(APPLICATION_NAME, "scene_on_exit_key_display");
  83. furi_assert(context);
  84. ESubGhzChatState* state = context;
  85. dialog_ex_reset(state->key_display);
  86. crypto_explicit_bzero(state->key_hex_str, sizeof(state->key_hex_str));
  87. }