Skip to content
Merged
Show file tree
Hide file tree
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
5 changes: 3 additions & 2 deletions applications/debug/unit_tests/nfc/nfc_transport.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifdef APP_UNIT_TESTS

#include <lib/nfc/nfc.h>
#include <lib/nfc/helpers/iso14443_crc.h>
#include <lib/nfc/protocols/iso14443_3a/iso14443_3a.h>

#include <furi/furi.h>
Expand Down Expand Up @@ -246,13 +247,13 @@ static void nfc_worker_listener_pass_col_res(Nfc* instance, uint8_t* rx_data, ui
if((rx_data[0] == 0x93) && (rx_data[1] == 0x70)) {
bit_buffer_set_size_bytes(tx_buffer, 1);
bit_buffer_set_byte(tx_buffer, 0, instance->col_res_data.sel_resp[0].sak);
iso14443_3a_append_crc(tx_buffer);
iso14443_crc_append(Iso14443CrcTypeA, tx_buffer);
nfc_listener_tx(instance, tx_buffer);
processed = true;
} else if((rx_data[0] == 0x95) && (rx_data[1] == 0x70)) {
bit_buffer_set_size_bytes(tx_buffer, 1);
bit_buffer_set_byte(tx_buffer, 0, instance->col_res_data.sel_resp[1].sak);
iso14443_3a_append_crc(tx_buffer);
iso14443_crc_append(Iso14443CrcTypeA, tx_buffer);
nfc_listener_tx(instance, tx_buffer);
instance->col_res_status = Iso14443_3aColResStatusDone;
NfcEvent event = {.type = NfcEventTypeListenerActivated};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
#include "iso14443_3b.h"
#include "iso14443_3b_render.h"

#include <nfc/protocols/iso14443_3b/iso14443_3b_poller.h>

#include "nfc/nfc_app_i.h"

#include "../nfc_protocol_support_gui_common.h"

static void nfc_scene_info_on_enter_iso14443_3b(NfcApp* instance) {
const NfcDevice* device = instance->nfc_device;
const Iso14443_3bData* data = nfc_device_get_data(device, NfcProtocolIso14443_3b);

FuriString* temp_str = furi_string_alloc();
furi_string_cat_printf(
temp_str, "\e#%s\n", nfc_device_get_name(device, NfcDeviceNameTypeFull));
nfc_render_iso14443_3b_info(data, NfcProtocolFormatTypeFull, temp_str);

widget_add_text_scroll_element(
instance->widget, 0, 0, 128, 64, furi_string_get_cstr(temp_str));

furi_string_free(temp_str);
}

static NfcCommand
nfc_scene_read_poller_callback_iso14443_3b(NfcGenericEvent event, void* context) {
furi_assert(event.protocol == NfcProtocolIso14443_3b);

NfcApp* instance = context;
const Iso14443_3bPollerEvent* iso14443_3b_event = event.data;

if(iso14443_3b_event->type == Iso14443_3bPollerEventTypeReady) {
nfc_device_set_data(
instance->nfc_device, NfcProtocolIso14443_3b, nfc_poller_get_data(instance->poller));
view_dispatcher_send_custom_event(instance->view_dispatcher, NfcCustomEventPollerSuccess);
return NfcCommandStop;
}

return NfcCommandContinue;
}

static void nfc_scene_read_on_enter_iso14443_3b(NfcApp* instance) {
nfc_poller_start(instance->poller, nfc_scene_read_poller_callback_iso14443_3b, instance);
}

static void nfc_scene_read_success_on_enter_iso14443_3b(NfcApp* instance) {
const NfcDevice* device = instance->nfc_device;
const Iso14443_3bData* data = nfc_device_get_data(device, NfcProtocolIso14443_3b);

FuriString* temp_str = furi_string_alloc();
furi_string_cat_printf(
temp_str, "\e#%s\n", nfc_device_get_name(device, NfcDeviceNameTypeFull));
nfc_render_iso14443_3b_info(data, NfcProtocolFormatTypeShort, temp_str);

widget_add_text_scroll_element(
instance->widget, 0, 0, 128, 52, furi_string_get_cstr(temp_str));

furi_string_free(temp_str);
}

static bool nfc_scene_info_on_event_iso14443_3b(NfcApp* instance, uint32_t event) {
if(event == GuiButtonTypeRight) {
scene_manager_next_scene(instance->scene_manager, NfcSceneNotImplemented);
return true;
}

return false;
}

static bool nfc_scene_saved_menu_on_event_iso14443_3b(NfcApp* instance, uint32_t event) {
if(event == SubmenuIndexCommonEdit) {
scene_manager_next_scene(instance->scene_manager, NfcSceneSetUid);
return true;
}

return false;
}

const NfcProtocolSupportBase nfc_protocol_support_iso14443_3b = {
.features = NfcProtocolFeatureNone, // TODO: Implement better UID editing,

.scene_info =
{
.on_enter = nfc_scene_info_on_enter_iso14443_3b,
.on_event = nfc_scene_info_on_event_iso14443_3b,
},
.scene_read =
{
.on_enter = nfc_scene_read_on_enter_iso14443_3b,
.on_event = NULL,
},
.scene_read_menu =
{
.on_enter = nfc_protocol_support_common_on_enter_empty,
.on_event = nfc_protocol_support_common_on_event_empty,
},
.scene_read_success =
{
.on_enter = nfc_scene_read_success_on_enter_iso14443_3b,
.on_event = NULL,
},
.scene_saved_menu =
{
.on_enter = nfc_protocol_support_common_on_enter_empty,
.on_event = nfc_scene_saved_menu_on_event_iso14443_3b,
},
.scene_emulate =
{
.on_enter = NULL,
.on_event = NULL,
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#pragma once

#include "../nfc_protocol_support_base.h"

extern const NfcProtocolSupportBase nfc_protocol_support_iso14443_3b;
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#include "iso14443_3b_render.h"

void nfc_render_iso14443_3b_info(
const Iso14443_3bData* data,
NfcProtocolFormatType format_type,
FuriString* str) {
if(format_type == NfcProtocolFormatTypeFull) {
const char iso_type = FURI_BIT(data->protocol_info[1], 0) ? '4' : '3';
furi_string_cat_printf(str, "ISO 14443-%c (NFC-B)\n", iso_type);
}

furi_string_cat_printf(str, "UID:");

for(size_t i = 0; i < ISO14443_3B_UID_SIZE; i++) {
furi_string_cat_printf(str, " %02X", data->uid[i]);
}

if(format_type == NfcProtocolFormatTypeFull) {
furi_string_cat_printf(str, "\nApp. data:");
for(size_t i = 0; i < ISO14443_3B_APP_DATA_SIZE; ++i) {
furi_string_cat_printf(str, " %02X", data->app_data[i]);
}
furi_string_cat_printf(str, "\nProtocol info:");
for(size_t i = 0; i < ISO14443_3B_PROTOCOL_INFO_SIZE; ++i) {
furi_string_cat_printf(str, " %02X", data->protocol_info[i]);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#pragma once

#include <nfc/protocols/iso14443_3b/iso14443_3b.h>

#include "../nfc_protocol_support_render_common.h"

void nfc_render_iso14443_3b_info(
const Iso14443_3bData* data,
NfcProtocolFormatType format_type,
FuriString* str);
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
#include "nfc_protocol_support_defs.h"

#include "iso14443_3a/iso14443_3a.h"
#include "iso14443_3b/iso14443_3b.h"
#include "iso14443_4a/iso14443_4a.h"
#include "mf_ultralight/mf_ultralight.h"
#include "mf_classic/mf_classic.h"
#include "mf_desfire/mf_desfire.h"

const NfcProtocolSupportBase* nfc_protocol_support[NfcProtocolNum] = {
[NfcProtocolIso14443_3a] = &nfc_protocol_support_iso14443_3a,
[NfcProtocolIso14443_3b] = &nfc_protocol_support_iso14443_3b,
[NfcProtocolIso14443_4a] = &nfc_protocol_support_iso14443_4a,
[NfcProtocolMfUltralight] = &nfc_protocol_support_mf_ultralight,
[NfcProtocolMfClassic] = &nfc_protocol_support_mf_classic,
Expand Down
32 changes: 26 additions & 6 deletions documentation/file_formats/NfcFileFormats.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

Filetype: Flipper NFC device
Version: 4
# Device type can be ISO14443-3A, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
Device type: ISO14443-4A
# UID is common for all formats
UID: 04 48 6A 32 33 58 80
Expand All @@ -28,7 +28,7 @@ Version differences:

Filetype: Flipper NFC device
Version: 4
# Device type can be ISO14443-3A, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
Device type: ISO14443-3A
# UID is common for all formats
UID: 34 19 6D 41 14 56 E6
Expand All @@ -44,13 +44,33 @@ UID must be either 4 or 7 bytes long. ATQA is 2 bytes long. SAK is 1 byte long.
Version differences:
None, there are no versions yet.

## ISO14443-3B

Filetype: Flipper NFC device
Version: 4
# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
Device type: ISO14443-3B
# UID is common for all formats
UID: 30 1D B3 28
# ISO14443-3B specific data
Application data: 00 12 34 FF
Protocol info: 11 81 E1

### Description

This file format is used to store the UID, Application data and Protocol info of a ISO14443-3B device.
UID must be 4 bytes long. Application data is 4 bytes long. Protocol info is 3 bytes long.

Version differences:
None, there are no versions yet.

## ISO14443-4A

### Example

Filetype: Flipper NFC device
Version: 4
# Device type can be ISO14443-3A, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
Device type: ISO14443-4A
# UID is common for all formats
UID: 04 48 6A 32 33 58 80
Expand All @@ -74,7 +94,7 @@ None, there are no versions yet.

Filetype: Flipper NFC device
Version: 4
# Device type can be ISO14443-3A, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
Device type: NTAG/Ultralight
# UID is common for all formats
UID: 04 85 90 54 12 98 23
Expand Down Expand Up @@ -130,7 +150,7 @@ Version differences:

Filetype: Flipper NFC device
Version: 4
# Device type can be ISO14443-3A, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
Device type: Mifare Classic
# UID is common for all formats
UID: BA E2 7C 9D
Expand Down Expand Up @@ -195,7 +215,7 @@ Example:

Filetype: Flipper NFC device
Version: 4
# Device type can be ISO14443-3A, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, NTAG/Ultralight, Mifare Classic, Mifare DESFire
Device type: Mifare DESFire
# UID is common for all formats
UID: 04 2F 19 0A CD 66 80
Expand Down
28 changes: 25 additions & 3 deletions firmware/targets/f7/api_symbols.csv
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ Header,+,lib/music_worker/music_worker.h,,
Header,+,lib/nanopb/pb.h,,
Header,+,lib/nanopb/pb_decode.h,,
Header,+,lib/nanopb/pb_encode.h,,
Header,+,lib/nfc/helpers/iso14443_crc.h,,
Header,+,lib/nfc/helpers/nfc_util.h,,
Header,+,lib/nfc/nfc.h,,
Header,+,lib/nfc/nfc_device.h,,
Expand All @@ -161,6 +162,8 @@ Header,+,lib/nfc/protocols/iso14443_3a/iso14443_3a.h,,
Header,+,lib/nfc/protocols/iso14443_3a/iso14443_3a_listener.h,,
Header,+,lib/nfc/protocols/iso14443_3a/iso14443_3a_poller.h,,
Header,+,lib/nfc/protocols/iso14443_3a/iso14443_3a_poller_sync_api.h,,
Header,+,lib/nfc/protocols/iso14443_3b/iso14443_3b.h,,
Header,+,lib/nfc/protocols/iso14443_3b/iso14443_3b_poller.h,,
Header,+,lib/nfc/protocols/iso14443_4a/iso14443_4a.h,,
Header,+,lib/nfc/protocols/iso14443_4a/iso14443_4a_listener.h,,
Header,+,lib/nfc/protocols/iso14443_4a/iso14443_4a_poller.h,,
Expand Down Expand Up @@ -1835,8 +1838,6 @@ Function,-,islower_l,int,"int, locale_t"
Function,-,isnan,int,double
Function,-,isnanf,int,float
Function,+,iso14443_3a_alloc,Iso14443_3aData*,
Function,+,iso14443_3a_append_crc,void,BitBuffer*
Function,+,iso14443_3a_check_crc,_Bool,const BitBuffer*
Function,+,iso14443_3a_copy,void,"Iso14443_3aData*, const Iso14443_3aData*"
Function,+,iso14443_3a_free,void,Iso14443_3aData*
Function,+,iso14443_3a_get_base_data,const Iso14443_3aData*,const Iso14443_3aData*
Expand All @@ -1848,8 +1849,20 @@ Function,+,iso14443_3a_load,_Bool,"Iso14443_3aData*, FlipperFormat*, uint32_t"
Function,+,iso14443_3a_poller_read,Iso14443_3aError,"Nfc*, Iso14443_3aData*"
Function,+,iso14443_3a_reset,void,Iso14443_3aData*
Function,+,iso14443_3a_save,_Bool,"const Iso14443_3aData*, FlipperFormat*"
Function,+,iso14443_3a_trim_crc,void,BitBuffer*
Function,+,iso14443_3a_set_uid,_Bool,"Iso14443_3aData*, const uint8_t*, size_t"
Function,+,iso14443_3a_verify,_Bool,"Iso14443_3aData*, const FuriString*"
Function,+,iso14443_3b_alloc,Iso14443_3bData*,
Function,+,iso14443_3b_copy,void,"Iso14443_3bData*, const Iso14443_3bData*"
Function,+,iso14443_3b_free,void,Iso14443_3bData*
Function,+,iso14443_3b_get_base_data,const Iso14443_3bData*,const Iso14443_3bData*
Function,+,iso14443_3b_get_device_name,const char*,"const Iso14443_3bData*, NfcDeviceNameType"
Function,+,iso14443_3b_get_uid,const uint8_t*,"const Iso14443_3bData*, size_t*"
Function,+,iso14443_3b_is_equal,_Bool,"const Iso14443_3bData*, const Iso14443_3bData*"
Function,+,iso14443_3b_load,_Bool,"Iso14443_3bData*, FlipperFormat*, uint32_t"
Function,+,iso14443_3b_reset,void,Iso14443_3bData*
Function,+,iso14443_3b_save,_Bool,"const Iso14443_3bData*, FlipperFormat*"
Function,+,iso14443_3b_set_uid,_Bool,"Iso14443_3bData*, const uint8_t*, size_t"
Function,+,iso14443_3b_verify,_Bool,"Iso14443_3bData*, const FuriString*"
Function,+,iso14443_4a_alloc,Iso14443_4aData*,
Function,+,iso14443_4a_copy,void,"Iso14443_4aData*, const Iso14443_4aData*"
Function,+,iso14443_4a_free,void,Iso14443_4aData*
Expand All @@ -1861,7 +1874,11 @@ Function,+,iso14443_4a_is_equal,_Bool,"const Iso14443_4aData*, const Iso14443_4a
Function,+,iso14443_4a_load,_Bool,"Iso14443_4aData*, FlipperFormat*, uint32_t"
Function,+,iso14443_4a_reset,void,Iso14443_4aData*
Function,+,iso14443_4a_save,_Bool,"const Iso14443_4aData*, FlipperFormat*"
Function,+,iso14443_4a_set_uid,_Bool,"Iso14443_4aData*, const uint8_t*, size_t"
Function,+,iso14443_4a_verify,_Bool,"Iso14443_4aData*, const FuriString*"
Function,+,iso14443_crc_append,void,"Iso14443CrcType, BitBuffer*"
Function,+,iso14443_crc_check,_Bool,"Iso14443CrcType, const BitBuffer*"
Function,+,iso14443_crc_trim,void,BitBuffer*
Function,-,isprint,int,int
Function,-,isprint_l,int,"int, locale_t"
Function,-,ispunct,int,int
Expand Down Expand Up @@ -2075,6 +2092,7 @@ Function,+,mf_classic_save,_Bool,"const MfClassicData*, FlipperFormat*"
Function,+,mf_classic_set_block_read,void,"MfClassicData*, uint8_t, MfClassicBlock*"
Function,+,mf_classic_set_key_found,void,"MfClassicData*, uint8_t, MfClassicKeyType, uint64_t"
Function,+,mf_classic_set_key_not_found,void,"MfClassicData*, uint8_t, MfClassicKeyType"
Function,+,mf_classic_set_uid,_Bool,"MfClassicData*, const uint8_t*, size_t"
Function,+,mf_classic_value_to_block,void,"int32_t, uint8_t, MfClassicBlock*"
Function,+,mf_classic_verify,_Bool,"MfClassicData*, const FuriString*"
Function,+,mf_desfire_alloc,MfDesfireData*,
Expand All @@ -2090,6 +2108,7 @@ Function,+,mf_desfire_is_equal,_Bool,"const MfDesfireData*, const MfDesfireData*
Function,+,mf_desfire_load,_Bool,"MfDesfireData*, FlipperFormat*, uint32_t"
Function,+,mf_desfire_reset,void,MfDesfireData*
Function,+,mf_desfire_save,_Bool,"const MfDesfireData*, FlipperFormat*"
Function,+,mf_desfire_set_uid,_Bool,"MfDesfireData*, const uint8_t*, size_t"
Function,+,mf_desfire_verify,_Bool,"MfDesfireData*, const FuriString*"
Function,+,mf_ultralight_alloc,MfUltralightData*,
Function,+,mf_ultralight_copy,void,"MfUltralightData*, const MfUltralightData*"
Expand All @@ -2116,6 +2135,7 @@ Function,+,mf_ultralight_poller_read_version,MfUltralightError,"Nfc*, MfUltralig
Function,+,mf_ultralight_poller_write_page,MfUltralightError,"Nfc*, uint16_t, MfUltralightPage*"
Function,+,mf_ultralight_reset,void,MfUltralightData*
Function,+,mf_ultralight_save,_Bool,"const MfUltralightData*, FlipperFormat*"
Function,+,mf_ultralight_set_uid,_Bool,"MfUltralightData*, const uint8_t*, size_t"
Function,+,mf_ultralight_verify,_Bool,"MfUltralightData*, const FuriString*"
Function,-,mkdtemp,char*,char*
Function,-,mkostemp,int,"char*, int"
Expand Down Expand Up @@ -2170,6 +2190,7 @@ Function,+,nfc_device_reset,void,NfcDevice*
Function,+,nfc_device_save,_Bool,"NfcDevice*, const char*"
Function,+,nfc_device_set_data,void,"NfcDevice*, NfcProtocol, const NfcDeviceData*"
Function,+,nfc_device_set_loading_callback,void,"NfcDevice*, NfcLoadingCallback, void*"
Function,+,nfc_device_set_uid,_Bool,"NfcDevice*, const uint8_t*, size_t"
Function,-,nfc_free,void,Nfc*
Function,-,nfc_iso14443_3a_listener_tx_custom_parity,NfcError,"Nfc*, const BitBuffer*"
Function,-,nfc_iso14443_3a_sdd_frame,NfcError,"Nfc*, const BitBuffer*, BitBuffer*, uint32_t"
Expand Down Expand Up @@ -3507,6 +3528,7 @@ Variable,+,message_sound_off,const NotificationMessage,
Variable,+,message_vibro_off,const NotificationMessage,
Variable,+,message_vibro_on,const NotificationMessage,
Variable,-,nfc_device_iso14443_3a,const NfcDeviceBase,
Variable,+,nfc_device_iso14443_3b,const NfcDeviceBase,
Variable,-,nfc_device_iso14443_4a,const NfcDeviceBase,
Variable,-,nfc_device_mf_classic,const NfcDeviceBase,
Variable,-,nfc_device_mf_desfire,const NfcDeviceBase,
Expand Down
Loading