mifare_fuzzer_worker.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "mifare_fuzzer_worker.h"
  2. /// @brief mifare_fuzzer_worker_alloc()
  3. /// @return
  4. MifareFuzzerWorker* mifare_fuzzer_worker_alloc() {
  5. MifareFuzzerWorker* mifare_fuzzer_worker = malloc(sizeof(MifareFuzzerWorker));
  6. // Worker thread attributes
  7. mifare_fuzzer_worker->thread = furi_thread_alloc_ex(
  8. "MifareFuzzerWorker", 8192, mifare_fuzzer_worker_task, mifare_fuzzer_worker);
  9. mifare_fuzzer_worker->state = MifareFuzzerWorkerStateStop;
  10. mifare_fuzzer_worker->nfc = nfc_alloc();
  11. mifare_fuzzer_worker->nfc_device = nfc_device_alloc();
  12. return mifare_fuzzer_worker;
  13. }
  14. /// @brief mifare_fuzzer_worker_free()
  15. /// @param mifare_fuzzer_worker
  16. void mifare_fuzzer_worker_free(MifareFuzzerWorker* mifare_fuzzer_worker) {
  17. furi_assert(mifare_fuzzer_worker);
  18. furi_thread_free(mifare_fuzzer_worker->thread);
  19. nfc_free(mifare_fuzzer_worker->nfc);
  20. nfc_device_free(mifare_fuzzer_worker->nfc_device);
  21. free(mifare_fuzzer_worker);
  22. }
  23. /// @brief mifare_fuzzer_worker_stop()
  24. /// @param mifare_fuzzer_worker
  25. void mifare_fuzzer_worker_stop(MifareFuzzerWorker* mifare_fuzzer_worker) {
  26. furi_assert(mifare_fuzzer_worker);
  27. if(mifare_fuzzer_worker->state != MifareFuzzerWorkerStateStop) {
  28. mifare_fuzzer_worker->state = MifareFuzzerWorkerStateStop;
  29. furi_thread_join(mifare_fuzzer_worker->thread);
  30. }
  31. }
  32. /// @brief mifare_fuzzer_worker_start()
  33. /// @param mifare_fuzzer_worker
  34. void mifare_fuzzer_worker_start(MifareFuzzerWorker* mifare_fuzzer_worker) {
  35. furi_assert(mifare_fuzzer_worker);
  36. mifare_fuzzer_worker->state = MifareFuzzerWorkerStateEmulate;
  37. furi_thread_start(mifare_fuzzer_worker->thread);
  38. }
  39. /// @brief mifare_fuzzer_worker_task()
  40. /// @param context
  41. /// @return
  42. int32_t mifare_fuzzer_worker_task(void* context) {
  43. MifareFuzzerWorker* mifare_fuzzer_worker = context;
  44. if(mifare_fuzzer_worker->state == MifareFuzzerWorkerStateEmulate) {
  45. const Iso14443_3aData* data =
  46. nfc_device_get_data(mifare_fuzzer_worker->nfc_device, NfcProtocolIso14443_3a);
  47. mifare_fuzzer_worker->nfc_listener =
  48. nfc_listener_alloc(mifare_fuzzer_worker->nfc, NfcProtocolIso14443_3a, data);
  49. nfc_listener_start(mifare_fuzzer_worker->nfc_listener, NULL, NULL);
  50. while(mifare_fuzzer_worker->state == MifareFuzzerWorkerStateEmulate) {
  51. furi_delay_ms(50);
  52. }
  53. nfc_listener_stop(mifare_fuzzer_worker->nfc_listener);
  54. nfc_listener_free(mifare_fuzzer_worker->nfc_listener);
  55. }
  56. mifare_fuzzer_worker->state = MifareFuzzerWorkerStateStop;
  57. return 0;
  58. }
  59. /// @brief mifare_fuzzer_worker_is_emulating()
  60. /// @param mifare_fuzzer_worker
  61. /// @return
  62. bool mifare_fuzzer_worker_is_emulating(MifareFuzzerWorker* mifare_fuzzer_worker) {
  63. if(mifare_fuzzer_worker->state == MifareFuzzerWorkerStateEmulate) {
  64. return true;
  65. }
  66. return false;
  67. }
  68. /// @brief mifare_fuzzer_worker_set_nfc_data()
  69. /// @param mifare_fuzzer_worker
  70. /// @param nfc_data
  71. void mifare_fuzzer_worker_set_nfc_data(
  72. MifareFuzzerWorker* mifare_fuzzer_worker,
  73. Iso14443_3aData nfc_data) {
  74. Iso14443_3aData* nfc_14a_data = iso14443_3a_alloc();
  75. nfc_14a_data->uid_len = nfc_data.uid_len;
  76. memcpy(nfc_14a_data->uid, nfc_data.uid, nfc_data.uid_len);
  77. memcpy(nfc_14a_data->atqa, nfc_data.atqa, ATQA_LEN);
  78. nfc_14a_data->sak = nfc_data.sak;
  79. nfc_device_clear(mifare_fuzzer_worker->nfc_device);
  80. nfc_device_set_data(mifare_fuzzer_worker->nfc_device, NfcProtocolIso14443_3a, nfc_14a_data);
  81. iso14443_3a_free(nfc_14a_data);
  82. }
  83. /// @brief mifare_fuzzer_worker_get_nfc_data()
  84. /// @param mifare_fuzzer_worker
  85. /// @return
  86. Iso14443_3aData mifare_fuzzer_worker_get_nfc_data(MifareFuzzerWorker* mifare_fuzzer_worker) {
  87. return mifare_fuzzer_worker->nfc_data;
  88. }