Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions applications/external/nfc_magic/nfc_magic_worker.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ void nfc_magic_worker_write(NfcMagicWorker* nfc_magic_worker) {
while(nfc_magic_worker->state == NfcMagicWorkerStateWrite) {
do {
if(magic_dev->type == MagicTypeClassicGen1) {
if(furi_hal_nfc_detect(&nfc_data, 200)) {
if(furi_hal_nfc_detect(&nfc_data, 200, false)) {
magic_deactivate();
magic_activate();
if(!magic_gen1_wupa()) {
Expand Down Expand Up @@ -134,7 +134,7 @@ void nfc_magic_worker_write(NfcMagicWorker* nfc_magic_worker) {
break;
}
} else if(magic_dev->type == MagicTypeGen4) {
if(furi_hal_nfc_detect(&nfc_data, 200)) {
if(furi_hal_nfc_detect(&nfc_data, 200, false)) {
uint8_t gen4_config[28];
uint32_t password = magic_dev->password;

Expand Down
6 changes: 4 additions & 2 deletions applications/main/nfc/nfc_cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ static void nfc_cli_detect(Cli* cli, FuriString* args) {
printf("Detecting nfc...\r\nPress Ctrl+C to abort\r\n");
while(!cmd_exit) {
cmd_exit |= cli_cmd_interrupt_received(cli);
if(furi_hal_nfc_detect(&dev_data, 400)) {
if(furi_hal_nfc_detect(&dev_data, 400, true) ||
furi_hal_nfc_detect(&dev_data, 400, false)) {
printf("Found: %s ", nfc_get_dev_type(dev_data.type));
printf("UID length: %d, UID:", dev_data.uid_len);
for(size_t i = 0; i < dev_data.uid_len; i++) {
Expand Down Expand Up @@ -125,7 +126,8 @@ static void nfc_cli_apdu(Cli* cli, FuriString* args) {
}

printf("detecting tag\r\n");
if(!furi_hal_nfc_detect(&dev_data, 300)) {
if(!furi_hal_nfc_detect(&dev_data, 300, true) &&
!furi_hal_nfc_detect(&dev_data, 300, false)) {
printf("Failed to detect tag\r\n");
break;
}
Expand Down
3 changes: 3 additions & 0 deletions applications/main/nfc/scenes/nfc_scene_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ ADD_SCENE(nfc, mf_classic_write_fail, MfClassicWriteFail)
ADD_SCENE(nfc, mf_classic_update, MfClassicUpdate)
ADD_SCENE(nfc, mf_classic_update_success, MfClassicUpdateSuccess)
ADD_SCENE(nfc, mf_classic_wrong_card, MfClassicWrongCard)
ADD_SCENE(nfc, topaz_read_success, TopazReadSuccess)
ADD_SCENE(nfc, topaz_menu, TopazMenu)
ADD_SCENE(nfc, topaz_data, TopazData)
ADD_SCENE(nfc, emv_read_success, EmvReadSuccess)
ADD_SCENE(nfc, emv_menu, EmvMenu)
ADD_SCENE(nfc, emulate_apdu_sequence, EmulateApduSequence)
Expand Down
2 changes: 2 additions & 0 deletions applications/main/nfc/scenes/nfc_scene_delete.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ void nfc_scene_delete_on_enter(void* context) {
} else if(protocol == NfcDeviceProtocolNfcV) {
furi_string_set(temp_str, "ISO15693 tag");
nfc_type = "NFC-V";
} else if(protocol == NfcDeviceProtocolTopaz) {
furi_string_set(temp_str, nfc_topaz_type(nfc->dev->dev_data.topaz_data.type));
} else {
furi_string_set(temp_str, "Unknown ISO tag");
}
Expand Down
10 changes: 9 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 @@ -15,7 +15,7 @@ void nfc_scene_nfc_data_info_on_enter(void* context) {
NfcProtocol protocol = dev_data->protocol;
uint8_t text_scroll_height = 0;
if((protocol == NfcDeviceProtocolMifareDesfire) || (protocol == NfcDeviceProtocolMifareUl) ||
(protocol == NfcDeviceProtocolMifareClassic)) {
(protocol == NfcDeviceProtocolMifareClassic) || (protocol == NfcDeviceProtocolTopaz)) {
widget_add_button_element(
widget, GuiButtonTypeRight, "More", nfc_scene_nfc_data_info_widget_callback, nfc);
text_scroll_height = 52;
Expand Down Expand Up @@ -62,6 +62,8 @@ void nfc_scene_nfc_data_info_on_enter(void* context) {
furi_string_cat_printf(temp_str, "\e#ISO15693 (unknown)\n");
break;
}
} else if(protocol == NfcDeviceProtocolTopaz) {
furi_string_cat_printf(temp_str, "\e#%s\n", nfc_topaz_type(dev_data->topaz_data.type));
} else {
furi_string_cat_printf(temp_str, "\e#Unknown ISO tag\n");
}
Expand Down Expand Up @@ -260,6 +262,9 @@ void nfc_scene_nfc_data_info_on_enter(void* context) {
mf_classic_get_read_sectors_and_keys(data, &sectors_read, &keys_found);
furi_string_cat_printf(temp_str, "\nKeys Found %d/%d", keys_found, keys_total);
furi_string_cat_printf(temp_str, "\nSectors Read %d/%d", sectors_read, sectors_total);
} else if(protocol == NfcDeviceProtocolTopaz) {
TopazData* data = &dev_data->topaz_data;
furi_string_cat_printf(temp_str, "\nHR0: %02X\nHR1: %02X", data->hr[0], data->hr[1]);
}

// Add text scroll widget
Expand Down Expand Up @@ -288,6 +293,9 @@ bool nfc_scene_nfc_data_info_on_event(void* context, SceneManagerEvent event) {
} else if(protocol == NfcDeviceProtocolNfcV) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcVMenu);
consumed = true;
} else if(protocol == NfcDeviceProtocolTopaz) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneTopazData);
consumed = true;
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions applications/main/nfc/scenes/nfc_scene_read.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@ bool nfc_scene_read_on_event(void* context, SceneManagerEvent event) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfDesfireReadSuccess);
dolphin_deed(DolphinDeedNfcReadSuccess);
consumed = true;
} else if(event.event == NfcWorkerEventReadTopaz) {
notification_message(nfc->notifications, &sequence_success);
scene_manager_next_scene(nfc->scene_manager, NfcSceneTopazReadSuccess);
dolphin_deed(DolphinDeedNfcReadSuccess);
consumed = true;
} else if(event.event == NfcWorkerEventReadMfClassicDictAttackRequired) {
if(mf_classic_dict_check_presence(MfClassicDictTypeSystem)) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicDictAttack);
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 @@ -5,6 +5,7 @@ enum SubmenuIndex {
SubmenuIndexReadMifareClassic,
SubmenuIndexReadMifareDesfire,
SubmenuIndexReadMfUltralight,
SubmenuIndexReadTopaz,
SubmenuIndexReadNFCA,
};

Expand Down Expand Up @@ -36,6 +37,12 @@ void nfc_scene_read_card_type_on_enter(void* context) {
SubmenuIndexReadMfUltralight,
nfc_scene_read_card_type_submenu_callback,
nfc);
submenu_add_item(
submenu,
"Read Topaz",
SubmenuIndexReadTopaz,
nfc_scene_read_card_type_submenu_callback,
nfc);
submenu_add_item(
submenu,
"Read NFC-A data",
Expand Down Expand Up @@ -68,6 +75,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 == SubmenuIndexReadTopaz) {
nfc->dev->dev_data.read_mode = NfcReadModeTopaz;
scene_manager_next_scene(nfc->scene_manager, NfcSceneRead);
consumed = true;
}
if(event.event == SubmenuIndexReadNFCA) {
nfc->dev->dev_data.read_mode = NfcReadModeNFCA;
scene_manager_next_scene(nfc->scene_manager, NfcSceneRead);
Expand Down
32 changes: 32 additions & 0 deletions applications/main/nfc/scenes/nfc_scene_topaz_data.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include "../nfc_i.h"

void nfc_scene_topaz_data_on_enter(void* context) {
Nfc* nfc = context;
TopazData* data = &nfc->dev->dev_data.topaz_data;
TextBox* text_box = nfc->text_box;

text_box_set_font(text_box, TextBoxFontHex);
for(uint16_t i = 0; i < data->size; i += 2) {
if(!(i % 8) && i) {
furi_string_push_back(nfc->text_box_store, '\n');
}
furi_string_cat_printf(nfc->text_box_store, "%02X%02X ", data->data[i], data->data[i + 1]);
}
text_box_set_text(text_box, furi_string_get_cstr(nfc->text_box_store));

view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextBox);
}

bool nfc_scene_topaz_data_on_event(void* context, SceneManagerEvent event) {
UNUSED(context);
UNUSED(event);
return false;
}

void nfc_scene_topaz_data_on_exit(void* context) {
Nfc* nfc = context;

// Clean view
text_box_reset(nfc->text_box);
furi_string_reset(nfc->text_box_store);
}
59 changes: 59 additions & 0 deletions applications/main/nfc/scenes/nfc_scene_topaz_menu.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#include "../nfc_i.h"
#include <dolphin/dolphin.h>

enum SubmenuIndex {
SubmenuIndexSave,
SubmenuIndexInfo,
};

void nfc_scene_topaz_menu_submenu_callback(void* context, uint32_t index) {
Nfc* nfc = context;

view_dispatcher_send_custom_event(nfc->view_dispatcher, index);
}

void nfc_scene_topaz_menu_on_enter(void* context) {
Nfc* nfc = context;
Submenu* submenu = nfc->submenu;

submenu_add_item(
submenu, "Save", SubmenuIndexSave, nfc_scene_topaz_menu_submenu_callback, nfc);
submenu_add_item(
submenu, "Info", SubmenuIndexInfo, nfc_scene_topaz_menu_submenu_callback, nfc);

submenu_set_selected_item(
nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneTopazMenu));

view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu);
}

bool nfc_scene_topaz_menu_on_event(void* context, SceneManagerEvent event) {
Nfc* nfc = context;
bool consumed = false;

if(event.type == SceneManagerEventTypeCustom) {
if(event.event == SubmenuIndexSave) {
nfc->dev->format = NfcDeviceSaveFormatTopaz;
// Clear device name
nfc_device_set_name(nfc->dev, "");
scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName);
consumed = true;
} else if(event.event == SubmenuIndexInfo) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcDataInfo);
consumed = true;
}
scene_manager_set_scene_state(nfc->scene_manager, NfcSceneTopazMenu, event.event);

} else if(event.type == SceneManagerEventTypeBack) {
consumed = scene_manager_previous_scene(nfc->scene_manager);
}

return consumed;
}

void nfc_scene_topaz_menu_on_exit(void* context) {
Nfc* nfc = context;

// Clear view
submenu_reset(nfc->submenu);
}
73 changes: 73 additions & 0 deletions applications/main/nfc/scenes/nfc_scene_topaz_read_success.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#include "../nfc_i.h"

void nfc_scene_topaz_read_success_widget_callback(
GuiButtonType result,
InputType type,
void* context) {
Nfc* nfc = context;

if(type == InputTypeShort) {
view_dispatcher_send_custom_event(nfc->view_dispatcher, result);
}
}

void nfc_scene_topaz_read_success_on_enter(void* context) {
Nfc* nfc = context;

// Setup widget view
FuriHalNfcDevData* data = &nfc->dev->dev_data.nfc_data;
TopazData* topaz_data = &nfc->dev->dev_data.topaz_data;
Widget* widget = nfc->widget;
widget_add_button_element(
widget, GuiButtonTypeLeft, "Retry", nfc_scene_topaz_read_success_widget_callback, nfc);
widget_add_button_element(
widget, GuiButtonTypeRight, "More", nfc_scene_topaz_read_success_widget_callback, nfc);

FuriString* temp_str = NULL;
if(furi_string_size(nfc->dev->dev_data.parsed_data)) {
temp_str = furi_string_alloc_set(nfc->dev->dev_data.parsed_data);
} else {
temp_str = furi_string_alloc_printf("\e#%s\n", nfc_topaz_type(topaz_data->type));
furi_string_cat_printf(temp_str, "UID:");
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, "\nHR0: %02X\nHR1: %02X", topaz_data->hr[0], topaz_data->hr[1]);
}
widget_add_text_scroll_element(widget, 0, 0, 128, 52, furi_string_get_cstr(temp_str));
furi_string_free(temp_str);

notification_message_block(nfc->notifications, &sequence_set_green_255);

view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget);
}

bool nfc_scene_topaz_read_success_on_event(void* context, SceneManagerEvent event) {
Nfc* nfc = context;
bool consumed = false;

if(event.type == SceneManagerEventTypeCustom) {
if(event.event == GuiButtonTypeLeft) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneRetryConfirm);
consumed = true;
} else if(event.event == GuiButtonTypeRight) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneTopazMenu);
consumed = true;
}
} else if(event.type == SceneManagerEventTypeBack) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneExitConfirm);
consumed = true;
}

return consumed;
}

void nfc_scene_topaz_read_success_on_exit(void* context) {
Nfc* nfc = context;

notification_message_block(nfc->notifications, &sequence_reset_green);

// Clean view
widget_reset(nfc->widget);
}
6 changes: 5 additions & 1 deletion firmware/targets/f7/api_symbols.csv
Original file line number Diff line number Diff line change
Expand Up @@ -1220,7 +1220,7 @@ Function,+,furi_hal_mpu_protect_no_access,void,"FuriHalMpuRegion, uint32_t, Furi
Function,+,furi_hal_mpu_protect_read_only,void,"FuriHalMpuRegion, uint32_t, FuriHalMPURegionSize"
Function,+,furi_hal_nfc_activate_nfca,_Bool,"uint32_t, uint32_t*"
Function,-,furi_hal_nfc_deinit,void,
Function,+,furi_hal_nfc_detect,_Bool,"FuriHalNfcDevData*, uint32_t"
Function,+,furi_hal_nfc_detect,_Bool,"FuriHalNfcDevData*, uint32_t, _Bool"
Function,+,furi_hal_nfc_emulate_nfca,_Bool,"uint8_t*, uint8_t, uint8_t*, uint8_t, FuriHalNfcEmulateCallback, void*, uint32_t"
Function,+,furi_hal_nfc_exit_sleep,void,
Function,+,furi_hal_nfc_field_off,void,
Expand Down Expand Up @@ -2845,6 +2845,10 @@ Function,-,toascii,int,int
Function,-,toascii_l,int,"int, locale_t"
Function,-,tolower,int,int
Function,-,tolower_l,int,"int, locale_t"
Function,-,topaz_check_card_type,_Bool,"uint8_t, uint8_t"
Function,-,topaz_get_size_by_type,size_t,TopazType
Function,-,topaz_get_type_from_hr0,TopazType,uint8_t
Function,-,topaz_read_card,_Bool,"FuriHalNfcTxRxContext*, TopazData*, uint8_t*"
Function,-,toupper,int,int
Function,-,toupper_l,int,"int, locale_t"
Function,-,trunc,double,double
Expand Down
6 changes: 3 additions & 3 deletions firmware/targets/f7/furi_hal/furi_hal_nfc.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ void furi_hal_nfc_exit_sleep() {
rfalLowPowerModeStop();
}

bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout) {
bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout, bool emv_compliance) {
furi_assert(nfc_data);

rfalNfcDevice* dev_list = NULL;
Expand All @@ -90,7 +90,7 @@ bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout) {
rfalNfcInitialize();
}
rfalNfcDiscoverParam params;
params.compMode = RFAL_COMPLIANCE_MODE_EMV;
params.compMode = emv_compliance ? RFAL_COMPLIANCE_MODE_EMV : RFAL_COMPLIANCE_MODE_NFC;
params.techs2Find = RFAL_NFC_POLL_TECH_A | RFAL_NFC_POLL_TECH_B | RFAL_NFC_POLL_TECH_F |
RFAL_NFC_POLL_TECH_V | RFAL_NFC_POLL_TECH_AP2P | RFAL_NFC_POLL_TECH_ST25TB;
params.totalDuration = 1000;
Expand Down Expand Up @@ -124,7 +124,7 @@ bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout) {
rfalNfcSelect(0);
}
if(DWT->CYCCNT - start > timeout * clocks_in_ms) {
rfalNfcDeactivate(true);
rfalNfcDeactivate(false);
FURI_LOG_T(TAG, "Timeout");
break;
}
Expand Down
11 changes: 5 additions & 6 deletions firmware/targets/f7/furi_hal/furi_hal_nfc.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,16 +135,15 @@ void furi_hal_nfc_stop_cmd();
*/
void furi_hal_nfc_exit_sleep();

/** NFC poll
/** NFC detect
*
* @param dev_list pointer to rfalNfcDevice buffer
* @param dev_cnt pointer device count
* @param timeout timeout in ms
* @param deactivate deactivate flag
* @param nfc_data pointer to FuriHalNfcDevData
* @param timeout timeout in ms
* @param emv_compliance whether to use EMVCo compliance mode
*
* @return true on success
*/
bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout);
bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout, bool emv_compliance);

/** Activate NFC-A tag
*
Expand Down
3 changes: 2 additions & 1 deletion lib/ST25RFAL002/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,8 @@ void rfal_platform_spi_release();
#define platformI2CSlaveAddrWR(add) /*!< I2C Slave address for Write operation */
#define platformI2CSlaveAddrRD(add) /*!< I2C Slave address for Read operation */

#define platformLog(...) /*!< Log method */
#define platformLog(...) \
FURI_LOG_D("ST25RFAL002", __VA_ARGS__) /*!< Log method */

/*
******************************************************************************
Expand Down
Loading