gen4_poller_i.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #include "gen4_poller_i.h"
  2. #include "bit_buffer.h"
  3. #include "core/log.h"
  4. #include <nfc/protocols/iso14443_3a/iso14443_3a_poller.h>
  5. #define GEN4_CMD_PREFIX (0xCF)
  6. #define GEN4_CMD_GET_CFG (0xC6)
  7. #define GEN4_CMD_GET_REVISION (0xCC)
  8. #define GEN4_CMD_WRITE (0xCD)
  9. #define GEN4_CMD_READ (0xCE)
  10. #define GEN4_CMD_SET_CFG (0xF0)
  11. #define GEN4_CMD_FUSE_CFG (0xF1)
  12. #define GEN4_CMD_SET_PWD (0xFE)
  13. #define CONFIG_SIZE (32)
  14. #define REVISION_SIZE (5)
  15. static Gen4PollerError gen4_poller_process_error(Iso14443_3aError error) {
  16. Gen4PollerError ret = Gen4PollerErrorNone;
  17. if(error == Iso14443_3aErrorNone) {
  18. ret = Gen4PollerErrorNone;
  19. } else {
  20. ret = Gen4PollerErrorTimeout;
  21. }
  22. return ret;
  23. }
  24. Gen4PollerError
  25. gen4_poller_get_config(Gen4Poller* instance, uint32_t password, uint8_t* config_result) {
  26. Gen4PollerError ret = Gen4PollerErrorNone;
  27. bit_buffer_reset(instance->tx_buffer);
  28. do {
  29. uint8_t password_arr[4] = {};
  30. bit_lib_num_to_bytes_be(password, COUNT_OF(password_arr), password_arr);
  31. bit_buffer_append_byte(instance->tx_buffer, GEN4_CMD_PREFIX);
  32. bit_buffer_append_bytes(instance->tx_buffer, password_arr, COUNT_OF(password_arr));
  33. bit_buffer_append_byte(instance->tx_buffer, GEN4_CMD_GET_CFG);
  34. Iso14443_3aError error = iso14443_3a_poller_send_standard_frame(
  35. instance->iso3_poller, instance->tx_buffer, instance->rx_buffer, GEN4_POLLER_MAX_FWT);
  36. if(error != Iso14443_3aErrorNone) {
  37. ret = gen4_poller_process_error(error);
  38. break;
  39. }
  40. size_t rx_bytes = bit_buffer_get_size_bytes(instance->rx_buffer);
  41. if(rx_bytes != CONFIG_SIZE) {
  42. ret = Gen4PollerErrorProtocol;
  43. break;
  44. }
  45. bit_buffer_write_bytes(instance->rx_buffer, config_result, CONFIG_SIZE);
  46. } while(false);
  47. return ret;
  48. }
  49. Gen4PollerError
  50. gen4_poller_get_revision(Gen4Poller* instance, uint32_t password, uint8_t* revision_result) {
  51. Gen4PollerError ret = Gen4PollerErrorNone;
  52. bit_buffer_reset(instance->tx_buffer);
  53. do {
  54. uint8_t password_arr[4] = {};
  55. bit_lib_num_to_bytes_be(password, COUNT_OF(password_arr), password_arr);
  56. bit_buffer_append_byte(instance->tx_buffer, GEN4_CMD_PREFIX);
  57. bit_buffer_append_bytes(instance->tx_buffer, password_arr, COUNT_OF(password_arr));
  58. bit_buffer_append_byte(instance->tx_buffer, GEN4_CMD_GET_REVISION);
  59. Iso14443_3aError error = iso14443_3a_poller_send_standard_frame(
  60. instance->iso3_poller, instance->tx_buffer, instance->rx_buffer, GEN4_POLLER_MAX_FWT);
  61. if(error != Iso14443_3aErrorNone) {
  62. ret = gen4_poller_process_error(error);
  63. break;
  64. }
  65. size_t rx_bytes = bit_buffer_get_size_bytes(instance->rx_buffer);
  66. if(rx_bytes != 5) {
  67. ret = Gen4PollerErrorProtocol;
  68. break;
  69. }
  70. bit_buffer_write_bytes(instance->rx_buffer, revision_result, REVISION_SIZE);
  71. } while(false);
  72. return ret;
  73. }
  74. Gen4PollerError gen4_poller_set_config(
  75. Gen4Poller* instance,
  76. uint32_t password,
  77. const uint8_t* config,
  78. size_t config_size,
  79. bool fuse) {
  80. Gen4PollerError ret = Gen4PollerErrorNone;
  81. bit_buffer_reset(instance->tx_buffer);
  82. do {
  83. uint8_t password_arr[4] = {};
  84. bit_lib_num_to_bytes_be(password, COUNT_OF(password_arr), password_arr);
  85. bit_buffer_append_byte(instance->tx_buffer, GEN4_CMD_PREFIX);
  86. bit_buffer_append_bytes(instance->tx_buffer, password_arr, COUNT_OF(password_arr));
  87. uint8_t fuse_config = fuse ? GEN4_CMD_FUSE_CFG : GEN4_CMD_SET_CFG;
  88. bit_buffer_append_byte(instance->tx_buffer, fuse_config);
  89. bit_buffer_append_bytes(instance->tx_buffer, config, config_size);
  90. Iso14443_3aError error = iso14443_3a_poller_send_standard_frame(
  91. instance->iso3_poller, instance->tx_buffer, instance->rx_buffer, GEN4_POLLER_MAX_FWT);
  92. if(error != Iso14443_3aErrorNone) {
  93. ret = gen4_poller_process_error(error);
  94. break;
  95. }
  96. size_t rx_bytes = bit_buffer_get_size_bytes(instance->rx_buffer);
  97. if(rx_bytes != 2) {
  98. ret = Gen4PollerErrorProtocol;
  99. break;
  100. }
  101. } while(false);
  102. return ret;
  103. }
  104. Gen4PollerError gen4_poller_write_block(
  105. Gen4Poller* instance,
  106. uint32_t password,
  107. uint8_t block_num,
  108. const uint8_t* data) {
  109. Gen4PollerError ret = Gen4PollerErrorNone;
  110. bit_buffer_reset(instance->tx_buffer);
  111. do {
  112. uint8_t password_arr[4] = {};
  113. bit_lib_num_to_bytes_be(password, COUNT_OF(password_arr), password_arr);
  114. bit_buffer_append_byte(instance->tx_buffer, GEN4_CMD_PREFIX);
  115. bit_buffer_append_bytes(instance->tx_buffer, password_arr, COUNT_OF(password_arr));
  116. bit_buffer_append_byte(instance->tx_buffer, GEN4_CMD_WRITE);
  117. bit_buffer_append_byte(instance->tx_buffer, block_num);
  118. bit_buffer_append_bytes(instance->tx_buffer, data, GEN4_POLLER_BLOCK_SIZE);
  119. Iso14443_3aError error = iso14443_3a_poller_send_standard_frame(
  120. instance->iso3_poller, instance->tx_buffer, instance->rx_buffer, GEN4_POLLER_MAX_FWT);
  121. if(error != Iso14443_3aErrorNone) {
  122. ret = gen4_poller_process_error(error);
  123. break;
  124. }
  125. size_t rx_bytes = bit_buffer_get_size_bytes(instance->rx_buffer);
  126. if(rx_bytes != 2) {
  127. ret = Gen4PollerErrorProtocol;
  128. break;
  129. }
  130. } while(false);
  131. return ret;
  132. }
  133. Gen4PollerError
  134. gen4_poller_change_password(Gen4Poller* instance, uint32_t pwd_current, uint32_t pwd_new) {
  135. Gen4PollerError ret = Gen4PollerErrorNone;
  136. bit_buffer_reset(instance->tx_buffer);
  137. do {
  138. uint8_t password_arr[4] = {};
  139. bit_lib_num_to_bytes_be(pwd_current, COUNT_OF(password_arr), password_arr);
  140. bit_buffer_append_byte(instance->tx_buffer, GEN4_CMD_PREFIX);
  141. bit_buffer_append_bytes(instance->tx_buffer, password_arr, COUNT_OF(password_arr));
  142. bit_buffer_append_byte(instance->tx_buffer, GEN4_CMD_SET_PWD);
  143. bit_lib_num_to_bytes_be(pwd_new, COUNT_OF(password_arr), password_arr);
  144. bit_buffer_append_bytes(instance->tx_buffer, password_arr, COUNT_OF(password_arr));
  145. Iso14443_3aError error = iso14443_3a_poller_send_standard_frame(
  146. instance->iso3_poller, instance->tx_buffer, instance->rx_buffer, GEN4_POLLER_MAX_FWT);
  147. if(error != Iso14443_3aErrorNone) {
  148. ret = gen4_poller_process_error(error);
  149. break;
  150. }
  151. size_t rx_bytes = bit_buffer_get_size_bytes(instance->rx_buffer);
  152. if(rx_bytes != 2) {
  153. ret = Gen4PollerErrorProtocol;
  154. break;
  155. }
  156. } while(false);
  157. return ret;
  158. }