mifare_ultralight.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #pragma once
  2. #include <furi_hal_nfc.h>
  3. // Largest tag is NTAG I2C Plus 2K, both data sectors plus SRAM
  4. #define MF_UL_MAX_DUMP_SIZE ((238 + 256 + 16) * 4)
  5. #define MF_UL_TEARING_FLAG_DEFAULT (0xBD)
  6. #define MF_UL_HALT_START (0x50)
  7. #define MF_UL_GET_VERSION_CMD (0x60)
  8. #define MF_UL_READ_CMD (0x30)
  9. #define MF_UL_FAST_READ_CMD (0x3A)
  10. #define MF_UL_WRITE (0xA2)
  11. #define MF_UL_FAST_WRITE (0xA6)
  12. #define MF_UL_COMP_WRITE (0xA0)
  13. #define MF_UL_READ_CNT (0x39)
  14. #define MF_UL_INC_CNT (0xA5)
  15. #define MF_UL_AUTH (0x1B)
  16. #define MF_UL_READ_SIG (0x3C)
  17. #define MF_UL_CHECK_TEARING (0x3E)
  18. #define MF_UL_READ_VCSL (0x4B)
  19. #define MF_UL_SECTOR_SELECT (0xC2)
  20. #define MF_UL_ACK (0xa)
  21. #define MF_UL_NAK_INVALID_ARGUMENT (0x0)
  22. #define MF_UL_NAK_AUTHLIM_REACHED (0x4)
  23. #define MF_UL_NTAG203_COUNTER_PAGE (41)
  24. // Important: order matters; some features are based on positioning in this enum
  25. typedef enum {
  26. MfUltralightTypeUnknown,
  27. MfUltralightTypeNTAG203,
  28. // Below have config pages and GET_VERSION support
  29. MfUltralightTypeUL11,
  30. MfUltralightTypeUL21,
  31. MfUltralightTypeNTAG213,
  32. MfUltralightTypeNTAG215,
  33. MfUltralightTypeNTAG216,
  34. // Below also have sector select
  35. // NTAG I2C's *does not* have regular config pages, so it's a bit of an odd duck
  36. MfUltralightTypeNTAGI2C1K,
  37. MfUltralightTypeNTAGI2C2K,
  38. // NTAG I2C Plus has stucture expected from NTAG21x
  39. MfUltralightTypeNTAGI2CPlus1K,
  40. MfUltralightTypeNTAGI2CPlus2K,
  41. // Keep last for number of types calculation
  42. MfUltralightTypeNum,
  43. } MfUltralightType;
  44. typedef enum {
  45. MfUltralightSupportNone = 0,
  46. MfUltralightSupportFastRead = 1 << 0,
  47. MfUltralightSupportTearingFlags = 1 << 1,
  48. MfUltralightSupportReadCounter = 1 << 2,
  49. MfUltralightSupportIncrCounter = 1 << 3,
  50. MfUltralightSupportSignature = 1 << 4,
  51. MfUltralightSupportFastWrite = 1 << 5,
  52. MfUltralightSupportCompatWrite = 1 << 6,
  53. MfUltralightSupportAuth = 1 << 7,
  54. MfUltralightSupportVcsl = 1 << 8,
  55. MfUltralightSupportSectorSelect = 1 << 9,
  56. // NTAG21x only has counter 2
  57. MfUltralightSupportSingleCounter = 1 << 10,
  58. // ASCII mirror is not a command, but handy to have as a flag
  59. MfUltralightSupportAsciiMirror = 1 << 11,
  60. // NTAG203 counter that's in memory rather than through a command
  61. MfUltralightSupportCounterInMemory = 1 << 12,
  62. } MfUltralightFeatures;
  63. typedef enum {
  64. MfUltralightMirrorNone,
  65. MfUltralightMirrorUid,
  66. MfUltralightMirrorCounter,
  67. MfUltralightMirrorUidCounter,
  68. } MfUltralightMirrorConf;
  69. typedef struct {
  70. uint8_t header;
  71. uint8_t vendor_id;
  72. uint8_t prod_type;
  73. uint8_t prod_subtype;
  74. uint8_t prod_ver_major;
  75. uint8_t prod_ver_minor;
  76. uint8_t storage_size;
  77. uint8_t protocol_type;
  78. } MfUltralightVersion;
  79. typedef struct {
  80. uint8_t sn0[3];
  81. uint8_t btBCC0;
  82. uint8_t sn1[4];
  83. uint8_t btBCC1;
  84. uint8_t internal;
  85. uint8_t lock[2];
  86. uint8_t otp[4];
  87. } MfUltralightManufacturerBlock;
  88. typedef struct {
  89. MfUltralightType type;
  90. MfUltralightVersion version;
  91. uint8_t signature[32];
  92. uint32_t counter[3];
  93. uint8_t tearing[3];
  94. uint16_t curr_authlim;
  95. uint16_t data_size;
  96. uint8_t data[MF_UL_MAX_DUMP_SIZE];
  97. } MfUltralightData;
  98. typedef struct __attribute__((packed)) {
  99. union {
  100. uint8_t raw[4];
  101. uint32_t value;
  102. } pwd;
  103. union {
  104. uint8_t raw[2];
  105. uint16_t value;
  106. } pack;
  107. } MfUltralightAuth;
  108. // Common configuration pages for MFUL EV1, NTAG21x, and NTAG I2C Plus
  109. typedef struct __attribute__((packed)) {
  110. union {
  111. uint8_t value;
  112. struct {
  113. uint8_t rfui1 : 2;
  114. bool strg_mod_en : 1;
  115. bool rfui2 : 1;
  116. uint8_t mirror_byte : 2;
  117. MfUltralightMirrorConf mirror_conf : 2;
  118. };
  119. } mirror;
  120. uint8_t rfui1;
  121. uint8_t mirror_page;
  122. uint8_t auth0;
  123. union {
  124. uint8_t value;
  125. struct {
  126. uint8_t authlim : 3;
  127. bool nfc_cnt_pwd_prot : 1;
  128. bool nfc_cnt_en : 1;
  129. bool nfc_dis_sec1 : 1; // NTAG I2C Plus only
  130. bool cfglck : 1;
  131. bool prot : 1;
  132. };
  133. } access;
  134. uint8_t vctid;
  135. uint8_t rfui2[2];
  136. MfUltralightAuth auth_data;
  137. uint8_t rfui3[2];
  138. } MfUltralightConfigPages;
  139. typedef struct {
  140. uint16_t pages_to_read;
  141. int16_t pages_read;
  142. MfUltralightFeatures supported_features;
  143. } MfUltralightReader;
  144. typedef struct {
  145. MfUltralightData data;
  146. MfUltralightConfigPages* config;
  147. // Most config values don't apply until power cycle, so cache config pages
  148. // for correct behavior
  149. MfUltralightConfigPages config_cache;
  150. MfUltralightFeatures supported_features;
  151. uint16_t page_num;
  152. bool data_changed;
  153. bool comp_write_cmd_started;
  154. uint8_t comp_write_page_addr;
  155. bool auth_success;
  156. uint8_t curr_sector;
  157. bool sector_select_cmd_started;
  158. bool ntag_i2c_plus_sector3_lockout;
  159. bool read_counter_incremented;
  160. } MfUltralightEmulator;
  161. bool mf_ul_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
  162. bool mf_ultralight_read_version(
  163. FuriHalNfcTxRxContext* tx_rx,
  164. MfUltralightReader* reader,
  165. MfUltralightData* data);
  166. bool mf_ultralight_read_pages_direct(
  167. FuriHalNfcTxRxContext* tx_rx,
  168. uint8_t start_index,
  169. uint8_t* data);
  170. bool mf_ultralight_read_pages(
  171. FuriHalNfcTxRxContext* tx_rx,
  172. MfUltralightReader* reader,
  173. MfUltralightData* data);
  174. bool mf_ultralight_fast_read_pages(
  175. FuriHalNfcTxRxContext* tx_rx,
  176. MfUltralightReader* reader,
  177. MfUltralightData* data);
  178. bool mf_ultralight_read_signature(FuriHalNfcTxRxContext* tx_rx, MfUltralightData* data);
  179. bool mf_ultralight_read_counters(FuriHalNfcTxRxContext* tx_rx, MfUltralightData* data);
  180. bool mf_ultralight_read_tearing_flags(FuriHalNfcTxRxContext* tx_rx, MfUltralightData* data);
  181. bool mf_ul_read_card(
  182. FuriHalNfcTxRxContext* tx_rx,
  183. MfUltralightReader* reader,
  184. MfUltralightData* data);
  185. void mf_ul_reset_emulation(MfUltralightEmulator* emulator, bool is_power_cycle);
  186. void mf_ul_prepare_emulation(MfUltralightEmulator* emulator, MfUltralightData* data);
  187. bool mf_ul_prepare_emulation_response(
  188. uint8_t* buff_rx,
  189. uint16_t buff_rx_len,
  190. uint8_t* buff_tx,
  191. uint16_t* buff_tx_len,
  192. uint32_t* data_type,
  193. void* context);