diff --git a/examples/nfc-list.c b/examples/nfc-list.c index fefce2a..b4b5c98 100644 --- a/examples/nfc-list.c +++ b/examples/nfc-list.c @@ -199,30 +199,30 @@ main (int argc, const char *argv[]) } } - nm.nmt = NMT_ISO14443B3SR; + nm.nmt = NMT_ISO14443B2SR; nm.nbr = NBR_106; - // List ISO14443B-3 ST SRx family targets + // List ISO14443B-2 ST SRx family targets if (nfc_initiator_list_passive_targets (pnd, nm, ant, MAX_TARGET_COUNT, &szTargetFound)) { size_t n; if (verbose || (szTargetFound > 0)) { - printf ("%d ISO14443B-3 ST SRx passive target(s) found%s\n", (int) szTargetFound, (szTargetFound == 0) ? ".\n" : ":"); + printf ("%d ISO14443B-2 ST SRx passive target(s) found%s\n", (int) szTargetFound, (szTargetFound == 0) ? ".\n" : ":"); } for (n = 0; n < szTargetFound; n++) { - print_nfc_iso14443b3sr_info (ant[n].nti.nsi, verbose); + print_nfc_iso14443b2sr_info (ant[n].nti.nsi, verbose); printf ("\n"); } } - nm.nmt = NMT_ISO14443B3CT; + nm.nmt = NMT_ISO14443B2CT; nm.nbr = NBR_106; - // List ISO14443B-3 ASK CTx family targets + // List ISO14443B-2 ASK CTx family targets if (nfc_initiator_list_passive_targets (pnd, nm, ant, MAX_TARGET_COUNT, &szTargetFound)) { size_t n; if (verbose || (szTargetFound > 0)) { - printf ("%d ISO14443B-3 ASK CTx passive target(s) found%s\n", (int) szTargetFound, (szTargetFound == 0) ? ".\n" : ":"); + printf ("%d ISO14443B-2 ASK CTx passive target(s) found%s\n", (int) szTargetFound, (szTargetFound == 0) ? ".\n" : ":"); } for (n = 0; n < szTargetFound; n++) { - print_nfc_iso14443b3ct_info (ant[n].nti.nci, verbose); + print_nfc_iso14443b2ct_info (ant[n].nti.nci, verbose); printf ("\n"); } } diff --git a/examples/nfc-utils.c b/examples/nfc-utils.c index 0eb4611..bcb5a69 100644 --- a/examples/nfc-utils.c +++ b/examples/nfc-utils.c @@ -632,17 +632,22 @@ print_nfc_iso14443bi_info (const nfc_iso14443bi_info_t nii, bool verbose) } void -print_nfc_iso14443b3sr_info (const nfc_iso14443b3sr_info_t nsi, bool verbose) +print_nfc_iso14443b2sr_info (const nfc_iso14443b2sr_info_t nsi, bool verbose) { printf (" UID: "); print_hex (nsi.abtUID, 8); } void -print_nfc_iso14443b3ct_info (const nfc_iso14443b3ct_info_t nci, bool verbose) +print_nfc_iso14443b2ct_info (const nfc_iso14443b2ct_info_t nci, bool verbose) { - printf (" Data: "); - print_hex (nci.abtData, nci.szDataLen); + uint32_t uid; + uid = (nci.abtUID[3] << 24) + (nci.abtUID[2] << 16) + (nci.abtUID[1] << 8) + nci.abtUID[0]; + printf (" UID: "); + print_hex (nci.abtUID, sizeof(nci.abtUID)); + printf (" UID (decimal): %010u\n", uid); + printf (" Product Code: %02X\n", nci.btProdCode); + printf (" Fab Code: %02X\n", nci.btFabCode); } void @@ -754,13 +759,13 @@ print_nfc_target (const nfc_target_t nt, bool verbose) printf ("ISO/IEC 14443-4B' (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr)); print_nfc_iso14443bi_info (nt.nti.nii, verbose); break; - case NMT_ISO14443B3SR: - printf ("ISO/IEC 14443-3B ST SRx (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr)); - print_nfc_iso14443b3sr_info (nt.nti.nsi, verbose); + case NMT_ISO14443B2SR: + printf ("ISO/IEC 14443-2B ST SRx (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr)); + print_nfc_iso14443b2sr_info (nt.nti.nsi, verbose); break; - case NMT_ISO14443B3CT: - printf ("ISO/IEC 14443-3B ASK CTx (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr)); - print_nfc_iso14443b3ct_info (nt.nti.nci, verbose); + case NMT_ISO14443B2CT: + printf ("ISO/IEC 14443-2B ASK CTx (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr)); + print_nfc_iso14443b2ct_info (nt.nti.nci, verbose); break; case NMT_DEP: printf ("D.E.P. (%s) target:\n", str_nfc_baud_rate(nt.nm.nbr)); diff --git a/examples/nfc-utils.h b/examples/nfc-utils.h index 9768dae..3f08177 100644 --- a/examples/nfc-utils.h +++ b/examples/nfc-utils.h @@ -89,8 +89,8 @@ void print_hex_par (const byte_t * pbtData, const size_t szBits, const byte_t void print_nfc_iso14443a_info (const nfc_iso14443a_info_t nai, bool verbose); void print_nfc_iso14443b_info (const nfc_iso14443b_info_t nbi, bool verbose); void print_nfc_iso14443bi_info (const nfc_iso14443bi_info_t nii, bool verbose); -void print_nfc_iso14443b3sr_info (const nfc_iso14443b3sr_info_t nsi, bool verbose); -void print_nfc_iso14443b3ct_info (const nfc_iso14443b3ct_info_t nci, bool verbose); +void print_nfc_iso14443b2sr_info (const nfc_iso14443b2sr_info_t nsi, bool verbose); +void print_nfc_iso14443b2ct_info (const nfc_iso14443b2ct_info_t nci, bool verbose); void print_nfc_felica_info (const nfc_felica_info_t nfi, bool verbose); void print_nfc_jewel_info (const nfc_jewel_info_t nji, bool verbose); void print_nfc_dep_info (const nfc_dep_info_t ndi, bool verbose); diff --git a/include/nfc/nfc-types.h b/include/nfc/nfc-types.h index 3bc0a48..8e5132a 100644 --- a/include/nfc/nfc-types.h +++ b/include/nfc/nfc-types.h @@ -245,21 +245,22 @@ typedef struct { } nfc_iso14443bi_info_t; /** - * @struct nfc_iso14443b3sr_info_t - * @brief NFC ISO14443-3B ST SRx tag information + * @struct nfc_iso14443b2sr_info_t + * @brief NFC ISO14443-2B ST SRx tag information */ typedef struct { byte_t abtUID[8]; -} nfc_iso14443b3sr_info_t; +} nfc_iso14443b2sr_info_t; /** - * @struct nfc_iso14443b3ct_info_t - * @brief NFC ISO14443-3B ASK CTx tag information + * @struct nfc_iso14443b2ct_info_t + * @brief NFC ISO14443-2B ASK CTx tag information */ typedef struct { - byte_t abtData[256]; // No idea what data to expect... - size_t szDataLen; -} nfc_iso14443b3ct_info_t; + byte_t abtUID[4]; + byte_t btProdCode; + byte_t btFabCode; +} nfc_iso14443b2ct_info_t; /** * @struct nfc_jewel_info_t @@ -279,8 +280,8 @@ typedef union { nfc_felica_info_t nfi; nfc_iso14443b_info_t nbi; nfc_iso14443bi_info_t nii; - nfc_iso14443b3sr_info_t nsi; - nfc_iso14443b3ct_info_t nci; + nfc_iso14443b2sr_info_t nsi; + nfc_iso14443b2ct_info_t nci; nfc_jewel_info_t nji; nfc_dep_info_t ndi; } nfc_target_info_t; @@ -306,8 +307,8 @@ typedef enum { NMT_JEWEL, NMT_ISO14443B, NMT_ISO14443BI, // pre-ISO14443B aka ISO/IEC 14443 B' or Type B' - NMT_ISO14443B3SR, // ISO14443-3B ST SRx - NMT_ISO14443B3CT, // ISO14443-3B ASK CTx + NMT_ISO14443B2SR, // ISO14443-2B ST SRx + NMT_ISO14443B2CT, // ISO14443-2B ASK CTx NMT_FELICA, NMT_DEP, } nfc_modulation_type_t; diff --git a/libnfc/chips/pn53x.c b/libnfc/chips/pn53x.c index ff3d820..1fc9250 100644 --- a/libnfc/chips/pn53x.c +++ b/libnfc/chips/pn53x.c @@ -397,17 +397,22 @@ pn53x_decode_target_data (const byte_t * pbtRawData, size_t szRawData, pn53x_typ } break; - case NMT_ISO14443B3SR: + case NMT_ISO14443B2SR: // Store the UID memcpy (pnti->nsi.abtUID, pbtRawData, 8); pbtRawData += 8; break; - case NMT_ISO14443B3CT: - // Store the unknown data as one blob for now - memcpy (pnti->nci.abtData, pbtRawData, szRawData); - pbtRawData += szRawData; - pnti->nci.szDataLen = szRawData; + case NMT_ISO14443B2CT: + // Store UID LSB + memcpy (pnti->nci.abtUID, pbtRawData, 2); + pbtRawData += 2; + // Store Prod Code & Fab Code + pnti->nci.btProdCode = *(pbtRawData++); + pnti->nci.btFabCode = *(pbtRawData++); + // Store UID MSB + memcpy (pnti->nci.abtUID+2, pbtRawData, 2); + pbtRawData += 2; break; case NMT_FELICA: @@ -844,7 +849,7 @@ pn53x_initiator_select_passive_target (nfc_device_t * pnd, byte_t abtTargetsData[PN53x_EXTENDED_FRAME__DATA_MAX_LEN]; size_t szTargetsData = sizeof(abtTargetsData); - if (nm.nmt == NMT_ISO14443BI || nm.nmt == NMT_ISO14443B3SR || nm.nmt == NMT_ISO14443B3CT) { + if (nm.nmt == NMT_ISO14443BI || nm.nmt == NMT_ISO14443B2SR || nm.nmt == NMT_ISO14443B2CT) { // No native support in InListPassiveTarget so we do discovery by hand if (!nfc_configure (pnd, NDO_FORCE_ISO14443_B, true)) { return false; @@ -856,7 +861,7 @@ pn53x_initiator_select_passive_target (nfc_device_t * pnd, return false; } pnd->bEasyFraming = false; - if (nm.nmt == NMT_ISO14443B3SR) { + if (nm.nmt == NMT_ISO14443B2SR) { // Some work to do before getting the UID... byte_t abtInitiate[]="\x06\x00"; size_t szInitiateLen = 2; @@ -873,9 +878,32 @@ pn53x_initiator_select_passive_target (nfc_device_t * pnd, return false; } } + else if (nm.nmt == NMT_ISO14443B2CT) { + // Some work to do before getting the UID... + byte_t abtReqt[]="\x10"; + size_t szReqtLen = 1; + byte_t abtRx[2]; + size_t szRxLen = 2; + // Getting product code / fab code & store it in output buffer after the serial nr we'll obtain later + if (!pn53x_initiator_transceive_bytes (pnd, abtReqt, szReqtLen, abtTargetsData+2, &szTargetsData) || szTargetsData != 2) { + return false; + } + } if (!pn53x_initiator_transceive_bytes (pnd, pbtInitData, szInitData, abtTargetsData, &szTargetsData)) { return false; } + if (nm.nmt == NMT_ISO14443B2CT) { + if (szTargetsData != 2) + return false; + byte_t abtRead[]="\xC4"; // Reading UID_MSB (Read address 4) + size_t szReadLen = 1; + byte_t abtRx[2]; + size_t szRxLen = 2; + if (!pn53x_initiator_transceive_bytes (pnd, abtRead, szReadLen, abtTargetsData+4, &szTargetsData) || szTargetsData != 2) { + return false; + } + szTargetsData = 6; // u16 UID_LSB, u8 prod code, u8 fab code, u16 UID_MSB + } if (pnt) { pnt->nm = nm; // Fill the tag info struct with the values corresponding to this init modulation @@ -1416,8 +1444,8 @@ pn53x_target_init (nfc_device_t * pnd, nfc_target_t * pnt, byte_t * pbtRx, size_ break; case NMT_ISO14443B: case NMT_ISO14443BI: - case NMT_ISO14443B3SR: - case NMT_ISO14443B3CT: + case NMT_ISO14443B2SR: + case NMT_ISO14443B2CT: case NMT_JEWEL: pnd->iLastError = DENOTSUP; return false; @@ -1518,8 +1546,8 @@ pn53x_target_init (nfc_device_t * pnd, nfc_target_t * pnt, byte_t * pbtRx, size_ break; case NMT_ISO14443B: case NMT_ISO14443BI: - case NMT_ISO14443B3SR: - case NMT_ISO14443B3CT: + case NMT_ISO14443B2SR: + case NMT_ISO14443B2CT: case NMT_JEWEL: pnd->iLastError = DENOTSUP; return false; @@ -2307,8 +2335,8 @@ pn53x_nm_to_pm(const nfc_modulation_t nm) break; case NMT_ISO14443BI: - case NMT_ISO14443B3SR: - case NMT_ISO14443B3CT: + case NMT_ISO14443B2SR: + case NMT_ISO14443B2CT: case NMT_DEP: // Nothing to do... break; @@ -2409,8 +2437,8 @@ pn53x_nm_to_ptt(const nfc_modulation_t nm) break; case NMT_ISO14443BI: - case NMT_ISO14443B3SR: - case NMT_ISO14443B3CT: + case NMT_ISO14443B2SR: + case NMT_ISO14443B2CT: case NMT_DEP: // Nothing to do... break; diff --git a/libnfc/nfc.c b/libnfc/nfc.c index e727b51..0d116b1 100644 --- a/libnfc/nfc.c +++ b/libnfc/nfc.c @@ -380,16 +380,16 @@ nfc_initiator_list_passive_targets (nfc_device_t * pnd, szInitDataLen = 4; } break; - case NMT_ISO14443B3SR: { + case NMT_ISO14443B2SR: { // Get_UID pbtInitData = (byte_t *) "\x0b"; szInitDataLen = 1; } break; - case NMT_ISO14443B3CT: { - // REQT - pbtInitData = (byte_t *) "\x10"; - szInitDataLen = 1; + case NMT_ISO14443B2CT: { + // SELECT-ALL + pbtInitData = (byte_t *) "\x9F\xFF\xFF"; + szInitDataLen = 3; } break; case NMT_FELICA: { @@ -413,7 +413,7 @@ nfc_initiator_list_passive_targets (nfc_device_t * pnd, szTargetFound++; // deselect has no effect on FeliCa and Jewel cards so we'll stop after one... // ISO/IEC 14443 B' cards are polled at 100% probability so it's not possible to detect correctly two cards at the same time - if ((nm.nmt == NMT_FELICA) || (nm.nmt == NMT_JEWEL) || (nm.nmt == NMT_ISO14443BI) || (nm.nmt == NMT_ISO14443B3SR) || (nm.nmt == NMT_ISO14443B3CT)) { + if ((nm.nmt == NMT_FELICA) || (nm.nmt == NMT_JEWEL) || (nm.nmt == NMT_ISO14443BI) || (nm.nmt == NMT_ISO14443B2SR) || (nm.nmt == NMT_ISO14443B2CT)) { break; } }