Skip to content

Commit

Permalink
nfc: Enable MFUL sync poller to be provided with passwords
Browse files Browse the repository at this point in the history
  • Loading branch information
GMMan committed Dec 30, 2024
1 parent 5fb9558 commit 123c345
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 15 deletions.
8 changes: 4 additions & 4 deletions applications/debug/unit_tests/tests/nfc/nfc_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ static void mf_ultralight_reader_test(const char* path) {
nfc_listener_start(mfu_listener, NULL, NULL);

MfUltralightData* mfu_data = mf_ultralight_alloc();
MfUltralightError error = mf_ultralight_poller_sync_read_card(poller, mfu_data);
MfUltralightError error = mf_ultralight_poller_sync_read_card(poller, mfu_data, NULL);
mu_assert(error == MfUltralightErrorNone, "mf_ultralight_poller_sync_read_card() failed");

nfc_listener_stop(mfu_listener);
Expand Down Expand Up @@ -315,7 +315,7 @@ MU_TEST(ntag_213_locked_reader) {
nfc_listener_start(mfu_listener, NULL, NULL);

MfUltralightData* mfu_data = mf_ultralight_alloc();
MfUltralightError error = mf_ultralight_poller_sync_read_card(poller, mfu_data);
MfUltralightError error = mf_ultralight_poller_sync_read_card(poller, mfu_data, NULL);
mu_assert(error == MfUltralightErrorNone, "mf_ultralight_poller_sync_read_card() failed");

nfc_listener_stop(mfu_listener);
Expand Down Expand Up @@ -353,7 +353,7 @@ static void mf_ultralight_write(void) {
MfUltralightData* mfu_data = mf_ultralight_alloc();

// Initial read
MfUltralightError error = mf_ultralight_poller_sync_read_card(poller, mfu_data);
MfUltralightError error = mf_ultralight_poller_sync_read_card(poller, mfu_data, NULL);
mu_assert(error == MfUltralightErrorNone, "mf_ultralight_poller_sync_read_card() failed");

mu_assert(
Expand All @@ -371,7 +371,7 @@ static void mf_ultralight_write(void) {
}

// Verification read
error = mf_ultralight_poller_sync_read_card(poller, mfu_data);
error = mf_ultralight_poller_sync_read_card(poller, mfu_data, NULL);
mu_assert(error == MfUltralightErrorNone, "mf_ultralight_poller_sync_read_card() failed");

nfc_listener_stop(mfu_listener);
Expand Down
24 changes: 17 additions & 7 deletions lib/nfc/protocols/mf_ultralight/mf_ultralight_poller_sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ typedef struct {
FuriThreadId thread_id;
MfUltralightError error;
MfUltralightPollerContextData data;
const MfUltralightPollerAuthContext* auth_context;
} MfUltralightPollerContext;

typedef MfUltralightError (*MfUltralightPollerCmdHandler)(
Expand Down Expand Up @@ -250,12 +251,17 @@ static NfcCommand mf_ultralight_poller_read_callback(NfcGenericEvent event, void
poller_context->error = mfu_event->data->error;
command = NfcCommandStop;
} else if(mfu_event->type == MfUltralightPollerEventTypeAuthRequest) {
mfu_event->data->auth_context.skip_auth = true;
if(mf_ultralight_support_feature(
mfu_poller->feature_set, MfUltralightFeatureSupportAuthenticate)) {
mfu_event->data->auth_context.skip_auth = false;
memset(
mfu_poller->auth_context.tdes_key.data, 0x00, MF_ULTRALIGHT_C_AUTH_DES_KEY_SIZE);
if(poller_context->auth_context != NULL) {
mfu_event->data->auth_context = *poller_context->auth_context;
} else {
mfu_event->data->auth_context.skip_auth = true;
if(mfu_poller->data->type == MfUltralightTypeMfulC) {
mfu_event->data->auth_context.skip_auth = false;
memset(
mfu_poller->auth_context.tdes_key.data,
0x00,
MF_ULTRALIGHT_C_AUTH_DES_KEY_SIZE);
}
}
}

Expand All @@ -266,13 +272,17 @@ static NfcCommand mf_ultralight_poller_read_callback(NfcGenericEvent event, void
return command;
}

MfUltralightError mf_ultralight_poller_sync_read_card(Nfc* nfc, MfUltralightData* data) {
MfUltralightError mf_ultralight_poller_sync_read_card(
Nfc* nfc,
MfUltralightData* data,
const MfUltralightPollerAuthContext* auth_context) {
furi_check(nfc);
furi_check(data);

MfUltralightPollerContext poller_context = {};
poller_context.thread_id = furi_thread_get_current_id();
poller_context.data.data = mf_ultralight_alloc();
poller_context.auth_context = auth_context;

NfcPoller* poller = nfc_poller_alloc(nfc, NfcProtocolMfUltralight);
nfc_poller_start(poller, mf_ultralight_poller_read_callback, &poller_context);
Expand Down
6 changes: 5 additions & 1 deletion lib/nfc/protocols/mf_ultralight/mf_ultralight_poller_sync.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include "mf_ultralight.h"
#include "mf_ultralight_poller.h"
#include <nfc/nfc.h>

#ifdef __cplusplus
Expand All @@ -27,7 +28,10 @@ MfUltralightError mf_ultralight_poller_sync_read_tearing_flag(
uint8_t flag_num,
MfUltralightTearingFlag* data);

MfUltralightError mf_ultralight_poller_sync_read_card(Nfc* nfc, MfUltralightData* data);
MfUltralightError mf_ultralight_poller_sync_read_card(
Nfc* nfc,
MfUltralightData* data,
const MfUltralightPollerAuthContext* auth_context);

#ifdef __cplusplus
}
Expand Down
6 changes: 3 additions & 3 deletions targets/f7/api_symbols.csv
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
entry,status,name,type,params
Version,+,79.2,,
Version,+,80.0,,
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
Expand Down Expand Up @@ -2656,7 +2656,7 @@ Function,+,mf_ultralight_poller_read_page_from_sector,MfUltralightError,"MfUltra
Function,+,mf_ultralight_poller_read_signature,MfUltralightError,"MfUltralightPoller*, MfUltralightSignature*"
Function,+,mf_ultralight_poller_read_tearing_flag,MfUltralightError,"MfUltralightPoller*, uint8_t, MfUltralightTearingFlag*"
Function,+,mf_ultralight_poller_read_version,MfUltralightError,"MfUltralightPoller*, MfUltralightVersion*"
Function,+,mf_ultralight_poller_sync_read_card,MfUltralightError,"Nfc*, MfUltralightData*"
Function,+,mf_ultralight_poller_sync_read_card,MfUltralightError,"Nfc*, MfUltralightData*, const MfUltralightPollerAuthContext*"
Function,+,mf_ultralight_poller_sync_read_counter,MfUltralightError,"Nfc*, uint8_t, MfUltralightCounter*"
Function,+,mf_ultralight_poller_sync_read_page,MfUltralightError,"Nfc*, uint16_t, MfUltralightPage*"
Function,+,mf_ultralight_poller_sync_read_signature,MfUltralightError,"Nfc*, MfUltralightSignature*"
Expand Down Expand Up @@ -2938,9 +2938,9 @@ Function,+,pipe_install_as_stdio,void,PipeSide*
Function,+,pipe_receive,size_t,"PipeSide*, void*, size_t, FuriWait"
Function,+,pipe_role,PipeRole,PipeSide*
Function,+,pipe_send,size_t,"PipeSide*, const void*, size_t, FuriWait"
Function,+,pipe_set_broken_callback,void,"PipeSide*, PipeSideBrokenCallback, FuriEventLoopEvent"
Function,+,pipe_set_callback_context,void,"PipeSide*, void*"
Function,+,pipe_set_data_arrived_callback,void,"PipeSide*, PipeSideDataArrivedCallback, FuriEventLoopEvent"
Function,+,pipe_set_broken_callback,void,"PipeSide*, PipeSideBrokenCallback, FuriEventLoopEvent"
Function,+,pipe_set_space_freed_callback,void,"PipeSide*, PipeSideSpaceFreedCallback, FuriEventLoopEvent"
Function,+,pipe_spaces_available,size_t,PipeSide*
Function,+,pipe_state,PipeState,PipeSide*
Expand Down

0 comments on commit 123c345

Please sign in to comment.