diff --git a/examples/mifare-classic-format.c b/examples/mifare-classic-format.c index e8daa7fb..3620bbc1 100644 --- a/examples/mifare-classic-format.c +++ b/examples/mifare-classic-format.c @@ -83,28 +83,35 @@ try_format_sector(FreefareTag tag, MifareClassicSectorNumber sector) { display_progress(); for (size_t i = 0; i < (sizeof(default_keys) / sizeof(MifareClassicKey)); i++) { - MifareClassicBlockNumber block = mifare_classic_sector_last_block(sector); - if ((0 == mifare_classic_connect(tag)) && (0 == mifare_classic_authenticate(tag, block, default_keys[i], MFC_KEY_A))) { - if (0 == mifare_classic_format_sector(tag, sector)) { - mifare_classic_disconnect(tag); - return 1; - } else if (EIO == errno) { - err(EXIT_FAILURE, "sector %d", sector); - } - mifare_classic_disconnect(tag); - } - - if ((0 == mifare_classic_connect(tag)) && (0 == mifare_classic_authenticate(tag, block, default_keys[i], MFC_KEY_B))) { - if (0 == mifare_classic_format_sector(tag, sector)) { - mifare_classic_disconnect(tag); - return 1; - } else if (EIO == errno) { - err(EXIT_FAILURE, "sector %d", sector); - } - mifare_classic_disconnect(tag); - } + MifareClassicBlockNumber block = mifare_classic_sector_last_block(sector); + // The disconnect event only execute after connected + if (0 == mifare_classic_connect(tag)) { + int ret = mifare_classic_authenticate(tag, block, default_keys[i], MFC_KEY_A); + if ((0x00 == ret) || (0x90 == ret)) { + if (0 == mifare_classic_format_sector(tag, sector)) { + mifare_classic_disconnect(tag); + return 1; + } else if (EIO == errno) { + err(EXIT_FAILURE, "sector %d", sector); + } + } + mifare_classic_disconnect(tag); + } + //With PC/SC reader, it has SW1SW2 + if (0 == mifare_classic_connect(tag)) { + int ret = mifare_classic_authenticate(tag, block, default_keys[i], MFC_KEY_B); + if ((0x00 == ret) || (0x90 == ret)) { + if (0 == mifare_classic_format_sector(tag, sector)) { + mifare_classic_disconnect(tag); + return 1; + } else if (EIO == errno) { + err(EXIT_FAILURE, "sector %d", sector); + } + } + mifare_classic_disconnect(tag); + } } - + warnx("No known authentication key for sector %d", sector); return 0; } diff --git a/examples/mifare-classic-write-ndef.c b/examples/mifare-classic-write-ndef.c index 134ce61d..7d4f4383 100644 --- a/examples/mifare-classic-write-ndef.c +++ b/examples/mifare-classic-write-ndef.c @@ -62,29 +62,37 @@ search_sector_key(FreefareTag tag, MifareClassicSectorNumber sector, MifareClass */ mifare_classic_disconnect(tag); for (size_t i = 0; i < (sizeof(default_keys) / sizeof(MifareClassicKey)); i++) { - if ((0 == mifare_classic_connect(tag)) && (0 == mifare_classic_authenticate(tag, block, default_keys[i], MFC_KEY_A))) { - if ((1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_KEYA, MFC_KEY_A)) && - (1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_ACCESS_BITS, MFC_KEY_A)) && - (1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_KEYB, MFC_KEY_A))) { - memcpy(key, &default_keys[i], sizeof(MifareClassicKey)); - *key_type = MFC_KEY_A; - return 1; - } - } - mifare_classic_disconnect(tag); - - if ((0 == mifare_classic_connect(tag)) && (0 == mifare_classic_authenticate(tag, block, default_keys[i], MFC_KEY_B))) { - if ((1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_KEYA, MFC_KEY_B)) && - (1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_ACCESS_BITS, MFC_KEY_B)) && - (1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_KEYB, MFC_KEY_B))) { - memcpy(key, &default_keys[i], sizeof(MifareClassicKey)); - *key_type = MFC_KEY_B; - return 1; - } - } - mifare_classic_disconnect(tag); + //The disconnect event only execute after connected + if (0 == mifare_classic_connect(tag)){ + int ret = mifare_classic_authenticate(tag, block, default_keys[i], MFC_KEY_A); + if (0x00 == ret || 0x90 == ret) { + if ((1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_KEYA, MFC_KEY_A)) && + (1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_ACCESS_BITS, MFC_KEY_A)) && + (1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_KEYB, MFC_KEY_A))) { + memcpy(key, &default_keys[i], sizeof(MifareClassicKey)); + *key_type = MFC_KEY_A; + return 1; + } + } + mifare_classic_disconnect(tag); + } + + //With PC/SC reader, it has SW1SW2 + if (0 == mifare_classic_connect(tag)) { + int ret = mifare_classic_authenticate(tag, block, default_keys[i], MFC_KEY_B); + if (0x00 == ret || 0x90 == ret) { + if ((1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_KEYA, MFC_KEY_B)) && + (1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_ACCESS_BITS, MFC_KEY_B)) && + (1 == mifare_classic_get_trailer_block_permission(tag, block, MCAB_WRITE_KEYB, MFC_KEY_B))) { + memcpy(key, &default_keys[i], sizeof(MifareClassicKey)); + *key_type = MFC_KEY_B; + return 1; + } + } + mifare_classic_disconnect(tag); + } + } - warnx("No known authentication key for sector 0x%02x\n", sector); return 0; } diff --git a/libfreefare/mifare_classic.c b/libfreefare/mifare_classic.c index 6181db45..19428b97 100644 --- a/libfreefare/mifare_classic.c +++ b/libfreefare/mifare_classic.c @@ -355,12 +355,14 @@ mifare_classic_read(FreefareTag tag, const MifareClassicBlockNumber block, Mifar ASSERT_ACTIVE(tag); BUFFER_INIT(cmd, 2); - BUFFER_ALIAS(res, data, sizeof(MifareClassicBlock)); - + //For PC/SC reader, need give SW1SW2 + BUFFER_INIT(res, sizeof(MifareClassicBlock) + 2); + BUFFER_APPEND(cmd, MC_READ); BUFFER_APPEND(cmd, block); CLASSIC_TRANSCEIVE(tag, cmd, res); + memcpy(data, (MifareClassicBlock* )res, sizeof(MifareClassicBlock)); return 0; }