From 0480b7248e566e7604792c7ec992a2e166ce33ba Mon Sep 17 00:00:00 2001 From: Robert Quattlebaum Date: Thu, 2 Jan 2020 15:06:47 -0800 Subject: [PATCH] Add support for JCOP cards with DESFire emulation Some JCOP cards support native DESFire EV1/EV2 emulation, but the existing code was ignoring these cards because they didn't have the expected ATS prefix. This change updates `mifare_desfire_taste` to also return true for JCOP cards with DESFire support, allowing them to be used with libfreefare. --- libfreefare/mifare_desfire.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libfreefare/mifare_desfire.c b/libfreefare/mifare_desfire.c index fa05417..efa0505 100644 --- a/libfreefare/mifare_desfire.c +++ b/libfreefare/mifare_desfire.c @@ -271,11 +271,19 @@ le24toh(uint8_t data[3]) bool mifare_desfire_taste(nfc_device *device, nfc_target target) { + // We have two different ATS prefixes to + // check for, standalone and JCOP. + static const char STANDALONE_DESFIRE[] = { 0x75, 0x77, 0x81, 0x02}; + static const char JCOP_DESFIRE[] = { 0x75, 0xf7, 0xb1, 0x02 }; + (void) device; + return target.nm.nmt == NMT_ISO14443A && target.nti.nai.btSak == 0x20 && - target.nti.nai.szAtsLen >= 5 && - memcmp(target.nti.nai.abtAts, "\x75\x77\x81\x02", 4) == 0; + target.nti.nai.szAtsLen >= 5 && ( + memcmp(target.nti.nai.abtAts, STANDALONE_DESFIRE, sizeof(STANDALONE_DESFIRE)) == 0 || + memcmp(target.nti.nai.abtAts, JCOP_DESFIRE, sizeof(JCOP_DESFIRE)) == 0 + ); } /*