Skip to content

Commit

Permalink
NFC: add specific FeliCa type read option
Browse files Browse the repository at this point in the history
  • Loading branch information
nullableVoidPtr committed Dec 5, 2022
1 parent eaa2dea commit 68b3cc2
Show file tree
Hide file tree
Showing 16 changed files with 225 additions and 197 deletions.
12 changes: 7 additions & 5 deletions applications/main/nfc/nfc_cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,17 @@ static void nfc_cli_emulate(Cli* cli, FuriString* args) {
FuriHalNfcDevData params = {
.uid = {0x36, 0x9C, 0xe7, 0xb1, 0x0A, 0xC1, 0x34},
.uid_len = 7,
.a_data = {
.atqa = {0x44, 0x00},
.sak = 0x00,
},
.a_data =
{
.atqa = {0x44, 0x00},
.sak = 0x00,
},
.type = FuriHalNfcTypeA,
};

while(!cli_cmd_interrupt_received(cli)) {
if(furi_hal_nfc_listen(params.uid, params.uid_len, params.a_data.atqa, params.a_data.sak, false, 100)) {
if(furi_hal_nfc_listen(
params.uid, params.uid_len, params.a_data.atqa, params.a_data.sak, false, 100)) {
printf("Reader detected\r\n");
furi_hal_nfc_sleep();
}
Expand Down
3 changes: 2 additions & 1 deletion applications/main/nfc/scenes/nfc_scene_felica_read_success.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ void nfc_scene_felica_read_success_on_enter(void* context) {

FelicaSystem* current_system = felica_data->systems;
while(current_system) {
furi_string_cat_printf(temp_str, "\nSystem %04X (#%d):", current_system->code, current_system->number);
furi_string_cat_printf(
temp_str, "\nSystem %04X (#%d):", current_system->code, current_system->number);
furi_string_cat_printf(temp_str, "\nIDm:\n ");
for(size_t i = 0; i < 8; i++) {
furi_string_cat_printf(temp_str, "%02X", current_system->idm[i]);
Expand Down
3 changes: 2 additions & 1 deletion applications/main/nfc/scenes/nfc_scene_nfc_data_info.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ void nfc_scene_nfc_data_info_on_enter(void* context) {
for(size_t i = 0; i < nfc_data->uid_len; i++) {
furi_string_cat_printf(temp_str, " %02X", nfc_data->uid[i]);
}
furi_string_cat_printf(temp_str, "\nATQA: %02X %02X ", nfc_data->a_data.atqa[1], nfc_data->a_data.atqa[0]);
furi_string_cat_printf(
temp_str, "\nATQA: %02X %02X ", nfc_data->a_data.atqa[1], nfc_data->a_data.atqa[0]);
furi_string_cat_printf(temp_str, " SAK: %02X", nfc_data->a_data.sak);

// Set application specific data
Expand Down
3 changes: 2 additions & 1 deletion applications/main/nfc/scenes/nfc_scene_nfca_read_success.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ void nfc_scene_nfca_read_success_on_enter(void* context) {
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, "\nATQA: %02X %02X ", data->a_data.atqa[1], data->a_data.atqa[0]);
furi_string_cat_printf(
temp_str, "\nATQA: %02X %02X ", data->a_data.atqa[1], data->a_data.atqa[0]);
furi_string_cat_printf(temp_str, " SAK: %02X", data->a_data.sak);

widget_add_text_scroll_element(widget, 0, 0, 128, 52, furi_string_get_cstr(temp_str));
Expand Down
12 changes: 12 additions & 0 deletions applications/main/nfc/scenes/nfc_scene_read_card_type.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ enum SubmenuIndex {
SubmenuIndexReadMfUltralight,
SubmenuIndexReadEMV,
SubmenuIndexReadNFCA,
SubmenuIndexReadFelica,
};

void nfc_scene_read_card_type_submenu_callback(void* context, uint32_t index) {
Expand Down Expand Up @@ -49,6 +50,12 @@ void nfc_scene_read_card_type_on_enter(void* context) {
SubmenuIndexReadNFCA,
nfc_scene_read_card_type_submenu_callback,
nfc);
submenu_add_item(
submenu,
"Read FeliCa",
SubmenuIndexReadFelica,
nfc_scene_read_card_type_submenu_callback,
nfc);
uint32_t state = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneReadCardType);
submenu_set_selected_item(submenu, state);

Expand Down Expand Up @@ -85,6 +92,11 @@ bool nfc_scene_read_card_type_on_event(void* context, SceneManagerEvent event) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneRead);
consumed = true;
}
if(event.event == SubmenuIndexReadFelica) {
nfc->dev->dev_data.read_mode = NfcReadModeFelica;
scene_manager_next_scene(nfc->scene_manager, NfcSceneRead);
consumed = true;
}
scene_manager_set_scene_state(nfc->scene_manager, NfcSceneReadCardType, event.event);
}
return consumed;
Expand Down
5 changes: 1 addition & 4 deletions lib/nfc/helpers/reader_analyzer.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,7 @@ const FuriHalNfcDevData reader_analyzer_nfc_data[] = {
.type = FuriHalNfcTypeA,
.uid_len = 7,
.uid = {0x04, 0x77, 0x70, 0x2A, 0x23, 0x4F, 0x80},
.a_data = {
.sak = 0x08,
.atqa = {0x44, 0x00},
.cuid = 0x2A234F80}},
.a_data = {.sak = 0x08, .atqa = {0x44, 0x00}, .cuid = 0x2A234F80}},
};

void reader_analyzer_parse(ReaderAnalyzer* instance, uint8_t* buffer, size_t size) {
Expand Down
2 changes: 1 addition & 1 deletion lib/nfc/nfc_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -1127,7 +1127,7 @@ static bool nfc_device_load_data(NfcDevice* dev, FuriString* path, bool show_dia
cuid_start = &data->uid[3];
}
data->a_data.cuid = (cuid_start[0] << 24) | (cuid_start[1] << 16) | (cuid_start[2] << 8) |
(cuid_start[3]);
(cuid_start[3]);
// Parse other data
if(dev->format == NfcDeviceSaveFormatMifareUl) {
if(!nfc_device_load_mifare_ul_data(file, dev)) break;
Expand Down
2 changes: 1 addition & 1 deletion lib/nfc/nfc_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ typedef enum {
NfcReadModeMfDesfire,
NfcReadModeEMV,
NfcReadModeNFCA,
NfcReadModeNFCF,
NfcReadModeFelica,
} NfcReadMode;

typedef struct {
Expand Down
11 changes: 11 additions & 0 deletions lib/nfc/nfc_worker.c
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,17 @@ void nfc_worker_read_type(NfcWorker* nfc_worker) {
event = NfcWorkerEventReadUidNfcA;
break;
}
} else if(nfc_data->type == FuriHalNfcTypeF) {
if(read_mode == NfcReadModeFelica) {
nfc_worker->dev_data->protocol = NfcDeviceProtocolFelica;
if(nfc_worker_read_felica(nfc_worker, &tx_rx)) {
nfc_worker->dev_data->protocol = NfcDeviceProtocolFelica;
if(nfc_worker_read_felica(nfc_worker, &tx_rx)) {
event = NfcWorkerEventReadFelica;
break;
}
}
}
} else {
if(!card_not_detected_notified) {
nfc_worker->callback(NfcWorkerEventNoCardDetected, nfc_worker->context);
Expand Down
3 changes: 2 additions & 1 deletion lib/nfc/parsers/plantain_4k_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ bool plantain_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx

MfClassicReader reader = {};
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
reader.type = mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
reader.type =
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
for(size_t i = 0; i < COUNT_OF(plantain_keys_4k); i++) {
mf_classic_reader_add_sector(
&reader,
Expand Down
3 changes: 2 additions & 1 deletion lib/nfc/parsers/plantain_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ bool plantain_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {

MfClassicReader reader = {};
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
reader.type = mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
reader.type =
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
for(size_t i = 0; i < COUNT_OF(plantain_keys); i++) {
mf_classic_reader_add_sector(
&reader, plantain_keys[i].sector, plantain_keys[i].key_a, plantain_keys[i].key_b);
Expand Down
3 changes: 2 additions & 1 deletion lib/nfc/parsers/troika_4k_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ bool troika_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx)

MfClassicReader reader = {};
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
reader.type = mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
reader.type =
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
for(size_t i = 0; i < COUNT_OF(troika_4k_keys); i++) {
mf_classic_reader_add_sector(
&reader, troika_4k_keys[i].sector, troika_4k_keys[i].key_a, troika_4k_keys[i].key_b);
Expand Down
3 changes: 2 additions & 1 deletion lib/nfc/parsers/troika_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ bool troika_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {

MfClassicReader reader = {};
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
reader.type = mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
reader.type =
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);

for(size_t i = 0; i < COUNT_OF(troika_keys); i++) {
mf_classic_reader_add_sector(
Expand Down
3 changes: 2 additions & 1 deletion lib/nfc/parsers/two_cities.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ bool two_cities_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx)

MfClassicReader reader = {};
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
reader.type = mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
reader.type =
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
for(size_t i = 0; i < COUNT_OF(two_cities_keys_4k); i++) {
mf_classic_reader_add_sector(
&reader,
Expand Down
Loading

0 comments on commit 68b3cc2

Please sign in to comment.