NFC: Allow choosing DESFire poller cmd mode, fix send_chunks() naming

This commit is contained in:
Willy-JL
2025-03-27 04:51:03 +00:00
parent 6ebc4c7ad3
commit d362cb51e3
5 changed files with 52 additions and 16 deletions

View File

@@ -3,6 +3,7 @@
#include "mf_desfire.h" #include "mf_desfire.h"
#include <lib/nfc/protocols/iso14443_4a/iso14443_4a_poller.h> #include <lib/nfc/protocols/iso14443_4a/iso14443_4a_poller.h>
#include <lib/nfc/helpers/nxp_native_command_mode.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@@ -38,6 +39,16 @@ typedef struct {
MfDesfirePollerEventData* data; /**< Pointer to event specific data. */ MfDesfirePollerEventData* data; /**< Pointer to event specific data. */
} MfDesfirePollerEvent; } MfDesfirePollerEvent;
/**
* @brief Change command mode used in poller mode.
*
* @param[in, out] instance pointer to the instance to affect.
* @param[in] command_mode command mode to use in further communication with the card.
*/
void mf_desfire_poller_set_command_mode(
MfDesfirePoller* instance,
NxpNativeCommandMode command_mode);
/** /**
* @brief Transmit and receive MfDesfire chunks in poller mode. * @brief Transmit and receive MfDesfire chunks in poller mode.
* *
@@ -51,11 +62,16 @@ typedef struct {
* @param[out] rx_buffer pointer to the buffer to be filled with received data. * @param[out] rx_buffer pointer to the buffer to be filled with received data.
* @return MfDesfireErrorNone on success, an error code on failure. * @return MfDesfireErrorNone on success, an error code on failure.
*/ */
MfDesfireError mf_desfire_send_chunks( MfDesfireError mf_desfire_poller_send_chunks(
MfDesfirePoller* instance, MfDesfirePoller* instance,
const BitBuffer* tx_buffer, const BitBuffer* tx_buffer,
BitBuffer* rx_buffer); BitBuffer* rx_buffer);
/**
* @warning deprecated, use mf_desfire_poller_send_chunks instead
*/
#define mf_desfire_send_chunks mf_desfire_poller_send_chunks
/** /**
* @brief Read MfDesfire card version. * @brief Read MfDesfire card version.
* *

View File

@@ -32,7 +32,17 @@ MfDesfireError mf_desfire_process_status_code(uint8_t status_code) {
} }
} }
MfDesfireError mf_desfire_send_chunks( void mf_desfire_poller_set_command_mode(
MfDesfirePoller* instance,
NxpNativeCommandMode command_mode) {
furi_check(instance);
furi_check(instance->state == MfDesfirePollerStateIdle);
furi_check(command_mode < NxpNativeCommandModeMAX);
instance->command_mode = command_mode;
}
MfDesfireError mf_desfire_poller_send_chunks(
MfDesfirePoller* instance, MfDesfirePoller* instance,
const BitBuffer* tx_buffer, const BitBuffer* tx_buffer,
BitBuffer* rx_buffer) { BitBuffer* rx_buffer) {
@@ -44,7 +54,7 @@ MfDesfireError mf_desfire_send_chunks(
&status_code, &status_code,
tx_buffer, tx_buffer,
rx_buffer, rx_buffer,
NxpNativeCommandModePlain, instance->command_mode,
instance->tx_buffer, instance->tx_buffer,
instance->rx_buffer); instance->rx_buffer);
@@ -64,7 +74,8 @@ MfDesfireError mf_desfire_poller_read_version(MfDesfirePoller* instance, MfDesfi
MfDesfireError error; MfDesfireError error;
do { do {
error = mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer); error = mf_desfire_poller_send_chunks(
instance, instance->input_buffer, instance->result_buffer);
if(error != MfDesfireErrorNone) break; if(error != MfDesfireErrorNone) break;
@@ -86,7 +97,8 @@ MfDesfireError
MfDesfireError error; MfDesfireError error;
do { do {
error = mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer); error = mf_desfire_poller_send_chunks(
instance, instance->input_buffer, instance->result_buffer);
if(error != MfDesfireErrorNone) break; if(error != MfDesfireErrorNone) break;
@@ -108,7 +120,8 @@ MfDesfireError
MfDesfireError error; MfDesfireError error;
do { do {
error = mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer); error = mf_desfire_poller_send_chunks(
instance, instance->input_buffer, instance->result_buffer);
if(error != MfDesfireErrorNone) break; if(error != MfDesfireErrorNone) break;
@@ -132,7 +145,7 @@ MfDesfireError mf_desfire_poller_read_key_version(
bit_buffer_set_byte(instance->input_buffer, 1, key_num); bit_buffer_set_byte(instance->input_buffer, 1, key_num);
MfDesfireError error = MfDesfireError error =
mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer); mf_desfire_poller_send_chunks(instance, instance->input_buffer, instance->result_buffer);
if(error == MfDesfireErrorNone) { if(error == MfDesfireErrorNone) {
if(!mf_desfire_key_version_parse(data, instance->result_buffer)) { if(!mf_desfire_key_version_parse(data, instance->result_buffer)) {
error = MfDesfireErrorProtocol; error = MfDesfireErrorProtocol;
@@ -172,7 +185,8 @@ MfDesfireError
MfDesfireError error; MfDesfireError error;
do { do {
error = mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer); error = mf_desfire_poller_send_chunks(
instance, instance->input_buffer, instance->result_buffer);
if(error != MfDesfireErrorNone) break; if(error != MfDesfireErrorNone) break;
@@ -205,7 +219,7 @@ MfDesfireError mf_desfire_poller_select_application(
instance->input_buffer, (const uint8_t*)id, sizeof(MfDesfireApplicationId)); instance->input_buffer, (const uint8_t*)id, sizeof(MfDesfireApplicationId));
MfDesfireError error = MfDesfireError error =
mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer); mf_desfire_poller_send_chunks(instance, instance->input_buffer, instance->result_buffer);
return error; return error;
} }
@@ -220,7 +234,8 @@ MfDesfireError mf_desfire_poller_read_file_ids(MfDesfirePoller* instance, Simple
MfDesfireError error; MfDesfireError error;
do { do {
error = mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer); error = mf_desfire_poller_send_chunks(
instance, instance->input_buffer, instance->result_buffer);
if(error != MfDesfireErrorNone) break; if(error != MfDesfireErrorNone) break;
@@ -255,7 +270,8 @@ MfDesfireError mf_desfire_poller_read_file_settings(
MfDesfireError error; MfDesfireError error;
do { do {
error = mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer); error = mf_desfire_poller_send_chunks(
instance, instance->input_buffer, instance->result_buffer);
if(error != MfDesfireErrorNone) break; if(error != MfDesfireErrorNone) break;
@@ -316,7 +332,8 @@ static MfDesfireError mf_desfire_poller_read_file(
bit_buffer_append_bytes(instance->input_buffer, (const uint8_t*)&current_offset, 3); bit_buffer_append_bytes(instance->input_buffer, (const uint8_t*)&current_offset, 3);
bit_buffer_append_bytes(instance->input_buffer, (const uint8_t*)&bytes_to_read, 3); bit_buffer_append_bytes(instance->input_buffer, (const uint8_t*)&bytes_to_read, 3);
error = mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer); error = mf_desfire_poller_send_chunks(
instance, instance->input_buffer, instance->result_buffer);
if(error != MfDesfireErrorNone) break; if(error != MfDesfireErrorNone) break;
size_t bytes_received = bit_buffer_get_size_bytes(instance->result_buffer); size_t bytes_received = bit_buffer_get_size_bytes(instance->result_buffer);
@@ -362,7 +379,8 @@ MfDesfireError mf_desfire_poller_read_file_value(
MfDesfireError error; MfDesfireError error;
do { do {
error = mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer); error = mf_desfire_poller_send_chunks(
instance, instance->input_buffer, instance->result_buffer);
if(error != MfDesfireErrorNone) break; if(error != MfDesfireErrorNone) break;

View File

@@ -30,6 +30,7 @@ typedef enum {
struct MfDesfirePoller { struct MfDesfirePoller {
Iso14443_4aPoller* iso14443_4a_poller; Iso14443_4aPoller* iso14443_4a_poller;
NxpNativeCommandMode command_mode;
MfDesfirePollerSessionState session_state; MfDesfirePollerSessionState session_state;
MfDesfirePollerState state; MfDesfirePollerState state;
MfDesfireError error; MfDesfireError error;

View File

@@ -1,5 +1,5 @@
entry,status,name,type,params entry,status,name,type,params
Version,+,82.3,, Version,+,83.0,,
Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli.h,,
1 entry status name type params
2 Version + 82.3 83.0
3 Header + applications/services/bt/bt_service/bt.h
4 Header + applications/services/bt/bt_service/bt_keys_storage.h
5 Header + applications/services/cli/cli.h

View File

@@ -1,5 +1,5 @@
entry,status,name,type,params entry,status,name,type,params
Version,+,82.3,, Version,+,83.0,,
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, 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.h,,
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
@@ -2647,9 +2647,10 @@ Function,+,mf_desfire_poller_read_key_version,MfDesfireError,"MfDesfirePoller*,
Function,+,mf_desfire_poller_read_key_versions,MfDesfireError,"MfDesfirePoller*, SimpleArray*, uint32_t" Function,+,mf_desfire_poller_read_key_versions,MfDesfireError,"MfDesfirePoller*, SimpleArray*, uint32_t"
Function,+,mf_desfire_poller_read_version,MfDesfireError,"MfDesfirePoller*, MfDesfireVersion*" Function,+,mf_desfire_poller_read_version,MfDesfireError,"MfDesfirePoller*, MfDesfireVersion*"
Function,+,mf_desfire_poller_select_application,MfDesfireError,"MfDesfirePoller*, const MfDesfireApplicationId*" Function,+,mf_desfire_poller_select_application,MfDesfireError,"MfDesfirePoller*, const MfDesfireApplicationId*"
Function,+,mf_desfire_poller_send_chunks,MfDesfireError,"MfDesfirePoller*, const BitBuffer*, BitBuffer*"
Function,+,mf_desfire_poller_set_command_mode,void,"MfDesfirePoller*, NxpNativeCommandMode"
Function,+,mf_desfire_reset,void,MfDesfireData* Function,+,mf_desfire_reset,void,MfDesfireData*
Function,+,mf_desfire_save,_Bool,"const MfDesfireData*, FlipperFormat*" Function,+,mf_desfire_save,_Bool,"const MfDesfireData*, FlipperFormat*"
Function,+,mf_desfire_send_chunks,MfDesfireError,"MfDesfirePoller*, const BitBuffer*, BitBuffer*"
Function,+,mf_desfire_set_uid,_Bool,"MfDesfireData*, const uint8_t*, size_t" Function,+,mf_desfire_set_uid,_Bool,"MfDesfireData*, const uint8_t*, size_t"
Function,+,mf_desfire_verify,_Bool,"MfDesfireData*, const FuriString*" Function,+,mf_desfire_verify,_Bool,"MfDesfireData*, const FuriString*"
Function,+,mf_plus_alloc,MfPlusData*, Function,+,mf_plus_alloc,MfPlusData*,
1 entry status name type params
2 Version + 82.3 83.0
3 Header + applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h
4 Header + applications/services/bt/bt_service/bt.h
5 Header + applications/services/bt/bt_service/bt_keys_storage.h
2647 Function + mf_desfire_poller_read_key_versions MfDesfireError MfDesfirePoller*, SimpleArray*, uint32_t
2648 Function + mf_desfire_poller_read_version MfDesfireError MfDesfirePoller*, MfDesfireVersion*
2649 Function + mf_desfire_poller_select_application MfDesfireError MfDesfirePoller*, const MfDesfireApplicationId*
2650 Function + mf_desfire_poller_send_chunks MfDesfireError MfDesfirePoller*, const BitBuffer*, BitBuffer*
2651 Function + mf_desfire_poller_set_command_mode void MfDesfirePoller*, NxpNativeCommandMode
2652 Function + mf_desfire_reset void MfDesfireData*
2653 Function + mf_desfire_save _Bool const MfDesfireData*, FlipperFormat*
Function + mf_desfire_send_chunks MfDesfireError MfDesfirePoller*, const BitBuffer*, BitBuffer*
2654 Function + mf_desfire_set_uid _Bool MfDesfireData*, const uint8_t*, size_t
2655 Function + mf_desfire_verify _Bool MfDesfireData*, const FuriString*
2656 Function + mf_plus_alloc MfPlusData*