10#ifndef M5_UNIT_UNIFIED_NFC_NFC_ISODEP_DESFIRE_FILE_SYSTEM_HPP
11#define M5_UNIT_UNIFIED_NFC_NFC_ISODEP_DESFIRE_FILE_SYSTEM_HPP
15#include <m5_utility/stl/expected.hpp>
31constexpr uint8_t DESFIRE_APDU_CLA{0x90};
32constexpr uint8_t DESFIRE_LIGHT_INS_READ_DATA{0xAD};
33constexpr uint8_t DESFIRE_LIGHT_INS_WRITE_DATA{0x8D};
46inline uint16_t clamp_u16_size(
const size_t size)
48 constexpr size_t max_u16 = std::numeric_limits<uint16_t>::max();
49 return static_cast<uint16_t
>(size > max_u16 ? max_u16 : size);
54 const uint16_t cfg_rx = dep.config().max_frame_size_rx();
55 const uint16_t base = cfg_rx ? cfg_rx : 256;
56 return std::max<uint16_t>(256, base);
59inline void pack_le24(uint8_t out[3],
const uint32_t value)
61 out[0] =
static_cast<uint8_t
>(value & 0xFF);
62 out[1] =
static_cast<uint8_t
>((value >> 8) & 0xFF);
63 out[2] =
static_cast<uint8_t
>((value >> 16) & 0xFF);
66inline void pack_be24(uint8_t out[3],
const uint32_t value)
68 out[0] =
static_cast<uint8_t
>((value >> 16) & 0xFF);
69 out[1] =
static_cast<uint8_t
>((value >> 8) & 0xFF);
70 out[2] =
static_cast<uint8_t
>(value & 0xFF);
73inline uint32_t unpack_le24(
const uint8_t in[3])
75 return static_cast<uint32_t
>(in[0]) | (
static_cast<uint32_t
>(in[1]) << 8) | (
static_cast<uint32_t
>(in[2]) << 16);
87 uint16_t access_rights{};
98 inline constexpr uint32_t aid24()
const noexcept
101 return ((uint32_t)aid[0] << 16) | ((uint32_t)aid[1] << 8) | aid[2];
103 inline constexpr const uint8_t* data()
const noexcept
107 inline explicit operator uint32_t()
const noexcept
114 return a.aid[0] ==
b.aid[0] &&
a.aid[1] ==
b.aid[1] &&
a.aid[2] ==
b.aid[2];
116inline bool operator!=(
const desfire_aid_t&
a,
const desfire_aid_t&
b)
noexcept
120inline bool operator<(
const desfire_aid_t&
a,
const desfire_aid_t&
b)
noexcept
122 return a.aid24() <
b.aid24();
184std::vector<uint8_t> make_native_wrap_command(
const uint8_t ins,
const uint8_t* data =
nullptr,
185 const uint16_t data_len = 0);
188inline uint8_t
status_code(
const uint8_t* rx,
const uint16_t rx_len)
190 return (rx && rx_len >= 2 && rx[rx_len - 2] == 0x91) ? rx[rx_len - 1] : 0xFF;
200inline bool is_more(
const uint8_t* rx,
const uint16_t rx_len)
222 m5::stl::expected<void, uint8_t> createApplication(
const uint8_t aid[3],
const uint8_t key_settings1,
223 const uint8_t key_settings2,
const uint16_t iso_fid = 0,
224 const uint8_t* df_name =
nullptr,
const uint8_t df_name_len = 0);
227 return selectApplication(aid.data());
229 bool selectApplication(
const uint8_t aid[3]);
230 bool selectApplication(
const uint32_t aid24 = 0u);
231 bool deleteApplication(
const uint8_t aid[3]);
233 bool getApplicationIDs(std::vector<desfire_aid_t>& out);
235 bool getFreeMemory(uint32_t& out);
236 bool getKeySettings(uint8_t& key_settings, uint8_t& key_count);
237 bool getFileIDs(std::vector<uint8_t>& out);
238 bool getISOFileIDs(std::vector<uint8_t>& out);
239 bool getFileSettings(
FileSettings& out,
const uint8_t file_no);
243 bool changeFileSettings(
const uint8_t file_no,
const uint8_t file_option,
const uint16_t access_rights);
244 bool changeFileSettingsEV2(
const uint8_t file_no,
const uint8_t file_option,
const uint16_t access_rights,
246 bool changeFileSettingsEV2Full(
const uint8_t file_no,
const uint8_t file_option,
const uint16_t access_rights,
249 bool formatPICC(
const uint8_t* picc_master_key,
const AuthMode mode = AuthMode::Auto);
251 bool createStdDataFile(
const uint8_t file_no,
const uint16_t iso_fid,
const uint8_t comm_mode,
252 const uint16_t access_rights,
const uint32_t file_size);
278 const uint8_t tmac_key[16],
const uint8_t tmac_key_ver,
Ev2Context& ctx);
279 bool setConfigurationAppNameEV2Full(
const uint8_t* df_name, uint8_t df_name_len, uint16_t iso_fid,
Ev2Context& ctx);
289 bool readData(std::vector<uint8_t>& out,
const uint8_t file_no,
const uint32_t offset,
const uint32_t length);
290 bool readDataLight(std::vector<uint8_t>& out,
const uint8_t file_no,
const uint32_t offset,
const uint32_t length);
291 bool readDataLightEV2Full(std::vector<uint8_t>& out,
const uint8_t file_no,
const uint32_t offset,
293 bool readDataLightEV2(std::vector<uint8_t>& out,
const uint8_t file_no,
const uint32_t offset,
295 bool writeData(
const uint8_t file_no,
const uint32_t offset,
const uint8_t* data,
const uint32_t data_len);
296 bool writeDataLight(
const uint8_t file_no,
const uint32_t offset,
const uint8_t* data,
const uint32_t data_len);
297 bool writeDataLightEV2(
const uint8_t file_no,
const uint32_t offset,
const uint8_t* data,
const uint32_t data_len,
299 bool writeDataLightEV2Full(
const uint8_t file_no,
const uint32_t offset,
const uint8_t* data,
302 bool authenticateDES(
const uint8_t key_no,
const uint8_t key[16]);
303 bool authenticateISO(
const uint8_t key_no,
const uint8_t key[16]);
304 bool authenticateAES(
const uint8_t key_no,
const uint8_t key[16]);
305 bool authenticateEV2First(
const uint8_t key_no,
const uint8_t key[16],
Ev2Context& ctx);
308 bool transceive(uint8_t* rx, uint16_t& rx_len,
const uint8_t* tx,
const uint16_t tx_len);
ISO/IEC 7816-4 file system.
Definition file_system.hpp:81
Common interface layer for each chip of the NFC-A reader.
Definition nfc_layer_a.hpp:43
File system for MIFARE DESFire.
Definition desfire_file_system.hpp:215
bool createTransactionMACFileEV2Full(const uint8_t file_no, const uint8_t comm_mode, const uint16_t access_rights, const uint8_t tmac_key[16], const uint8_t tmac_key_ver, Ev2Context &ctx)
Create TransactionMAC file.
Definition desfire_file_system.cpp:1101
bool readData(std::vector< uint8_t > &out, const uint8_t file_no, const uint32_t offset, const uint32_t length)
Read data from DESFire file.
Definition desfire_file_system.cpp:567
bool deleteTransactionMACFileEV2Full(const uint8_t file_no, Ev2Context &ctx)
Delete TransactionMAC file (required for ISOReadBinary to work)
Definition desfire_file_system.cpp:1092
ISO Data Exchange Protocol.
Definition isoDEP.hpp:190
bool is_more(const uint8_t *rx, const uint16_t rx_len)
Is the received data still waiting for a response?
Definition desfire_file_system.hpp:200
constexpr file_no_t MAXIMUM_FILE_NO
Maximum file number.
Definition desfire_file_system.hpp:39
uint8_t file_no_t
Alias for file number.
Definition desfire_file_system.hpp:37
bool is_duplicate(const uint8_t *rx, const uint16_t rx_len)
Is duplicate error? (e.g. app/file already exists)
Definition desfire_file_system.hpp:206
constexpr uint8_t MAXIMUM_FILES
Files max.
Definition desfire_file_system.hpp:42
constexpr file_no_t MINIMUM_FILE_NO
Minimum file number.
Definition desfire_file_system.hpp:38
AuthMode
Authentication mode.
Definition desfire_file_system.hpp:129
bool is_successful(const uint8_t *rx, const uint16_t rx_len)
Is the status of the received data successful?
Definition desfire_file_system.hpp:194
uint8_t status_code(const uint8_t *rx, const uint16_t rx_len)
DESFire status code (0x91xx)
Definition desfire_file_system.hpp:188
File system base using isoDEP.
constexpr uint8_t DESFIRE_CC_FILE_NO
AN11004 default CC file number.
Definition mifare.hpp:196
constexpr uint8_t DESFIRE_NDEF_FILE_NO
AN11004 default NDEF file number.
Definition mifare.hpp:197
constexpr uint8_t DESFIRE_NDEF_AID[]
DESFire NDEF AID (3 bytes)
Definition mifare.hpp:198
Top level namespace of M5stack.
bool operator==(const PICC &a, const PICC &b)
Equal?
Definition nfca.hpp:523
bool operator!=(const PICC &a, const PICC &b)
Not equal?
Definition nfca.hpp:529
Session context for EV2 secure messaging.
Definition desfire_file_system.hpp:170
uint8_t ses_mac_key[16]
Session MAC key.
Definition desfire_file_system.hpp:174
uint16_t cmd_ctr
Command Counter.
Definition desfire_file_system.hpp:172
uint8_t ses_enc_key[16]
Session ENC key.
Definition desfire_file_system.hpp:173
uint8_t ti[4]
Transaction Identifier.
Definition desfire_file_system.hpp:171
File renaming parameters for DESFire Light SetConfiguration.
Definition desfire_file_system.hpp:160
uint16_t new_file_id
New ISO File ID (LSB first in command)
Definition desfire_file_system.hpp:163
uint8_t new_file_no
New file number.
Definition desfire_file_system.hpp:162
uint8_t old_file_no
Current file number.
Definition desfire_file_system.hpp:161
DESFire file settings (minimal fields for StdDataFile)
Definition desfire_file_system.hpp:84
24bit Application ID
Definition desfire_file_system.hpp:95
Capability container for Type4.
Definition ndef.hpp:455