mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-06-17 20:19:43 -07:00
Merge branch 'nfcf' of github.com:erakem/flipperzero-firmware into erakem-nfcf
This commit is contained in:
@@ -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*"
|
||||
|
||||
|
+9
-13
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user