|
@@ -4,6 +4,7 @@ enum SubmenuIndex {
|
|
|
SubmenuIndexSave,
|
|
SubmenuIndexSave,
|
|
|
SubmenuIndexSaveAsLF,
|
|
SubmenuIndexSaveAsLF,
|
|
|
SubmenuIndexSaveAsSeader,
|
|
SubmenuIndexSaveAsSeader,
|
|
|
|
|
+ SubmenuIndexParse,
|
|
|
SubmenuIndexChangeKey,
|
|
SubmenuIndexChangeKey,
|
|
|
SubmenuIndexWrite,
|
|
SubmenuIndexWrite,
|
|
|
SubmenuIndexEmulate,
|
|
SubmenuIndexEmulate,
|
|
@@ -22,6 +23,7 @@ void picopass_scene_card_menu_on_enter(void* context) {
|
|
|
PicopassPacs* pacs = &picopass->dev->dev_data.pacs;
|
|
PicopassPacs* pacs = &picopass->dev->dev_data.pacs;
|
|
|
PicopassBlock* card_data = picopass->dev->dev_data.card_data;
|
|
PicopassBlock* card_data = picopass->dev->dev_data.card_data;
|
|
|
PicopassDeviceAuthMethod auth = picopass->dev->dev_data.auth;
|
|
PicopassDeviceAuthMethod auth = picopass->dev->dev_data.auth;
|
|
|
|
|
+ PluginWiegand* plugin = picopass->plugin_wiegand;
|
|
|
|
|
|
|
|
bool SE = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].valid &&
|
|
bool SE = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].valid &&
|
|
|
0x30 == card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0];
|
|
0x30 == card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0];
|
|
@@ -59,6 +61,23 @@ void picopass_scene_card_menu_on_enter(void* context) {
|
|
|
SubmenuIndexSaveAsLF,
|
|
SubmenuIndexSaveAsLF,
|
|
|
picopass_scene_card_menu_submenu_callback,
|
|
picopass_scene_card_menu_submenu_callback,
|
|
|
picopass);
|
|
picopass);
|
|
|
|
|
+
|
|
|
|
|
+ if(plugin) {
|
|
|
|
|
+ // Convert from byte array to uint64_t
|
|
|
|
|
+ uint64_t credential = 0;
|
|
|
|
|
+ memcpy(&credential, pacs->credential, sizeof(uint64_t));
|
|
|
|
|
+ credential = __builtin_bswap64(credential);
|
|
|
|
|
+
|
|
|
|
|
+ size_t format_count = plugin->count(pacs->bitLength, credential);
|
|
|
|
|
+ if(format_count > 0) {
|
|
|
|
|
+ submenu_add_item(
|
|
|
|
|
+ submenu,
|
|
|
|
|
+ "Parse",
|
|
|
|
|
+ SubmenuIndexParse,
|
|
|
|
|
+ picopass_scene_card_menu_submenu_callback,
|
|
|
|
|
+ picopass);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(auth == PicopassDeviceAuthMethodNone || auth == PicopassDeviceAuthMethodKey) {
|
|
if(auth == PicopassDeviceAuthMethodNone || auth == PicopassDeviceAuthMethodKey) {
|
|
@@ -131,6 +150,11 @@ bool picopass_scene_card_menu_on_event(void* context, SceneManagerEvent event) {
|
|
|
picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexChangeKey);
|
|
picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexChangeKey);
|
|
|
scene_manager_next_scene(picopass->scene_manager, PicopassSceneKeyMenu);
|
|
scene_manager_next_scene(picopass->scene_manager, PicopassSceneKeyMenu);
|
|
|
consumed = true;
|
|
consumed = true;
|
|
|
|
|
+ } else if(event.event == SubmenuIndexParse) {
|
|
|
|
|
+ scene_manager_set_scene_state(
|
|
|
|
|
+ picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexParse);
|
|
|
|
|
+ scene_manager_next_scene(picopass->scene_manager, PicopassSceneFormats);
|
|
|
|
|
+ consumed = true;
|
|
|
}
|
|
}
|
|
|
} else if(event.type == SceneManagerEventTypeBack) {
|
|
} else if(event.type == SceneManagerEventTypeBack) {
|
|
|
consumed = scene_manager_search_and_switch_to_previous_scene(
|
|
consumed = scene_manager_search_and_switch_to_previous_scene(
|