mifare_classic.h 5.2 KB

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