gen1a_poller_i.c 3.8 KB

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