mifare_desfire.h 5.1 KB

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