Merge pull request #376 from qistoph/mrtd

MRTD Support NFC-B documents
This commit is contained in:
RogueMaster
2022-10-24 02:43:25 -04:00
committed by GitHub
2 changed files with 52 additions and 6 deletions

View File

@@ -21,8 +21,20 @@ void nfc_scene_passport_read_on_enter(void* context) {
temp_str = furi_string_alloc(); temp_str = furi_string_alloc();
furi_string_set(temp_str, "\e#Passport\n"); furi_string_set(temp_str, "\e#Passport\n");
char iso_type = FURI_BIT(data->sak, 5) ? '4' : '3'; char iso_type = FURI_BIT(data->sak, 5) ? '4' : '3';
//TODO: NFC-B?
furi_string_cat_printf(temp_str, "ISO 14443-%c (NFC-A)\n", iso_type); char nfc_type;
switch(data->type) {
case FuriHalNfcTypeA:
nfc_type = 'A';
break;
case FuriHalNfcTypeB:
nfc_type = 'B';
break;
default:
nfc_type = '?';
break;
}
furi_string_cat_printf(temp_str, "ISO 14443-%c (NFC-%c)\n", iso_type, nfc_type);
furi_string_cat_printf(temp_str, "UID:"); furi_string_cat_printf(temp_str, "UID:");
for(size_t i = 0; i < data->uid_len; i++) { for(size_t i = 0; i < data->uid_len; i++) {
furi_string_cat_printf(temp_str, " %02X", data->uid[i]); furi_string_cat_printf(temp_str, " %02X", data->uid[i]);

View File

@@ -376,6 +376,33 @@ static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* t
return card_read; return card_read;
} }
static bool nfc_worker_read_nfcb(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
bool card_read = false;
furi_hal_nfc_sleep();
if(nfc_data->interface == FuriHalNfcInterfaceIsoDep) {
FURI_LOG_I(TAG, "ISO14443-4B card detected");
//TODO: thoughts on improving logic/readability here?
do {
FURI_LOG_D(TAG, "Try reading MRTD");
if(nfc_worker_read_mrtd(nfc_worker, tx_rx)) {
nfc_worker->dev_data->protocol = NfcDeviceProtocolMRTD;
break;
}
FURI_LOG_I(TAG, "Unknown card. Save UID");
nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown;
} while(false);
card_read = true;
} else {
nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown;
card_read = true;
}
return card_read;
}
void nfc_worker_read(NfcWorker* nfc_worker) { void nfc_worker_read(NfcWorker* nfc_worker) {
furi_assert(nfc_worker); furi_assert(nfc_worker);
furi_assert(nfc_worker->callback); furi_assert(nfc_worker->callback);
@@ -420,8 +447,15 @@ void nfc_worker_read(NfcWorker* nfc_worker) {
} }
} }
} else if(nfc_data->type == FuriHalNfcTypeB) { } else if(nfc_data->type == FuriHalNfcTypeB) {
event = NfcWorkerEventReadUidNfcB; if(nfc_worker_read_nfcb(nfc_worker, &tx_rx)) {
break; if(dev_data->protocol == NfcDeviceProtocolMRTD) {
event = NfcWorkerEventReadPassport;
break;
}
}
event = NfcWorkerEventReadUidNfcB;
break;
} else if(nfc_data->type == FuriHalNfcTypeF) { } else if(nfc_data->type == FuriHalNfcTypeF) {
event = NfcWorkerEventReadUidNfcF; event = NfcWorkerEventReadUidNfcF;
break; break;