diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index a9999e20e..2962645c2 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,8.2,, +Version,+,8.3,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -1829,7 +1829,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 @@ -1847,7 +1847,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 @@ -1881,7 +1881,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**" @@ -1904,7 +1904,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*" diff --git a/lib/nfc/nfc_worker.c b/lib/nfc/nfc_worker.c index 3e4677a46..257dd336e 100644 --- a/lib/nfc/nfc_worker.c +++ b/lib/nfc/nfc_worker.c @@ -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) { diff --git a/lib/nfc/parsers/plantain_4k_parser.c b/lib/nfc/parsers/plantain_4k_parser.c index 2d48c9a6e..300fd20bd 100644 --- a/lib/nfc/parsers/plantain_4k_parser.c +++ b/lib/nfc/parsers/plantain_4k_parser.c @@ -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, diff --git a/lib/nfc/parsers/plantain_parser.c b/lib/nfc/parsers/plantain_parser.c index b2cc1017f..0039b588d 100644 --- a/lib/nfc/parsers/plantain_parser.c +++ b/lib/nfc/parsers/plantain_parser.c @@ -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); diff --git a/lib/nfc/parsers/troika_4k_parser.c b/lib/nfc/parsers/troika_4k_parser.c index a94d69486..dc3e93ff9 100644 --- a/lib/nfc/parsers/troika_4k_parser.c +++ b/lib/nfc/parsers/troika_4k_parser.c @@ -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); diff --git a/lib/nfc/parsers/troika_parser.c b/lib/nfc/parsers/troika_parser.c index 569d83822..c46022300 100644 --- a/lib/nfc/parsers/troika_parser.c +++ b/lib/nfc/parsers/troika_parser.c @@ -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( diff --git a/lib/nfc/parsers/two_cities.c b/lib/nfc/parsers/two_cities.c index e625e3e97..296880a9f 100644 --- a/lib/nfc/parsers/two_cities.c +++ b/lib/nfc/parsers/two_cities.c @@ -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, diff --git a/lib/nfc/protocols/mifare_classic.c b/lib/nfc/protocols/mifare_classic.c index 7fdf8c784..2156237f1 100644 --- a/lib/nfc/protocols/mifare_classic.c +++ b/lib/nfc/protocols/mifare_classic.c @@ -351,7 +351,10 @@ static bool mf_classic_is_allowed_access( } } -bool mf_classic_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) { +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)) { @@ -364,7 +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) { +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)) { diff --git a/lib/nfc/protocols/mifare_classic.h b/lib/nfc/protocols/mifare_classic.h index 9a0bb5790..97a56ae6c 100644 --- a/lib/nfc/protocols/mifare_classic.h +++ b/lib/nfc/protocols/mifare_classic.h @@ -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); diff --git a/lib/nfc/protocols/mifare_common.c b/lib/nfc/protocols/mifare_common.c index 90b57e1f0..cfb5e0a37 100644 --- a/lib/nfc/protocols/mifare_common.c +++ b/lib/nfc/protocols/mifare_common.c @@ -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)) { diff --git a/lib/nfc/protocols/mifare_common.h b/lib/nfc/protocols/mifare_common.h index 2b694d906..e60a97bd0 100644 --- a/lib/nfc/protocols/mifare_common.h +++ b/lib/nfc/protocols/mifare_common.h @@ -1,6 +1,7 @@ #pragma once #include +#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); diff --git a/lib/nfc/protocols/mifare_desfire.c b/lib/nfc/protocols/mifare_desfire.c index b2247bf20..562549efe 100644 --- a/lib/nfc/protocols/mifare_desfire.c +++ b/lib/nfc/protocols/mifare_desfire.c @@ -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; } diff --git a/lib/nfc/protocols/mifare_desfire.h b/lib/nfc/protocols/mifare_desfire.h index 963a18f58..5a912377d 100644 --- a/lib/nfc/protocols/mifare_desfire.h +++ b/lib/nfc/protocols/mifare_desfire.h @@ -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); diff --git a/lib/nfc/protocols/mifare_ultralight.c b/lib/nfc/protocols/mifare_ultralight.c index 85e234bd9..02a7b0994 100644 --- a/lib/nfc/protocols/mifare_ultralight.c +++ b/lib/nfc/protocols/mifare_ultralight.c @@ -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) { diff --git a/lib/nfc/protocols/mifare_ultralight.h b/lib/nfc/protocols/mifare_ultralight.h index 4ab22e89c..9ae9ab463 100644 --- a/lib/nfc/protocols/mifare_ultralight.h +++ b/lib/nfc/protocols/mifare_ultralight.h @@ -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,