Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wiegand parsing using a plugin #16

Merged
merged 11 commits into from
Apr 16, 2024
Merged
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
2 changes: 2 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -7,6 +7,8 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: 'true'
- name: Build with ufbt
uses: flipperdevices/flipperzero-ufbt-action@v0.1.2
id: build-app
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "plugin"]
path = plugin
url = https://gitlab.com/bettse/flipper-wiegand-plugin.git
9 changes: 9 additions & 0 deletions application.fam
Original file line number Diff line number Diff line change
@@ -14,6 +14,7 @@ App(
sources=[
"*.c",
"aeabi_uldivmod.sx",
"!plugin/*.c",
],
fap_icon="icons/logo.png",
fap_category="NFC",
@@ -39,3 +40,11 @@ App(
fap_weburl="https://seader.ericbetts.dev",
fap_icon_assets="icons",
)

App(
appid="plugin_wiegand",
apptype=FlipperAppType.PLUGIN,
entry_point="plugin_wiegand_ep",
requires=["seader"],
sources=["plugin/wiegand.c"],
)
1 change: 1 addition & 0 deletions plugin
Submodule plugin added at 435397
19 changes: 19 additions & 0 deletions scenes/seader_scene_card_menu.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "../seader_i.h"

enum SubmenuIndex {
SubmenuIndexParse,
SubmenuIndexSave,
SubmenuIndexSavePicopass,
SubmenuIndexSaveRFID,
@@ -17,8 +18,21 @@ void seader_scene_card_menu_submenu_callback(void* context, uint32_t index) {
void seader_scene_card_menu_on_enter(void* context) {
Seader* seader = context;
SeaderCredential* credential = seader->credential;
PluginWiegand* plugin = seader->plugin_wiegand;
Submenu* submenu = seader->submenu;

if(plugin) {
size_t format_count = plugin->count(credential->bit_length, credential->credential);
if(format_count > 0) {
submenu_add_item(
submenu,
"Parse",
SubmenuIndexParse,
seader_scene_card_menu_submenu_callback,
seader);
}
}

submenu_add_item(
submenu, "Save", SubmenuIndexSave, seader_scene_card_menu_submenu_callback, seader);
submenu_add_item(
@@ -85,6 +99,11 @@ bool seader_scene_card_menu_on_event(void* context, SceneManagerEvent event) {
seader->credential->save_format = SeaderCredentialSaveFormatMFC;
scene_manager_next_scene(seader->scene_manager, SeaderSceneSaveName);
consumed = true;
} else if(event.event == SubmenuIndexParse) {
scene_manager_set_scene_state(
seader->scene_manager, SeaderSceneCardMenu, SubmenuIndexParse);
scene_manager_next_scene(seader->scene_manager, SeaderSceneFormats);
consumed = true;
}
} else if(event.type == SceneManagerEventTypeBack) {
consumed = scene_manager_search_and_switch_to_previous_scene(
1 change: 1 addition & 0 deletions scenes/seader_scene_config.h
Original file line number Diff line number Diff line change
@@ -15,3 +15,4 @@ ADD_SCENE(seader, delete_success, DeleteSuccess)
ADD_SCENE(seader, credential_info, CredentialInfo)
ADD_SCENE(seader, sam_info, SamInfo)
ADD_SCENE(seader, virtual_credential, VirtualCredential)
ADD_SCENE(seader, formats, Formats)
47 changes: 47 additions & 0 deletions scenes/seader_scene_formats.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include "../seader_i.h"
#include <dolphin/dolphin.h>

void seader_scene_formats_on_enter(void* context) {
Seader* seader = context;
PluginWiegand* plugin = seader->plugin_wiegand;
SeaderCredential* credential = seader->credential;

FuriString* str = seader->text_box_store;
furi_string_reset(str);

if(plugin) {
FuriString* description = furi_string_alloc();
size_t format_count = plugin->count(credential->bit_length, credential->credential);
for(size_t i = 0; i < format_count; i++) {
plugin->description(credential->bit_length, credential->credential, i, description);

furi_string_cat_printf(str, "%s\n", furi_string_get_cstr(description));
}
furi_string_free(description);
}

text_box_set_font(seader->text_box, TextBoxFontHex);
text_box_set_text(seader->text_box, furi_string_get_cstr(seader->text_box_store));
view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewTextBox);
}

bool seader_scene_formats_on_event(void* context, SceneManagerEvent event) {
Seader* seader = context;
bool consumed = false;

if(event.type == SceneManagerEventTypeCustom) {
if(event.event == GuiButtonTypeLeft) {
consumed = scene_manager_previous_scene(seader->scene_manager);
}
} else if(event.type == SceneManagerEventTypeBack) {
consumed = scene_manager_previous_scene(seader->scene_manager);
}
return consumed;
}

void seader_scene_formats_on_exit(void* context) {
Seader* seader = context;

// Clear views
text_box_reset(seader->text_box);
}
34 changes: 34 additions & 0 deletions seader.c
Original file line number Diff line number Diff line change
@@ -80,11 +80,38 @@ Seader* seader_alloc() {
view_dispatcher_add_view(
seader->view_dispatcher, SeaderViewTextInput, text_input_get_view(seader->text_input));

// TextBox
seader->text_box = text_box_alloc();
view_dispatcher_add_view(
seader->view_dispatcher, SeaderViewTextBox, text_box_get_view(seader->text_box));
seader->text_box_store = furi_string_alloc();

// Custom Widget
seader->widget = widget_alloc();
view_dispatcher_add_view(
seader->view_dispatcher, SeaderViewWidget, widget_get_view(seader->widget));

seader->plugin_manager =
plugin_manager_alloc(PLUGIN_APP_ID, PLUGIN_API_VERSION, firmware_api_interface);

seader->plugin_wiegand = NULL;
if(plugin_manager_load_all(seader->plugin_manager, APP_DATA_PATH("plugins")) !=
PluginManagerErrorNone) {
FURI_LOG_E(TAG, "Failed to load all libs");
} else {
uint32_t plugin_count = plugin_manager_get_count(seader->plugin_manager);
FURI_LOG_I(TAG, "Loaded %lu plugin(s)", plugin_count);

for(uint32_t i = 0; i < plugin_count; i++) {
const PluginWiegand* plugin = plugin_manager_get_ep(seader->plugin_manager, i);
FURI_LOG_I(TAG, "plugin name: %s", plugin->name);
if(strcmp(plugin->name, "Plugin Wiegand") == 0) {
// Have to cast to drop "const" qualifier
seader->plugin_wiegand = (PluginWiegand*)plugin;
}
}
}

return seader;
}

@@ -122,6 +149,11 @@ void seader_free(Seader* seader) {
view_dispatcher_remove_view(seader->view_dispatcher, SeaderViewTextInput);
text_input_free(seader->text_input);

// TextBox
view_dispatcher_remove_view(seader->view_dispatcher, SeaderViewTextBox);
text_box_free(seader->text_box);
furi_string_free(seader->text_box_store);

// Custom Widget
view_dispatcher_remove_view(seader->view_dispatcher, SeaderViewWidget);
widget_free(seader->widget);
@@ -144,6 +176,8 @@ void seader_free(Seader* seader) {
furi_record_close(RECORD_NOTIFICATION);
seader->notifications = NULL;

plugin_manager_free(seader->plugin_manager);

free(seader);
}

11 changes: 11 additions & 0 deletions seader_i.h
Original file line number Diff line number Diff line change
@@ -18,6 +18,7 @@
#include <gui/modules/popup.h>
#include <gui/modules/loading.h>
#include <gui/modules/text_input.h>
#include <gui/modules/text_box.h>
#include <gui/modules/widget.h>

#include <input/input.h>
@@ -40,6 +41,11 @@
#include <Payload.h>
#include <FrameProtocol.h>

#include "plugin/interface.h"
#include <flipper_application/flipper_application.h>
#include <flipper_application/plugins/plugin_manager.h>
#include <loader/firmware_api/firmware_api.h>

#include "protocol/picopass_poller.h"
#include "scenes/seader_scene.h"

@@ -103,13 +109,17 @@ struct Seader {
Popup* popup;
Loading* loading;
TextInput* text_input;
TextBox* text_box;
Widget* widget;

Nfc* nfc;
NfcPoller* poller;
PicopassPoller* picopass_poller;

NfcDevice* nfc_device;

PluginManager* plugin_manager;
PluginWiegand* plugin_wiegand;
};

struct SeaderPollerContainer {
@@ -122,6 +132,7 @@ typedef enum {
SeaderViewPopup,
SeaderViewLoading,
SeaderViewTextInput,
SeaderViewTextBox,
SeaderViewWidget,
SeaderViewUart,
} SeaderView;

Unchanged files with check annotations Beta

BIT_STRING_t compact_a, compact_b;
const BIT_STRING_t *a = BIT_STRING__compactify(aptr, &compact_a);
const BIT_STRING_t *b = BIT_STRING__compactify(bptr, &compact_b);
const asn_OCTET_STRING_specifics_t *specs = td->specifics;

Check warning on line 268 in lib/asn1/BIT_STRING.c

GitHub Actions / ufbt: Build for release branch

unused variable 'specs' [-Wunused-variable]

Check warning on line 268 in lib/asn1/BIT_STRING.c

GitHub Actions / ufbt: Build for release branch

unused variable 'specs' [-Wunused-variable]
assert(specs && specs->subvariant == ASN_OSUBV_BIT);
break;
}
/* Copy the integer body */
for(bp = buf, pend1 += add; p != pend1; p += add)

Check warning on line 977 in lib/asn1/INTEGER.c

GitHub Actions / ufbt: Build for release branch

array subscript 0 is outside array bounds of 'intmax_t[1]' {aka 'long long int[1]'} [-Warray-bounds]

Check warning on line 977 in lib/asn1/INTEGER.c

GitHub Actions / ufbt: Build for release branch

array subscript 0 is outside array bounds of 'intmax_t[1]' {aka 'long long int[1]'} [-Warray-bounds]
*bp++ = *p;
if(st->buf) FREEMEM(st->buf);
int
OCTET_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr,
const void *bptr) {
const asn_OCTET_STRING_specifics_t *specs = td->specifics;

Check warning on line 1822 in lib/asn1/OCTET_STRING.c

GitHub Actions / ufbt: Build for release branch

unused variable 'specs' [-Wunused-variable]

Check warning on line 1822 in lib/asn1/OCTET_STRING.c

GitHub Actions / ufbt: Build for release branch

unused variable 'specs' [-Wunused-variable]
const OCTET_STRING_t *a = aptr;
const OCTET_STRING_t *b = bptr;
if(lb == rb) {
return lb;
} else {
const uintmax_t intmax_max = ((~(uintmax_t)0) >> 1);

Check warning on line 41 in lib/asn1/asn_random_fill.c

GitHub Actions / ufbt: Build for release branch

unused variable 'intmax_max' [-Wunused-variable]

Check warning on line 41 in lib/asn1/asn_random_fill.c

GitHub Actions / ufbt: Build for release branch

unused variable 'intmax_max' [-Wunused-variable]
uintmax_t range = asn__intmax_range(lb, rb);
uintmax_t value = 0;
uintmax_t got_entropy = 0;
asn_dec_rval_t tmprval;
void *memb_ptr; /* Pointer to the member */
void **memb_ptr2; /* Pointer to that pointer */
unsigned old_present;

Check warning on line 605 in lib/asn1/constr_CHOICE.c

GitHub Actions / ufbt: Build for release branch

variable 'old_present' set but not used [-Wunused-but-set-variable]

Check warning on line 605 in lib/asn1/constr_CHOICE.c

GitHub Actions / ufbt: Build for release branch

variable 'old_present' set but not used [-Wunused-but-set-variable]
elm = &td->elements[edx];