mifare_desfire.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #pragma once
  2. #include <m-string.h>
  3. #include <stdint.h>
  4. #include <stdbool.h>
  5. #include <furi_hal_nfc.h>
  6. #define MF_DF_GET_VERSION (0x60)
  7. #define MF_DF_GET_FREE_MEMORY (0x6E)
  8. #define MF_DF_GET_KEY_SETTINGS (0x45)
  9. #define MF_DF_GET_KEY_VERSION (0x64)
  10. #define MF_DF_GET_APPLICATION_IDS (0x6A)
  11. #define MF_DF_SELECT_APPLICATION (0x5A)
  12. #define MF_DF_GET_FILE_IDS (0x6F)
  13. #define MF_DF_GET_FILE_SETTINGS (0xF5)
  14. #define MF_DF_READ_DATA (0xBD)
  15. #define MF_DF_GET_VALUE (0x6C)
  16. #define MF_DF_READ_RECORDS (0xBB)
  17. typedef struct {
  18. uint8_t hw_vendor;
  19. uint8_t hw_type;
  20. uint8_t hw_subtype;
  21. uint8_t hw_major;
  22. uint8_t hw_minor;
  23. uint8_t hw_storage;
  24. uint8_t hw_proto;
  25. uint8_t sw_vendor;
  26. uint8_t sw_type;
  27. uint8_t sw_subtype;
  28. uint8_t sw_major;
  29. uint8_t sw_minor;
  30. uint8_t sw_storage;
  31. uint8_t sw_proto;
  32. uint8_t uid[7];
  33. uint8_t batch[5];
  34. uint8_t prod_week;
  35. uint8_t prod_year;
  36. } MifareDesfireVersion;
  37. typedef struct {
  38. uint32_t bytes;
  39. } MifareDesfireFreeMemory; // EV1+ only
  40. typedef struct MifareDesfireKeyVersion {
  41. uint8_t id;
  42. uint8_t version;
  43. struct MifareDesfireKeyVersion* next;
  44. } MifareDesfireKeyVersion;
  45. typedef struct {
  46. uint8_t change_key_id;
  47. bool config_changeable;
  48. bool free_create_delete;
  49. bool free_directory_list;
  50. bool master_key_changeable;
  51. uint8_t flags;
  52. uint8_t max_keys;
  53. MifareDesfireKeyVersion* key_version_head;
  54. } MifareDesfireKeySettings;
  55. typedef enum {
  56. MifareDesfireFileTypeStandard = 0,
  57. MifareDesfireFileTypeBackup = 1,
  58. MifareDesfireFileTypeValue = 2,
  59. MifareDesfireFileTypeLinearRecord = 3,
  60. MifareDesfireFileTypeCyclicRecord = 4,
  61. } MifareDesfireFileType;
  62. typedef enum {
  63. MifareDesfireFileCommunicationSettingsPlaintext = 0,
  64. MifareDesfireFileCommunicationSettingsAuthenticated = 1,
  65. MifareDesfireFileCommunicationSettingsEnciphered = 3,
  66. } MifareDesfireFileCommunicationSettings;
  67. typedef struct MifareDesfireFile {
  68. uint8_t id;
  69. MifareDesfireFileType type;
  70. MifareDesfireFileCommunicationSettings comm;
  71. uint16_t access_rights;
  72. union {
  73. struct {
  74. uint32_t size;
  75. } data;
  76. struct {
  77. uint32_t lo_limit;
  78. uint32_t hi_limit;
  79. uint32_t limited_credit_value;
  80. bool limited_credit_enabled;
  81. } value;
  82. struct {
  83. uint32_t size;
  84. uint32_t max;
  85. uint32_t cur;
  86. } record;
  87. } settings;
  88. uint8_t* contents;
  89. struct MifareDesfireFile* next;
  90. } MifareDesfireFile;
  91. typedef struct MifareDesfireApplication {
  92. uint8_t id[3];
  93. MifareDesfireKeySettings* key_settings;
  94. MifareDesfireFile* file_head;
  95. struct MifareDesfireApplication* next;
  96. } MifareDesfireApplication;
  97. typedef struct {
  98. MifareDesfireVersion version;
  99. MifareDesfireFreeMemory* free_memory;
  100. MifareDesfireKeySettings* master_key_settings;
  101. MifareDesfireApplication* app_head;
  102. } MifareDesfireData;
  103. void mf_df_clear(MifareDesfireData* data);
  104. void mf_df_cat_data(MifareDesfireData* data, string_t out);
  105. void mf_df_cat_card_info(MifareDesfireData* data, string_t out);
  106. void mf_df_cat_version(MifareDesfireVersion* version, string_t out);
  107. void mf_df_cat_free_mem(MifareDesfireFreeMemory* free_mem, string_t out);
  108. void mf_df_cat_key_settings(MifareDesfireKeySettings* ks, string_t out);
  109. void mf_df_cat_application_info(MifareDesfireApplication* app, string_t out);
  110. void mf_df_cat_application(MifareDesfireApplication* app, string_t out);
  111. void mf_df_cat_file(MifareDesfireFile* file, string_t out);
  112. bool mf_df_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
  113. uint16_t mf_df_prepare_get_version(uint8_t* dest);
  114. bool mf_df_parse_get_version_response(uint8_t* buf, uint16_t len, MifareDesfireVersion* out);
  115. uint16_t mf_df_prepare_get_free_memory(uint8_t* dest);
  116. bool mf_df_parse_get_free_memory_response(uint8_t* buf, uint16_t len, MifareDesfireFreeMemory* out);
  117. uint16_t mf_df_prepare_get_key_settings(uint8_t* dest);
  118. bool mf_df_parse_get_key_settings_response(
  119. uint8_t* buf,
  120. uint16_t len,
  121. MifareDesfireKeySettings* out);
  122. uint16_t mf_df_prepare_get_key_version(uint8_t* dest, uint8_t key_id);
  123. bool mf_df_parse_get_key_version_response(uint8_t* buf, uint16_t len, MifareDesfireKeyVersion* out);
  124. uint16_t mf_df_prepare_get_application_ids(uint8_t* dest);
  125. bool mf_df_parse_get_application_ids_response(
  126. uint8_t* buf,
  127. uint16_t len,
  128. MifareDesfireApplication** app_head);
  129. uint16_t mf_df_prepare_select_application(uint8_t* dest, uint8_t id[3]);
  130. bool mf_df_parse_select_application_response(uint8_t* buf, uint16_t len);
  131. uint16_t mf_df_prepare_get_file_ids(uint8_t* dest);
  132. bool mf_df_parse_get_file_ids_response(uint8_t* buf, uint16_t len, MifareDesfireFile** file_head);
  133. uint16_t mf_df_prepare_get_file_settings(uint8_t* dest, uint8_t file_id);
  134. bool mf_df_parse_get_file_settings_response(uint8_t* buf, uint16_t len, MifareDesfireFile* out);
  135. uint16_t mf_df_prepare_read_data(uint8_t* dest, uint8_t file_id, uint32_t offset, uint32_t len);
  136. uint16_t mf_df_prepare_get_value(uint8_t* dest, uint8_t file_id);
  137. uint16_t mf_df_prepare_read_records(uint8_t* dest, uint8_t file_id, uint32_t offset, uint32_t len);
  138. bool mf_df_parse_read_data_response(uint8_t* buf, uint16_t len, MifareDesfireFile* out);
  139. bool mf_df_read_card(FuriHalNfcTxRxContext* tx_rx, MifareDesfireData* data);