mifare_ultralight.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. #include "mifare_ultralight.h"
  2. #include <furi.h>
  3. #define TAG "MfUltralight"
  4. bool mf_ul_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) {
  5. if((ATQA0 == 0x44) && (ATQA1 == 0x00) && (SAK == 0x00)) {
  6. return true;
  7. }
  8. return false;
  9. }
  10. static void mf_ul_set_default_version(MfUltralightReader* reader, MfUltralightData* data) {
  11. data->type = MfUltralightTypeUnknown;
  12. reader->pages_to_read = 16;
  13. reader->support_fast_read = false;
  14. }
  15. bool mf_ultralight_read_version(
  16. FuriHalNfcTxRxContext* tx_rx,
  17. MfUltralightReader* reader,
  18. MfUltralightData* data) {
  19. bool version_read = false;
  20. do {
  21. FURI_LOG_D(TAG, "Reading version");
  22. tx_rx->tx_data[0] = MF_UL_GET_VERSION_CMD;
  23. tx_rx->tx_bits = 8;
  24. tx_rx->tx_rx_type = FuriHalNfcTxRxTypeDefault;
  25. if(!furi_hal_nfc_tx_rx(tx_rx, 4)) {
  26. FURI_LOG_D(TAG, "Failed reading version");
  27. mf_ul_set_default_version(reader, data);
  28. furi_hal_nfc_sleep();
  29. furi_hal_nfc_activate_nfca(300, NULL);
  30. break;
  31. }
  32. MfUltralightVersion* version = (MfUltralightVersion*)tx_rx->rx_data;
  33. data->version = *version;
  34. if(version->storage_size == 0x0B || version->storage_size == 0x00) {
  35. data->type = MfUltralightTypeUL11;
  36. reader->pages_to_read = 20;
  37. reader->support_fast_read = true;
  38. } else if(version->storage_size == 0x0E) {
  39. data->type = MfUltralightTypeUL21;
  40. reader->pages_to_read = 41;
  41. reader->support_fast_read = true;
  42. } else if(version->storage_size == 0x0F) {
  43. data->type = MfUltralightTypeNTAG213;
  44. reader->pages_to_read = 45;
  45. reader->support_fast_read = false;
  46. } else if(version->storage_size == 0x11) {
  47. data->type = MfUltralightTypeNTAG215;
  48. reader->pages_to_read = 135;
  49. reader->support_fast_read = false;
  50. } else if(version->storage_size == 0x13) {
  51. data->type = MfUltralightTypeNTAG216;
  52. reader->pages_to_read = 231;
  53. reader->support_fast_read = false;
  54. } else {
  55. mf_ul_set_default_version(reader, data);
  56. break;
  57. }
  58. version_read = true;
  59. } while(false);
  60. return version_read;
  61. }
  62. bool mf_ultralight_read_pages(
  63. FuriHalNfcTxRxContext* tx_rx,
  64. MfUltralightReader* reader,
  65. MfUltralightData* data) {
  66. uint8_t pages_read_cnt = 0;
  67. for(size_t i = 0; i < reader->pages_to_read; i += 4) {
  68. FURI_LOG_D(TAG, "Reading pages %d - %d", i, i + 3);
  69. tx_rx->tx_data[0] = MF_UL_READ_CMD;
  70. tx_rx->tx_data[1] = i;
  71. tx_rx->tx_bits = 16;
  72. tx_rx->tx_rx_type = FuriHalNfcTxRxTypeDefault;
  73. if(!furi_hal_nfc_tx_rx(tx_rx, 4)) {
  74. FURI_LOG_D(TAG, "Failed to read pages %d - %d", i, i + 3);
  75. break;
  76. }
  77. if(i + 4 <= reader->pages_to_read) {
  78. pages_read_cnt = 4;
  79. } else {
  80. pages_read_cnt = reader->pages_to_read - reader->pages_read;
  81. }
  82. reader->pages_read += pages_read_cnt;
  83. data->data_size = reader->pages_read * 4;
  84. memcpy(&data->data[i * 4], tx_rx->rx_data, pages_read_cnt * 4);
  85. }
  86. return reader->pages_read == reader->pages_to_read;
  87. }
  88. bool mf_ultralight_fast_read_pages(
  89. FuriHalNfcTxRxContext* tx_rx,
  90. MfUltralightReader* reader,
  91. MfUltralightData* data) {
  92. FURI_LOG_D(TAG, "Reading pages 0 - %d", reader->pages_to_read);
  93. tx_rx->tx_data[0] = MF_UL_FAST_READ_CMD;
  94. tx_rx->tx_data[1] = 0;
  95. tx_rx->tx_data[2] = reader->pages_to_read - 1;
  96. tx_rx->tx_bits = 24;
  97. tx_rx->tx_rx_type = FuriHalNfcTxRxTypeDefault;
  98. if(furi_hal_nfc_tx_rx(tx_rx, 20)) {
  99. reader->pages_read = reader->pages_to_read;
  100. data->data_size = reader->pages_read * 4;
  101. memcpy(data->data, tx_rx->rx_data, data->data_size);
  102. } else {
  103. FURI_LOG_D(TAG, "Failed to read pages 0 - %d", reader->pages_to_read);
  104. }
  105. return reader->pages_read == reader->pages_to_read;
  106. }
  107. bool mf_ultralight_read_signature(FuriHalNfcTxRxContext* tx_rx, MfUltralightData* data) {
  108. bool signature_read = false;
  109. FURI_LOG_D(TAG, "Reading signature");
  110. tx_rx->tx_data[0] = MF_UL_READ_SIG;
  111. tx_rx->tx_data[1] = 0;
  112. tx_rx->tx_bits = 16;
  113. tx_rx->tx_rx_type = FuriHalNfcTxRxTypeDefault;
  114. if(furi_hal_nfc_tx_rx(tx_rx, 7)) {
  115. memcpy(data->signature, tx_rx->rx_data, sizeof(data->signature));
  116. signature_read = true;
  117. } else {
  118. FURI_LOG_D(TAG, "Failed redaing signature");
  119. }
  120. return signature_read;
  121. }
  122. bool mf_ultralight_read_counters(FuriHalNfcTxRxContext* tx_rx, MfUltralightData* data) {
  123. uint8_t counter_read = 0;
  124. FURI_LOG_D(TAG, "Reading counters");
  125. for(size_t i = 0; i < 3; i++) {
  126. tx_rx->tx_data[0] = MF_UL_READ_CNT;
  127. tx_rx->rx_data[1] = i;
  128. tx_rx->tx_bits = 16;
  129. tx_rx->tx_rx_type = FuriHalNfcTxRxTypeDefault;
  130. if(!furi_hal_nfc_tx_rx(tx_rx, 4)) {
  131. FURI_LOG_D(TAG, "Failed to read %d counter", i);
  132. break;
  133. }
  134. data->counter[i] = (tx_rx->rx_data[2] << 16) | (tx_rx->rx_data[1] << 8) |
  135. tx_rx->rx_data[0];
  136. counter_read++;
  137. }
  138. return counter_read == 2;
  139. }
  140. bool mf_ultralight_read_tearing_flags(FuriHalNfcTxRxContext* tx_rx, MfUltralightData* data) {
  141. uint8_t flag_read = 0;
  142. FURI_LOG_D(TAG, "Reading tearing flags");
  143. for(size_t i = 0; i < 3; i++) {
  144. tx_rx->tx_data[0] = MF_UL_CHECK_TEARING;
  145. tx_rx->rx_data[1] = i;
  146. tx_rx->tx_bits = 16;
  147. tx_rx->tx_rx_type = FuriHalNfcTxRxTypeDefault;
  148. if(!furi_hal_nfc_tx_rx(tx_rx, 4)) {
  149. FURI_LOG_D(TAG, "Failed to read %d tearing flag", i);
  150. break;
  151. }
  152. data->tearing[i] = tx_rx->rx_data[0];
  153. flag_read++;
  154. }
  155. return flag_read == 2;
  156. }
  157. bool mf_ul_read_card(
  158. FuriHalNfcTxRxContext* tx_rx,
  159. MfUltralightReader* reader,
  160. MfUltralightData* data) {
  161. furi_assert(tx_rx);
  162. furi_assert(reader);
  163. furi_assert(data);
  164. bool card_read = false;
  165. // Read Mifare Ultralight version
  166. if(mf_ultralight_read_version(tx_rx, reader, data)) {
  167. // Read Signature
  168. mf_ultralight_read_signature(tx_rx, data);
  169. }
  170. // Read data blocks
  171. if(reader->support_fast_read) {
  172. mf_ultralight_read_counters(tx_rx, data);
  173. mf_ultralight_read_tearing_flags(tx_rx, data);
  174. }
  175. card_read = mf_ultralight_read_pages(tx_rx, reader, data);
  176. return card_read;
  177. }
  178. // TODO rework
  179. static void mf_ul_protect_auth_data_on_read_command(
  180. uint8_t* tx_buff,
  181. uint8_t start_page,
  182. uint8_t end_page,
  183. MfUltralightEmulator* emulator) {
  184. if(emulator->data.type >= MfUltralightTypeNTAG213) {
  185. uint8_t pwd_page = (emulator->data.data_size / 4) - 2;
  186. uint8_t pack_page = pwd_page + 1;
  187. if((start_page <= pwd_page) && (end_page >= pwd_page)) {
  188. memset(&tx_buff[(pwd_page - start_page) * 4], 0, 4);
  189. }
  190. if((start_page <= pack_page) && (end_page >= pack_page)) {
  191. memset(&tx_buff[(pack_page - start_page) * 4], 0, 2);
  192. }
  193. }
  194. }
  195. void mf_ul_prepare_emulation(MfUltralightEmulator* emulator, MfUltralightData* data) {
  196. emulator->data = *data;
  197. emulator->auth_data = NULL;
  198. emulator->data_changed = false;
  199. emulator->comp_write_cmd_started = false;
  200. if(data->type == MfUltralightTypeUnknown) {
  201. emulator->support_fast_read = false;
  202. } else if(data->type == MfUltralightTypeUL11) {
  203. emulator->support_fast_read = true;
  204. } else if(data->type == MfUltralightTypeUL21) {
  205. emulator->support_fast_read = true;
  206. } else if(data->type == MfUltralightTypeNTAG213) {
  207. emulator->support_fast_read = false;
  208. } else if(data->type == MfUltralightTypeNTAG215) {
  209. emulator->support_fast_read = false;
  210. } else if(data->type == MfUltralightTypeNTAG216) {
  211. emulator->support_fast_read = false;
  212. }
  213. if(data->type >= MfUltralightTypeNTAG213) {
  214. uint16_t pwd_page = (data->data_size / 4) - 2;
  215. emulator->auth_data = (MfUltralightAuth*)&data->data[pwd_page * 4];
  216. }
  217. }
  218. bool mf_ul_prepare_emulation_response(
  219. uint8_t* buff_rx,
  220. uint16_t buff_rx_len,
  221. uint8_t* buff_tx,
  222. uint16_t* buff_tx_len,
  223. uint32_t* data_type,
  224. void* context) {
  225. furi_assert(context);
  226. MfUltralightEmulator* emulator = context;
  227. uint8_t cmd = buff_rx[0];
  228. uint16_t page_num = emulator->data.data_size / 4;
  229. uint16_t tx_bytes = 0;
  230. uint16_t tx_bits = 0;
  231. bool command_parsed = false;
  232. // Check composite commands
  233. if(emulator->comp_write_cmd_started) {
  234. // Compatibility write is the only one composit command
  235. if(buff_rx_len == 16) {
  236. memcpy(&emulator->data.data[emulator->comp_write_page_addr * 4], buff_rx, 4);
  237. emulator->data_changed = true;
  238. // Send ACK message
  239. buff_tx[0] = 0x0A;
  240. tx_bits = 4;
  241. *data_type = FURI_HAL_NFC_TXRX_RAW;
  242. command_parsed = true;
  243. }
  244. emulator->comp_write_cmd_started = false;
  245. } else if(cmd == MF_UL_GET_VERSION_CMD) {
  246. if(emulator->data.type != MfUltralightTypeUnknown) {
  247. tx_bytes = sizeof(emulator->data.version);
  248. memcpy(buff_tx, &emulator->data.version, tx_bytes);
  249. *data_type = FURI_HAL_NFC_TXRX_DEFAULT;
  250. command_parsed = true;
  251. }
  252. } else if(cmd == MF_UL_READ_CMD) {
  253. uint8_t start_page = buff_rx[1];
  254. if(start_page < page_num) {
  255. tx_bytes = 16;
  256. if(start_page + 4 > page_num) {
  257. // Handle roll-over mechanism
  258. uint8_t end_pages_num = page_num - start_page;
  259. memcpy(buff_tx, &emulator->data.data[start_page * 4], end_pages_num * 4);
  260. memcpy(&buff_tx[end_pages_num * 4], emulator->data.data, (4 - end_pages_num) * 4);
  261. } else {
  262. memcpy(buff_tx, &emulator->data.data[start_page * 4], tx_bytes);
  263. }
  264. mf_ul_protect_auth_data_on_read_command(
  265. buff_tx, start_page, (start_page + 4), emulator);
  266. *data_type = FURI_HAL_NFC_TXRX_DEFAULT;
  267. command_parsed = true;
  268. }
  269. } else if(cmd == MF_UL_FAST_READ_CMD) {
  270. if(emulator->support_fast_read) {
  271. uint8_t start_page = buff_rx[1];
  272. uint8_t end_page = buff_rx[2];
  273. if((start_page < page_num) && (end_page < page_num) && (start_page < (end_page + 1))) {
  274. tx_bytes = ((end_page + 1) - start_page) * 4;
  275. memcpy(buff_tx, &emulator->data.data[start_page * 4], tx_bytes);
  276. mf_ul_protect_auth_data_on_read_command(buff_tx, start_page, end_page, emulator);
  277. *data_type = FURI_HAL_NFC_TXRX_DEFAULT;
  278. command_parsed = true;
  279. }
  280. }
  281. } else if(cmd == MF_UL_WRITE) {
  282. uint8_t write_page = buff_rx[1];
  283. if((write_page > 1) && (write_page < page_num - 2)) {
  284. memcpy(&emulator->data.data[write_page * 4], &buff_rx[2], 4);
  285. emulator->data_changed = true;
  286. // ACK
  287. buff_tx[0] = 0x0A;
  288. tx_bits = 4;
  289. *data_type = FURI_HAL_NFC_TXRX_RAW;
  290. command_parsed = true;
  291. }
  292. } else if(cmd == MF_UL_COMP_WRITE) {
  293. uint8_t write_page = buff_rx[1];
  294. if((write_page > 1) && (write_page < page_num - 2)) {
  295. emulator->comp_write_cmd_started = true;
  296. emulator->comp_write_page_addr = write_page;
  297. // ACK
  298. buff_tx[0] = 0x0A;
  299. tx_bits = 4;
  300. *data_type = FURI_HAL_NFC_TXRX_RAW;
  301. command_parsed = true;
  302. }
  303. } else if(cmd == MF_UL_READ_CNT) {
  304. uint8_t cnt_num = buff_rx[1];
  305. if(cnt_num < 3) {
  306. buff_tx[0] = emulator->data.counter[cnt_num] >> 16;
  307. buff_tx[1] = emulator->data.counter[cnt_num] >> 8;
  308. buff_tx[2] = emulator->data.counter[cnt_num];
  309. tx_bytes = 3;
  310. *data_type = FURI_HAL_NFC_TXRX_DEFAULT;
  311. command_parsed = true;
  312. }
  313. } else if(cmd == MF_UL_INC_CNT) {
  314. uint8_t cnt_num = buff_rx[1];
  315. uint32_t inc = (buff_rx[2] | (buff_rx[3] << 8) | (buff_rx[4] << 16));
  316. if((cnt_num < 3) && (emulator->data.counter[cnt_num] + inc < 0x00FFFFFF)) {
  317. emulator->data.counter[cnt_num] += inc;
  318. emulator->data_changed = true;
  319. // ACK
  320. buff_tx[0] = 0x0A;
  321. tx_bits = 4;
  322. *data_type = FURI_HAL_NFC_TXRX_RAW;
  323. command_parsed = true;
  324. }
  325. } else if(cmd == MF_UL_AUTH) {
  326. if(emulator->data.type >= MfUltralightTypeNTAG213) {
  327. if(memcmp(&buff_rx[1], emulator->auth_data->pwd, 4) == 0) {
  328. buff_tx[0] = emulator->auth_data->pack.raw[0];
  329. buff_tx[1] = emulator->auth_data->pack.raw[1];
  330. tx_bytes = 2;
  331. *data_type = FURI_HAL_NFC_TXRX_DEFAULT;
  332. command_parsed = true;
  333. } else if(!emulator->auth_data->pack.value) {
  334. buff_tx[0] = 0x80;
  335. buff_tx[1] = 0x80;
  336. tx_bytes = 2;
  337. *data_type = FURI_HAL_NFC_TXRX_DEFAULT;
  338. command_parsed = true;
  339. }
  340. }
  341. } else if(cmd == MF_UL_READ_SIG) {
  342. // Check 2nd byte = 0x00 - RFU
  343. if(buff_rx[1] == 0x00) {
  344. tx_bytes = sizeof(emulator->data.signature);
  345. memcpy(buff_tx, emulator->data.signature, tx_bytes);
  346. *data_type = FURI_HAL_NFC_TXRX_DEFAULT;
  347. command_parsed = true;
  348. }
  349. } else if(cmd == MF_UL_CHECK_TEARING) {
  350. uint8_t cnt_num = buff_rx[1];
  351. if(cnt_num < 3) {
  352. buff_tx[0] = emulator->data.tearing[cnt_num];
  353. tx_bytes = 1;
  354. *data_type = FURI_HAL_NFC_TXRX_DEFAULT;
  355. command_parsed = true;
  356. }
  357. } else if(cmd == MF_UL_HALT_START) {
  358. tx_bits = 0;
  359. command_parsed = true;
  360. }
  361. if(!command_parsed) {
  362. // Send NACK
  363. buff_tx[0] = 0x00;
  364. tx_bits = 4;
  365. *data_type = FURI_HAL_NFC_TXRX_RAW;
  366. }
  367. // Return tx buffer size in bits
  368. if(tx_bytes) {
  369. tx_bits = tx_bytes * 8;
  370. }
  371. *buff_tx_len = tx_bits;
  372. return tx_bits > 0;
  373. }