updates as per @goedox comments

This commit is contained in:
Adam Laurie 2020-05-11 18:04:57 +01:00
parent 19a51dc2bd
commit dcc52cd4d5
5 changed files with 23 additions and 16 deletions

View file

@ -293,7 +293,7 @@ typedef union {
nfc_jewel_info nji; nfc_jewel_info nji;
nfc_barcode_info nti; // "t" for Thinfilm, "b" already used nfc_barcode_info nti; // "t" for Thinfilm, "b" already used
nfc_dep_info ndi; nfc_dep_info ndi;
nfc_iso14443biclass_info nic; // iclass - nbi already used nfc_iso14443biclass_info nhi; // hid iclass / picopass - nii already used
} nfc_target_info; } nfc_target_info;
/** /**

View file

@ -581,7 +581,7 @@ pn53x_decode_target_data(const uint8_t *pbtRawData, size_t szRawData, pn53x_type
case NMT_ISO14443BICLASS: case NMT_ISO14443BICLASS:
// Store the UID // Store the UID
for(uint8_t i= 0 ; i < 8 ; ++i) for(uint8_t i= 0 ; i < 8 ; ++i)
pnti->nic.abtUID[7 - i]= pbtRawData[i]; pnti->nhi.abtUID[7 - i]= pbtRawData[i];
break; break;
case NMT_ISO14443B2CT: case NMT_ISO14443B2CT:
@ -1062,7 +1062,7 @@ pn53x_initiator_init(struct nfc_device *pnd)
// iclass requires special modulation settings // iclass requires special modulation settings
void pn53x_initiator_init_iclass_modulation(struct nfc_device *pnd) void pn53x_initiator_init_iclass_modulation(struct nfc_device *pnd)
{ {
// send a bunch of low level commands I reverse engineered from a working iClass reader // send a bunch of low level commands reverse engineered from a working iClass reader
// original device was using a PN512 // original device was using a PN512
// //
// // TxModeReg - Defines the data rate and framing during transmission. // // TxModeReg - Defines the data rate and framing during transmission.
@ -1196,12 +1196,12 @@ pn53x_initiator_select_passive_target_ext(struct nfc_device *pnd,
abtReqt[0]= 0x0c; // iClass SELECT abtReqt[0]= 0x0c; // iClass SELECT
abtAnticol[0]= 0x81; // iClass ANTICOL abtAnticol[0]= 0x81; // iClass ANTICOL
if ((res = pn53x_initiator_transceive_bytes(pnd, abtReqt, sizeof(abtReqt), &abtAnticol[1], sizeof(abtAnticol) - 1, timeout)) < 0) { if ((res = pn53x_initiator_transceive_bytes(pnd, abtReqt, sizeof(abtReqt), &abtAnticol[1], sizeof(abtAnticol) - 1, timeout)) < 0) {
log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "timeout on iClass anticol"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "timeout on iClass anticol");
return res; return res;
} }
// write back anticol handle to get UID // write back anticol handle to get UID
if ((res = pn53x_initiator_transceive_bytes(pnd, abtAnticol, 9, abtTargetsData, 10, timeout)) < 0) { if ((res = pn53x_initiator_transceive_bytes(pnd, abtAnticol, 9, abtTargetsData, 10, timeout)) < 0) {
log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "timeout on iClass get UID"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "timeout on iClass get UID");
return res; return res;
} }
log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "iClass raw UID: %02x %02x %02x %02x %02x %02x %02x %02x", abtTargetsData[0], abtTargetsData[1], abtTargetsData[2], abtTargetsData[3], abtTargetsData[4], abtTargetsData[5], abtTargetsData[6], abtTargetsData[7]); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "iClass raw UID: %02x %02x %02x %02x %02x %02x %02x %02x", abtTargetsData[0], abtTargetsData[1], abtTargetsData[2], abtTargetsData[3], abtTargetsData[4], abtTargetsData[5], abtTargetsData[6], abtTargetsData[7]);
@ -1210,6 +1210,15 @@ pn53x_initiator_select_passive_target_ext(struct nfc_device *pnd,
if ((res = pn53x_decode_target_data(abtTargetsData, szTargetsData, CHIP_DATA(pnd)->type, nm.nmt, &(nttmp.nti))) < 0) { if ((res = pn53x_decode_target_data(abtTargetsData, szTargetsData, CHIP_DATA(pnd)->type, nm.nmt, &(nttmp.nti))) < 0) {
return res; return res;
} }
} else {
if ((res = pn53x_initiator_transceive_bytes(pnd, pbtInitData, szInitData, abtTargetsData, sizeof(abtTargetsData), timeout)) < 0) {
if ((res == NFC_ERFTRANS) && (CHIP_DATA(pnd)->last_status_byte == 0x01)) { // Chip timeout
continue;
} else
return res;
}
szTargetsData = (size_t)res;
} }
if (nm.nmt == NMT_ISO14443B2CT) { if (nm.nmt == NMT_ISO14443B2CT) {

View file

@ -170,37 +170,33 @@ void
prepare_initiator_data(const nfc_modulation nm, uint8_t **ppbtInitiatorData, size_t *pszInitiatorData) prepare_initiator_data(const nfc_modulation nm, uint8_t **ppbtInitiatorData, size_t *pszInitiatorData)
{ {
switch (nm.nmt) { switch (nm.nmt) {
case NMT_ISO14443B: { case NMT_ISO14443B:
// Application Family Identifier (AFI) must equals 0x00 in order to wakeup all ISO14443-B PICCs (see ISO/IEC 14443-3) // Application Family Identifier (AFI) must equals 0x00 in order to wakeup all ISO14443-B PICCs (see ISO/IEC 14443-3)
*ppbtInitiatorData = (uint8_t *) "\x00"; *ppbtInitiatorData = (uint8_t *) "\x00";
*pszInitiatorData = 1; *pszInitiatorData = 1;
}
break; break;
case NMT_ISO14443BI: { case NMT_ISO14443BI:
// APGEN // APGEN
*ppbtInitiatorData = (uint8_t *) "\x01\x0b\x3f\x80"; *ppbtInitiatorData = (uint8_t *) "\x01\x0b\x3f\x80";
*pszInitiatorData = 4; *pszInitiatorData = 4;
}
break; break;
case NMT_ISO14443B2SR: { case NMT_ISO14443B2SR:
// Get_UID // Get_UID
*ppbtInitiatorData = (uint8_t *) "\x0b"; *ppbtInitiatorData = (uint8_t *) "\x0b";
*pszInitiatorData = 1; *pszInitiatorData = 1;
}
break; break;
case NMT_ISO14443B2CT: { case NMT_ISO14443B2CT:
// SELECT-ALL // SELECT-ALL
*ppbtInitiatorData = (uint8_t *) "\x9F\xFF\xFF"; *ppbtInitiatorData = (uint8_t *) "\x9F\xFF\xFF";
*pszInitiatorData = 3; *pszInitiatorData = 3;
}
break; break;
case NMT_FELICA: { case NMT_FELICA:
// polling payload must be present (see ISO/IEC 18092 11.2.2.5) // polling payload must be present (see ISO/IEC 18092 11.2.2.5)
*ppbtInitiatorData = (uint8_t *) "\x00\xff\xff\x01\x00"; *ppbtInitiatorData = (uint8_t *) "\x00\xff\xff\x01\x00";
*pszInitiatorData = 5; *pszInitiatorData = 5;
}
break; break;
case NMT_ISO14443A: case NMT_ISO14443A:
case NMT_ISO14443BICLASS:
case NMT_JEWEL: case NMT_JEWEL:
case NMT_BARCODE: case NMT_BARCODE:
case NMT_DEP: case NMT_DEP:

View file

@ -1390,6 +1390,8 @@ str_nfc_modulation_type(const nfc_modulation_type nmt)
return "ISO/IEC 14443-4B"; return "ISO/IEC 14443-4B";
case NMT_ISO14443BI: case NMT_ISO14443BI:
return "ISO/IEC 14443-4B'"; return "ISO/IEC 14443-4B'";
case NMT_ISO14443BICLASS:
return "ISO/IEC 14443-2B-3B iClass (Picopass)";
case NMT_ISO14443B2CT: case NMT_ISO14443B2CT:
return "ISO/IEC 14443-2B ASK CTx"; return "ISO/IEC 14443-2B ASK CTx";
case NMT_ISO14443B2SR: case NMT_ISO14443B2SR:

View file

@ -679,7 +679,7 @@ snprint_nfc_target(char *dst, size_t size, const nfc_target *pnt, bool verbose)
snprint_nfc_iso14443b2sr_info(dst + off, size - off, &pnt->nti.nsi, verbose); snprint_nfc_iso14443b2sr_info(dst + off, size - off, &pnt->nti.nsi, verbose);
break; break;
case NMT_ISO14443BICLASS: case NMT_ISO14443BICLASS:
snprint_nfc_iso14443biclass_info(dst + off, size - off, &pnt->nti.nic, verbose); snprint_nfc_iso14443biclass_info(dst + off, size - off, &pnt->nti.nhi, verbose);
break; break;
case NMT_ISO14443B2CT: case NMT_ISO14443B2CT:
snprint_nfc_iso14443b2ct_info(dst + off, size - off, &pnt->nti.nci, verbose); snprint_nfc_iso14443b2ct_info(dst + off, size - off, &pnt->nti.nci, verbose);