Skip to content

Commit 14a4e0b

Browse files
committed
Merge branch 'save_as_legacy' into 'main'
Save as legacy See merge request bettse/picopass!1
2 parents c6581be + 60d2c64 commit 14a4e0b

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

picopass_device.c

+16-4
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ static bool picopass_device_save_file(
193193
furi_string_printf(temp_str, "%s/%s%s", folder, dev_name, extension);
194194
}
195195

196-
if(dev->format == PicopassDeviceSaveFormatHF ||
196+
if(dev->format == PicopassDeviceSaveFormatOriginal ||
197+
dev->format == PicopassDeviceSaveFormatLegacy ||
197198
dev->format == PicopassDeviceSaveFormatPartial) {
198199
// Open file
199200
if(!flipper_format_file_open_always(file, furi_string_get_cstr(temp_str))) break;
@@ -215,6 +216,12 @@ static bool picopass_device_save_file(
215216
for(size_t i = 0; i < app_limit; i++) {
216217
furi_string_printf(temp_str, "Block %d", i);
217218
if(card_data[i].valid) {
219+
if(dev->format == PicopassDeviceSaveFormatLegacy) {
220+
if(i == PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX) {
221+
card_data[i].data[0] = 0x03;
222+
}
223+
}
224+
218225
if(!flipper_format_write_hex(
219226
file,
220227
furi_string_get_cstr(temp_str),
@@ -249,7 +256,7 @@ static bool picopass_device_save_file(
249256
}
250257

251258
bool picopass_device_save(PicopassDevice* dev, const char* dev_name) {
252-
if(dev->format == PicopassDeviceSaveFormatHF) {
259+
if(dev->format == PicopassDeviceSaveFormatOriginal) {
253260
return picopass_device_save_file(
254261
dev, dev_name, STORAGE_APP_DATA_PATH_PREFIX, PICOPASS_APP_EXTENSION, true);
255262
} else if(dev->format == PicopassDeviceSaveFormatLF) {
@@ -260,6 +267,11 @@ bool picopass_device_save(PicopassDevice* dev, const char* dev_name) {
260267
} else if(dev->format == PicopassDeviceSaveFormatPartial) {
261268
return picopass_device_save_file(
262269
dev, dev_name, STORAGE_APP_DATA_PATH_PREFIX, PICOPASS_APP_EXTENSION, true);
270+
} else if(dev->format == PicopassDeviceSaveFormatLegacy) {
271+
return picopass_device_save_file(
272+
dev, dev_name, STORAGE_APP_DATA_PATH_PREFIX, PICOPASS_APP_EXTENSION, true);
273+
} else {
274+
FURI_LOG_E(TAG, "Unknown format");
263275
}
264276

265277
return false;
@@ -382,7 +394,7 @@ void picopass_device_clear(PicopassDevice* dev) {
382394

383395
picopass_device_data_clear(&dev->dev_data);
384396
memset(&dev->dev_data, 0, sizeof(dev->dev_data));
385-
dev->format = PicopassDeviceSaveFormatHF;
397+
dev->format = PicopassDeviceSaveFormatOriginal;
386398
furi_string_reset(dev->load_path);
387399
}
388400

@@ -441,7 +453,7 @@ void picopass_device_data_clear(PicopassDeviceData* dev_data) {
441453

442454
bool picopass_device_delete(PicopassDevice* dev, bool use_load_path) {
443455
furi_assert(dev);
444-
if(dev->format != PicopassDeviceSaveFormatHF) {
456+
if(dev->format != PicopassDeviceSaveFormatOriginal) {
445457
// Never delete other formats (LF, Seader, etc)
446458
return false;
447459
}

picopass_device.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ typedef enum {
6868
} PicopassEncryption;
6969

7070
typedef enum {
71-
PicopassDeviceSaveFormatHF,
71+
PicopassDeviceSaveFormatOriginal,
72+
PicopassDeviceSaveFormatLegacy,
7273
PicopassDeviceSaveFormatLF,
7374
PicopassDeviceSaveFormatSeader,
7475
PicopassDeviceSaveFormatPartial,

scenes/picopass_scene_card_menu.c

+19-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ enum SubmenuIndex {
99
SubmenuIndexWrite,
1010
SubmenuIndexEmulate,
1111
SubmenuIndexSavePartial,
12+
SubmenuIndexSaveLegacy,
1213
};
1314

1415
void picopass_scene_card_menu_submenu_callback(void* context, uint32_t index) {
@@ -27,7 +28,8 @@ void picopass_scene_card_menu_on_enter(void* context) {
2728

2829
bool SE = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].valid &&
2930
0x30 == card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0];
30-
bool SR = card_data[10].valid && 0x30 == card_data[10].data[0];
31+
bool SR = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0] == 0xA3 &&
32+
card_data[10].valid && 0x30 == card_data[10].data[0];
3133
bool has_sio = SE || SR;
3234
bool secured = (card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[7] & PICOPASS_FUSE_CRYPT10) !=
3335
PICOPASS_FUSE_CRYPT0;
@@ -62,6 +64,15 @@ void picopass_scene_card_menu_on_enter(void* context) {
6264
picopass_scene_card_menu_submenu_callback,
6365
picopass);
6466

67+
if(SR) {
68+
submenu_add_item(
69+
submenu,
70+
"Save as Legacy",
71+
SubmenuIndexSaveLegacy,
72+
picopass_scene_card_menu_submenu_callback,
73+
picopass);
74+
}
75+
6576
if(plugin) {
6677
// Convert from byte array to uint64_t
6778
uint64_t credential = 0;
@@ -119,7 +130,7 @@ bool picopass_scene_card_menu_on_event(void* context, SceneManagerEvent event) {
119130
scene_manager_set_scene_state(
120131
picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexSave);
121132
scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName);
122-
picopass->dev->format = PicopassDeviceSaveFormatHF;
133+
picopass->dev->format = PicopassDeviceSaveFormatOriginal;
123134
consumed = true;
124135
} else if(event.event == SubmenuIndexSavePartial) {
125136
scene_manager_set_scene_state(
@@ -155,6 +166,12 @@ bool picopass_scene_card_menu_on_event(void* context, SceneManagerEvent event) {
155166
picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexParse);
156167
scene_manager_next_scene(picopass->scene_manager, PicopassSceneFormats);
157168
consumed = true;
169+
} else if(event.event == SubmenuIndexSaveLegacy) {
170+
scene_manager_set_scene_state(
171+
picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexSaveLegacy);
172+
picopass->dev->format = PicopassDeviceSaveFormatLegacy;
173+
scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName);
174+
consumed = true;
158175
}
159176
} else if(event.type == SceneManagerEventTypeBack) {
160177
consumed = scene_manager_search_and_switch_to_previous_scene(

0 commit comments

Comments
 (0)