mfc_editor_scene_data_edit.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #include "../mfc_editor_app_i.h"
  2. void mfc_editor_scene_data_edit_block_view_save_callback(void* context) {
  3. MfcEditorApp* instance = context;
  4. view_dispatcher_send_custom_event(instance->view_dispatcher, MfcEditorCustomEventSave);
  5. }
  6. void mfc_editor_scene_data_edit_block_view_changed_callback(void* context) {
  7. UNUSED(context);
  8. }
  9. void mfc_editor_scene_data_edit_on_enter(void* context) {
  10. MfcEditorApp* instance = context;
  11. ByteInput* byte_input = instance->byte_input;
  12. MfClassicData* mf_classic_data = instance->mf_classic_data;
  13. Iso14443_3aData* iso14443_3a_data = mf_classic_data->iso14443_3a_data;
  14. MfcEditorBlockView block_view =
  15. scene_manager_get_scene_state(instance->scene_manager, MfcEditorSceneDataView);
  16. if(block_view == MfcEditorBlockViewUID) {
  17. byte_input_set_header_text(byte_input, "Enter new UID");
  18. instance->edit_buffer = malloc(iso14443_3a_data->uid_len);
  19. memcpy(instance->edit_buffer, iso14443_3a_data->uid, iso14443_3a_data->uid_len);
  20. byte_input_set_result_callback(
  21. byte_input,
  22. mfc_editor_scene_data_edit_block_view_save_callback,
  23. mfc_editor_scene_data_edit_block_view_changed_callback,
  24. instance,
  25. instance->edit_buffer,
  26. iso14443_3a_data->uid_len);
  27. } else if(block_view == MfcEditorBlockViewManufacturerBytes) {
  28. byte_input_set_header_text(byte_input, "Enter new Manufacturer Bytes");
  29. // Skip BCC byte (not present on 7B UID cards)
  30. bool skip_byte = iso14443_3a_data->uid_len == 4;
  31. uint8_t byte_num = MF_CLASSIC_BLOCK_SIZE - iso14443_3a_data->uid_len - skip_byte;
  32. instance->edit_buffer = malloc(byte_num);
  33. memcpy(
  34. instance->edit_buffer,
  35. mf_classic_data->block[0].data + iso14443_3a_data->uid_len + skip_byte,
  36. byte_num);
  37. byte_input_set_result_callback(
  38. byte_input,
  39. mfc_editor_scene_data_edit_block_view_save_callback,
  40. mfc_editor_scene_data_edit_block_view_changed_callback,
  41. instance,
  42. instance->edit_buffer,
  43. byte_num);
  44. } else if(block_view == MfcEditorBlockViewKeyA) {
  45. byte_input_set_header_text(byte_input, "Enter new Key A");
  46. instance->edit_buffer = malloc(MF_CLASSIC_KEY_SIZE);
  47. memcpy(
  48. instance->edit_buffer,
  49. mf_classic_get_sector_trailer_by_sector(mf_classic_data, instance->current_sector)
  50. ->key_a.data,
  51. MF_CLASSIC_KEY_SIZE);
  52. byte_input_set_result_callback(
  53. byte_input,
  54. mfc_editor_scene_data_edit_block_view_save_callback,
  55. mfc_editor_scene_data_edit_block_view_changed_callback,
  56. instance,
  57. instance->edit_buffer,
  58. MF_CLASSIC_KEY_SIZE);
  59. } else if(block_view == MfcEditorBlockViewKeyB) {
  60. byte_input_set_header_text(byte_input, "Enter new Key B");
  61. instance->edit_buffer = malloc(MF_CLASSIC_KEY_SIZE);
  62. memcpy(
  63. instance->edit_buffer,
  64. mf_classic_get_sector_trailer_by_sector(mf_classic_data, instance->current_sector)
  65. ->key_b.data,
  66. MF_CLASSIC_KEY_SIZE);
  67. byte_input_set_result_callback(
  68. byte_input,
  69. mfc_editor_scene_data_edit_block_view_save_callback,
  70. mfc_editor_scene_data_edit_block_view_changed_callback,
  71. instance,
  72. instance->edit_buffer,
  73. MF_CLASSIC_KEY_SIZE);
  74. } else if(block_view == MfcEditorBlockViewUserByte) {
  75. byte_input_set_header_text(byte_input, "Enter new User Byte");
  76. instance->edit_buffer = malloc(1);
  77. instance->edit_buffer[0] =
  78. mf_classic_get_sector_trailer_by_sector(mf_classic_data, instance->current_sector)
  79. ->access_bits.data[3];
  80. byte_input_set_result_callback(
  81. byte_input,
  82. mfc_editor_scene_data_edit_block_view_save_callback,
  83. mfc_editor_scene_data_edit_block_view_changed_callback,
  84. instance,
  85. instance->edit_buffer,
  86. 1);
  87. } else {
  88. byte_input_set_header_text(byte_input, "Enter new block content");
  89. instance->edit_buffer = malloc(MF_CLASSIC_BLOCK_SIZE);
  90. memcpy(
  91. instance->edit_buffer,
  92. mf_classic_data->block[instance->current_block].data,
  93. MF_CLASSIC_BLOCK_SIZE);
  94. byte_input_set_result_callback(
  95. byte_input,
  96. mfc_editor_scene_data_edit_block_view_save_callback,
  97. mfc_editor_scene_data_edit_block_view_changed_callback,
  98. instance,
  99. instance->edit_buffer,
  100. MF_CLASSIC_BLOCK_SIZE);
  101. }
  102. view_dispatcher_switch_to_view(instance->view_dispatcher, MfcEditorAppViewByteInput);
  103. }
  104. bool mfc_editor_scene_data_edit_on_event(void* context, SceneManagerEvent event) {
  105. MfcEditorApp* instance = context;
  106. bool consumed = false;
  107. MfClassicData* mf_classic_data = instance->mf_classic_data;
  108. Iso14443_3aData* iso14443_3a_data = mf_classic_data->iso14443_3a_data;
  109. MfcEditorBlockView block_view =
  110. scene_manager_get_scene_state(instance->scene_manager, MfcEditorSceneDataView);
  111. if(event.type == SceneManagerEventTypeCustom) {
  112. if(event.event == MfcEditorCustomEventSave) {
  113. if(block_view == MfcEditorBlockViewNormal) {
  114. memcpy(
  115. mf_classic_data->block[instance->current_block].data,
  116. instance->edit_buffer,
  117. MF_CLASSIC_BLOCK_SIZE);
  118. if(instance->current_block == 0) {
  119. // UID needs to be equal to the first bytes in block 0
  120. memcpy(
  121. iso14443_3a_data->uid,
  122. mf_classic_data->block[0].data,
  123. iso14443_3a_data->uid_len);
  124. }
  125. } else if(block_view == MfcEditorBlockViewUID) {
  126. memcpy(iso14443_3a_data->uid, instance->edit_buffer, iso14443_3a_data->uid_len);
  127. // UID is also the first bytes in block 0
  128. memcpy(
  129. mf_classic_data->block[0].data,
  130. iso14443_3a_data->uid,
  131. iso14443_3a_data->uid_len);
  132. // 4-byte UID cards need the BCC byte set to correct value
  133. if(iso14443_3a_data->uid_len == 4) {
  134. mf_classic_data->block[0].data[4] = mfc_editor_calculate_uid_bcc(
  135. iso14443_3a_data->uid, iso14443_3a_data->uid_len);
  136. }
  137. } else if(block_view == MfcEditorBlockViewManufacturerBytes) {
  138. // Skip BCC byte (not present on 7B UID cards)
  139. bool skip_byte = iso14443_3a_data->uid_len == 4;
  140. uint8_t byte_num = MF_CLASSIC_BLOCK_SIZE - iso14443_3a_data->uid_len - skip_byte;
  141. memcpy(
  142. mf_classic_data->block[0].data + iso14443_3a_data->uid_len + skip_byte,
  143. instance->edit_buffer,
  144. byte_num);
  145. } else if(block_view == MfcEditorBlockViewKeyA) {
  146. memcpy(
  147. mf_classic_get_sector_trailer_by_sector(
  148. mf_classic_data, instance->current_sector)
  149. ->key_a.data,
  150. instance->edit_buffer,
  151. MF_CLASSIC_KEY_SIZE);
  152. } else if(block_view == MfcEditorBlockViewKeyB) {
  153. memcpy(
  154. mf_classic_get_sector_trailer_by_sector(
  155. mf_classic_data, instance->current_sector)
  156. ->key_b.data,
  157. instance->edit_buffer,
  158. MF_CLASSIC_KEY_SIZE);
  159. } else if(block_view == MfcEditorBlockViewUserByte) {
  160. mf_classic_get_sector_trailer_by_sector(mf_classic_data, instance->current_sector)
  161. ->access_bits.data[3] = instance->edit_buffer[0];
  162. }
  163. }
  164. scene_manager_previous_scene(instance->scene_manager);
  165. consumed = true;
  166. }
  167. return consumed;
  168. }
  169. void mfc_editor_scene_data_edit_on_exit(void* context) {
  170. MfcEditorApp* instance = context;
  171. if(instance->edit_buffer != NULL) {
  172. free(instance->edit_buffer);
  173. instance->edit_buffer = NULL;
  174. }
  175. }