esubghz_chat_key_display.c 4.0 KB

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