35 #include "target-subr.h"
51 struct card_atqa const_ca[] = {
53 0x0044, 0xffff,
"MIFARE Ultralight",
57 0x0044, 0xffff,
"MIFARE Ultralight C",
61 0x0004, 0xff0f,
"MIFARE Mini 0.3K",
65 0x0004, 0xff0f,
"MIFARE Classic 1K",
69 0x0002, 0xff0f,
"MIFARE Classic 4K",
73 0x0004, 0xffff,
"MIFARE Plus (4 Byte UID or 4 Byte RID)",
74 {4, 5, 6, 7, 8, 9, -1}
77 0x0002, 0xffff,
"MIFARE Plus (4 Byte UID or 4 Byte RID)",
78 {4, 5, 6, 7, 8, 9, -1}
81 0x0044, 0xffff,
"MIFARE Plus (7 Byte UID)",
82 {4, 5, 6, 7, 8, 9, -1}
85 0x0042, 0xffff,
"MIFARE Plus (7 Byte UID)",
86 {4, 5, 6, 7, 8, 9, -1}
89 0x0344, 0xffff,
"MIFARE DESFire",
93 0x0044, 0xffff,
"P3SR008",
97 0x0004, 0xf0ff,
"SmartMX with MIFARE 1K emulation",
101 0x0002, 0xf0ff,
"SmartMX with MIFARE 4K emulation",
105 0x0048, 0xf0ff,
"SmartMX with 7 Byte UID",
110 struct card_sak const_cs[] = {
115 {0x08, 0xff,
" 2K, Security level 1" },
116 {0x18, 0xff,
" 4K, Security level 1" },
117 {0x10, 0xff,
" 2K, Security level 2" },
118 {0x11, 0xff,
" 4K, Security level 2" },
119 {0x20, 0xff,
" 2K, Security level 3" },
120 {0x20, 0xff,
" 4K, Security level 3" },
121 {0x20, 0xff,
" 4K" },
122 {0x20, 0xff,
" EV1 2K/4K/8K" },
127 snprint_hex(
char *dst,
size_t size,
const uint8_t *pbtData,
const size_t szBytes)
131 for (szPos = 0; szPos < szBytes; szPos++) {
132 res += snprintf(dst + res, size - res,
"%02x ", pbtData[szPos]);
134 res += snprintf(dst + res, size - res,
"\n");
138 #define SAK_UID_NOT_COMPLETE 0x04
139 #define SAK_ISO14443_4_COMPLIANT 0x20
140 #define SAK_ISO18092_COMPLIANT 0x40
143 snprint_nfc_iso14443a_info(
char *dst,
size_t size,
const nfc_iso14443a_info *pnai,
bool verbose)
146 off += snprintf(dst + off, size - off,
" ATQA (SENS_RES): ");
147 off += snprint_hex(dst + off, size - off, pnai->abtAtqa, 2);
149 off += snprintf(dst + off, size - off,
"* UID size: ");
150 switch ((pnai->abtAtqa[1] & 0xc0) >> 6) {
152 off += snprintf(dst + off, size - off,
"single\n");
155 off += snprintf(dst + off, size - off,
"double\n");
158 off += snprintf(dst + off, size - off,
"triple\n");
161 off += snprintf(dst + off, size - off,
"RFU\n");
164 off += snprintf(dst + off, size - off,
"* bit frame anticollision ");
165 switch (pnai->abtAtqa[1] & 0x1f) {
171 off += snprintf(dst + off, size - off,
"supported\n");
174 off += snprintf(dst + off, size - off,
"not supported\n");
178 off += snprintf(dst + off, size - off,
" UID (NFCID%c): ", (pnai->abtUid[0] == 0x08 ?
'3' :
'1'));
179 off += snprint_hex(dst + off, size - off, pnai->abtUid, pnai->szUidLen);
181 if (pnai->abtUid[0] == 0x08) {
182 off += snprintf(dst + off, size - off,
"* Random UID\n");
185 off += snprintf(dst + off, size - off,
" SAK (SEL_RES): ");
186 off += snprint_hex(dst + off, size - off, &pnai->btSak, 1);
188 if (pnai->btSak & SAK_UID_NOT_COMPLETE) {
189 off += snprintf(dst + off, size - off,
"* Warning! Cascade bit set: UID not complete\n");
191 if (pnai->btSak & SAK_ISO14443_4_COMPLIANT) {
192 off += snprintf(dst + off, size - off,
"* Compliant with ISO/IEC 14443-4\n");
194 off += snprintf(dst + off, size - off,
"* Not compliant with ISO/IEC 14443-4\n");
196 if (pnai->btSak & SAK_ISO18092_COMPLIANT) {
197 off += snprintf(dst + off, size - off,
"* Compliant with ISO/IEC 18092\n");
199 off += snprintf(dst + off, size - off,
"* Not compliant with ISO/IEC 18092\n");
202 if (pnai->szAtsLen) {
203 off += snprintf(dst + off, size - off,
" ATS: ");
204 off += snprint_hex(dst + off, size - off, pnai->abtAts, pnai->szAtsLen);
206 if (pnai->szAtsLen && verbose) {
208 const int iMaxFrameSizes[] = { 16, 24, 32, 40, 48, 64, 96, 128, 256 };
209 off += snprintf(dst + off, size - off,
"* Max Frame Size accepted by PICC: %d bytes\n", iMaxFrameSizes[pnai->abtAts[0] & 0x0F]);
212 if (pnai->abtAts[0] & 0x10) {
213 uint8_t TA = pnai->abtAts[offset];
215 off += snprintf(dst + off, size - off,
"* Bit Rate Capability:\n");
217 off += snprintf(dst + off, size - off,
" * PICC supports only 106 kbits/s in both directions\n");
220 off += snprintf(dst + off, size - off,
" * Same bitrate in both directions mandatory\n");
223 off += snprintf(dst + off, size - off,
" * PICC to PCD, DS=2, bitrate 212 kbits/s supported\n");
226 off += snprintf(dst + off, size - off,
" * PICC to PCD, DS=4, bitrate 424 kbits/s supported\n");
229 off += snprintf(dst + off, size - off,
" * PICC to PCD, DS=8, bitrate 847 kbits/s supported\n");
232 off += snprintf(dst + off, size - off,
" * PCD to PICC, DR=2, bitrate 212 kbits/s supported\n");
235 off += snprintf(dst + off, size - off,
" * PCD to PICC, DR=4, bitrate 424 kbits/s supported\n");
238 off += snprintf(dst + off, size - off,
" * PCD to PICC, DR=8, bitrate 847 kbits/s supported\n");
241 off += snprintf(dst + off, size - off,
" * ERROR unknown value\n");
244 if (pnai->abtAts[0] & 0x20) {
245 uint8_t TB = pnai->abtAts[offset];
247 off += snprintf(dst + off, size - off,
"* Frame Waiting Time: %.4g ms\n", 256.0 * 16.0 * (1 << ((TB & 0xf0) >> 4)) / 13560.0);
248 if ((TB & 0x0f) == 0) {
249 off += snprintf(dst + off, size - off,
"* No Start-up Frame Guard Time required\n");
251 off += snprintf(dst + off, size - off,
"* Start-up Frame Guard Time: %.4g ms\n", 256.0 * 16.0 * (1 << (TB & 0x0f)) / 13560.0);
254 if (pnai->abtAts[0] & 0x40) {
255 uint8_t TC = pnai->abtAts[offset];
258 off += snprintf(dst + off, size - off,
"* Node Address supported\n");
260 off += snprintf(dst + off, size - off,
"* Node Address not supported\n");
263 off += snprintf(dst + off, size - off,
"* Card IDentifier supported\n");
265 off += snprintf(dst + off, size - off,
"* Card IDentifier not supported\n");
268 if (pnai->szAtsLen > offset) {
269 off += snprintf(dst + off, size - off,
"* Historical bytes Tk: ");
270 off += snprint_hex(dst + off, size - off, pnai->abtAts + offset, (pnai->szAtsLen - offset));
271 uint8_t CIB = pnai->abtAts[offset];
273 if (CIB != 0x00 && CIB != 0x10 && (CIB & 0xf0) != 0x80) {
274 off += snprintf(dst + off, size - off,
" * Proprietary format\n");
276 off += snprintf(dst + off, size - off,
" * Tag byte: Mifare or virtual cards of various types\n");
277 uint8_t L = pnai->abtAts[offset];
279 if (L != (pnai->szAtsLen - offset)) {
280 off += snprintf(dst + off, size - off,
" * Warning: Type Identification Coding length (%i)", L);
281 off += snprintf(dst + off, size - off,
" not matching Tk length (%" PRIdPTR
")\n", (pnai->szAtsLen - offset));
283 if ((pnai->szAtsLen - offset - 2) > 0) {
284 uint8_t CTC = pnai->abtAts[offset];
286 off += snprintf(dst + off, size - off,
" * Chip Type: ");
287 switch (CTC & 0xf0) {
289 off += snprintf(dst + off, size - off,
"(Multiple) Virtual Cards\n");
292 off += snprintf(dst + off, size - off,
"Mifare DESFire\n");
295 off += snprintf(dst + off, size - off,
"Mifare Plus\n");
298 off += snprintf(dst + off, size - off,
"RFU\n");
301 off += snprintf(dst + off, size - off,
" * Memory size: ");
302 switch (CTC & 0x0f) {
304 off += snprintf(dst + off, size - off,
"<1 kbyte\n");
307 off += snprintf(dst + off, size - off,
"1 kbyte\n");
310 off += snprintf(dst + off, size - off,
"2 kbyte\n");
313 off += snprintf(dst + off, size - off,
"4 kbyte\n");
316 off += snprintf(dst + off, size - off,
"8 kbyte\n");
319 off += snprintf(dst + off, size - off,
"Unspecified\n");
322 off += snprintf(dst + off, size - off,
"RFU\n");
326 if ((pnai->szAtsLen - offset) > 0) {
327 uint8_t CVC = pnai->abtAts[offset];
329 off += snprintf(dst + off, size - off,
" * Chip Status: ");
330 switch (CVC & 0xf0) {
332 off += snprintf(dst + off, size - off,
"Engineering sample\n");
335 off += snprintf(dst + off, size - off,
"Released\n");
338 off += snprintf(dst + off, size - off,
"RFU\n");
341 off += snprintf(dst + off, size - off,
" * Chip Generation: ");
342 switch (CVC & 0x0f) {
344 off += snprintf(dst + off, size - off,
"Generation 1\n");
347 off += snprintf(dst + off, size - off,
"Generation 2\n");
350 off += snprintf(dst + off, size - off,
"Generation 3\n");
353 off += snprintf(dst + off, size - off,
"Unspecified\n");
356 off += snprintf(dst + off, size - off,
"RFU\n");
360 if ((pnai->szAtsLen - offset) > 0) {
361 uint8_t VCS = pnai->abtAts[offset];
363 off += snprintf(dst + off, size - off,
" * Specifics (Virtual Card Selection):\n");
364 if ((VCS & 0x09) == 0x00) {
365 off += snprintf(dst + off, size - off,
" * Only VCSL supported\n");
366 }
else if ((VCS & 0x09) == 0x01) {
367 off += snprintf(dst + off, size - off,
" * VCS, VCSL and SVC supported\n");
369 if ((VCS & 0x0e) == 0x00) {
370 off += snprintf(dst + off, size - off,
" * SL1, SL2(?), SL3 supported\n");
371 }
else if ((VCS & 0x0e) == 0x02) {
372 off += snprintf(dst + off, size - off,
" * SL3 only card\n");
373 }
else if ((VCS & 0x0f) == 0x0e) {
374 off += snprintf(dst + off, size - off,
" * No VCS command supported\n");
375 }
else if ((VCS & 0x0f) == 0x0f) {
376 off += snprintf(dst + off, size - off,
" * Unspecified\n");
378 off += snprintf(dst + off, size - off,
" * RFU\n");
384 off += snprintf(dst + off, size - off,
" * Tk after 0x00 consist of optional consecutive COMPACT-TLV data objects\n");
385 off += snprintf(dst + off, size - off,
" followed by a mandatory status indicator (the last three bytes, not in TLV)\n");
386 off += snprintf(dst + off, size - off,
" See ISO/IEC 7816-4 8.1.1.3 for more info\n");
389 off += snprintf(dst + off, size - off,
" * DIR data reference: %02x\n", pnai->abtAts[offset]);
392 if (pnai->szAtsLen == offset) {
393 off += snprintf(dst + off, size - off,
" * No COMPACT-TLV objects found, no status found\n");
395 off += snprintf(dst + off, size - off,
" * Tk after 0x80 consist of optional consecutive COMPACT-TLV data objects;\n");
396 off += snprintf(dst + off, size - off,
" the last data object may carry a status indicator of one, two or three bytes.\n");
397 off += snprintf(dst + off, size - off,
" See ISO/IEC 7816-4 8.1.1.3 for more info\n");
404 off += snprintf(dst + off, size - off,
"\nFingerprinting based on MIFARE type Identification Procedure:\n");
408 bool found_possible_match =
false;
410 atqa = (((uint16_t)pnai->abtAtqa[0] & 0xff) << 8);
411 atqa += (((uint16_t)pnai->abtAtqa[1] & 0xff));
412 sak = ((uint8_t)pnai->btSak & 0xff);
414 for (i = 0; i <
sizeof(const_ca) /
sizeof(const_ca[0]); i++) {
415 if ((atqa & const_ca[i].mask) == const_ca[i].atqa) {
416 for (j = 0; (j <
sizeof(const_ca[i].saklist) /
sizeof(const_ca[i].saklist[0])) && (const_ca[i].saklist[j] >= 0); j++) {
417 int sakindex = const_ca[i].saklist[j];
418 if ((sak & const_cs[sakindex].mask) == const_cs[sakindex].sak) {
419 off += snprintf(dst + off, size - off,
"* %s%s\n", const_ca[i].type, const_cs[sakindex].type);
420 found_possible_match =
true;
428 off += snprintf(dst + off, size - off,
"Other possible matches based on ATQA & SAK values:\n");
429 uint32_t atqasak = 0;
430 atqasak += (((uint32_t)pnai->abtAtqa[0] & 0xff) << 16);
431 atqasak += (((uint32_t)pnai->abtAtqa[1] & 0xff) << 8);
432 atqasak += ((uint32_t)pnai->btSak & 0xff);
435 off += snprintf(dst + off, size - off,
"* Mifare Classic 1K Infineon\n");
436 found_possible_match =
true;
439 off += snprintf(dst + off, size - off,
"* Gemplus MPCOS\n");
440 found_possible_match =
true;
443 off += snprintf(dst + off, size - off,
"* JCOP31\n");
444 found_possible_match =
true;
447 off += snprintf(dst + off, size - off,
"* JCOP31 v2.4.1\n");
448 off += snprintf(dst + off, size - off,
"* JCOP31 v2.2\n");
449 found_possible_match =
true;
452 off += snprintf(dst + off, size - off,
"* JCOP31 v2.3.1\n");
453 found_possible_match =
true;
456 off += snprintf(dst + off, size - off,
"* Fudan FM1208SH01\n");
457 found_possible_match =
true;
460 off += snprintf(dst + off, size - off,
"* Fudan FM1208\n");
461 found_possible_match =
true;
464 off += snprintf(dst + off, size - off,
"* MFC 4K emulated by Nokia 6212 Classic\n");
465 found_possible_match =
true;
468 off += snprintf(dst + off, size - off,
"* MFC 4K emulated by Nokia 6131 NFC\n");
469 found_possible_match =
true;
472 if (! found_possible_match) {
473 snprintf(dst + off, size - off,
"* Unknown card, sorry\n");
479 snprint_nfc_felica_info(
char *dst,
size_t size,
const nfc_felica_info *pnfi,
bool verbose)
483 off += snprintf(dst + off, size - off,
" ID (NFCID2): ");
484 off += snprint_hex(dst + off, size - off, pnfi->abtId, 8);
485 off += snprintf(dst + off, size - off,
" Parameter (PAD): ");
486 off += snprint_hex(dst + off, size - off, pnfi->abtPad, 8);
487 off += snprintf(dst + off, size - off,
" System Code (SC): ");
488 snprint_hex(dst + off, size - off, pnfi->abtSysCode, 2);
492 snprint_nfc_jewel_info(
char *dst,
size_t size,
const nfc_jewel_info *pnji,
bool verbose)
496 off += snprintf(dst + off, size - off,
" ATQA (SENS_RES): ");
497 off += snprint_hex(dst + off, size - off, pnji->btSensRes, 2);
498 off += snprintf(dst + off, size - off,
" 4-LSB JEWELID: ");
499 snprint_hex(dst + off, size - off, pnji->btId, 4);
503 snprint_nfc_barcode_info(
char *dst,
size_t size,
const nfc_barcode_info *pnti,
bool verbose)
507 off += snprintf(dst + off, size - off,
" Size (bits): %lu\n", (
unsigned long)(pnti->szDataLen * 8));
508 off += snprintf(dst + off, size - off,
" Content: ");
509 for (uint8_t i = 0; i < pnti->szDataLen; i++) {
510 off += snprintf(dst + off, size - off,
"%02X", pnti->abtData[i]);
511 if ((i % 8 == 7) && (i < (pnti->szDataLen - 1))) {
512 off += snprintf(dst + off, size - off,
"\n ");
515 snprintf(dst + off, size - off,
"\n");
518 #define PI_ISO14443_4_SUPPORTED 0x01
519 #define PI_NAD_SUPPORTED 0x01
520 #define PI_CID_SUPPORTED 0x02
522 snprint_nfc_iso14443b_info(
char *dst,
size_t size,
const nfc_iso14443b_info *pnbi,
bool verbose)
525 off += snprintf(dst + off, size - off,
" PUPI: ");
526 off += snprint_hex(dst + off, size - off, pnbi->
abtPupi, 4);
527 off += snprintf(dst + off, size - off,
" Application Data: ");
529 off += snprintf(dst + off, size - off,
" Protocol Info: ");
532 off += snprintf(dst + off, size - off,
"* Bit Rate Capability:\n");
534 off += snprintf(dst + off, size - off,
" * PICC supports only 106 kbits/s in both directions\n");
537 off += snprintf(dst + off, size - off,
" * Same bitrate in both directions mandatory\n");
540 off += snprintf(dst + off, size - off,
" * PICC to PCD, 1etu=64/fc, bitrate 212 kbits/s supported\n");
543 off += snprintf(dst + off, size - off,
" * PICC to PCD, 1etu=32/fc, bitrate 424 kbits/s supported\n");
546 off += snprintf(dst + off, size - off,
" * PICC to PCD, 1etu=16/fc, bitrate 847 kbits/s supported\n");
549 off += snprintf(dst + off, size - off,
" * PCD to PICC, 1etu=64/fc, bitrate 212 kbits/s supported\n");
552 off += snprintf(dst + off, size - off,
" * PCD to PICC, 1etu=32/fc, bitrate 424 kbits/s supported\n");
555 off += snprintf(dst + off, size - off,
" * PCD to PICC, 1etu=16/fc, bitrate 847 kbits/s supported\n");
558 off += snprintf(dst + off, size - off,
" * ERROR unknown value\n");
561 const int iMaxFrameSizes[] = { 16, 24, 32, 40, 48, 64, 96, 128, 256 };
562 off += snprintf(dst + off, size - off,
"* Maximum frame sizes: %d bytes\n", iMaxFrameSizes[((pnbi->
abtProtocolInfo[1] & 0xf0) >> 4)]);
567 off += snprintf(dst + off, size - off,
"* Protocol types supported: ISO/IEC 14443-4\n");
569 off += snprintf(dst + off, size - off,
"* Frame Waiting Time: %.4g ms\n", 256.0 * 16.0 * (1 << ((pnbi->
abtProtocolInfo[2] & 0xf0) >> 4)) / 13560.0);
570 if ((pnbi->
abtProtocolInfo[2] & (PI_NAD_SUPPORTED | PI_CID_SUPPORTED)) != 0) {
571 off += snprintf(dst + off, size - off,
"* Frame options supported: ");
572 if ((pnbi->
abtProtocolInfo[2] & PI_NAD_SUPPORTED) != 0) off += snprintf(dst + off, size - off,
"NAD ");
573 if ((pnbi->
abtProtocolInfo[2] & PI_CID_SUPPORTED) != 0) off += snprintf(dst + off, size - off,
"CID ");
574 snprintf(dst + off, size - off,
"\n");
580 snprint_nfc_iso14443bi_info(
char *dst,
size_t size,
const nfc_iso14443bi_info *pnii,
bool verbose)
583 off += snprintf(dst + off, size - off,
" DIV: ");
584 off += snprint_hex(dst + off, size - off, pnii->
abtDIV, 4);
586 int version = (pnii->
btVerLog & 0x1e) >> 1;
587 off += snprintf(dst + off, size - off,
" Software Version: ");
589 off += snprintf(dst + off, size - off,
"Undefined\n");
591 off += snprintf(dst + off, size - off,
"%i\n", version);
595 off += snprintf(dst + off, size - off,
" Wait Enable: yes");
599 off += snprintf(dst + off, size - off,
" ATS: ");
600 snprint_hex(dst + off, size - off, pnii->abtAtr, pnii->
szAtrLen);
605 snprint_nfc_iso14443b2sr_info(
char *dst,
size_t size,
const nfc_iso14443b2sr_info *pnsi,
bool verbose)
609 off += snprintf(dst + off, size - off,
" UID: ");
610 snprint_hex(dst + off, size - off, pnsi->abtUID, 8);
618 off += snprintf(dst + off, size - off,
" UID: ");
619 snprint_hex(dst + off, size - off, pnic->abtUID, 8);
623 snprint_nfc_iso14443b2ct_info(
char *dst,
size_t size,
const nfc_iso14443b2ct_info *pnci,
bool verbose)
628 uid = (pnci->abtUID[3] << 24) + (pnci->abtUID[2] << 16) + (pnci->abtUID[1] << 8) + pnci->abtUID[0];
629 off += snprintf(dst + off, size - off,
" UID: ");
630 off += snprint_hex(dst + off, size - off, pnci->abtUID,
sizeof(pnci->abtUID));
631 off += snprintf(dst + off, size - off,
" UID (decimal): %010u\n", uid);
632 off += snprintf(dst + off, size - off,
" Product Code: %02X\n", pnci->btProdCode);
633 snprintf(dst + off, size - off,
" Fab Code: %02X\n", pnci->btFabCode);
637 snprint_nfc_dep_info(
char *dst,
size_t size,
const nfc_dep_info *pndi,
bool verbose)
641 off += snprintf(dst + off, size - off,
" NFCID3: ");
642 off += snprint_hex(dst + off, size - off, pndi->
abtNFCID3, 10);
643 off += snprintf(dst + off, size - off,
" BS: %02x\n", pndi->
btBS);
644 off += snprintf(dst + off, size - off,
" BR: %02x\n", pndi->
btBR);
645 off += snprintf(dst + off, size - off,
" TO: %02x\n", pndi->
btTO);
646 off += snprintf(dst + off, size - off,
" PP: %02x\n", pndi->
btPP);
648 off += snprintf(dst + off, size - off,
"General Bytes: ");
649 snprint_hex(dst + off, size - off, pndi->
abtGB, pndi->szGB);
654 snprint_nfc_target(
char *dst,
size_t size,
const nfc_target *pnt,
bool verbose)
658 off += snprintf(dst + off, size - off,
"%s (%s%s) target:\n",
str_nfc_modulation_type(pnt->nm.nmt),
str_nfc_baud_rate(pnt->nm.nbr), (pnt->nm.nmt != NMT_DEP) ?
"" : (pnt->nti.ndi.
ndm == NDM_ACTIVE) ?
"active mode" :
"passive mode");
659 switch (pnt->nm.nmt) {
661 snprint_nfc_iso14443a_info(dst + off, size - off, &pnt->nti.nai, verbose);
664 snprint_nfc_jewel_info(dst + off, size - off, &pnt->nti.nji, verbose);
667 snprint_nfc_barcode_info(dst + off, size - off, &pnt->nti.nti, verbose);
670 snprint_nfc_felica_info(dst + off, size - off, &pnt->nti.nfi, verbose);
673 snprint_nfc_iso14443b_info(dst + off, size - off, &pnt->nti.nbi, verbose);
676 snprint_nfc_iso14443bi_info(dst + off, size - off, &pnt->nti.nii, verbose);
678 case NMT_ISO14443B2SR:
679 snprint_nfc_iso14443b2sr_info(dst + off, size - off, &pnt->nti.nsi, verbose);
681 case NMT_ISO14443BICLASS:
682 snprint_nfc_iso14443biclass_info(dst + off, size - off, &pnt->nti.nhi, verbose);
684 case NMT_ISO14443B2CT:
685 snprint_nfc_iso14443b2ct_info(dst + off, size - off, &pnt->nti.nci, verbose);
688 snprint_nfc_dep_info(dst + off, size - off, &pnt->nti.ndi, verbose);
const char * str_nfc_baud_rate(const nfc_baud_rate nbr)
Convert nfc_baud_rate value to string.
const char * str_nfc_modulation_type(const nfc_modulation_type nmt)
Convert nfc_modulation_type value to string.
Thinfilm NFC Barcode information.
NFC target information in D.E.P. (Data Exchange Protocol) see ISO/IEC 18092 (NFCIP-1)
NFC FeLiCa tag information.
NFC ISO14443A tag (MIFARE) information.
NFC ISO14443-2B ASK CTx tag information.
NFC ISO14443-2B ST SRx tag information.
NFC ISO14443B tag information.
uint8_t abtApplicationData[4]
uint8_t abtProtocolInfo[3]
NFC ISO14443B' tag information.
NFC ISO14443BiClass tag information.
NFC Jewel tag information.