mfc_editor_scene_data_view.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "../mfc_editor_app_i.h"
  2. void mfc_editor_scene_data_view_on_enter(void* context) {
  3. MfcEditorApp* instance = context;
  4. DialogEx* dialog_ex = instance->dialog_ex;
  5. dialog_ex_set_context(instance->dialog_ex, instance);
  6. MfcEditorBlockView block_view =
  7. scene_manager_get_scene_state(instance->scene_manager, MfcEditorSceneDataView);
  8. const MfClassicData* mf_classic_data = instance->mf_classic_data;
  9. Iso14443_3aData* iso14443_3a_data = mf_classic_data->iso14443_3a_data;
  10. if(block_view == MfcEditorBlockViewUID) {
  11. dialog_ex_set_header(dialog_ex, "UID", 63, 3, AlignCenter, AlignTop);
  12. furi_string_set(instance->data_view_text, "");
  13. for(int i = 0; i < iso14443_3a_data->uid_len; i++) {
  14. furi_string_cat_printf(instance->data_view_text, "%02hhX ", iso14443_3a_data->uid[i]);
  15. }
  16. // Remove trailing space
  17. furi_string_trim(instance->data_view_text);
  18. } else if(block_view == MfcEditorBlockViewBCC) {
  19. dialog_ex_set_header(dialog_ex, "Block Check Character", 63, 3, AlignCenter, AlignTop);
  20. uint8_t stored_bcc = mf_classic_data->block[0].data[4];
  21. uint8_t calculated_bcc =
  22. mfc_editor_calculate_uid_bcc(iso14443_3a_data->uid, iso14443_3a_data->uid_len);
  23. furi_string_printf(
  24. instance->data_view_text,
  25. "Stored BCC: %02hhX\nActual BCC: %02hhX",
  26. stored_bcc,
  27. calculated_bcc);
  28. if(stored_bcc != calculated_bcc) {
  29. furi_string_cat(instance->data_view_text, "\n(Mismatch!)");
  30. }
  31. } else if(block_view == MfcEditorBlockViewManufacturerBytes) {
  32. dialog_ex_set_header(dialog_ex, "Manufacturer Bytes", 63, 3, AlignCenter, AlignTop);
  33. if(mf_classic_is_block_read(mf_classic_data, 0)) {
  34. furi_string_set(instance->data_view_text, "");
  35. // Skip BCC byte (not present on 7B UID cards)
  36. bool skip_byte = iso14443_3a_data->uid_len == 4;
  37. uint8_t byte_num = MF_CLASSIC_BLOCK_SIZE - iso14443_3a_data->uid_len - skip_byte;
  38. for(int i = iso14443_3a_data->uid_len + skip_byte; i < MF_CLASSIC_BLOCK_SIZE; i++) {
  39. furi_string_cat_printf(
  40. instance->data_view_text, "%02hhX", mf_classic_data->block[0].data[i]);
  41. // Go onto next line when halfway through
  42. if(MF_CLASSIC_BLOCK_SIZE - i - 1 == byte_num / 2) {
  43. furi_string_cat(instance->data_view_text, "\n");
  44. } else {
  45. furi_string_cat(instance->data_view_text, " ");
  46. }
  47. }
  48. // Remove trailing space
  49. furi_string_trim(instance->data_view_text);
  50. } else {
  51. furi_string_set(
  52. instance->data_view_text, "Data unavailable.\nBlock 0 has not been read.");
  53. }
  54. } else if(block_view == MfcEditorBlockViewKeyA) {
  55. dialog_ex_set_header(dialog_ex, "Key A", 63, 3, AlignCenter, AlignTop);
  56. if(mf_classic_is_key_found(mf_classic_data, instance->current_sector, MfClassicKeyTypeA)) {
  57. MfClassicSectorTrailer* sector_trailer =
  58. mf_classic_get_sector_trailer_by_sector(mf_classic_data, instance->current_sector);
  59. MfClassicKey key_a = sector_trailer->key_a;
  60. furi_string_printf(
  61. instance->data_view_text,
  62. "%02hhX %02hhX %02hhX %02hhX %02hhX %02hhX",
  63. key_a.data[0],
  64. key_a.data[1],
  65. key_a.data[2],
  66. key_a.data[3],
  67. key_a.data[4],
  68. key_a.data[5]);
  69. } else {
  70. furi_string_set(
  71. instance->data_view_text, "Key A has not been found\nfor this sector.");
  72. }
  73. } else if(block_view == MfcEditorBlockViewKeyB) {
  74. dialog_ex_set_header(dialog_ex, "Key B", 63, 3, AlignCenter, AlignTop);
  75. if(mf_classic_is_key_found(mf_classic_data, instance->current_sector, MfClassicKeyTypeB)) {
  76. MfClassicSectorTrailer* sector_trailer =
  77. mf_classic_get_sector_trailer_by_sector(mf_classic_data, instance->current_sector);
  78. MfClassicKey key_b = sector_trailer->key_b;
  79. furi_string_printf(
  80. instance->data_view_text,
  81. "%02hhX %02hhX %02hhX %02hhX %02hhX %02hhX",
  82. key_b.data[0],
  83. key_b.data[1],
  84. key_b.data[2],
  85. key_b.data[3],
  86. key_b.data[4],
  87. key_b.data[5]);
  88. } else {
  89. furi_string_set(
  90. instance->data_view_text, "Key B has not been found\nfor this sector.");
  91. }
  92. } else if(block_view == MfcEditorBlockViewAccessBits) {
  93. dialog_ex_set_header(dialog_ex, "Access Bits", 63, 3, AlignCenter, AlignTop);
  94. } else if(block_view == MfcEditorBlockViewUserByte) {
  95. dialog_ex_set_header(dialog_ex, "User Byte", 63, 3, AlignCenter, AlignTop);
  96. } else {
  97. furi_string_printf(instance->data_view_header, "Block %hhu Data", instance->current_block);
  98. dialog_ex_set_header(
  99. dialog_ex,
  100. furi_string_get_cstr(instance->data_view_header),
  101. 63,
  102. 3,
  103. AlignCenter,
  104. AlignTop);
  105. }
  106. dialog_ex_set_text(
  107. dialog_ex,
  108. furi_string_get_cstr(instance->data_view_text),
  109. 63,
  110. 31,
  111. AlignCenter,
  112. AlignCenter);
  113. view_dispatcher_switch_to_view(instance->view_dispatcher, MfcEditorAppViewDialogEx);
  114. }
  115. bool mfc_editor_scene_data_view_on_event(void* context, SceneManagerEvent event) {
  116. MfcEditorApp* instance = context;
  117. bool consumed = false;
  118. UNUSED(instance);
  119. UNUSED(event);
  120. return consumed;
  121. }
  122. void mfc_editor_scene_data_view_on_exit(void* context) {
  123. MfcEditorApp* instance = context;
  124. dialog_ex_reset(instance->dialog_ex);
  125. }