10#ifndef M5_UNIT_UNIFIED_NFC_NFC_F_NFCF_HPP
11#define M5_UNIT_UNIFIED_NFC_NFC_F_NFCF_HPP
42 return (t != Type::Unknown) ? NFCForumTag::Type3 : NFCForumTag::None;
63 RequestService = 0x02,
64 RequestResponse = 0x04,
65 ReadWithoutEncryption = 0x06,
66 WriteWithoutEncryption = 0x08,
67 RequestSystemCode = 0x0C,
76 RequestService = 0x03,
77 RequestResponse = 0x05,
78 ReadWithoutEncryption = 0x07,
79 WriteWithoutEncryption = 0x09,
80 RequestSystemCode = 0x0D,
107enum class TimeSlot : uint8_t { Slot1, Slot2, Slot4 = 0x03, Slot8 = 0x07, Slot16 = 0x0F };
112 return (ts == TimeSlot::Slot16) ? 16
113 : (ts == TimeSlot::Slot8) ? 8
114 : (ts == TimeSlot::Slot4) ? 4
115 : (ts == TimeSlot::Slot2) ? 2
116 : (ts == TimeSlot::Slot1) ? 1
157 inline constexpr block_t(
const uint16_t num,
const uint8_t access = 0,
const uint8_t order = 0)
158 :
header{(uint8_t)(((num > 0xFF) ? 0x00 : 0x80) | ((access & 0x07) << 4) | (order & 0x0F))},
number{num}
162 static block_t from(
const uint8_t
v[3])
169 b.number |= (uint16_t)
v[2] << 8;
175 inline constexpr bool is_2byte()
const
177 return (
header & 0x80) != 0;
179 inline constexpr bool is_3byte()
const
181 return (
header & 0x80) == 0;
183 inline constexpr uint8_t access_mode()
const
185 return (
header >> 4) & 0x07;
187 inline constexpr uint8_t order()
const
191 inline constexpr uint16_t block()
const
196 inline void block(
const uint16_t num)
201 inline void access_mode(
const uint8_t
a)
205 inline void order(
const uint8_t o)
210 inline operator uint16_t()
const
215 uint8_t store(uint8_t buf[3])
const
219 buf[idx++] =
number & 0xFF;
264constexpr block_t S_PAD10{0x0A};
265constexpr block_t S_PAD11{0x0B};
266constexpr block_t S_PAD12{0X0C};
267constexpr block_t S_PAD13{0x0D};
302constexpr block_t S_PAD1{0x01};
303constexpr block_t S_PAD2{0x02};
304constexpr block_t S_PAD3{0x03};
305constexpr block_t S_PAD4{0x04};
306constexpr block_t S_PAD5{0x05};
307constexpr block_t S_PAD6{0x06};
308constexpr block_t S_PAD7{0x07};
309constexpr block_t S_PAD8{0x08};
310constexpr block_t S_PAD9{0x09};
311constexpr block_t S_PAD10{0x0A};
312constexpr block_t S_PAD11{0x0B};
313constexpr block_t S_PAD12{0X0C};
314constexpr block_t S_PAD13{0x0D};
315constexpr block_t REG{0x0E};
316constexpr block_t RC{0x80};
317constexpr block_t MAC{0x81};
318constexpr block_t ID{0x082};
319constexpr block_t D_ID{0x83};
320constexpr block_t SER_C{0x84};
321constexpr block_t SYS_C{0x85};
322constexpr block_t CKV{0x86};
323constexpr block_t CK{0x87};
324constexpr block_t MC{0x88};
325constexpr block_t WCNT{0x90};
326constexpr block_t MAC_A{0x91};
327constexpr block_t STATE{0x92};
328constexpr block_t CRC_CHECK{0xA0};
338inline uint16_t get_user_area_size(
const Type t)
340 return 16 * get_number_of_user_blocks(t);
343uint16_t get_first_user_block(
const Type t);
345uint16_t get_last_user_block(
const Type t);
347inline bool is_user_block(
const Type t,
const uint16_t block)
349 return (block >= get_first_user_block(t)) && (block <= get_last_user_block(t));
352uint8_t get_maximum_read_blocks(
const Type t);
354uint8_t get_maximum_write_blocks(
const Type t);
357bool is_read_only_lite(
const block_t block);
359bool is_read_only_lite_s(
const block_t block);
361bool can_read_lite(
const block_t block);
363bool can_read_lite_s(
const block_t block);
371constexpr uint8_t FELICA_ID_LENGTH{8};
372constexpr uint8_t FELICA_MAX_BLOCKS{8};
373constexpr uint16_t FELICA_MAX_PACKET_LENGTH_REQUEST_SERVICE{1 + 8 + 1 + 2 * 255};
374constexpr uint16_t FELICA_MAX_PACKET_LENGTH_REQUEST_RESPONSE{1 + 8 + 1};
375constexpr uint16_t FELICA_MAX_PACKET_LENGTH_REQUEST_SYSTEM_CODE{1 + 8 + 1 + 2 * 255};
385 uint8_t
idm[FELICA_ID_LENGTH];
386 uint8_t
pmm[FELICA_ID_LENGTH];
405 return valid() ? get_user_area_size(
type) : 0;
410 return valid() ? get_first_user_block(
type) : 0xFFFF;
415 return valid() ? get_last_user_block(
type) : 0xFFFF;
420 return is_user_block(
type, block);
448 return get_nfc_forum_tag_type(
type);
459 bool emulate(
const Type t,
const uint8_t
idm[FELICA_ID_LENGTH],
const uint8_t
pmm[FELICA_ID_LENGTH],
460 const uint16_t sc = 0);
471bool operator==(
const PICC&
a,
const PICC&
b);
494 } __attribute__((packed));
503 return ((uint32_t)reg_a[3] << 24) | ((uint32_t)reg_a[2] << 16) | ((uint32_t)reg_a[1] << 8) |
504 ((uint32_t)reg_a[0]);
509 return ((uint32_t)reg_b[3] << 24) | ((uint32_t)reg_b[2] << 16) | ((uint32_t)reg_b[1] << 8) |
510 ((uint32_t)reg_b[0]);
515 return ((uint64_t)reg_c[0] << 56) | ((uint64_t)reg_c[1] << 48) | ((uint64_t)reg_c[2] << 40) |
516 ((uint64_t)reg_c[3] << 32) | ((uint64_t)reg_c[4] << 24) | ((uint64_t)reg_c[5] << 16) |
517 ((uint64_t)reg_c[6] << 8) | ((uint64_t)reg_c[7]);
548 inline operator const uint8_t*()
const
552 inline operator uint8_t*()
556} __attribute__((packed));
578bool make_session_key(uint8_t sk[16],
const uint8_t ck[16],
const uint8_t rc[16]);
592bool generate_mac(uint8_t mac[8],
const uint8_t* plain, uint32_t plain_len,
const uint8_t* block_data,
593 uint32_t block_len,
const uint8_t sk1[8],
const uint8_t sk2[8],
const uint8_t rc[16]);
602bool make_personalized_card_key_lite_s(uint8_t card_key[16],
const uint8_t master_key[24],
const uint8_t id_block[16]);
Mode
Mode for LiteS.
Definition nfcf.hpp:292
@ Mode11
External authentication complete, polling response not possible.
@ Mode10
External authentication complete, polling response possible.
@ Mode00
External authentication incomplete, polling response possible.
@ Mode01
External authentication incomplete, polling response not possible.
Top level namespace of M5stack.
NFCForumTag
NFC Forum Tag Type.
Definition nfc.hpp:39
uint16_t get_number_of_user_blocks(const Type t)
Gets the number of user blocks.
Definition nfca.cpp:327
uint8_t get_maximum_write_blocks(const Type t)
Maximum number of blocks that can be write simultaneously.
Definition nfcf.cpp:112
uint16_t get_maximum_block(const Type t)
Gets the maximum block.
Definition nfcf.cpp:80
uint8_t get_maximum_read_blocks(const Type t)
Maximum number of blocks that can be read simultaneously.
Definition nfcf.cpp:106
constexpr uint32_t TIMEOUT_POLLING
Definition nfcf.hpp:481
TimeSlot
Timeslot value for Polling.
Definition nfcf.hpp:107
constexpr uint16_t service_parse_cacheback_auth
Random,Read/write,Authentication required (S)
Definition nfcf.hpp:135
constexpr uint16_t service_random_read_write
Random,Read/write,No authentication required (S, L, LS)
Definition nfcf.hpp:124
constexpr Format format_private
Has private area.
Definition nfcf.hpp:50
constexpr uint16_t system_code_shared
Shared area.
Definition nfcf.hpp:88
constexpr Format format_shared
Has shared area.
Definition nfcf.hpp:52
constexpr uint16_t service_parse_cacheback
Random,Read/write,Authentication required (S)
Definition nfcf.hpp:136
constexpr uint16_t service_parse_decrement_auth
Random,Read/write,Authentication required (S)
Definition nfcf.hpp:137
ResponseCode
NFC-F Response code.
Definition nfcf.hpp:74
constexpr uint16_t service_random_read_write_auth
Random,Read/write,Authentication required (S)
Definition nfcf.hpp:123
constexpr uint16_t system_code_felica_plug
FeliCa Plug.
Definition nfcf.hpp:90
constexpr uint32_t TIMEOUT_POLLING_PICC
Definition nfcf.hpp:482
constexpr uint16_t service_parse_increment_auth
Random,Read/write,Authentication required (S)
Definition nfcf.hpp:139
constexpr uint16_t service_random_read_auth
Random,Read only,No authentication required (S)
Definition nfcf.hpp:125
CommandCode
NFC-F Command code.
Definition nfcf.hpp:61
bool can_write_reg(const REG &o, const REG &n)
Definition nfcf.hpp:564
Mode
Mode for Standard.
Definition nfcf.hpp:236
@ Mode2
After mutual authentication is complete (Auth2)
@ Mode0
Power was supplied to the PICC.
@ Mode1
Certification for PICC has been completed (Auth1)
@ Mode3
After registering area services or executing system partitioning.
Type
Type of the PICC.
Definition nfcf.hpp:30
@ FeliCaStandard
Standard.
constexpr Format format_felica_plug
FeliCa Plug.
Definition nfcf.hpp:54
constexpr uint16_t service_cyclic_read_write_auth
Cyclic,Read/write,Authentication required(S)
Definition nfcf.hpp:128
constexpr uint16_t service_parse_direct_auth
Random,Read/write,Authentication required (S)
Definition nfcf.hpp:133
constexpr uint16_t KEY_VERIOSN_NONE
No key version exists.
Definition nfcf.hpp:368
constexpr uint8_t timeslot_to_slot(const TimeSlot ts)
TimeSlot to the number of the slot.
Definition nfcf.hpp:110
constexpr uint16_t service_parse_direct
Random,Read/write,Authentication required (S)
Definition nfcf.hpp:134
constexpr Format format_secure
FeliCa Secure ID.
Definition nfcf.hpp:53
constexpr uint16_t service_random_read
Random,Read only,No authentication required (S,LS)
Definition nfcf.hpp:126
constexpr Format format_nfcip1
Support ISO/IEC18092.
Definition nfcf.hpp:48
RequestCode
Request code for Polling.
Definition nfcf.hpp:97
@ SystemCode
Request system code.
@ CommunicationPerformance
Request communication performance.
uint8_t Format
Support ISO/IEC18092.
Definition nfcf.hpp:47
constexpr uint16_t system_code_ndef
NDEF.
Definition nfcf.hpp:86
constexpr uint16_t service_cyclic_read_auth
Cyclic,Read only,Authentication required(S)
Definition nfcf.hpp:130
constexpr Format format_ndef
Support NDEF.
Definition nfcf.hpp:51
constexpr uint16_t service_cyclic_read_write
Cyclic,Read/write,No athentication required(S)
Definition nfcf.hpp:129
constexpr uint16_t system_code_felica_secure_id
FeliCa secure ID.
Definition nfcf.hpp:87
constexpr uint16_t service_cyclic_read
Cyclic,Read only,No authentication required(S)
Definition nfcf.hpp:131
constexpr uint16_t service_parse_decrement
Random,Read/write,Authentication required (S)
Definition nfcf.hpp:138
constexpr uint16_t system_code_wildcard
Wildcard.
Definition nfcf.hpp:85
constexpr uint16_t NODE_SYSTEM_KEY
Retrieving the System Key Version.
Definition nfcf.hpp:367
constexpr uint16_t system_code_lite
Lite, Lite-S.
Definition nfcf.hpp:89
constexpr uint16_t service_parse_increment
Random,Read/write,Authentication required (S)
Definition nfcf.hpp:140
constexpr Format format_lite
Lite or Lite-S.
Definition nfcf.hpp:49
PICC information for NFC-F.
Definition nfcf.hpp:381
NFCForumTag nfcForumTagType() const
NFC ForumTag.
Definition nfcf.hpp:446
uint16_t userAreaSize() const
Total user area size.
Definition nfcf.hpp:403
std::string typeAsString() const
Gets the type string.
Definition nfcf.cpp:333
bool supportsNDEF() const
Supports NDEF?
Definition nfcf.hpp:440
uint16_t dfc_format
DFC format ID:0x82[8,9] BE if format include DFC.
Definition nfcf.hpp:394
bool validEmulation() const
Valid for emulation?
Definition nfcf.cpp:317
Format format
Format type group bits.
Definition nfcf.hpp:392
uint16_t lastUserBlock() const
Gets the last user block.
Definition nfcf.hpp:413
uint8_t idm[FELICA_ID_LENGTH]
Manufacture ID.
Definition nfcf.hpp:385
RequestCode request_code
Tyepe of the request_data.
Definition nfcf.hpp:390
std::string pmmAsString() const
Gets the PMm string.
Definition nfcf.cpp:328
bool checkFormat(const Format f) const
Check format.
Definition nfcf.hpp:435
uint8_t pmm[FELICA_ID_LENGTH]
Manufacture Parameter.
Definition nfcf.hpp:386
uint8_t maximumWriteBlocks() const
Maximum number of blocks that can be write simultaneously.
Definition nfcf.hpp:429
bool emulate(const Type t, const uint8_t idm[FELICA_ID_LENGTH], const uint8_t pmm[FELICA_ID_LENGTH], const uint16_t sc=0)
Emulation settings.
Definition nfcf.cpp:339
uint16_t request_data
Any request data if exists.
Definition nfcf.hpp:389
uint16_t firstUserBlock() const
Gets the first user block.
Definition nfcf.hpp:408
Type type
PICC Type.
Definition nfcf.hpp:391
uint8_t maximumReadBlocks() const
Maximum number of blocks that can be read simultaneously.
Definition nfcf.hpp:424
bool isUserBlock(const block_t block) const
Is user block?
Definition nfcf.hpp:418
std::string idmAsString() const
Gets the IDm string.
Definition nfcf.cpp:323
uint16_t emulation_sc
System code for emulation.
Definition nfcf.hpp:395
bool valid() const
Valid for detection?
Definition nfcf.cpp:310
Block list element.
Definition nfcf.hpp:147
uint16_t number
block number (using low byte if 2 byte mode)
Definition nfcf.hpp:150
uint8_t header
size:1 access:3 order:4
Definition nfcf.hpp:149
Subtract Register Block Data.
Definition nfcf.hpp:488
uint64_t regC() const
Gets the RegC.
Definition nfcf.hpp:513
void regC(const uint64_t v)
Set the RegC.
Definition nfcf.hpp:536
void regB(const uint32_t v)
Set the RegB.
Definition nfcf.hpp:528
void regA(const uint32_t v)
Set the RegA.
Definition nfcf.hpp:520
uint32_t regA() const
Gets the RegA.
Definition nfcf.hpp:501
uint32_t regB() const
Gets the RegB.
Definition nfcf.hpp:507