gen1a_poller_i.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #include "gen1a_poller_i.h"
  2. #include <nfc/helpers/iso14443_crc.h>
  3. #include <furi/furi.h>
  4. #define TAG "GEN1A_POLLER"
  5. static Gen1aPollerError gen1a_poller_process_nfc_error(NfcError error) {
  6. Gen1aPollerError ret = Gen1aPollerErrorNone;
  7. if(error == NfcErrorNone) {
  8. ret = Gen1aPollerErrorNone;
  9. } else if(error == NfcErrorTimeout) {
  10. ret = Gen1aPollerErrorTimeout;
  11. } else {
  12. ret = Gen1aPollerErrorNotPresent;
  13. }
  14. return ret;
  15. }
  16. Gen1aPollerError gen1a_poller_wupa(Gen1aPoller* instance) {
  17. furi_assert(instance);
  18. Gen1aPollerError ret = Gen1aPollerErrorNone;
  19. bit_buffer_reset(instance->tx_buffer);
  20. do {
  21. bit_buffer_set_size(instance->tx_buffer, 7);
  22. bit_buffer_set_byte(instance->tx_buffer, 0, 0x40);
  23. NfcError error = nfc_poller_trx(
  24. instance->nfc, instance->tx_buffer, instance->rx_buffer, GEN1A_POLLER_MAX_FWT);
  25. if(error != NfcErrorNone) {
  26. ret = gen1a_poller_process_nfc_error(error);
  27. break;
  28. }
  29. if(bit_buffer_get_size(instance->rx_buffer) != 4) {
  30. ret = Gen1aPollerErrorProtocol;
  31. break;
  32. }
  33. if(bit_buffer_get_byte(instance->rx_buffer, 0) != 0x0A) {
  34. ret = Gen1aPollerErrorProtocol;
  35. break;
  36. }
  37. } while(false);
  38. return ret;
  39. }
  40. Gen1aPollerError gen1a_poller_data_access(Gen1aPoller* instance) {
  41. furi_assert(instance);
  42. Gen1aPollerError ret = Gen1aPollerErrorNone;
  43. bit_buffer_reset(instance->tx_buffer);
  44. do {
  45. bit_buffer_set_size(instance->tx_buffer, 8);
  46. bit_buffer_set_byte(instance->tx_buffer, 0, 0x43);
  47. NfcError error = nfc_poller_trx(
  48. instance->nfc, instance->tx_buffer, instance->rx_buffer, GEN1A_POLLER_MAX_FWT);
  49. if(error != NfcErrorNone) {
  50. ret = gen1a_poller_process_nfc_error(error);
  51. break;
  52. }
  53. if(bit_buffer_get_size(instance->rx_buffer) != 4) {
  54. ret = Gen1aPollerErrorProtocol;
  55. break;
  56. }
  57. if(bit_buffer_get_byte(instance->rx_buffer, 0) != 0x0A) {
  58. ret = Gen1aPollerErrorProtocol;
  59. break;
  60. }
  61. } while(false);
  62. return ret;
  63. }
  64. Gen1aPollerError gen1a_poller_write_block(
  65. Gen1aPoller* instance,
  66. uint8_t block_num,
  67. const MfClassicBlock* block) {
  68. furi_assert(instance);
  69. furi_assert(block);
  70. Gen1aPollerError ret = Gen1aPollerErrorNone;
  71. bit_buffer_reset(instance->tx_buffer);
  72. do {
  73. bit_buffer_append_byte(instance->tx_buffer, 0xA0);
  74. bit_buffer_append_byte(instance->tx_buffer, block_num);
  75. iso14443_crc_append(Iso14443CrcTypeA, instance->tx_buffer);
  76. NfcError error = nfc_poller_trx(
  77. instance->nfc, instance->tx_buffer, instance->rx_buffer, GEN1A_POLLER_MAX_FWT);
  78. if(error != NfcErrorNone) {
  79. ret = gen1a_poller_process_nfc_error(error);
  80. break;
  81. }
  82. if(bit_buffer_get_size(instance->rx_buffer) != 4) {
  83. ret = Gen1aPollerErrorProtocol;
  84. break;
  85. }
  86. if(bit_buffer_get_byte(instance->rx_buffer, 0) != 0x0A) {
  87. ret = Gen1aPollerErrorProtocol;
  88. break;
  89. }
  90. bit_buffer_copy_bytes(instance->tx_buffer, block->data, sizeof(MfClassicBlock));
  91. iso14443_crc_append(Iso14443CrcTypeA, instance->tx_buffer);
  92. error = nfc_poller_trx(
  93. instance->nfc, instance->tx_buffer, instance->rx_buffer, GEN1A_POLLER_MAX_FWT);
  94. if(error != NfcErrorNone) {
  95. ret = gen1a_poller_process_nfc_error(error);
  96. break;
  97. }
  98. if(bit_buffer_get_size(instance->rx_buffer) != 4) {
  99. ret = Gen1aPollerErrorProtocol;
  100. break;
  101. }
  102. if(bit_buffer_get_byte(instance->rx_buffer, 0) != 0x0A) {
  103. ret = Gen1aPollerErrorProtocol;
  104. break;
  105. }
  106. } while(false);
  107. return ret;
  108. }
  109. Gen1aPollerError
  110. gen1a_poller_read_block(Gen1aPoller* instance, uint8_t block_num, MfClassicBlock* block) {
  111. furi_assert(instance);
  112. furi_assert(block);
  113. Gen1aPollerError ret = Gen1aPollerErrorNone;
  114. bit_buffer_reset(instance->tx_buffer);
  115. do {
  116. bit_buffer_reset(instance->tx_buffer);
  117. bit_buffer_reset(instance->rx_buffer);
  118. bit_buffer_append_byte(instance->tx_buffer, 0x30);
  119. bit_buffer_append_byte(instance->tx_buffer, block_num);
  120. iso14443_crc_append(Iso14443CrcTypeA, instance->tx_buffer);
  121. NfcError error = nfc_poller_trx(
  122. instance->nfc, instance->tx_buffer, instance->rx_buffer, GEN1A_POLLER_MAX_FWT);
  123. if(error != NfcErrorNone) {
  124. ret = gen1a_poller_process_nfc_error(error);
  125. break;
  126. }
  127. if(bit_buffer_get_size(instance->rx_buffer) != 18 * 8) { // 18 bytes
  128. ret = Gen1aPollerErrorProtocol;
  129. FURI_LOG_D(TAG, "Expected 18 bytes, got %d", bit_buffer_get_size(instance->rx_buffer));
  130. break;
  131. }
  132. memcpy(block->data, bit_buffer_get_data(instance->rx_buffer), 16);
  133. } while(false);
  134. return ret;
  135. }