Merge branch 'nfcf' of github.com:erakem/flipperzero-firmware into erakem-nfcf

This commit is contained in:
nullableVoidPtr
2022-12-10 12:32:17 +11:00
15 changed files with 49 additions and 44 deletions
+5 -5
View File
@@ -1,5 +1,5 @@
entry,status,name,type,params
Version,+,10.2,,
Version,+,10.3,,
Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/cli/cli.h,,
Header,+,applications/services/cli/cli_vcp.h,,
@@ -1843,7 +1843,7 @@ Function,+,menu_set_selected_item,void,"Menu*, uint32_t"
Function,-,mf_classic_auth_attempt,_Bool,"FuriHalNfcTxRxContext*, MfClassicAuthContext*, uint64_t"
Function,-,mf_classic_auth_init_context,void,"MfClassicAuthContext*, uint8_t"
Function,-,mf_classic_authenticate,_Bool,"FuriHalNfcTxRxContext*, uint8_t, uint64_t, MfClassicKey"
Function,-,mf_classic_check_card_type,_Bool,"uint8_t, uint8_t, uint8_t"
Function,-,mf_classic_check_card_type,_Bool,FuriHalNfcADevData*
Function,-,mf_classic_dict_add_key,_Bool,"MfClassicDict*, uint8_t*"
Function,-,mf_classic_dict_add_key_str,_Bool,"MfClassicDict*, FuriString*"
Function,-,mf_classic_dict_alloc,MfClassicDict*,MfClassicDictType
@@ -1861,7 +1861,7 @@ Function,-,mf_classic_dict_is_key_present,_Bool,"MfClassicDict*, uint8_t*"
Function,-,mf_classic_dict_is_key_present_str,_Bool,"MfClassicDict*, FuriString*"
Function,-,mf_classic_dict_rewind,_Bool,MfClassicDict*
Function,-,mf_classic_emulator,_Bool,"MfClassicEmulator*, FuriHalNfcTxRxContext*"
Function,-,mf_classic_get_classic_type,MfClassicType,"int8_t, uint8_t, uint8_t"
Function,-,mf_classic_get_classic_type,MfClassicType,FuriHalNfcADevData*
Function,-,mf_classic_get_read_sectors_and_keys,void,"MfClassicData*, uint8_t*, uint8_t*"
Function,-,mf_classic_get_sector_by_block,uint8_t,uint8_t
Function,-,mf_classic_get_sector_trailer_block_num_by_sector,uint8_t,uint8_t
@@ -1895,7 +1895,7 @@ Function,-,mf_df_cat_file,void,"MifareDesfireFile*, FuriString*"
Function,-,mf_df_cat_free_mem,void,"MifareDesfireFreeMemory*, FuriString*"
Function,-,mf_df_cat_key_settings,void,"MifareDesfireKeySettings*, FuriString*"
Function,-,mf_df_cat_version,void,"MifareDesfireVersion*, FuriString*"
Function,-,mf_df_check_card_type,_Bool,"uint8_t, uint8_t, uint8_t"
Function,-,mf_df_check_card_type,_Bool,FuriHalNfcADevData*
Function,-,mf_df_clear,void,MifareDesfireData*
Function,-,mf_df_parse_get_application_ids_response,_Bool,"uint8_t*, uint16_t, MifareDesfireApplication**"
Function,-,mf_df_parse_get_file_ids_response,_Bool,"uint8_t*, uint16_t, MifareDesfireFile**"
@@ -1918,7 +1918,7 @@ Function,-,mf_df_prepare_read_data,uint16_t,"uint8_t*, uint8_t, uint32_t, uint32
Function,-,mf_df_prepare_read_records,uint16_t,"uint8_t*, uint8_t, uint32_t, uint32_t"
Function,-,mf_df_prepare_select_application,uint16_t,"uint8_t*, uint8_t[3]"
Function,-,mf_df_read_card,_Bool,"FuriHalNfcTxRxContext*, MifareDesfireData*"
Function,-,mf_ul_check_card_type,_Bool,"uint8_t, uint8_t, uint8_t"
Function,-,mf_ul_check_card_type,_Bool,FuriHalNfcADevData*
Function,-,mf_ul_is_full_capture,_Bool,MfUltralightData*
Function,-,mf_ul_prepare_emulation,void,"MfUltralightEmulator*, MfUltralightData*"
Function,-,mf_ul_prepare_emulation_response,_Bool,"uint8_t*, uint16_t, uint8_t*, uint16_t*, uint32_t*, void*"
1 entry status name type params
2 Version + 10.2 10.3
3 Header + applications/services/bt/bt_service/bt.h
4 Header + applications/services/cli/cli.h
5 Header + applications/services/cli/cli_vcp.h
1843 Function - mf_classic_auth_attempt _Bool FuriHalNfcTxRxContext*, MfClassicAuthContext*, uint64_t
1844 Function - mf_classic_auth_init_context void MfClassicAuthContext*, uint8_t
1845 Function - mf_classic_authenticate _Bool FuriHalNfcTxRxContext*, uint8_t, uint64_t, MfClassicKey
1846 Function - mf_classic_check_card_type _Bool uint8_t, uint8_t, uint8_t FuriHalNfcADevData*
1847 Function - mf_classic_dict_add_key _Bool MfClassicDict*, uint8_t*
1848 Function - mf_classic_dict_add_key_str _Bool MfClassicDict*, FuriString*
1849 Function - mf_classic_dict_alloc MfClassicDict* MfClassicDictType
1861 Function - mf_classic_dict_is_key_present_str _Bool MfClassicDict*, FuriString*
1862 Function - mf_classic_dict_rewind _Bool MfClassicDict*
1863 Function - mf_classic_emulator _Bool MfClassicEmulator*, FuriHalNfcTxRxContext*
1864 Function - mf_classic_get_classic_type MfClassicType int8_t, uint8_t, uint8_t FuriHalNfcADevData*
1865 Function - mf_classic_get_read_sectors_and_keys void MfClassicData*, uint8_t*, uint8_t*
1866 Function - mf_classic_get_sector_by_block uint8_t uint8_t
1867 Function - mf_classic_get_sector_trailer_block_num_by_sector uint8_t uint8_t
1895 Function - mf_df_cat_free_mem void MifareDesfireFreeMemory*, FuriString*
1896 Function - mf_df_cat_key_settings void MifareDesfireKeySettings*, FuriString*
1897 Function - mf_df_cat_version void MifareDesfireVersion*, FuriString*
1898 Function - mf_df_check_card_type _Bool uint8_t, uint8_t, uint8_t FuriHalNfcADevData*
1899 Function - mf_df_clear void MifareDesfireData*
1900 Function - mf_df_parse_get_application_ids_response _Bool uint8_t*, uint16_t, MifareDesfireApplication**
1901 Function - mf_df_parse_get_file_ids_response _Bool uint8_t*, uint16_t, MifareDesfireFile**
1918 Function - mf_df_prepare_read_records uint16_t uint8_t*, uint8_t, uint32_t, uint32_t
1919 Function - mf_df_prepare_select_application uint16_t uint8_t*, uint8_t[3]
1920 Function - mf_df_read_card _Bool FuriHalNfcTxRxContext*, MifareDesfireData*
1921 Function - mf_ul_check_card_type _Bool uint8_t, uint8_t, uint8_t FuriHalNfcADevData*
1922 Function - mf_ul_is_full_capture _Bool MfUltralightData*
1923 Function - mf_ul_prepare_emulation void MfUltralightEmulator*, MfUltralightData*
1924 Function - mf_ul_prepare_emulation_response _Bool uint8_t*, uint16_t, uint8_t*, uint16_t*, uint32_t*, void*
+9 -13
View File
@@ -296,17 +296,16 @@ static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* t
bool card_read = false;
furi_hal_nfc_sleep();
if(mf_ul_check_card_type(a_data->atqa[0], a_data->atqa[1], a_data->sak)) {
if(mf_ul_check_card_type(a_data)) {
FURI_LOG_I(TAG, "Mifare Ultralight / NTAG detected");
nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareUl;
card_read = nfc_worker_read_mf_ultralight(nfc_worker, tx_rx);
} else if(mf_classic_check_card_type(a_data->atqa[0], a_data->atqa[1], a_data->sak)) {
} else if(mf_classic_check_card_type(a_data)) {
FURI_LOG_I(TAG, "Mifare Classic detected");
nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareClassic;
nfc_worker->dev_data->mf_classic_data.type =
mf_classic_get_classic_type(a_data->atqa[0], a_data->atqa[1], a_data->sak);
nfc_worker->dev_data->mf_classic_data.type = mf_classic_get_classic_type(a_data);
card_read = nfc_worker_read_mf_classic(nfc_worker, tx_rx);
} else if(mf_df_check_card_type(a_data->atqa[0], a_data->atqa[1], a_data->sak)) {
} else if(mf_df_check_card_type(a_data)) {
FURI_LOG_I(TAG, "Mifare DESFire detected");
nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareDesfire;
if(!nfc_worker_read_mf_desfire(nfc_worker, tx_rx)) {
@@ -462,8 +461,8 @@ void nfc_worker_read_type(NfcWorker* nfc_worker) {
if(nfc_data->type == FuriHalNfcTypeA) {
if(read_mode == NfcReadModeMfClassic) {
nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareClassic;
nfc_worker->dev_data->mf_classic_data.type = mf_classic_get_classic_type(
nfc_data->a_data.atqa[0], nfc_data->a_data.atqa[1], nfc_data->a_data.sak);
nfc_worker->dev_data->mf_classic_data.type =
mf_classic_get_classic_type(&nfc_data->a_data);
if(nfc_worker_read_mf_classic(nfc_worker, &tx_rx)) {
FURI_LOG_D(TAG, "Card read");
dev_data->protocol = NfcDeviceProtocolMifareClassic;
@@ -845,8 +844,7 @@ void nfc_worker_write_mf_classic(NfcWorker* nfc_worker) {
}
FURI_LOG_I(TAG, "Check mf classic type");
MfClassicType type = mf_classic_get_classic_type(
nfc_data.a_data.atqa[0], nfc_data.a_data.atqa[1], nfc_data.a_data.sak);
MfClassicType type = mf_classic_get_classic_type(&nfc_data.a_data);
if(type != nfc_worker->dev_data->mf_classic_data.type) {
FURI_LOG_E(TAG, "Wrong mf classic type");
nfc_worker->callback(NfcWorkerEventWrongCard, nfc_worker->context);
@@ -917,8 +915,7 @@ void nfc_worker_update_mf_classic(NfcWorker* nfc_worker) {
}
FURI_LOG_I(TAG, "Check MF classic type");
MfClassicType type = mf_classic_get_classic_type(
nfc_data.a_data.atqa[0], nfc_data.a_data.atqa[1], nfc_data.a_data.sak);
MfClassicType type = mf_classic_get_classic_type(&nfc_data.a_data);
if(type != nfc_worker->dev_data->mf_classic_data.type) {
FURI_LOG_E(TAG, "MF classic type mismatch");
nfc_worker->callback(NfcWorkerEventWrongCard, nfc_worker->context);
@@ -980,8 +977,7 @@ void nfc_worker_mf_ultralight_read_auth(NfcWorker* nfc_worker) {
while(nfc_worker->state == NfcWorkerStateReadMfUltralightReadAuth) {
furi_hal_nfc_sleep();
if(furi_hal_nfc_detect(nfc_data, 300) && nfc_data->type == FuriHalNfcTypeA) {
if(mf_ul_check_card_type(
nfc_data->a_data.atqa[0], nfc_data->a_data.atqa[1], nfc_data->a_data.sak)) {
if(mf_ul_check_card_type(&nfc_data->a_data)) {
nfc_worker->callback(NfcWorkerEventCardDetected, nfc_worker->context);
if(data->auth_method == MfUltralightAuthMethodManual ||
data->auth_method == MfUltralightAuthMethodAuto) {
+1 -2
View File
@@ -71,8 +71,7 @@ bool plantain_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx
MfClassicReader reader = {};
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
reader.type =
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
reader.type = mf_classic_get_classic_type(nfc_a_data);
for(size_t i = 0; i < COUNT_OF(plantain_keys_4k); i++) {
mf_classic_reader_add_sector(
&reader,
+1 -2
View File
@@ -46,8 +46,7 @@ bool plantain_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {
MfClassicReader reader = {};
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
reader.type =
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
reader.type = mf_classic_get_classic_type(nfc_a_data);
for(size_t i = 0; i < COUNT_OF(plantain_keys); i++) {
mf_classic_reader_add_sector(
&reader, plantain_keys[i].sector, plantain_keys[i].key_a, plantain_keys[i].key_b);
+1 -2
View File
@@ -68,8 +68,7 @@ bool troika_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx)
MfClassicReader reader = {};
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
reader.type =
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
reader.type = mf_classic_get_classic_type(nfc_a_data);
for(size_t i = 0; i < COUNT_OF(troika_4k_keys); i++) {
mf_classic_reader_add_sector(
&reader, troika_4k_keys[i].sector, troika_4k_keys[i].key_a, troika_4k_keys[i].key_b);
+1 -2
View File
@@ -44,8 +44,7 @@ bool troika_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {
MfClassicReader reader = {};
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
reader.type =
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
reader.type = mf_classic_get_classic_type(nfc_a_data);
for(size_t i = 0; i < COUNT_OF(troika_keys); i++) {
mf_classic_reader_add_sector(
+1 -2
View File
@@ -72,8 +72,7 @@ bool two_cities_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx)
MfClassicReader reader = {};
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
reader.type =
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
reader.type = mf_classic_get_classic_type(nfc_a_data);
for(size_t i = 0; i < COUNT_OF(two_cities_keys_4k); i++) {
mf_classic_reader_add_sector(
&reader,
+8 -4
View File
@@ -351,8 +351,10 @@ static bool mf_classic_is_allowed_access(
}
}
bool mf_classic_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) {
UNUSED(ATQA1);
bool mf_classic_check_card_type(FuriHalNfcADevData* data) {
uint8_t ATQA0 = data->atqa[0];
uint8_t ATQA1 = data->atqa[1];
uint8_t SAK = data->sak;
if((ATQA0 == 0x44 || ATQA0 == 0x04) && (SAK == 0x08 || SAK == 0x88 || SAK == 0x09)) {
return true;
} else if((ATQA0 == 0x01) && (ATQA1 == 0x0F) && (SAK == 0x01)) {
@@ -365,8 +367,10 @@ bool mf_classic_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) {
}
}
MfClassicType mf_classic_get_classic_type(int8_t ATQA0, uint8_t ATQA1, uint8_t SAK) {
UNUSED(ATQA1);
MfClassicType mf_classic_get_classic_type(FuriHalNfcADevData* data) {
uint8_t ATQA0 = data->atqa[0];
uint8_t ATQA1 = data->atqa[1];
uint8_t SAK = data->sak;
if((ATQA0 == 0x44 || ATQA0 == 0x04) && (SAK == 0x08 || SAK == 0x88 || SAK == 0x09)) {
return MfClassicType1k;
} else if((ATQA0 == 0x01) && (ATQA1 == 0x0F) && (SAK == 0x01)) {
+2 -2
View File
@@ -92,9 +92,9 @@ typedef struct {
const char* mf_classic_get_type_str(MfClassicType type);
bool mf_classic_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
bool mf_classic_check_card_type(FuriHalNfcADevData* data);
MfClassicType mf_classic_get_classic_type(int8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
MfClassicType mf_classic_get_classic_type(FuriHalNfcADevData* data);
uint8_t mf_classic_get_total_sectors_num(MfClassicType type);
+5 -1
View File
@@ -1,6 +1,10 @@
#include "mifare_common.h"
#include "furi_hal_nfc.h"
MifareType mifare_common_get_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) {
MifareType mifare_common_get_type(FuriHalNfcADevData* data) {
uint8_t ATQA0 = data->atqa[0];
uint8_t ATQA1 = data->atqa[1];
uint8_t SAK = data->sak;
MifareType type = MifareTypeUnknown;
if((ATQA0 == 0x44) && (ATQA1 == 0x00) && (SAK == 0x00)) {
+2 -1
View File
@@ -1,6 +1,7 @@
#pragma once
#include <stdint.h>
#include "furi_hal_nfc.h"
typedef enum {
MifareTypeUnknown,
@@ -9,4 +10,4 @@ typedef enum {
MifareTypeDesfire,
} MifareType;
MifareType mifare_common_get_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
MifareType mifare_common_get_type(FuriHalNfcADevData* data);
+5 -1
View File
@@ -233,7 +233,11 @@ void mf_df_cat_file(MifareDesfireFile* file, FuriString* out) {
}
}
bool mf_df_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) {
bool mf_df_check_card_type(FuriHalNfcADevData* data) {
uint8_t ATQA0 = data->atqa[0];
uint8_t ATQA1 = data->atqa[1];
uint8_t SAK = data->sak;
return ATQA0 == 0x44 && ATQA1 == 0x03 && SAK == 0x20;
}
+1 -1
View File
@@ -128,7 +128,7 @@ void mf_df_cat_application_info(MifareDesfireApplication* app, FuriString* out);
void mf_df_cat_application(MifareDesfireApplication* app, FuriString* out);
void mf_df_cat_file(MifareDesfireFile* file, FuriString* out);
bool mf_df_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
bool mf_df_check_card_type(FuriHalNfcADevData* data);
uint16_t mf_df_prepare_get_version(uint8_t* dest);
bool mf_df_parse_get_version_response(uint8_t* buf, uint16_t len, MifareDesfireVersion* out);
+6 -5
View File
@@ -33,11 +33,12 @@ uint32_t mf_ul_pwdgen_amiibo(FuriHalNfcDevData* data) {
return pwd;
}
bool mf_ul_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) {
if((ATQA0 == 0x44) && (ATQA1 == 0x00) && (SAK == 0x00)) {
return true;
}
return false;
bool mf_ul_check_card_type(FuriHalNfcADevData* data) {
uint8_t ATQA0 = data->atqa[0];
uint8_t ATQA1 = data->atqa[1];
uint8_t SAK = data->sak;
return ((ATQA0 == 0x44) && (ATQA1 == 0x00) && (SAK == 0x00));
}
void mf_ul_reset(MfUltralightData* data) {
+1 -1
View File
@@ -200,7 +200,7 @@ typedef struct {
void mf_ul_reset(MfUltralightData* data);
bool mf_ul_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK);
bool mf_ul_check_card_type(FuriHalNfcADevData* data);
bool mf_ultralight_read_version(
FuriHalNfcTxRxContext* tx_rx,