esubghz_chat_key_display.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. // No way to share, NFC part is removed for now
  80. //dialog_ex_set_center_button_text(state->key_display, "Share");
  81. }
  82. dialog_ex_set_result_callback(state->key_display, key_display_result_cb);
  83. dialog_ex_set_context(state->key_display, state);
  84. view_dispatcher_switch_to_view(state->view_dispatcher, ESubGhzChatView_KeyDisplay);
  85. }
  86. /* Handles scene manager events for the key display scene. */
  87. bool scene_on_event_key_display(void* context, SceneManagerEvent event) {
  88. FURI_LOG_T(APPLICATION_NAME, "scene_on_event_key_display");
  89. furi_assert(context);
  90. ESubGhzChatState* state = context;
  91. bool consumed = false;
  92. switch(event.type) {
  93. case SceneManagerEventTypeCustom:
  94. switch(event.event) {
  95. /* switch to message input scene */
  96. case ESubGhzChatEvent_KeyDisplayBack:
  97. if(!scene_manager_previous_scene(state->scene_manager)) {
  98. /* error condition, exit for real */
  99. state->exit_for_real = true;
  100. view_dispatcher_stop(state->view_dispatcher);
  101. }
  102. consumed = true;
  103. break;
  104. }
  105. break;
  106. default:
  107. consumed = false;
  108. break;
  109. }
  110. return consumed;
  111. }
  112. /* Cleans up the key display scene. */
  113. void scene_on_exit_key_display(void* context) {
  114. FURI_LOG_T(APPLICATION_NAME, "scene_on_exit_key_display");
  115. furi_assert(context);
  116. ESubGhzChatState* state = context;
  117. dialog_ex_reset(state->key_display);
  118. crypto_explicit_bzero(state->key_hex_str, sizeof(state->key_hex_str));
  119. }