mifare_classic.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #pragma once
  2. #include "../furi_hal_nfc.h"
  3. #include "crypto1.h"
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. #define MF_CLASSIC_BLOCK_SIZE (16)
  8. #define MF_CLASSIC_TOTAL_BLOCKS_MAX (256)
  9. #define MF_MINI_TOTAL_SECTORS_NUM (5)
  10. #define MF_CLASSIC_1K_TOTAL_SECTORS_NUM (16)
  11. #define MF_CLASSIC_4K_TOTAL_SECTORS_NUM (40)
  12. #define MF_CLASSIC_SECTORS_MAX (40)
  13. #define MF_CLASSIC_BLOCKS_IN_SECTOR_MAX (16)
  14. #define MF_CLASSIC_NO_KEY (0xFFFFFFFFFFFFFFFF)
  15. #define MF_CLASSIC_MAX_DATA_SIZE (16)
  16. #define MF_CLASSIC_KEY_SIZE (6)
  17. #define MF_CLASSIC_ACCESS_BYTES_SIZE (4)
  18. typedef enum {
  19. MfClassicType1k,
  20. MfClassicType4k,
  21. MfClassicTypeMini,
  22. } MfClassicType;
  23. typedef enum {
  24. MfClassicKeyA,
  25. MfClassicKeyB,
  26. } MfClassicKey;
  27. typedef enum {
  28. MfClassicActionDataRead,
  29. MfClassicActionDataWrite,
  30. MfClassicActionDataInc,
  31. MfClassicActionDataDec,
  32. MfClassicActionKeyARead,
  33. MfClassicActionKeyAWrite,
  34. MfClassicActionKeyBRead,
  35. MfClassicActionKeyBWrite,
  36. MfClassicActionACRead,
  37. MfClassicActionACWrite,
  38. } MfClassicAction;
  39. typedef struct {
  40. uint8_t value[MF_CLASSIC_BLOCK_SIZE];
  41. } MfClassicBlock;
  42. typedef struct {
  43. uint8_t key_a[MF_CLASSIC_KEY_SIZE];
  44. uint8_t access_bits[MF_CLASSIC_ACCESS_BYTES_SIZE];
  45. uint8_t key_b[MF_CLASSIC_KEY_SIZE];
  46. } MfClassicSectorTrailer;
  47. typedef struct {
  48. uint8_t total_blocks;
  49. MfClassicBlock block[MF_CLASSIC_BLOCKS_IN_SECTOR_MAX];
  50. } MfClassicSector;
  51. typedef struct {
  52. MfClassicType type;
  53. uint32_t block_read_mask[MF_CLASSIC_TOTAL_BLOCKS_MAX / 32];
  54. uint64_t key_a_mask;
  55. uint64_t key_b_mask;
  56. MfClassicBlock block[MF_CLASSIC_TOTAL_BLOCKS_MAX];
  57. } MfClassicData;
  58. typedef struct {
  59. uint8_t sector;
  60. uint64_t key_a;
  61. uint64_t key_b;
  62. } MfClassicAuthContext;
  63. typedef struct {
  64. uint8_t sector_num;
  65. uint64_t key_a;
  66. uint64_t key_b;
  67. } MfClassicSectorReader;
  68. typedef struct {
  69. MfClassicType type;
  70. Crypto1 crypto;
  71. uint8_t sectors_to_read;
  72. MfClassicSectorReader sector_reader[MF_CLASSIC_SECTORS_MAX];
  73. } MfClassicReader;
  74. typedef struct {
  75. uint32_t cuid;
  76. Crypto1 crypto;
  77. MfClassicData data;
  78. bool data_changed;
  79. } MfClassicEmulator;
  80. const char* mf_classic_get_type_str(MfClassicType type);
  81. bool mf_classic_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
  82. MfClassicType mf_classic_get_classic_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
  83. uint8_t mf_classic_get_total_sectors_num(MfClassicType type);
  84. uint16_t mf_classic_get_total_block_num(MfClassicType type);
  85. uint8_t mf_classic_get_sector_trailer_block_num_by_sector(uint8_t sector);
  86. bool mf_classic_is_sector_trailer(uint8_t block);
  87. uint8_t mf_classic_get_sector_by_block(uint8_t block);
  88. bool mf_classic_is_allowed_access_sector_trailer(
  89. MfClassicData* data,
  90. uint8_t block_num,
  91. MfClassicKey key,
  92. MfClassicAction action);
  93. bool mf_classic_is_allowed_access_data_block(
  94. MfClassicData* data,
  95. uint8_t block_num,
  96. MfClassicKey key,
  97. MfClassicAction action);
  98. bool mf_classic_is_value_block(MfClassicData* data, uint8_t block_num);
  99. bool mf_classic_block_to_value(const uint8_t* block, int32_t* value, uint8_t* addr);
  100. void mf_classic_value_to_block(int32_t value, uint8_t addr, uint8_t* block);
  101. bool mf_classic_is_key_found(MfClassicData* data, uint8_t sector_num, MfClassicKey key_type);
  102. void mf_classic_set_key_found(
  103. MfClassicData* data,
  104. uint8_t sector_num,
  105. MfClassicKey key_type,
  106. uint64_t key);
  107. void mf_classic_set_key_not_found(MfClassicData* data, uint8_t sector_num, MfClassicKey key_type);
  108. bool mf_classic_is_block_read(MfClassicData* data, uint8_t block_num);
  109. void mf_classic_set_block_read(MfClassicData* data, uint8_t block_num, MfClassicBlock* block_data);
  110. bool mf_classic_is_sector_data_read(MfClassicData* data, uint8_t sector_num);
  111. void mf_classic_set_sector_data_not_read(MfClassicData* data);
  112. bool mf_classic_is_sector_read(MfClassicData* data, uint8_t sector_num);
  113. bool mf_classic_is_card_read(MfClassicData* data);
  114. void mf_classic_get_read_sectors_and_keys(
  115. MfClassicData* data,
  116. uint8_t* sectors_read,
  117. uint8_t* keys_found);
  118. MfClassicSectorTrailer*
  119. mf_classic_get_sector_trailer_by_sector(MfClassicData* data, uint8_t sector);
  120. void mf_classic_auth_init_context(MfClassicAuthContext* auth_ctx, uint8_t sector);
  121. bool mf_classic_authenticate(
  122. FurryHalNfcTxRxContext* tx_rx,
  123. uint8_t block_num,
  124. uint64_t key,
  125. MfClassicKey key_type);
  126. bool mf_classic_authenticate_skip_activate(
  127. FurryHalNfcTxRxContext* tx_rx,
  128. uint8_t block_num,
  129. uint64_t key,
  130. MfClassicKey key_type,
  131. bool skip_activate,
  132. uint32_t cuid);
  133. bool mf_classic_auth_attempt(
  134. FurryHalNfcTxRxContext* tx_rx,
  135. Crypto1* crypto,
  136. MfClassicAuthContext* auth_ctx,
  137. uint64_t key);
  138. void mf_classic_reader_add_sector(
  139. MfClassicReader* reader,
  140. uint8_t sector,
  141. uint64_t key_a,
  142. uint64_t key_b);
  143. bool mf_classic_read_block(
  144. FurryHalNfcTxRxContext* tx_rx,
  145. Crypto1* crypto,
  146. uint8_t block_num,
  147. MfClassicBlock* block);
  148. void mf_classic_read_sector(FurryHalNfcTxRxContext* tx_rx, MfClassicData* data, uint8_t sec_num);
  149. uint8_t mf_classic_read_card(
  150. FurryHalNfcTxRxContext* tx_rx,
  151. MfClassicReader* reader,
  152. MfClassicData* data);
  153. uint8_t mf_classic_update_card(FurryHalNfcTxRxContext* tx_rx, MfClassicData* data);
  154. bool mf_classic_emulator(
  155. MfClassicEmulator* emulator,
  156. FurryHalNfcTxRxContext* tx_rx,
  157. bool is_reader_analyzer);
  158. void mf_classic_halt(FurryHalNfcTxRxContext* tx_rx, Crypto1* crypto);
  159. bool mf_classic_write_block(
  160. FurryHalNfcTxRxContext* tx_rx,
  161. Crypto1* crypto,
  162. uint8_t block_num,
  163. MfClassicBlock* src_block);
  164. bool mf_classic_auth_write_block(
  165. FurryHalNfcTxRxContext* tx_rx,
  166. MfClassicBlock* src_block,
  167. uint8_t block_num,
  168. MfClassicKey key_type,
  169. uint64_t key);
  170. bool mf_classic_transfer(FurryHalNfcTxRxContext* tx_rx, Crypto1* crypto, uint8_t block_num);
  171. bool mf_classic_value_cmd(
  172. FurryHalNfcTxRxContext* tx_rx,
  173. Crypto1* crypto,
  174. uint8_t block_num,
  175. uint8_t cmd,
  176. int32_t d_value);
  177. bool mf_classic_value_cmd_full(
  178. FurryHalNfcTxRxContext* tx_rx,
  179. MfClassicBlock* src_block,
  180. uint8_t block_num,
  181. MfClassicKey key_type,
  182. uint64_t key,
  183. int32_t d_value);
  184. bool mf_classic_write_sector(
  185. FurryHalNfcTxRxContext* tx_rx,
  186. MfClassicData* dest_data,
  187. MfClassicData* src_data,
  188. uint8_t sec_num);
  189. #ifdef __cplusplus
  190. }
  191. #endif