17#ifndef M5_UNIT_NFC_NFC_LAYER_NFC_LAYER_A_HPP
18#define M5_UNIT_NFC_NFC_LAYER_NFC_LAYER_A_HPP
46 explicit NFCLayerA(m5::unit::UnitMFRC522& u);
47 explicit NFCLayerA(m5::unit::UnitWS1850S& u);
53 virtual bool transceive(uint8_t* rx, uint16_t& rx_len,
const uint8_t* tx,
const uint16_t tx_len,
54 const uint32_t timeout_ms)
override;
73 return _activePICC.
valid() && _activePICC == picc;
100 bool wakeup(uint16_t& atqa);
121 bool detect(std::vector<m5::nfc::a::PICC>& piccs,
const uint32_t timeout_ms = 1000U);
192 bool read4(uint8_t rx[4],
const uint8_t addr);
200 bool read16(uint8_t rx[16],
const uint8_t addr);
211 bool read(uint8_t* rx, uint16_t& rx_len,
const uint8_t saddr,
236 bool write4(
const uint8_t addr,
const uint8_t* tx,
const uint16_t tx_len,
const bool safety =
true);
248 bool write16(
const uint8_t addr,
const uint8_t* tx,
const uint16_t tx_len,
const bool safety =
true);
260 bool write(
const uint8_t saddr,
const uint8_t* tx,
const uint16_t tx_len,
272 bool write(
const uint8_t addr,
const uint8_t* tx,
const uint16_t tx_len,
289 bool dump(
const uint8_t block);
524 bool ndefRead(std::vector<m5::nfc::ndef::TLV>& tlvs,
544 bool ndefWrite(
const std::vector<m5::nfc::ndef::TLV>& tlvs);
548 virtual bool read(uint8_t* rx, uint16_t& rx_len,
const uint16_t saddr)
override;
549 virtual bool write(
const uint16_t saddr,
const uint8_t* tx,
const uint16_t tx_len)
override;
573 uint8_t identify_plus_sl03();
575 bool read_using_fast(uint8_t* rx, uint16_t& rx_len,
const uint8_t saddr);
576 bool read_using_read16(uint8_t* rx, uint16_t& rx_len,
const uint8_t saddr,
578 bool write_using_write4(
const uint8_t addr,
const uint8_t* tx,
const uint16_t tx_len);
579 bool write_using_write16(
const uint8_t addr,
const uint8_t* tx,
const uint16_t tx_len,
582 bool nfca_request_ats(
m5::nfc::a::ATS& ats,
const uint8_t fsdi = 5,
const uint8_t cid = 0);
583 bool nfca_deselect();
585 bool mifare_get_version_L3(uint8_t ver[8]);
586 bool mifare_get_version_L4_raw(uint8_t* ver, uint16_t& ver_len);
587 bool mifare_get_version_L4_wrapped(uint8_t* ver, uint16_t& ver_len);
591 bool mifare_plus_read_plain_nomac(
const uint16_t block,
const uint8_t count, std::vector<uint8_t>& out);
592 bool mifare_plus_read_plain_mac(
const uint16_t block,
const uint8_t count, std::vector<uint8_t>& out);
593 bool mifare_plus_read_mac_l4(
const uint16_t block,
const uint8_t count, std::vector<uint8_t>& out,
595 bool mifare_plus_write_mac_l4(
const uint16_t block,
const uint8_t* data,
const uint16_t data_len,
const bool plain);
597 bool mifare_classic_value_block(
const m5::nfc::a::Command cmd,
const uint8_t block,
const uint32_t arg = 0);
599 bool mifare_ultralightC_authenticate1(uint8_t ek[8]);
600 bool mifare_ultralightC_authenticate2(uint8_t rx_ek[8],
const uint8_t tx_ek[16]);
602 bool ntag_read_page(uint8_t* rx, uint16_t& rx_len,
const uint8_t spage,
const uint8_t epage);
603 bool ntag_write_page(
const uint8_t page,
const uint8_t tx[4]);
606 bool dump_sector(
const uint8_t sector);
607 bool dump_sector_mifare_plus_sl3(
const uint8_t sector);
608 bool dump_page_structure(
const uint16_t maxPage);
609 bool dump_page(
const uint8_t page,
const uint16_t maxPage);
612 bool dump_desfire_light();
615 static bool push_back_picc(std::vector<m5::nfc::a::PICC>&
v,
const m5::nfc::a::PICC& picc);
623 bool mifare_plus_transceive_raw(uint8_t* rx, uint16_t& rx_len,
const uint8_t* tx,
const uint16_t tx_len);
629 struct MifarePlusSession {
630 bool authenticated{};
635 std::array<uint8_t, 4> ti{};
636 std::array<uint8_t, 16> kenc{};
637 std::array<uint8_t, 16> kmac{};
640 MifarePlusSession _mfp_session{};
641 std::unique_ptr<Adapter> _impl;
646struct NFCLayerA::Adapter {
647 virtual ~Adapter() =
default;
649 virtual uint16_t max_fifo_depth()
const = 0;
651 virtual bool transceive(uint8_t* rx, uint16_t& rx_len,
const uint8_t* tx,
const uint16_t tx_len,
652 const uint32_t timeout_ms) = 0;
654 virtual bool request(uint16_t& atqa) = 0;
655 virtual bool wakeup(uint16_t& atqa) = 0;
659 virtual bool hlt() = 0;
661 virtual bool nfca_read_block(uint8_t rx[16],
const uint8_t addr) = 0;
662 virtual bool nfca_write_block(
const uint8_t addr,
const uint8_t tx[16]) = 0;
663 virtual bool mifare_classic_authenticate(
const bool auth_a,
const m5::nfc::a::PICC& picc,
const uint8_t block,
665 virtual bool mifare_classic_value_block(
const m5::nfc::a::Command cmd,
const uint8_t block,
666 const uint32_t arg = 0) = 0;
Common interface layer for each chip of the NFC-A reader.
Definition nfc_layer_a.hpp:43
bool dump(const m5::nfc::a::mifare::classic::Key &mkey=m5::nfc::a::mifare::classic::DEFAULT_KEY)
Dump all blocks/files.
Definition nfc_layer_a.cpp:906
bool mifareClassicTransferValueBlock(const uint8_t block)
Transfer inner buffer value to block.
Definition nfc_layer_a.cpp:1104
bool request(uint16_t &atqa)
Send REQA to discover a PICC in IDLE.
Definition nfc_layer_a.cpp:199
virtual uint16_t first_user_block() const override
First user block.
Definition nfc_layer_a.hpp:550
bool mifareClassicReadValueBlock(int32_t &value, const uint8_t block)
Read the specific block as the value block.
Definition nfc_layer_a.cpp:1050
bool mifareClassicIsValueBlock(bool &is_value_block, const uint8_t block)
Is specific block the value block?
Definition nfc_layer_a.cpp:1018
bool detect(m5::nfc::a::PICC &picc, const uint32_t timeout_ms=100U)
Detect single idle PICC.
Definition nfc_layer_a.cpp:211
bool mifarePlusUpgradeSecurityLevel2(const m5::nfc::a::mifare::plus::AESKey &sl2_switch_key=m5::nfc::a::mifare::plus::DEFAULT_KEY)
Upgrade security level to SL2 (AES over CRYPTO1)
Definition nfc_layer_a.cpp:1312
bool mifarePlusUpgradeSecurityLevel1(const m5::nfc::a::mifare::plus::AESKey &card_config_key=m5::nfc::a::mifare::plus::DEFAULT_KEY, const m5::nfc::a::mifare::plus::AESKey &card_master_key=m5::nfc::a::mifare::plus::DEFAULT_KEY, const m5::nfc::a::mifare::plus::AESKey &l2_switch_key=m5::nfc::a::mifare::plus::DEFAULT_KEY, const m5::nfc::a::mifare::plus::AESKey &l3_switch_key=m5::nfc::a::mifare::plus::DEFAULT_KEY, const m5::nfc::a::mifare::plus::AESKey &aes_sector_key=m5::nfc::a::mifare::plus::DEFAULT_FF_KEY, const m5::nfc::a::mifare::classic::Key &key_a=m5::nfc::a::mifare::classic::DEFAULT_KEY, const m5::nfc::a::mifare::classic::Key &key_b=m5::nfc::a::mifare::classic::DEFAULT_KEY)
Upgrade security level to SL1 (Classic compatibility mode)
Definition nfc_layer_a.cpp:1222
bool write(const uint8_t saddr, const uint8_t *tx, const uint16_t tx_len, const m5::nfc::a::mifare::classic::Key &key=m5::nfc::a::mifare::classic::DEFAULT_KEY)
Write any bytes to user area.
Definition nfc_layer_a.cpp:746
bool isActive(const m5::nfc::a::PICC &picc) const
Is the specified PICC currently active?
Definition nfc_layer_a.hpp:71
virtual uint16_t last_user_block() const override
Last user block.
Definition nfc_layer_a.hpp:554
virtual file_system_feature_t supportsFilesystem() const override
activePICC's File system
Definition nfc_layer_a.cpp:194
bool activate(const m5::nfc::a::PICC &picc, const bool force_rats=false)
Activate a specific PICC (anti-collision against the given PICC)
Definition nfc_layer_a.cpp:274
bool mifareUltralightCAuthenticate(const uint8_t key[16])
Authentication for MIFARE UltralightC.
Definition nfc_layer_a.cpp:1144
bool mifareUltralightChangeFormatToNDEF()
Write change to NFC Type-2 (NDEF) format for MIFARE Ultralight/C.
Definition nfc_layer_a.cpp:1114
virtual uint16_t user_area_size() const
User area size (bytes)
Definition nfc_layer_a.hpp:558
bool ndefPrepareDesfire(const uint32_t max_ndef_size)
Prepare NDEF files on MIFARE DESFire (EV1/EV2/EV3)
Definition nfc_layer_a.cpp:1362
bool mifareClassicWriteValueBlock(const uint8_t block, const int32_t value)
Write the specific block as the value block.
Definition nfc_layer_a.cpp:1077
bool ndefIsValidFormat(bool &valid)
Is the PICC data in NDEF format?
Definition nfc_layer_a.cpp:1348
bool select(m5::nfc::a::PICC &picc)
Select a PICC (anti-collision + SELECT cascade to ACTIVE)
Definition nfc_layer_a.cpp:259
virtual m5::nfc::isodep::IsoDEP * isoDEP() override
ISO-DEP interface (nullptr if not supported)
Definition nfc_layer_a.hpp:59
bool read16(uint8_t rx[16], const uint8_t addr)
Read the 1 block / 4 page (16 bytes)
Definition nfc_layer_a.cpp:520
bool mifareClassicDecrementValueBlock(const uint8_t block, const uint32_t delta, const bool transfer=true)
Decrement value of the value block.
Definition nfc_layer_a.cpp:1088
const m5::nfc::a::PICC & activatedPICC() const
Retrieve the currently activated PICC.
Definition nfc_layer_a.hpp:80
bool ndefRead(m5::nfc::ndef::TLV &msg)
Read NDEF Message TLV.
Definition nfc_layer_a.cpp:1370
bool write4(const uint8_t addr, const uint8_t *tx, const uint16_t tx_len, const bool safety=true)
Write the 1 page (4 bytes)
Definition nfc_layer_a.cpp:698
bool reactivate()
Reactivate the previously selected PICC.
Definition nfc_layer_a.hpp:160
virtual uint16_t unit_size_read() const override
Unit size for read.
Definition nfc_layer_a.hpp:562
bool identify(m5::nfc::a::PICC &picc)
Identify the specified PICC type.
Definition nfc_layer_a.cpp:331
bool read4(uint8_t rx[4], const uint8_t addr)
Read the 1 page.
Definition nfc_layer_a.cpp:502
bool mifareClassicAuthenticateB(const uint8_t block, const m5::nfc::a::mifare::classic::Key &key=m5::nfc::a::mifare::classic::DEFAULT_KEY)
Authentication by KeyB for MIFARE classic.
Definition nfc_layer_a.cpp:951
bool deactivate()
Send HLTA to the currently selected PICC (deactivate)
Definition nfc_layer_a.cpp:316
bool mifareClassicWriteAccessCondition(const uint8_t block, const uint8_t c123, const m5::nfc::a::mifare::classic::Key &akey, const m5::nfc::a::mifare::classic::Key &bkey)
Write the specific block access conditions.
Definition nfc_layer_a.cpp:982
virtual m5::nfc::NFCForumTag supportsNFCTag() const override
activePICC's NDEF type
Definition nfc_layer_a.cpp:189
bool ndefPrepareDesfireLight()
Prepare NDEF files on MIFARE DESFire Light.
Definition nfc_layer_a.cpp:1354
bool mifareClassicAuthenticateA(const uint8_t block, const m5::nfc::a::mifare::classic::Key &key=m5::nfc::a::mifare::classic::DEFAULT_KEY)
Authentication by KeyA for MIFARE classic.
Definition nfc_layer_a.cpp:946
bool ndefWrite(const m5::nfc::ndef::TLV &msg)
Write NDEF message.
Definition nfc_layer_a.cpp:1387
virtual uint16_t unit_size_write() const override
Unit size for write.
Definition nfc_layer_a.hpp:566
bool mifarePlusUpgradeSecurityLevel3(const m5::nfc::a::mifare::plus::AESKey &l3_switch_key=m5::nfc::a::mifare::plus::DEFAULT_KEY)
Upgrade security level to SL3 (AES)
Definition nfc_layer_a.cpp:1330
virtual uint16_t maximum_fifo_depth() const override
Maximum FIFO depth.
Definition nfc_layer_a.cpp:184
bool mifareClassicReadAccessCondition(uint8_t &c123, const uint8_t block)
Read the specific block access conditions.
Definition nfc_layer_a.cpp:956
bool mifareClassicRestoreValueBlock(const uint8_t block)
Restore block value to inner buffer.
Definition nfc_layer_a.cpp:1109
bool read(uint8_t *rx, uint16_t &rx_len, const uint8_t saddr, const m5::nfc::a::mifare::classic::Key &key=m5::nfc::a::mifare::classic::DEFAULT_KEY)
Read any bytes from user area.
Definition nfc_layer_a.cpp:528
bool wakeup(uint16_t &atqa)
Send WUPA to wake a PICC from IDLE or HALT.
Definition nfc_layer_a.cpp:204
bool write16(const uint8_t addr, const uint8_t *tx, const uint16_t tx_len, const bool safety=true)
Write the 1 block / 4 page (16 bytes)
Definition nfc_layer_a.cpp:714
virtual bool transceive(uint8_t *rx, uint16_t &rx_len, const uint8_t *tx, const uint16_t tx_len, const uint32_t timeout_ms) override
Transceive (RF command)
Definition nfc_layer_a.cpp:178
bool mifareClassicIncrementValueBlock(const uint8_t block, const uint32_t delta, const bool transfer=true)
Increment value of the value block.
Definition nfc_layer_a.cpp:1096
Common interface for NFC layer.
Definition nfc_layer.hpp:26
ISO Data Exchange Protocol.
Definition isoDEP.hpp:190
NDEF operations layer.
Definition ndef_layer.hpp:35
NDEF TLV container.
Definition ndef_tlv.hpp:27
ST25R3916 unit in CapCC1101 (SPI)
Definition unit_ST25R3916.hpp:2062
ST25R3916 Unit.
Definition unit_ST25R3916.hpp:38
ISO Data Exchange Protocol.
std::array< uint8_t, 16 > AESKey
MIFARE Plus SL2/3 Key (AES)
Definition mifare.hpp:279
std::array< uint8_t, 6 > Key
MIFARE classic Key.
Definition mifare.hpp:50
Top level namespace of M5stack.
uint8_t TagBits
TLV(Tag,Length,Value) tag bit group for type2/5.
Definition ndef.hpp:55
Common layer for NDEF related.
uint8_t file_system_feature_t
Alias for file_system_feature_t.
Definition nfc.hpp:62
NFCForumTag
NFC Forum Tag Type.
Definition nfc.hpp:39
Common layer for NFC related units.
Command
ISO-14443-3/4,MIFARE,NTAG commands.
Definition nfca.hpp:538
Type
Type of the PICC.
Definition nfca.hpp:31
Answer to request.
Definition nfca.hpp:256
PICC for NFC-A.
Definition nfca.hpp:335
uint16_t userAreaSize() const
Total user area size.
Definition nfca.hpp:458
bool supportsNFC() const
Supports NFC?
Definition nfca.hpp:487
uint16_t lastUserBlock() const
Total size.
Definition nfca.hpp:473
bool valid() const
Valid?
Definition nfca.hpp:356
uint16_t firstUserBlock() const
Gets the first user block/page address.
Definition nfca.hpp:469
bool isMifareUltralight() const
Is MIFARE Ultralight series?
Definition nfca.hpp:393