diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/src/lsnfc.c b/src/lsnfc.c index c8e9c2e..78fe600 100644 --- a/src/lsnfc.c +++ b/src/lsnfc.c @@ -23,9 +23,9 @@ #include -#include +#include -static dev_info* pdi; +static nfc_device_t* pnd; static byte_t abtFelica[5] = { 0x00, 0xff, 0xff, 0x00, 0x00 }; #define ERR(x, ...) printf("ERROR: " x "\n", ## __VA_ARGS__ ) @@ -39,11 +39,11 @@ void print_hex(byte_t* pbtData, size_t szDate) int main(int argc, const char* argv[]) { - tag_info ti; + nfc_target_info_t nti; uint8_t tag_count = 0; // Try to open the NFC device - pdi = nfc_connect(NULL); + pnd = nfc_connect(NULL); // If specific device is wanted, i.e. an ARYGON device on /dev/ttyUSB0 /* @@ -52,33 +52,33 @@ int main(int argc, const char* argv[]) ndd.pcPort = "/dev/ttyUSB0"; ndd.uiSpeed = 115200; - pdi = nfc_connect(&ndd); + pnd = nfc_connect(&ndd); */ - if (pdi == INVALID_DEVICE_INFO) + if (pnd == NULL) { ERR("Unable to connect to NFC device."); return 1; } - nfc_initiator_init(pdi); + nfc_initiator_init(pnd); // Drop the field for a while - nfc_configure(pdi,DCO_ACTIVATE_FIELD,false); + nfc_configure(pnd,NDO_ACTIVATE_FIELD,false); // Let the reader only try once to find a tag - nfc_configure(pdi,DCO_INFINITE_SELECT,false); + nfc_configure(pnd,NDO_INFINITE_SELECT,false); // Configure the CRC and Parity settings - nfc_configure(pdi,DCO_HANDLE_CRC,true); - nfc_configure(pdi,DCO_HANDLE_PARITY,true); + nfc_configure(pnd,NDO_HANDLE_CRC,true); + nfc_configure(pnd,NDO_HANDLE_PARITY,true); // Enable field so more power consuming cards can power themselves up - nfc_configure(pdi,DCO_ACTIVATE_FIELD,true); + nfc_configure(pnd,NDO_ACTIVATE_FIELD,true); bool no_more_tag = false; - printf("device = %s\n",pdi->acName); + printf("device = %s\n",pnd->acName); do { - if (nfc_initiator_select_tag(pdi,IM_ISO14443A_106,NULL,0,&ti)) // Poll for a ISO14443A (MIFARE) tag + if (nfc_initiator_select_tag(pnd,NM_ISO14443A_106,NULL,0,&nti)) // Poll for a ISO14443A (MIFARE) tag { printf(" ISO14443A: "); @@ -102,72 +102,72 @@ Gemplus MPCOS 00 02 98 Innovision R&T Jewel 0C 00 */ - if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x04) && (ti.tia.btSak == 0x09)) { - printf("NXP MIFARE Mini (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x04) && (ti.tia.btSak == 0x08)) { - printf("NXP MIFARE Classic 1K (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x02) && (ti.tia.btSak == 0x18)) { - printf("NXP MIFARE Classic 4K (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x02) && (ti.tia.btSak == 0x38)) { - printf("Nokia MIFARE Classic 4K - emulated - (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x44) && (ti.tia.btSak == 0x00)) { - printf("NXP MIFARE Ultralight (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x03) && (ti.tia.abtAtqa[1] == 0x44) && (ti.tia.btSak == 0x20)) { - printf("NXP MIFARE DESFire (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x03) && (ti.tia.abtAtqa[1] == 0x04) && (ti.tia.btSak == 0x28)) { - printf("NXP JCOP31 (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x48) && (ti.tia.btSak == 0x20)) { + if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x04) && (nti.nai.btSak == 0x09)) { + printf("NXP MIFARE Mini (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x04) && (nti.nai.btSak == 0x08)) { + printf("NXP MIFARE Classic 1K (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x02) && (nti.nai.btSak == 0x18)) { + printf("NXP MIFARE Classic 4K (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x02) && (nti.nai.btSak == 0x38)) { + printf("Nokia MIFARE Classic 4K - emulated - (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x44) && (nti.nai.btSak == 0x00)) { + printf("NXP MIFARE Ultralight (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x03) && (nti.nai.abtAtqa[1] == 0x44) && (nti.nai.btSak == 0x20)) { + printf("NXP MIFARE DESFire (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x03) && (nti.nai.abtAtqa[1] == 0x04) && (nti.nai.btSak == 0x28)) { + printf("NXP JCOP31 (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x48) && (nti.nai.btSak == 0x20)) { /* @todo handle ATS to be able to know which one is it. */ - printf("NXP JCOP31 or JCOP41 (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x04) && (ti.tia.btSak == 0x28)) { - printf("NXP JCOP41 (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x04) && (ti.tia.btSak == 0x88)) { - printf("Infineon MIFARE Classic 1K (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x00) && (ti.tia.abtAtqa[1] == 0x02) && (ti.tia.btSak == 0x98)) { - printf("Gemplus MPCOS (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); - } else if ((ti.tia.abtAtqa[0] == 0x0C) && (ti.tia.abtAtqa[1] == 0x00)) { + printf("NXP JCOP31 or JCOP41 (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x04) && (nti.nai.btSak == 0x28)) { + printf("NXP JCOP41 (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x04) && (nti.nai.btSak == 0x88)) { + printf("Infineon MIFARE Classic 1K (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x00) && (nti.nai.abtAtqa[1] == 0x02) && (nti.nai.btSak == 0x98)) { + printf("Gemplus MPCOS (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); + } else if ((nti.nai.abtAtqa[0] == 0x0C) && (nti.nai.abtAtqa[1] == 0x00)) { /* @note I'm not sure that Jewel can be detected using this modultation and I haven't Jewel tags to test. */ - printf("Innovision R&T Jewel (UID="); print_hex(ti.tia.abtUid,ti.tia.szUidLen); printf(")\n"); + printf("Innovision R&T Jewel (UID="); print_hex(nti.nai.abtUid,nti.nai.szUidLen); printf(")\n"); } else { printf("Unknown tag type: "); - printf("ATQA (SENS_RES): "); print_hex(ti.tia.abtAtqa,2); - printf(", UID (NFCID%c): ",(ti.tia.abtUid[0]==0x08?'3':'1')); print_hex(ti.tia.abtUid,ti.tia.szUidLen); - printf(", SAK (SEL_RES): "); print_hex(&ti.tia.btSak,1); - if (ti.tia.szAtsLen) + printf("ATQA (SENS_RES): "); print_hex(nti.nai.abtAtqa,2); + printf(", UID (NFCID%c): ",(nti.nai.abtUid[0]==0x08?'3':'1')); print_hex(nti.nai.abtUid,nti.nai.szUidLen); + printf(", SAK (SEL_RES): "); print_hex(&nti.nai.btSak,1); + if (nti.nai.szAtsLen) { printf(", ATS (ATR): "); - print_hex(ti.tia.abtAts,ti.tia.szAtsLen); + print_hex(nti.nai.abtAts,nti.nai.szAtsLen); } printf("\n"); } - nfc_initiator_deselect_tag(pdi); + nfc_initiator_deselect_tag(pnd); tag_count++; - } else if (nfc_initiator_select_tag(pdi,IM_FELICA_212,abtFelica,5,&ti) || nfc_initiator_select_tag(pdi,IM_FELICA_424,abtFelica,5,&ti)) // Poll for a Felica tag + } else if (nfc_initiator_select_tag(pnd,NM_FELICA_212,abtFelica,5,&nti) || nfc_initiator_select_tag(pnd,NM_FELICA_424,abtFelica,5,&nti)) // Poll for a Felica tag { printf(" Felica: "); - printf("ID (NFCID2): "); print_hex(ti.tif.abtId,8); - printf(", Parameter (PAD): "); print_hex(ti.tif.abtPad,8); + printf("ID (NFCID2): "); print_hex(nti.nfi.abtId,8); + printf(", Parameter (PAD): "); print_hex(nti.nfi.abtPad,8); printf("\n"); - nfc_initiator_deselect_tag(pdi); + nfc_initiator_deselect_tag(pnd); tag_count++; - } else if (nfc_initiator_select_tag(pdi,IM_ISO14443B_106,(byte_t*)"\x00",1,&ti)) // Poll for a ISO14443B tag + } else if (nfc_initiator_select_tag(pnd,NM_ISO14443B_106,(byte_t*)"\x00",1,&nti)) // Poll for a ISO14443B tag { printf(" ISO14443B: "); - printf("ATQB: "); print_hex(ti.tib.abtAtqb,12); - printf(", ID: "); print_hex(ti.tib.abtId,4); - printf(", CID: %02x\n",ti.tib.btCid); - if (ti.tib.szInfLen>0) + printf("ATQB: "); print_hex(nti.nbi.abtAtqb,12); + printf(", ID: "); print_hex(nti.nbi.abtId,4); + printf(", CID: %02x\n",nti.nbi.btCid); + if (nti.nbi.szInfLen>0) { - printf(", INF: "); print_hex(ti.tib.abtInf,ti.tib.szInfLen); + printf(", INF: "); print_hex(nti.nbi.abtInf,nti.nbi.szInfLen); } - printf(", PARAMS: %02x %02x %02x %02x\n",ti.tib.btParam1,ti.tib.btParam2,ti.tib.btParam3,ti.tib.btParam4); + printf(", PARAMS: %02x %02x %02x %02x\n",nti.nbi.btParam1,nti.nbi.btParam2,nti.nbi.btParam3,nti.nbi.btParam4); printf("\n"); - nfc_initiator_deselect_tag(pdi); + nfc_initiator_deselect_tag(pnd); tag_count++; - } else if (nfc_initiator_select_tag(pdi,IM_JEWEL_106,NULL,0,&ti)) // Poll for a Jewel tag + } else if (nfc_initiator_select_tag(pnd,NM_JEWEL_106,NULL,0,&nti)) // Poll for a Jewel tag { printf(" Jewel: No test results yet"); - nfc_initiator_deselect_tag(pdi); + nfc_initiator_deselect_tag(pnd); tag_count++; } else { no_more_tag = true; @@ -176,8 +176,8 @@ Innovision R&T Jewel 0C 00 printf("%d tag(s) have been found.\n", tag_count); // Disable field - nfc_configure(pdi,DCO_ACTIVATE_FIELD,false); + nfc_configure(pnd,NDO_ACTIVATE_FIELD,false); - nfc_disconnect(pdi); + nfc_disconnect(pnd); return 1; }