mifare_classic.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. typedef enum {
  12. MfClassicType1k,
  13. MfClassicType4k,
  14. } MfClassicType;
  15. typedef enum {
  16. MfClassicKeyA,
  17. MfClassicKeyB,
  18. } MfClassicKey;
  19. typedef struct {
  20. uint8_t value[MF_CLASSIC_BLOCK_SIZE];
  21. } MfClassicBlock;
  22. typedef struct {
  23. uint8_t key_a[6];
  24. uint8_t access_bits[4];
  25. uint8_t key_b[6];
  26. } MfClassicSectorTrailer;
  27. typedef struct {
  28. uint8_t total_blocks;
  29. MfClassicBlock block[MF_CLASSIC_BLOCKS_IN_SECTOR_MAX];
  30. } MfClassicSector;
  31. typedef struct {
  32. MfClassicType type;
  33. MfClassicBlock block[MF_CLASSIC_TOTAL_BLOCKS_MAX];
  34. } MfClassicData;
  35. typedef struct {
  36. uint32_t cuid;
  37. uint8_t sector;
  38. uint64_t key_a;
  39. uint64_t key_b;
  40. } MfClassicAuthContext;
  41. typedef struct {
  42. uint8_t sector_num;
  43. uint64_t key_a;
  44. uint64_t key_b;
  45. } MfClassicSectorReader;
  46. typedef struct {
  47. MfClassicType type;
  48. uint32_t cuid;
  49. uint8_t sectors_to_read;
  50. Crypto1 crypto;
  51. MfClassicSectorReader sector_reader[MF_CLASSIC_SECTORS_MAX];
  52. } MfClassicReader;
  53. bool mf_classic_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
  54. bool mf_classic_get_type(
  55. uint8_t* uid,
  56. uint8_t uid_len,
  57. uint8_t ATQA0,
  58. uint8_t ATQA1,
  59. uint8_t SAK,
  60. MfClassicReader* reader);
  61. uint8_t mf_classic_get_total_sectors_num(MfClassicReader* reader);
  62. void mf_classic_auth_init_context(MfClassicAuthContext* auth_ctx, uint32_t cuid, uint8_t sector);
  63. bool mf_classic_auth_attempt(
  64. FuriHalNfcTxRxContext* tx_rx,
  65. MfClassicAuthContext* auth_ctx,
  66. uint64_t key);
  67. void mf_classic_reader_add_sector(
  68. MfClassicReader* reader,
  69. uint8_t sector,
  70. uint64_t key_a,
  71. uint64_t key_b);
  72. bool mf_classic_read_sector(
  73. FuriHalNfcTxRxContext* tx_rx,
  74. Crypto1* crypto,
  75. MfClassicSectorReader* sector_reader,
  76. MfClassicSector* sector);
  77. uint8_t mf_classic_read_card(
  78. FuriHalNfcTxRxContext* tx_rx,
  79. MfClassicReader* reader,
  80. MfClassicData* data);