NFC App: Add manual MF Classic custom UID

This commit is contained in:
gid9798
2023-08-08 14:16:35 +03:00
parent 20a6aa078c
commit 8936c02487
7 changed files with 170 additions and 7 deletions

View File

@@ -15,3 +15,10 @@ enum NfcCustomEvent {
NfcCustomEventUpdateLog, NfcCustomEventUpdateLog,
NfcCustomEventSaveShadow, NfcCustomEventSaveShadow,
}; };
enum NfcSceneSetUidState {
NfcSceneSetUidStateNotSet,
NfcSceneSetUidStateMFClassic1k,
NfcSceneSetUidStateMFClassic4k,
NfcSceneSetUidStateMFClassicMini,
};

View File

@@ -67,6 +67,9 @@ bool nfc_scene_save_name_on_event(void* context, SceneManagerEvent event) {
if(!scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) { if(!scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) {
// Nothing, do not count editing as saving // Nothing, do not count editing as saving
} else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSetType)) { } else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSetType)) {
scene_manager_set_scene_state(
nfc->scene_manager, NfcSceneSetUid, NfcSceneSetUidStateNotSet);
dolphin_deed(DolphinDeedNfcAddSave); dolphin_deed(DolphinDeedNfcAddSave);
} else { } else {
dolphin_deed(DolphinDeedNfcSave); dolphin_deed(DolphinDeedNfcSave);

View File

@@ -4,9 +4,19 @@
enum SubmenuIndex { enum SubmenuIndex {
SubmenuIndexNFCA4, SubmenuIndexNFCA4,
SubmenuIndexNFCA7, SubmenuIndexNFCA7,
SubmenuIndexMFC1k4Uid,
SubmenuIndexMFC4k4Uid,
SubmenuIndexMFC1k7Uid,
SubmenuIndexMFC4k7Uid,
SubmenuIndexMFCMini,
SubmenuIndexGeneratorsStart, SubmenuIndexGeneratorsStart,
}; };
static const NfcGenerator ganeator_gag = {
.name = "Mifare Classic Custom UID",
.generator_func = NULL,
};
void nfc_scene_set_type_submenu_callback(void* context, uint32_t index) { void nfc_scene_set_type_submenu_callback(void* context, uint32_t index) {
Nfc* nfc = context; Nfc* nfc = context;
@@ -23,6 +33,36 @@ void nfc_scene_set_type_on_enter(void* context) {
submenu, "NFC-A 7-bytes UID", SubmenuIndexNFCA7, nfc_scene_set_type_submenu_callback, nfc); submenu, "NFC-A 7-bytes UID", SubmenuIndexNFCA7, nfc_scene_set_type_submenu_callback, nfc);
submenu_add_item( submenu_add_item(
submenu, "NFC-A 4-bytes UID", SubmenuIndexNFCA4, nfc_scene_set_type_submenu_callback, nfc); submenu, "NFC-A 4-bytes UID", SubmenuIndexNFCA4, nfc_scene_set_type_submenu_callback, nfc);
submenu_add_item(
submenu,
"MFClassic1k4b Custom uid",
SubmenuIndexMFC1k4Uid,
nfc_scene_set_type_submenu_callback,
nfc);
submenu_add_item(
submenu,
"MFClassic4k4b Custom uid",
SubmenuIndexMFC4k4Uid,
nfc_scene_set_type_submenu_callback,
nfc);
submenu_add_item(
submenu,
"MFClassic1k7b Custom uid",
SubmenuIndexMFC1k7Uid,
nfc_scene_set_type_submenu_callback,
nfc);
submenu_add_item(
submenu,
"MFClassic4k7b Custom uid ",
SubmenuIndexMFC4k7Uid,
nfc_scene_set_type_submenu_callback,
nfc);
submenu_add_item(
submenu,
"MFClassic Mini Custom uid ",
SubmenuIndexMFCMini,
nfc_scene_set_type_submenu_callback,
nfc);
// Generators // Generators
int i = SubmenuIndexGeneratorsStart; int i = SubmenuIndexGeneratorsStart;
@@ -49,6 +89,46 @@ bool nfc_scene_set_type_on_event(void* context, SceneManagerEvent event) {
nfc->dev->format = NfcDeviceSaveFormatUid; nfc->dev->format = NfcDeviceSaveFormatUid;
scene_manager_next_scene(nfc->scene_manager, NfcSceneSetSak); scene_manager_next_scene(nfc->scene_manager, NfcSceneSetSak);
consumed = true; consumed = true;
} else if(event.event == SubmenuIndexMFC1k4Uid) {
nfc->dev->dev_data.nfc_data.uid_len = 4;
nfc->dev->format = NfcDeviceSaveFormatMifareClassic;
nfc->generator = &ganeator_gag;
scene_manager_set_scene_state(
nfc->scene_manager, NfcSceneSetUid, NfcSceneSetUidStateMFClassic1k);
scene_manager_next_scene(nfc->scene_manager, NfcSceneSetUid);
consumed = true;
} else if(event.event == SubmenuIndexMFC1k7Uid) {
nfc->dev->dev_data.nfc_data.uid_len = 7;
nfc->dev->format = NfcDeviceSaveFormatMifareClassic;
nfc->generator = &ganeator_gag;
scene_manager_set_scene_state(
nfc->scene_manager, NfcSceneSetUid, NfcSceneSetUidStateMFClassic1k);
scene_manager_next_scene(nfc->scene_manager, NfcSceneSetUid);
consumed = true;
} else if(event.event == SubmenuIndexMFC4k4Uid) {
nfc->dev->dev_data.nfc_data.uid_len = 4;
nfc->dev->format = NfcDeviceSaveFormatMifareClassic;
nfc->generator = &ganeator_gag;
scene_manager_set_scene_state(
nfc->scene_manager, NfcSceneSetUid, NfcSceneSetUidStateMFClassic4k);
scene_manager_next_scene(nfc->scene_manager, NfcSceneSetUid);
consumed = true;
} else if(event.event == SubmenuIndexMFC4k7Uid) {
nfc->dev->dev_data.nfc_data.uid_len = 7;
nfc->dev->format = NfcDeviceSaveFormatMifareClassic;
nfc->generator = &ganeator_gag;
scene_manager_set_scene_state(
nfc->scene_manager, NfcSceneSetUid, NfcSceneSetUidStateMFClassic4k);
scene_manager_next_scene(nfc->scene_manager, NfcSceneSetUid);
consumed = true;
} else if(event.event == SubmenuIndexMFCMini) {
nfc->dev->dev_data.nfc_data.uid_len = 4;
nfc->dev->format = NfcDeviceSaveFormatMifareClassic;
nfc->generator = &ganeator_gag;
scene_manager_set_scene_state(
nfc->scene_manager, NfcSceneSetUid, NfcSceneSetUidStateMFClassicMini);
scene_manager_next_scene(nfc->scene_manager, NfcSceneSetUid);
consumed = true;
} else { } else {
nfc_device_clear(nfc->dev); nfc_device_clear(nfc->dev);
nfc->generator = nfc_generators[event.event - SubmenuIndexGeneratorsStart]; nfc->generator = nfc_generators[event.event - SubmenuIndexGeneratorsStart];

View File

@@ -27,7 +27,10 @@ bool nfc_scene_set_uid_on_event(void* context, SceneManagerEvent event) {
Nfc* nfc = (Nfc*)context; Nfc* nfc = (Nfc*)context;
bool consumed = false; bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) { if(event.type == SceneManagerEventTypeBack) {
scene_manager_set_scene_state(
nfc->scene_manager, NfcSceneSetUid, NfcSceneSetUidStateNotSet);
} else if(event.type == SceneManagerEventTypeCustom) {
if(event.event == NfcCustomEventByteInputDone) { if(event.event == NfcCustomEventByteInputDone) {
if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) { if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) {
nfc->dev->dev_data.nfc_data = nfc->dev_edit_data; nfc->dev->dev_data.nfc_data = nfc->dev_edit_data;
@@ -36,8 +39,49 @@ bool nfc_scene_set_uid_on_event(void* context, SceneManagerEvent event) {
consumed = true; consumed = true;
} }
} else { } else {
scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName); switch(scene_manager_get_scene_state(nfc->scene_manager, NfcSceneSetUid)) {
consumed = true; case NfcSceneSetUidStateMFClassic1k:
nfc_generate_mf_classic_ext(
&nfc->dev->dev_data,
nfc->dev_edit_data.uid_len,
MfClassicType1k,
false,
nfc->dev_edit_data.uid);
scene_manager_next_scene(nfc->scene_manager, NfcSceneGenerateInfo);
consumed = true;
break;
case NfcSceneSetUidStateMFClassic4k:
nfc_generate_mf_classic_ext(
&nfc->dev->dev_data,
nfc->dev_edit_data.uid_len,
MfClassicType4k,
false,
nfc->dev_edit_data.uid);
scene_manager_next_scene(nfc->scene_manager, NfcSceneGenerateInfo);
consumed = true;
break;
case NfcSceneSetUidStateMFClassicMini:
nfc_generate_mf_classic_ext(
&nfc->dev->dev_data,
nfc->dev_edit_data.uid_len,
MfClassicTypeMini,
false,
nfc->dev_edit_data.uid);
scene_manager_next_scene(nfc->scene_manager, NfcSceneGenerateInfo);
consumed = true;
break;
case NfcSceneSetUidStateNotSet:
scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName);
consumed = true;
break;
default:
furi_crash("Nfc unknown type");
break;
}
} }
} }
} }

View File

@@ -2138,6 +2138,7 @@ Function,+,nfc_device_set_loading_callback,void,"NfcDevice*, NfcLoadingCallback,
Function,+,nfc_device_set_name,void,"NfcDevice*, const char*" Function,+,nfc_device_set_name,void,"NfcDevice*, const char*"
Function,+,nfc_file_select,_Bool,NfcDevice* Function,+,nfc_file_select,_Bool,NfcDevice*
Function,-,nfc_generate_mf_classic,void,"NfcDeviceData*, uint8_t, MfClassicType" Function,-,nfc_generate_mf_classic,void,"NfcDeviceData*, uint8_t, MfClassicType"
Function,+,nfc_generate_mf_classic_ext,void,"NfcDeviceData*, uint8_t, MfClassicType, _Bool, uint8_t*"
Function,+,nfc_get_dev_type,const char*,FuriHalNfcType Function,+,nfc_get_dev_type,const char*,FuriHalNfcType
Function,-,nfc_guess_protocol,const char*,NfcProtocol Function,-,nfc_guess_protocol,const char*,NfcProtocol
Function,+,nfc_mf_classic_type,const char*,MfClassicType Function,+,nfc_mf_classic_type,const char*,MfClassicType
1 entry status name type params
2138 Function + nfc_device_set_name void NfcDevice*, const char*
2139 Function + nfc_file_select _Bool NfcDevice*
2140 Function - nfc_generate_mf_classic void NfcDeviceData*, uint8_t, MfClassicType
2141 Function + nfc_generate_mf_classic_ext void NfcDeviceData*, uint8_t, MfClassicType, _Bool, uint8_t*
2142 Function + nfc_get_dev_type const char* FuriHalNfcType
2143 Function - nfc_guess_protocol const char* NfcProtocol
2144 Function + nfc_mf_classic_type const char* MfClassicType

View File

@@ -333,14 +333,22 @@ static void nfc_generate_ntag_i2c_plus_2k(NfcDeviceData* data) {
mful->version.storage_size = 0x15; mful->version.storage_size = 0x15;
} }
void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType type) { void nfc_generate_mf_classic_ext(
NfcDeviceData* data,
uint8_t uid_len,
MfClassicType type,
bool random_uid,
uint8_t* uid) {
nfc_generate_common_start(data); nfc_generate_common_start(data);
nfc_generate_mf_classic_uid(data->mf_classic_data.block[0].value, uid_len); if(random_uid) {
nfc_generate_mf_classic_uid(data->mf_classic_data.block[0].value, uid_len);
} else {
memcpy(data->mf_classic_data.block[0].value, uid, uid_len);
}
nfc_generate_mf_classic_common(data, uid_len, type); nfc_generate_mf_classic_common(data, uid_len, type);
// Set the UID // Set the UID
data->nfc_data.uid[0] = NXP_MANUFACTURER_ID; for(int i = 0; i < uid_len; i++) {
for(int i = 1; i < uid_len; i++) {
data->nfc_data.uid[i] = data->mf_classic_data.block[0].value[i]; data->nfc_data.uid[i] = data->mf_classic_data.block[0].value[i];
} }
@@ -395,6 +403,11 @@ void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType
mfc->type = type; mfc->type = type;
} }
void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType type) {
uint8_t uid = 0;
nfc_generate_mf_classic_ext(data, uid_len, type, true, &uid);
}
static void nfc_generate_mf_mini(NfcDeviceData* data) { static void nfc_generate_mf_mini(NfcDeviceData* data) {
nfc_generate_mf_classic(data, 4, MfClassicTypeMini); nfc_generate_mf_classic(data, 4, MfClassicTypeMini);
} }

View File

@@ -2,6 +2,10 @@
#include "../nfc_device.h" #include "../nfc_device.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*NfcGeneratorFunc)(NfcDeviceData* data); typedef void (*NfcGeneratorFunc)(NfcDeviceData* data);
typedef struct { typedef struct {
@@ -12,3 +16,14 @@ typedef struct {
extern const NfcGenerator* const nfc_generators[]; extern const NfcGenerator* const nfc_generators[];
void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType type); void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType type);
void nfc_generate_mf_classic_ext(
NfcDeviceData* data,
uint8_t uid_len,
MfClassicType type,
bool random_uid,
uint8_t* uid);
#ifdef __cplusplus
}
#endif