esubghz_chat_key_display.c 2.7 KB

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