From ed34dfa1c6738a1bc40cb9da934817fa574e6d77 Mon Sep 17 00:00:00 2001 From: Leptopt1los <53914086+Leptopt1los@users.noreply.github.com> Date: Wed, 7 Feb 2024 01:53:42 +0900 Subject: [PATCH] NFC: MF Classic parsers read() fix (dictionary attack skip) (#3355) * NFC: MF Classic lib: MfClassicErrorPartialRead added * unnecessary imports removed * MfClassicError refactor by @gornekich Co-authored-by: gornekich --------- Co-authored-by: gornekich --- .../main/nfc/plugins/supported_cards/aime.c | 2 +- .../main/nfc/plugins/supported_cards/hid.c | 2 +- .../nfc/plugins/supported_cards/plantain.c | 4 ++-- .../main/nfc/plugins/supported_cards/troika.c | 4 ++-- .../nfc/plugins/supported_cards/two_cities.c | 4 ++-- lib/nfc/protocols/mf_classic/mf_classic.h | 1 + .../mf_classic/mf_classic_poller_sync.c | 21 ++++++++----------- 7 files changed, 18 insertions(+), 20 deletions(-) diff --git a/applications/main/nfc/plugins/supported_cards/aime.c b/applications/main/nfc/plugins/supported_cards/aime.c index df1e7e0772..50052f0d19 100644 --- a/applications/main/nfc/plugins/supported_cards/aime.c +++ b/applications/main/nfc/plugins/supported_cards/aime.c @@ -60,7 +60,7 @@ static bool aime_read(Nfc* nfc, NfcDevice* device) { } error = mf_classic_poller_sync_read(nfc, &keys, data); - if(error != MfClassicErrorNone) { + if(error == MfClassicErrorNotPresent) { FURI_LOG_W(TAG, "Failed to read data"); break; } diff --git a/applications/main/nfc/plugins/supported_cards/hid.c b/applications/main/nfc/plugins/supported_cards/hid.c index 66ced4d0c5..b6b0a406ff 100644 --- a/applications/main/nfc/plugins/supported_cards/hid.c +++ b/applications/main/nfc/plugins/supported_cards/hid.c @@ -60,7 +60,7 @@ static bool hid_read(Nfc* nfc, NfcDevice* device) { } error = mf_classic_poller_sync_read(nfc, &keys, data); - if(error != MfClassicErrorNone) { + if(error == MfClassicErrorNotPresent) { FURI_LOG_W(TAG, "Failed to read data"); break; } diff --git a/applications/main/nfc/plugins/supported_cards/plantain.c b/applications/main/nfc/plugins/supported_cards/plantain.c index a21e1cd415..b7e7497f74 100644 --- a/applications/main/nfc/plugins/supported_cards/plantain.c +++ b/applications/main/nfc/plugins/supported_cards/plantain.c @@ -135,14 +135,14 @@ static bool plantain_read(Nfc* nfc, NfcDevice* device) { } error = mf_classic_poller_sync_read(nfc, &keys, data); - if(error != MfClassicErrorNone) { + if(error != MfClassicErrorNotPresent) { FURI_LOG_W(TAG, "Failed to read data"); break; } nfc_device_set_data(device, NfcProtocolMfClassic, data); - is_read = true; + is_read = (error == MfClassicErrorNone); } while(false); mf_classic_free(data); diff --git a/applications/main/nfc/plugins/supported_cards/troika.c b/applications/main/nfc/plugins/supported_cards/troika.c index 7cf1e4dd8c..e3dfb703c9 100644 --- a/applications/main/nfc/plugins/supported_cards/troika.c +++ b/applications/main/nfc/plugins/supported_cards/troika.c @@ -137,14 +137,14 @@ static bool troika_read(Nfc* nfc, NfcDevice* device) { } error = mf_classic_poller_sync_read(nfc, &keys, data); - if(error != MfClassicErrorNone) { + if(error == MfClassicErrorNotPresent) { FURI_LOG_W(TAG, "Failed to read data"); break; } nfc_device_set_data(device, NfcProtocolMfClassic, data); - is_read = true; + is_read = (error == MfClassicErrorNone); } while(false); mf_classic_free(data); diff --git a/applications/main/nfc/plugins/supported_cards/two_cities.c b/applications/main/nfc/plugins/supported_cards/two_cities.c index 1748d372d2..e9309f719e 100644 --- a/applications/main/nfc/plugins/supported_cards/two_cities.c +++ b/applications/main/nfc/plugins/supported_cards/two_cities.c @@ -85,14 +85,14 @@ static bool two_cities_read(Nfc* nfc, NfcDevice* device) { } error = mf_classic_poller_sync_read(nfc, &keys, data); - if(error != MfClassicErrorNone) { + if(error != MfClassicErrorNotPresent) { FURI_LOG_W(TAG, "Failed to read data"); break; } nfc_device_set_data(device, NfcProtocolMfClassic, data); - is_read = true; + is_read = (error == MfClassicErrorNone); } while(false); mf_classic_free(data); diff --git a/lib/nfc/protocols/mf_classic/mf_classic.h b/lib/nfc/protocols/mf_classic/mf_classic.h index 146e6a6f15..755c457d16 100644 --- a/lib/nfc/protocols/mf_classic/mf_classic.h +++ b/lib/nfc/protocols/mf_classic/mf_classic.h @@ -39,6 +39,7 @@ typedef enum { MfClassicErrorNotPresent, MfClassicErrorProtocol, MfClassicErrorAuth, + MfClassicErrorPartialRead, MfClassicErrorTimeout, } MfClassicError; diff --git a/lib/nfc/protocols/mf_classic/mf_classic_poller_sync.c b/lib/nfc/protocols/mf_classic/mf_classic_poller_sync.c index 69954452aa..8566a86125 100644 --- a/lib/nfc/protocols/mf_classic/mf_classic_poller_sync.c +++ b/lib/nfc/protocols/mf_classic/mf_classic_poller_sync.c @@ -475,19 +475,16 @@ MfClassicError nfc_poller_stop(poller); - if(poller_context.error != MfClassicErrorNone) { - error = poller_context.error; - } else { - const MfClassicData* mfc_data = nfc_poller_get_data(poller); - uint8_t sectors_read = 0; - uint8_t keys_found = 0; + const MfClassicData* mfc_data = nfc_poller_get_data(poller); + uint8_t sectors_read = 0; + uint8_t keys_found = 0; - mf_classic_get_read_sectors_and_keys(mfc_data, §ors_read, &keys_found); - if((sectors_read > 0) || (keys_found > 0)) { - mf_classic_copy(data, mfc_data); - } else { - error = MfClassicErrorNotPresent; - } + mf_classic_get_read_sectors_and_keys(mfc_data, §ors_read, &keys_found); + if((sectors_read == 0) && (keys_found == 0)) { + error = MfClassicErrorNotPresent; + } else { + mf_classic_copy(data, mfc_data); + error = mf_classic_is_card_read(mfc_data) ? MfClassicErrorNone : MfClassicErrorPartialRead; } nfc_poller_free(poller);