esubghz_chat_key_display.c 3.2 KB

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