mifare_classic.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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_CLASSIC_1K_TOTAL_SECTORS_NUM (16)
  7. #define MF_CLASSIC_4K_TOTAL_SECTORS_NUM (40)
  8. #define MF_CLASSIC_SECTORS_MAX (40)
  9. #define MF_CLASSIC_BLOCKS_IN_SECTOR_MAX (16)
  10. #define MF_CLASSIC_NO_KEY (0xFFFFFFFFFFFFFFFF)
  11. #define MF_CLASSIC_MAX_DATA_SIZE (16)
  12. #define MF_CLASSIC_KEY_SIZE (6)
  13. #define MF_CLASSIC_ACCESS_BYTES_SIZE (4)
  14. typedef enum {
  15. MfClassicType1k,
  16. MfClassicType4k,
  17. } MfClassicType;
  18. typedef enum {
  19. MfClassicKeyA,
  20. MfClassicKeyB,
  21. } MfClassicKey;
  22. typedef struct {
  23. uint8_t value[MF_CLASSIC_BLOCK_SIZE];
  24. } MfClassicBlock;
  25. typedef struct {
  26. uint8_t key_a[MF_CLASSIC_KEY_SIZE];
  27. uint8_t access_bits[MF_CLASSIC_ACCESS_BYTES_SIZE];
  28. uint8_t key_b[MF_CLASSIC_KEY_SIZE];
  29. } MfClassicSectorTrailer;
  30. typedef struct {
  31. uint8_t total_blocks;
  32. MfClassicBlock block[MF_CLASSIC_BLOCKS_IN_SECTOR_MAX];
  33. } MfClassicSector;
  34. typedef struct {
  35. MfClassicType type;
  36. uint32_t block_read_mask[MF_CLASSIC_TOTAL_BLOCKS_MAX / 32];
  37. uint64_t key_a_mask;
  38. uint64_t key_b_mask;
  39. MfClassicBlock block[MF_CLASSIC_TOTAL_BLOCKS_MAX];
  40. } MfClassicData;
  41. typedef struct {
  42. uint8_t sector;
  43. uint64_t key_a;
  44. uint64_t key_b;
  45. } MfClassicAuthContext;
  46. typedef struct {
  47. uint8_t sector_num;
  48. uint64_t key_a;
  49. uint64_t key_b;
  50. } MfClassicSectorReader;
  51. typedef struct {
  52. MfClassicType type;
  53. Crypto1 crypto;
  54. uint8_t sectors_to_read;
  55. MfClassicSectorReader sector_reader[MF_CLASSIC_SECTORS_MAX];
  56. } MfClassicReader;
  57. typedef struct {
  58. uint32_t cuid;
  59. Crypto1 crypto;
  60. MfClassicData data;
  61. bool data_changed;
  62. } MfClassicEmulator;
  63. const char* mf_classic_get_type_str(MfClassicType type);
  64. bool mf_classic_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
  65. MfClassicType mf_classic_get_classic_type(int8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
  66. uint8_t mf_classic_get_total_sectors_num(MfClassicType type);
  67. uint8_t mf_classic_get_sector_trailer_block_num_by_sector(uint8_t sector);
  68. bool mf_classic_is_sector_trailer(uint8_t block);
  69. uint8_t mf_classic_get_sector_by_block(uint8_t block);
  70. bool mf_classic_is_key_found(MfClassicData* data, uint8_t sector_num, MfClassicKey key_type);
  71. void mf_classic_set_key_found(
  72. MfClassicData* data,
  73. uint8_t sector_num,
  74. MfClassicKey key_type,
  75. uint64_t key);
  76. void mf_classic_set_key_not_found(MfClassicData* data, uint8_t sector_num, MfClassicKey key_type);
  77. bool mf_classic_is_block_read(MfClassicData* data, uint8_t block_num);
  78. void mf_classic_set_block_read(MfClassicData* data, uint8_t block_num, MfClassicBlock* block_data);
  79. bool mf_classic_is_sector_read(MfClassicData* data, uint8_t sector_num);
  80. bool mf_classic_is_card_read(MfClassicData* data);
  81. void mf_classic_get_read_sectors_and_keys(
  82. MfClassicData* data,
  83. uint8_t* sectors_read,
  84. uint8_t* keys_found);
  85. MfClassicSectorTrailer*
  86. mf_classic_get_sector_trailer_by_sector(MfClassicData* data, uint8_t sector);
  87. void mf_classic_auth_init_context(MfClassicAuthContext* auth_ctx, uint8_t sector);
  88. bool mf_classic_authenticate(
  89. FuriHalNfcTxRxContext* tx_rx,
  90. uint8_t block_num,
  91. uint64_t key,
  92. MfClassicKey key_type);
  93. bool mf_classic_auth_attempt(
  94. FuriHalNfcTxRxContext* tx_rx,
  95. MfClassicAuthContext* auth_ctx,
  96. uint64_t key);
  97. void mf_classic_reader_add_sector(
  98. MfClassicReader* reader,
  99. uint8_t sector,
  100. uint64_t key_a,
  101. uint64_t key_b);
  102. void mf_classic_read_sector(FuriHalNfcTxRxContext* tx_rx, MfClassicData* data, uint8_t sec_num);
  103. uint8_t mf_classic_read_card(
  104. FuriHalNfcTxRxContext* tx_rx,
  105. MfClassicReader* reader,
  106. MfClassicData* data);
  107. uint8_t mf_classic_update_card(FuriHalNfcTxRxContext* tx_rx, MfClassicData* data);
  108. bool mf_classic_emulator(MfClassicEmulator* emulator, FuriHalNfcTxRxContext* tx_rx);