mifare_fuzzer_worker.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "mifare_fuzzer_worker.h"
  2. #include "mifare_fuzzer_i.h"
  3. /// @brief mifare_fuzzer_worker_alloc()
  4. /// @return
  5. MifareFuzzerWorker* mifare_fuzzer_worker_alloc() {
  6. MifareFuzzerWorker* mifare_fuzzer_worker = malloc(sizeof(MifareFuzzerWorker));
  7. // Worker thread attributes
  8. mifare_fuzzer_worker->thread = furi_thread_alloc_ex(
  9. "MifareFuzzerWorker", 8192, mifare_fuzzer_worker_task, mifare_fuzzer_worker);
  10. mifare_fuzzer_worker->state = MifareFuzzerWorkerStateStop;
  11. mifare_fuzzer_worker->nfc = nfc_alloc();
  12. mifare_fuzzer_worker->nfc_device = nfc_device_alloc();
  13. return mifare_fuzzer_worker;
  14. }
  15. /// @brief mifare_fuzzer_worker_free()
  16. /// @param mifare_fuzzer_worker
  17. void mifare_fuzzer_worker_free(MifareFuzzerWorker* mifare_fuzzer_worker) {
  18. furi_assert(mifare_fuzzer_worker);
  19. furi_thread_free(mifare_fuzzer_worker->thread);
  20. nfc_free(mifare_fuzzer_worker->nfc);
  21. nfc_device_free(mifare_fuzzer_worker->nfc_device);
  22. free(mifare_fuzzer_worker);
  23. }
  24. /// @brief mifare_fuzzer_worker_stop()
  25. /// @param mifare_fuzzer_worker
  26. void mifare_fuzzer_worker_stop(MifareFuzzerWorker* mifare_fuzzer_worker) {
  27. furi_assert(mifare_fuzzer_worker);
  28. if(mifare_fuzzer_worker->state != MifareFuzzerWorkerStateStop) {
  29. mifare_fuzzer_worker->state = MifareFuzzerWorkerStateStop;
  30. furi_thread_join(mifare_fuzzer_worker->thread);
  31. }
  32. }
  33. /// @brief mifare_fuzzer_worker_start()
  34. /// @param mifare_fuzzer_worker
  35. void mifare_fuzzer_worker_start(MifareFuzzerWorker* mifare_fuzzer_worker) {
  36. furi_assert(mifare_fuzzer_worker);
  37. mifare_fuzzer_worker->state = MifareFuzzerWorkerStateEmulate;
  38. furi_thread_start(mifare_fuzzer_worker->thread);
  39. }
  40. /// @brief mifare_fuzzer_worker_task()
  41. /// @param context
  42. /// @return
  43. int32_t mifare_fuzzer_worker_task(void* context) {
  44. MifareFuzzerWorker* mifare_fuzzer_worker = context;
  45. FURI_LOG_D(TAG, "mifare_fuzzer_worker_task()");
  46. if(mifare_fuzzer_worker->state == MifareFuzzerWorkerStateEmulate) {
  47. NfcDevice* device = mifare_fuzzer_worker->nfc_device;
  48. NfcProtocol protocol = nfc_device_get_protocol(device);
  49. FURI_LOG_D(
  50. TAG,
  51. "mifare_fuzzer_worker_task() :: Allocating and starting with %s",
  52. nfc_device_get_protocol_name(protocol));
  53. mifare_fuzzer_worker->nfc_listener = nfc_listener_alloc(
  54. mifare_fuzzer_worker->nfc, protocol, nfc_device_get_data(device, protocol));
  55. nfc_listener_start(mifare_fuzzer_worker->nfc_listener, NULL, NULL);
  56. FURI_LOG_D(TAG, "mifare_fuzzer_worker_task() :: Emulating...");
  57. while(mifare_fuzzer_worker->state == MifareFuzzerWorkerStateEmulate) {
  58. furi_delay_ms(50);
  59. }
  60. FURI_LOG_D(TAG, "mifare_fuzzer_worker_task() :: Stopping NFC Listener");
  61. nfc_listener_stop(mifare_fuzzer_worker->nfc_listener);
  62. nfc_listener_free(mifare_fuzzer_worker->nfc_listener);
  63. }
  64. FURI_LOG_D(TAG, "mifare_fuzzer_worker_task() :: Stopping");
  65. mifare_fuzzer_worker->state = MifareFuzzerWorkerStateStop;
  66. return 0;
  67. }
  68. /// @brief mifare_fuzzer_worker_is_emulating()
  69. /// @param mifare_fuzzer_worker
  70. /// @return
  71. bool mifare_fuzzer_worker_is_emulating(MifareFuzzerWorker* mifare_fuzzer_worker) {
  72. if(mifare_fuzzer_worker->state == MifareFuzzerWorkerStateEmulate) {
  73. return true;
  74. }
  75. return false;
  76. }
  77. /// @brief mifare_fuzzer_worker_set_nfc_device()
  78. /// @param mifare_fuzzer_worker
  79. /// @param nfc_device
  80. void mifare_fuzzer_worker_set_nfc_device(
  81. MifareFuzzerWorker* mifare_fuzzer_worker,
  82. NfcDevice* nfc_device) {
  83. FURI_LOG_D(
  84. TAG,
  85. "mifare_fuzzer_worker_set_nfc_device() :: Protocol: %s",
  86. nfc_device_get_protocol_name(nfc_device_get_protocol(nfc_device)));
  87. mifare_fuzzer_worker->nfc_device = nfc_device;
  88. }
  89. /// @brief mifare_fuzzer_worker_get_nfc_device()
  90. /// @param mifare_fuzzer_worker
  91. /// @return
  92. NfcDevice* mifare_fuzzer_worker_get_nfc_device(MifareFuzzerWorker* mifare_fuzzer_worker) {
  93. return mifare_fuzzer_worker->nfc_device;
  94. }
  95. /// @brief mifare_fuzzer_worker_set_nfc_data()
  96. /// @param mifare_fuzzer_worker
  97. /// @param nfc_data
  98. void mifare_fuzzer_worker_set_nfc_data(
  99. MifareFuzzerWorker* mifare_fuzzer_worker,
  100. Iso14443_3aData nfc_data) {
  101. Iso14443_3aData* nfc_14a_data = iso14443_3a_alloc();
  102. nfc_14a_data->uid_len = nfc_data.uid_len;
  103. memcpy(nfc_14a_data->uid, nfc_data.uid, nfc_data.uid_len);
  104. memcpy(nfc_14a_data->atqa, nfc_data.atqa, ATQA_LEN);
  105. nfc_14a_data->sak = nfc_data.sak;
  106. FURI_LOG_D(
  107. TAG,
  108. "mifare_fuzzer_worker_set_nfc_data() :: Clearing nfc_device and setting Iso14443_3aData");
  109. nfc_device_clear(mifare_fuzzer_worker->nfc_device);
  110. nfc_device_set_data(mifare_fuzzer_worker->nfc_device, NfcProtocolIso14443_3a, nfc_14a_data);
  111. FURI_LOG_D(
  112. TAG,
  113. "mifare_fuzzer_worker_set_nfc_data() :: Protocol: %s",
  114. nfc_device_get_protocol_name(nfc_device_get_protocol(mifare_fuzzer_worker->nfc_device)));
  115. iso14443_3a_free(nfc_14a_data);
  116. }
  117. /// @brief mifare_fuzzer_worker_get_nfc_data()
  118. /// @param mifare_fuzzer_worker
  119. /// @return
  120. Iso14443_3aData mifare_fuzzer_worker_get_nfc_data(MifareFuzzerWorker* mifare_fuzzer_worker) {
  121. return mifare_fuzzer_worker->nfc_data;
  122. }