NFC: Improvements to NFC Magic app (#2760)

Ability to write gen1b tags (ignore 0x43)
Ability to write gen1 7 byte UID tags
Fix detection of non magic cards

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
AloneLiberty 2023-06-28 19:35:25 +03:00 committed by GitHub
parent dcf105994b
commit feebf2cd77
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 33 deletions

View File

@ -46,6 +46,7 @@ enum NfcMagicCustomEvent {
struct NfcMagicDevice { struct NfcMagicDevice {
MagicType type; MagicType type;
uint32_t cuid; uint32_t cuid;
uint8_t uid_len;
uint32_t password; uint32_t password;
}; };

View File

@ -107,14 +107,7 @@ void nfc_magic_worker_write(NfcMagicWorker* nfc_magic_worker) {
} }
magic_activate(); magic_activate();
if(magic_gen1_wupa()) { if(magic_gen1_wupa()) {
if(!magic_gen1_data_access_cmd()) { magic_gen1_data_access_cmd();
FURI_LOG_E(
TAG, "No card response to data access command (not a magic card)");
nfc_magic_worker->callback(
NfcMagicWorkerEventWrongCard, nfc_magic_worker->context);
done = true;
break;
}
MfClassicData* mfc_data = &dev_data->mf_classic_data; MfClassicData* mfc_data = &dev_data->mf_classic_data;
for(size_t i = 0; i < 64; i++) { for(size_t i = 0; i < 64; i++) {
@ -296,6 +289,7 @@ void nfc_magic_worker_write(NfcMagicWorker* nfc_magic_worker) {
} }
void nfc_magic_worker_check(NfcMagicWorker* nfc_magic_worker) { void nfc_magic_worker_check(NfcMagicWorker* nfc_magic_worker) {
FuriHalNfcDevData nfc_data = {};
NfcMagicDevice* magic_dev = nfc_magic_worker->magic_dev; NfcMagicDevice* magic_dev = nfc_magic_worker->magic_dev;
bool card_found_notified = false; bool card_found_notified = false;
uint8_t gen4_config[MAGIC_GEN4_CONFIG_LEN]; uint8_t gen4_config[MAGIC_GEN4_CONFIG_LEN];
@ -310,32 +304,44 @@ void nfc_magic_worker_check(NfcMagicWorker* nfc_magic_worker) {
card_found_notified = true; card_found_notified = true;
} }
furi_hal_nfc_activate_nfca(200, &magic_dev->cuid); if(furi_hal_nfc_detect(&nfc_data, 200)) {
nfc_magic_worker->callback(NfcMagicWorkerEventSuccess, nfc_magic_worker->context); magic_dev->cuid = nfc_data.cuid;
break; magic_dev->uid_len = nfc_data.uid_len;
} } else {
// wrong BCC
magic_deactivate(); magic_dev->uid_len = 4;
furi_delay_ms(300);
magic_activate();
furi_hal_nfc_activate_nfca(200, &magic_dev->cuid);
if(magic_gen4_get_cfg(magic_dev->password, gen4_config)) {
magic_dev->type = MagicTypeGen4;
if(!card_found_notified) {
nfc_magic_worker->callback(
NfcMagicWorkerEventCardDetected, nfc_magic_worker->context);
card_found_notified = true;
} }
nfc_magic_worker->callback(NfcMagicWorkerEventSuccess, nfc_magic_worker->context); nfc_magic_worker->callback(NfcMagicWorkerEventSuccess, nfc_magic_worker->context);
break; break;
} } else {
magic_deactivate();
magic_activate();
if(furi_hal_nfc_detect(&nfc_data, 200)) {
magic_dev->cuid = nfc_data.cuid;
magic_dev->uid_len = nfc_data.uid_len;
if(magic_gen4_get_cfg(magic_dev->password, gen4_config)) {
magic_dev->type = MagicTypeGen4;
if(!card_found_notified) {
nfc_magic_worker->callback(
NfcMagicWorkerEventCardDetected, nfc_magic_worker->context);
card_found_notified = true;
}
if(card_found_notified) { nfc_magic_worker->callback(
nfc_magic_worker->callback( NfcMagicWorkerEventSuccess, nfc_magic_worker->context);
NfcMagicWorkerEventNoCardDetected, nfc_magic_worker->context); } else {
card_found_notified = false; nfc_magic_worker->callback(
NfcMagicWorkerEventWrongCard, nfc_magic_worker->context);
card_found_notified = true;
}
break;
} else {
if(card_found_notified) {
nfc_magic_worker->callback(
NfcMagicWorkerEventNoCardDetected, nfc_magic_worker->context);
card_found_notified = false;
}
}
} }
magic_deactivate(); magic_deactivate();

View File

@ -8,7 +8,7 @@ static bool nfc_magic_scene_file_select_is_file_suitable(NfcMagic* nfc_magic) {
case MagicTypeClassicDirectWrite: case MagicTypeClassicDirectWrite:
case MagicTypeClassicAPDU: case MagicTypeClassicAPDU:
if((nfc_dev->dev_data.mf_classic_data.type != MfClassicType1k) || if((nfc_dev->dev_data.mf_classic_data.type != MfClassicType1k) ||
(nfc_dev->dev_data.nfc_data.uid_len != 4)) { (nfc_dev->dev_data.nfc_data.uid_len != nfc_magic->dev->uid_len)) {
return false; return false;
} }
return true; return true;

View File

@ -13,11 +13,10 @@ void nfc_magic_scene_not_magic_on_enter(void* context) {
notification_message(nfc_magic->notifications, &sequence_error); notification_message(nfc_magic->notifications, &sequence_error);
// widget_add_icon_element(widget, 73, 17, &I_DolphinCommon_56x48);
widget_add_string_element( widget_add_string_element(
widget, 3, 4, AlignLeft, AlignTop, FontPrimary, "This is wrong card"); widget, 3, 4, AlignLeft, AlignTop, FontPrimary, "This is wrong card");
widget_add_string_multiline_element( widget_add_string_multiline_element(
widget, 4, 17, AlignLeft, AlignTop, FontSecondary, "Not a magic\ncard"); widget, 4, 17, AlignLeft, AlignTop, FontSecondary, "Not magic or unsupported\ncard");
widget_add_button_element( widget_add_button_element(
widget, GuiButtonTypeLeft, "Retry", nfc_magic_scene_not_magic_widget_callback, nfc_magic); widget, GuiButtonTypeLeft, "Retry", nfc_magic_scene_not_magic_widget_callback, nfc_magic);