nfc_magic_scene_file_select.c 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "../nfc_magic_app_i.h"
  2. #include <nfc/protocols/mf_classic/mf_classic.h>
  3. static bool nfc_magic_scene_file_select_is_file_suitable(NfcMagicApp* instance) {
  4. NfcProtocol protocol = nfc_device_get_protocol(instance->source_dev);
  5. size_t uid_len = 0;
  6. nfc_device_get_uid(instance->source_dev, &uid_len);
  7. bool suitable = false;
  8. if(instance->protocol == NfcMagicProtocolGen1) {
  9. if((uid_len == 4) && (protocol == NfcProtocolMfClassic)) {
  10. const MfClassicData* mfc_data =
  11. nfc_device_get_data(instance->source_dev, NfcProtocolMfClassic);
  12. if(mfc_data->type == MfClassicType1k) {
  13. suitable = true;
  14. }
  15. }
  16. } else if(instance->protocol == NfcMagicProtocolGen4) {
  17. if(protocol == NfcProtocolMfClassic) {
  18. suitable = true;
  19. } else if(protocol == NfcProtocolMfUltralight) {
  20. const MfUltralightData* mfu_data =
  21. nfc_device_get_data(instance->source_dev, NfcProtocolMfUltralight);
  22. const Iso14443_3aData* iso3_data = mfu_data->iso14443_3a_data;
  23. if(iso3_data->uid_len == 7) {
  24. MfUltralightType mfu_type = mfu_data->type;
  25. suitable = (mfu_type != MfUltralightTypeNTAGI2C1K) &&
  26. (mfu_type != MfUltralightTypeNTAGI2C2K) &&
  27. (mfu_type != MfUltralightTypeNTAGI2CPlus1K) &&
  28. (mfu_type != MfUltralightTypeNTAGI2CPlus2K);
  29. }
  30. }
  31. } else if(instance->protocol == NfcMagicProtocolGen2) {
  32. if(protocol == NfcProtocolMfClassic) {
  33. suitable = true;
  34. }
  35. } else if(instance->protocol == NfcMagicProtocolClassic) {
  36. if(protocol == NfcProtocolMfClassic) {
  37. suitable = true;
  38. }
  39. }
  40. return suitable;
  41. }
  42. void nfc_magic_scene_file_select_on_enter(void* context) {
  43. NfcMagicApp* instance = context;
  44. if(nfc_magic_load_from_file_select(instance)) {
  45. if(nfc_magic_scene_file_select_is_file_suitable(instance)) {
  46. if(instance->protocol == NfcMagicProtocolClassic ||
  47. instance->protocol == NfcMagicProtocolGen2) {
  48. scene_manager_next_scene(
  49. instance->scene_manager, NfcMagicSceneMfClassicDictAttack);
  50. } else {
  51. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneWriteConfirm);
  52. }
  53. } else {
  54. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneWrongCard);
  55. }
  56. } else {
  57. scene_manager_previous_scene(instance->scene_manager);
  58. }
  59. }
  60. bool nfc_magic_scene_file_select_on_event(void* context, SceneManagerEvent event) {
  61. UNUSED(context);
  62. UNUSED(event);
  63. return false;
  64. }
  65. void nfc_magic_scene_file_select_on_exit(void* context) {
  66. UNUSED(context);
  67. }