diff --git a/applications/main/nfc/helpers/nfc_supported_cards.c b/applications/main/nfc/helpers/nfc_supported_cards.c index a242ba3ae..6016ae178 100644 --- a/applications/main/nfc/helpers/nfc_supported_cards.c +++ b/applications/main/nfc/helpers/nfc_supported_cards.c @@ -1,4 +1,5 @@ #include "nfc_supported_cards.h" + #include "../plugins/supported_cards/nfc_supported_card_plugin.h" #include @@ -7,22 +8,72 @@ #include #include +#include #define TAG "NfcSupportedCards" #define NFC_SUPPORTED_CARDS_PLUGINS_PATH APP_DATA_PATH("plugins") #define NFC_SUPPORTED_CARDS_PLUGIN_SUFFIX "_parser.fal" +typedef enum { + NfcSupportedCardsPluginFeatureHasVerify = (1U << 0), + NfcSupportedCardsPluginFeatureHasRead = (1U << 1), + NfcSupportedCardsPluginFeatureHasParse = (1U << 2), +} NfcSupportedCardsPluginFeature; + +typedef struct { + FuriString* path; + NfcProtocol protocol; + NfcSupportedCardsPluginFeature feature; +} NfcSupportedCardsPluginCache; + +ARRAY_DEF(NfcSupportedCardsPluginCache, NfcSupportedCardsPluginCache, M_POD_OPLIST); + +typedef enum { + NfcSupportedCardsLoadStateIdle, + NfcSupportedCardsLoadStateInProgress, + NfcSupportedCardsLoadStateSuccess, + NfcSupportedCardsLoadStateFail, +} NfcSupportedCardsLoadState; + typedef struct { Storage* storage; File* directory; FuriString* file_path; char file_name[256]; FlipperApplication* app; -} NfcSupportedCards; +} NfcSupportedCardsLoadContext; -static NfcSupportedCards* nfc_supported_cards_alloc() { +struct NfcSupportedCards { + NfcSupportedCardsPluginCache_t plugins_cache_arr; + NfcSupportedCardsLoadState load_state; + NfcSupportedCardsLoadContext* load_context; +}; + +NfcSupportedCards* nfc_supported_cards_alloc() { NfcSupportedCards* instance = malloc(sizeof(NfcSupportedCards)); + NfcSupportedCardsPluginCache_init(instance->plugins_cache_arr); + + return instance; +} + +void nfc_supported_cards_free(NfcSupportedCards* instance) { + furi_assert(instance); + + NfcSupportedCardsPluginCache_it_t iter; + for(NfcSupportedCardsPluginCache_it(iter, instance->plugins_cache_arr); + !NfcSupportedCardsPluginCache_end_p(iter); + NfcSupportedCardsPluginCache_next(iter)) { + NfcSupportedCardsPluginCache* plugin_cache = NfcSupportedCardsPluginCache_ref(iter); + furi_string_free(plugin_cache->path); + } + + NfcSupportedCardsPluginCache_clear(instance->plugins_cache_arr); + free(instance); +} + +static NfcSupportedCardsLoadContext* nfc_supported_cards_load_context_alloc() { + NfcSupportedCardsLoadContext* instance = malloc(sizeof(NfcSupportedCardsLoadContext)); instance->storage = furi_record_open(RECORD_STORAGE); instance->directory = storage_file_alloc(instance->storage); @@ -35,7 +86,7 @@ static NfcSupportedCards* nfc_supported_cards_alloc() { return instance; } -static void nfc_supported_cards_free(NfcSupportedCards* instance) { +static void nfc_supported_cards_load_context_free(NfcSupportedCardsLoadContext* instance) { if(instance->app) { flipper_application_free(instance->app); } @@ -50,7 +101,36 @@ static void nfc_supported_cards_free(NfcSupportedCards* instance) { } static const NfcSupportedCardsPlugin* - nfc_supported_cards_get_next_plugin(NfcSupportedCards* instance) { + nfc_supported_cards_get_plugin(NfcSupportedCardsLoadContext* instance, FuriString* path) { + furi_assert(instance); + furi_assert(path); + + const NfcSupportedCardsPlugin* plugin = NULL; + do { + if(instance->app) flipper_application_free(instance->app); + instance->app = flipper_application_alloc(instance->storage, firmware_api_interface); + if(flipper_application_preload(instance->app, furi_string_get_cstr(path)) != + FlipperApplicationPreloadStatusSuccess) + break; + if(!flipper_application_is_plugin(instance->app)) break; + if(flipper_application_map_to_memory(instance->app) != FlipperApplicationLoadStatusSuccess) + break; + const FlipperAppPluginDescriptor* descriptor = + flipper_application_plugin_get_descriptor(instance->app); + + if(descriptor == NULL) break; + + if(strcmp(descriptor->appid, NFC_SUPPORTED_CARD_PLUGIN_APP_ID) != 0) break; + if(descriptor->ep_api_version != NFC_SUPPORTED_CARD_PLUGIN_API_VERSION) break; + + plugin = descriptor->entry_point; + } while(false); + + return plugin; +} + +static const NfcSupportedCardsPlugin* + nfc_supported_cards_get_next_plugin(NfcSupportedCardsLoadContext* instance) { const NfcSupportedCardsPlugin* plugin = NULL; do { @@ -65,83 +145,137 @@ static const NfcSupportedCardsPlugin* path_concat(NFC_SUPPORTED_CARDS_PLUGINS_PATH, instance->file_name, instance->file_path); - if(instance->app) flipper_application_free(instance->app); - instance->app = flipper_application_alloc(instance->storage, firmware_api_interface); - - if(flipper_application_preload(instance->app, furi_string_get_cstr(instance->file_path)) != - FlipperApplicationPreloadStatusSuccess) - continue; - if(!flipper_application_is_plugin(instance->app)) continue; - - if(flipper_application_map_to_memory(instance->app) != FlipperApplicationLoadStatusSuccess) - continue; - - const FlipperAppPluginDescriptor* descriptor = - flipper_application_plugin_get_descriptor(instance->app); - - if(descriptor == NULL) continue; - - if(strcmp(descriptor->appid, NFC_SUPPORTED_CARD_PLUGIN_APP_ID) != 0) continue; - if(descriptor->ep_api_version != NFC_SUPPORTED_CARD_PLUGIN_API_VERSION) continue; - - plugin = descriptor->entry_point; + plugin = nfc_supported_cards_get_plugin(instance, instance->file_path); } while(plugin == NULL); //-V654 return plugin; } -bool nfc_supported_cards_read(NfcDevice* device, Nfc* nfc) { +void nfc_supported_cards_load_cache(NfcSupportedCards* instance) { + furi_assert(instance); + + do { + if((instance->load_state == NfcSupportedCardsLoadStateSuccess) || + (instance->load_state == NfcSupportedCardsLoadStateFail)) + break; + + instance->load_context = nfc_supported_cards_load_context_alloc(); + + while(true) { + const NfcSupportedCardsPlugin* plugin = + nfc_supported_cards_get_next_plugin(instance->load_context); + if(plugin == NULL) break; //-V547 + + NfcSupportedCardsPluginCache plugin_cache = {}; //-V779 + plugin_cache.path = furi_string_alloc_set(instance->load_context->file_path); + plugin_cache.protocol = plugin->protocol; + if(plugin->verify) { + plugin_cache.feature |= NfcSupportedCardsPluginFeatureHasVerify; + } + if(plugin->read) { + plugin_cache.feature |= NfcSupportedCardsPluginFeatureHasRead; + } + if(plugin->parse) { + plugin_cache.feature |= NfcSupportedCardsPluginFeatureHasParse; + } + NfcSupportedCardsPluginCache_push_back(instance->plugins_cache_arr, plugin_cache); + } + + nfc_supported_cards_load_context_free(instance->load_context); + + size_t plugins_loaded = NfcSupportedCardsPluginCache_size(instance->plugins_cache_arr); + if(plugins_loaded == 0) { + FURI_LOG_D(TAG, "Plugins not found"); + instance->load_state = NfcSupportedCardsLoadStateFail; + } else { + FURI_LOG_D(TAG, "Loaded %zu plugins", plugins_loaded); + instance->load_state = NfcSupportedCardsLoadStateSuccess; + } + + } while(false); +} + +bool nfc_supported_cards_read(NfcSupportedCards* instance, NfcDevice* device, Nfc* nfc) { + furi_assert(instance); furi_assert(device); furi_assert(nfc); bool card_read = false; - - NfcSupportedCards* supported_cards = nfc_supported_cards_alloc(); + NfcProtocol protocol = nfc_device_get_protocol(device); do { - const NfcSupportedCardsPlugin* plugin = - nfc_supported_cards_get_next_plugin(supported_cards); - if(plugin == NULL) break; //-V547 + if(instance->load_state != NfcSupportedCardsLoadStateSuccess) break; - const NfcProtocol protocol = nfc_device_get_protocol(device); //-V779 - if(plugin->protocol != protocol) continue; + instance->load_context = nfc_supported_cards_load_context_alloc(); - if(plugin->verify) { - if(!plugin->verify(nfc)) continue; + NfcSupportedCardsPluginCache_it_t iter; + for(NfcSupportedCardsPluginCache_it(iter, instance->plugins_cache_arr); + !NfcSupportedCardsPluginCache_end_p(iter); + NfcSupportedCardsPluginCache_next(iter)) { + NfcSupportedCardsPluginCache* plugin_cache = NfcSupportedCardsPluginCache_ref(iter); + if(plugin_cache->protocol != protocol) continue; + if((plugin_cache->feature & NfcSupportedCardsPluginFeatureHasRead) == 0) continue; + + const NfcSupportedCardsPlugin* plugin = + nfc_supported_cards_get_plugin(instance->load_context, plugin_cache->path); + if(plugin == NULL) continue; + + if(plugin->verify) { + if(!plugin->verify(nfc)) continue; + } + + if(plugin->read) { + if(plugin->read(nfc, device)) { + card_read = true; + break; + } + } } - if(plugin->read) { - card_read = plugin->read(nfc, device); - } + nfc_supported_cards_load_context_free(instance->load_context); + } while(false); - } while(!card_read); - - nfc_supported_cards_free(supported_cards); return card_read; } -bool nfc_supported_cards_parse(const NfcDevice* device, FuriString* parsed_data) { +bool nfc_supported_cards_parse( + NfcSupportedCards* instance, + NfcDevice* device, + FuriString* parsed_data) { + furi_assert(instance); furi_assert(device); furi_assert(parsed_data); - bool parsed = false; - - NfcSupportedCards* supported_cards = nfc_supported_cards_alloc(); + bool card_parsed = false; + NfcProtocol protocol = nfc_device_get_protocol(device); do { - const NfcSupportedCardsPlugin* plugin = - nfc_supported_cards_get_next_plugin(supported_cards); - if(plugin == NULL) break; //-V547 + if(instance->load_state != NfcSupportedCardsLoadStateSuccess) break; - const NfcProtocol protocol = nfc_device_get_protocol(device); //-V779 - if(plugin->protocol != protocol) continue; + instance->load_context = nfc_supported_cards_load_context_alloc(); - if(plugin->parse) { - parsed = plugin->parse(device, parsed_data); + NfcSupportedCardsPluginCache_it_t iter; + for(NfcSupportedCardsPluginCache_it(iter, instance->plugins_cache_arr); + !NfcSupportedCardsPluginCache_end_p(iter); + NfcSupportedCardsPluginCache_next(iter)) { + NfcSupportedCardsPluginCache* plugin_cache = NfcSupportedCardsPluginCache_ref(iter); + if(plugin_cache->protocol != protocol) continue; + if((plugin_cache->feature & NfcSupportedCardsPluginFeatureHasParse) == 0) continue; + + const NfcSupportedCardsPlugin* plugin = + nfc_supported_cards_get_plugin(instance->load_context, plugin_cache->path); + if(plugin == NULL) continue; + + if(plugin->parse) { + if(plugin->parse(device, parsed_data)) { + card_parsed = true; + break; + } + } } - } while(!parsed); + nfc_supported_cards_load_context_free(instance->load_context); + } while(false); - nfc_supported_cards_free(supported_cards); - return parsed; + return card_parsed; } diff --git a/applications/main/nfc/helpers/nfc_supported_cards.h b/applications/main/nfc/helpers/nfc_supported_cards.h index 0c25a5b11..7778c6f22 100644 --- a/applications/main/nfc/helpers/nfc_supported_cards.h +++ b/applications/main/nfc/helpers/nfc_supported_cards.h @@ -15,6 +15,34 @@ extern "C" { #endif +/** + * @brief NfcSupportedCards opaque type definition. + */ +typedef struct NfcSupportedCards NfcSupportedCards; + +/** + * @brief Allocate NfcSupportedCards instance. + * + * @return pointer to allocated NfcSupportedCards instance. + */ +NfcSupportedCards* nfc_supported_cards_alloc(); + +/** + * @brief Delete an NfcSupportedCards instance + * + * @param[in] instance pointer to instance to be deleted. + */ +void nfc_supported_cards_free(NfcSupportedCards* instance); + +/** + * @brief Load plugins information to cache. + * + * @note This function must be called before calling read and parse fanctions. + * + * @param[in, out] instance pointer to NfcSupportedCards instance. + */ +void nfc_supported_cards_load_cache(NfcSupportedCards* instance); + /** * @brief Read the card using a custom procedure. * @@ -22,13 +50,14 @@ extern "C" { * try to execute the custom read procedure specified in each. Upon first success, * no further attempts will be made and the function will return. * + * @param[in, out] instance pointer to NfcSupportedCards instance. * @param[in,out] device pointer to a device instance to hold the read data. * @param[in,out] nfc pointer to an Nfc instance. * @returns true if the card was successfully read, false otherwise. * * @see NfcSupportedCardPluginRead for detailed description. */ -bool nfc_supported_cards_read(NfcDevice* device, Nfc* nfc); +bool nfc_supported_cards_read(NfcSupportedCards* instance, NfcDevice* device, Nfc* nfc); /** * @brief Parse raw data into human-readable representation. @@ -37,13 +66,17 @@ bool nfc_supported_cards_read(NfcDevice* device, Nfc* nfc); * try to parse the data according to each implementation. Upon first success, * no further attempts will be made and the function will return. * + * @param[in, out] instance pointer to NfcSupportedCards instance. * @param[in] device pointer to a device instance holding the data is to be parsed. * @param[out] parsed_data pointer to the string to contain the formatted result. * @returns true if the card was successfully parsed, false otherwise. * * @see NfcSupportedCardPluginParse for detailed description. */ -bool nfc_supported_cards_parse(const NfcDevice* device, FuriString* parsed_data); +bool nfc_supported_cards_parse( + NfcSupportedCards* instance, + NfcDevice* device, + FuriString* parsed_data); #ifdef __cplusplus } diff --git a/applications/main/nfc/helpers/protocol_support/nfc_protocol_support.c b/applications/main/nfc/helpers/protocol_support/nfc_protocol_support.c index 9b95fba35..268730606 100644 --- a/applications/main/nfc/helpers/protocol_support/nfc_protocol_support.c +++ b/applications/main/nfc/helpers/protocol_support/nfc_protocol_support.c @@ -8,7 +8,6 @@ #include "nfc_protocol_support.h" #include "nfc/nfc_app_i.h" -#include "nfc/helpers/nfc_supported_cards.h" #include "nfc_protocol_support_defs.h" #include "nfc_protocol_support_gui_common.h" @@ -157,9 +156,11 @@ static void nfc_protocol_support_scene_read_on_enter(NfcApp* instance) { instance->protocols_detected[instance->protocols_detected_selected_idx]; instance->poller = nfc_poller_alloc(instance->nfc, protocol); + view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup); + nfc_supported_cards_load_cache(instance->nfc_supported_cards); + // Start poller with the appropriate callback nfc_protocol_support[protocol]->scene_read.on_enter(instance); - view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup); nfc_blink_detect_start(instance); } @@ -178,7 +179,8 @@ static bool nfc_protocol_support_scene_read_on_event(NfcApp* instance, SceneMana } else if(event.event == NfcCustomEventPollerIncomplete) { nfc_poller_stop(instance->poller); nfc_poller_free(instance->poller); - bool card_read = nfc_supported_cards_read(instance->nfc_device, instance->nfc); + bool card_read = nfc_supported_cards_read( + instance->nfc_supported_cards, instance->nfc_device, instance->nfc); if(card_read) { notification_message(instance->notifications, &sequence_success); scene_manager_next_scene(instance->scene_manager, NfcSceneReadSuccess); @@ -303,7 +305,7 @@ static void nfc_protocol_support_scene_read_success_on_enter(NfcApp* instance) { Widget* widget = instance->widget; FuriString* temp_str = furi_string_alloc(); - if(nfc_supported_cards_parse(instance->nfc_device, temp_str)) { + if(nfc_supported_cards_parse(instance->nfc_supported_cards, instance->nfc_device, temp_str)) { widget_add_text_scroll_element( instance->widget, 0, 0, 128, 52, furi_string_get_cstr(temp_str)); } else { diff --git a/applications/main/nfc/nfc_app.c b/applications/main/nfc/nfc_app.c index 896644811..594a29b2e 100644 --- a/applications/main/nfc/nfc_app.c +++ b/applications/main/nfc/nfc_app.c @@ -52,6 +52,7 @@ NfcApp* nfc_app_alloc() { instance->mf_ul_auth = mf_ultralight_auth_alloc(); instance->mfc_key_cache = mf_classic_key_cache_alloc(); + instance->nfc_supported_cards = nfc_supported_cards_alloc(); // Nfc device instance->nfc_device = nfc_device_alloc(); @@ -111,7 +112,6 @@ NfcApp* nfc_app_alloc() { instance->view_dispatcher, NfcViewWidget, widget_get_view(instance->widget)); // Dict attack - instance->dict_attack = dict_attack_alloc(); view_dispatcher_add_view( instance->view_dispatcher, NfcViewDictAttack, dict_attack_get_view(instance->dict_attack)); @@ -142,6 +142,7 @@ void nfc_app_free(NfcApp* instance) { mf_ultralight_auth_free(instance->mf_ul_auth); mf_classic_key_cache_free(instance->mfc_key_cache); + nfc_supported_cards_free(instance->nfc_supported_cards); // Nfc device nfc_device_free(instance->nfc_device); @@ -340,6 +341,8 @@ bool nfc_load_file(NfcApp* instance, FuriString* path, bool show_dialog) { furi_assert(path); bool result = false; + nfc_supported_cards_load_cache(instance->nfc_supported_cards); + FuriString* load_path = furi_string_alloc(); if(nfc_has_shadow_file_internal(instance, path)) { nfc_set_shadow_file_path(path, load_path); diff --git a/applications/main/nfc/nfc_app_i.h b/applications/main/nfc/nfc_app_i.h index 3c0092007..bde87b12b 100644 --- a/applications/main/nfc/nfc_app_i.h +++ b/applications/main/nfc/nfc_app_i.h @@ -31,6 +31,7 @@ #include "helpers/mf_user_dict.h" #include "helpers/mfkey32_logger.h" #include "helpers/mf_classic_key_cache.h" +#include "helpers/nfc_supported_cards.h" #include #include @@ -132,6 +133,7 @@ struct NfcApp { Mfkey32Logger* mfkey32_logger; MfUserDict* mf_user_dict; MfClassicKeyCache* mfc_key_cache; + NfcSupportedCards* nfc_supported_cards; NfcDevice* nfc_device; Iso14443_3aData* iso14443_3a_edit_data; diff --git a/applications/main/nfc/plugins/supported_cards/mykey.c b/applications/main/nfc/plugins/supported_cards/mykey.c index 69fd18ee3..a0e206f9c 100644 --- a/applications/main/nfc/plugins/supported_cards/mykey.c +++ b/applications/main/nfc/plugins/supported_cards/mykey.c @@ -52,7 +52,7 @@ static bool mykey_parse(const NfcDevice* device, FuriString* parsed_data) { } bool is_blank = mykey_is_blank(data); - furi_string_cat_printf(parsed_data, "Serial#: %08lX\n", __bswap32(data->blocks[7])); + furi_string_cat_printf(parsed_data, "Serial#: %08lX\n", (uint32_t)__bswap32(data->blocks[7])); furi_string_cat_printf(parsed_data, "Blank: %s\n", is_blank ? "yes" : "no"); furi_string_cat_printf(parsed_data, "LockID: %s\n", mykey_has_lockid(data) ? "maybe" : "no"); @@ -66,7 +66,7 @@ static bool mykey_parse(const NfcDevice* device, FuriString* parsed_data) { if(!is_blank) { furi_string_cat_printf( - parsed_data, "\nOp. count: %ld\n", __bswap32(data->blocks[0x12] & 0xFFFFFF00)); + parsed_data, "\nOp. count: %zu\n", (size_t)__bswap32(data->blocks[0x12] & 0xFFFFFF00)); uint32_t block3C = data->blocks[0x3C]; if(block3C == 0xFFFFFFFF) { @@ -75,7 +75,7 @@ static bool mykey_parse(const NfcDevice* device, FuriString* parsed_data) { block3C ^= data->blocks[0x07]; uint32_t startingOffset = ((block3C & 0x30000000) >> 28) | ((block3C & 0x00100000) >> 18); - furi_check(startingOffset < 8); + furi_check(startingOffset < 8); //-V547 for(int txnOffset = 8; txnOffset > 0; txnOffset--) { uint32_t txnBlock = __bswap32(data->blocks[0x34 + ((startingOffset + txnOffset) % 8)]); diff --git a/applications/main/nfc/resources/nfc/assets/mf_classic_dict.nfc b/applications/main/nfc/resources/nfc/assets/mf_classic_dict.nfc index aa36a86aa..4fbc0d20b 100644 --- a/applications/main/nfc/resources/nfc/assets/mf_classic_dict.nfc +++ b/applications/main/nfc/resources/nfc/assets/mf_classic_dict.nfc @@ -3764,85 +3764,69 @@ E10F0E7A8DD5 F833E24C3F1C FA8CA10C7D59 FE98F38F3EE2 -# -########################################## -# added by colonelborkmundus -# "the more, the marriott" mifare project -# -# 20230125-01, Elite Member Marriott Rewards -43012BD9EB87 -# 20230125-02, Elite Member Marriott Rewards -3119A70628EB -# 20230125-03, Elite Member Marriott Rewards -23C9FDD9A366 -# 20230125-04, Elite Member Marriott Rewards +#---------------------------------------------------- +# Added by colonelborkmundus, cleaned by scaff.walker +# "the more, the marriott" Mifare project +# 1k GRADUATE HOTEL +C49DAE1C6049 +209A2B910545 +# 1k WESTIN +8C29F8320617 +5697519A8F02 +7D0A1C277C05 +2058580A941F +C40964215509 +D44CFC178460 +# 1k MARRIOT 7B4DFC6D6525 -# 20230125-05, Elite Member Marriott Rewards -1330824CD356 -# 20230125-06, Elite Member Marriott Rewards +23C9FDD9A366 +3119A70628EB 30AAD6A711EF -# 20230125-07, Fairfield Inn & Suites Marriott +1330824CD356 +43012BD9EB87 +035C70558D7B +9966588CB9A0 +12AB4C37BB8B +# 1k AC HOTELS MARRIOT +8EA8EC3F2320 +7B56B2B38725 +# 1k THE RITZ-CARTLON +30FB20D0EFEF +D20289CD9E6E +66A3B064CC4B +D18296CD9E6E +# 1k UNKNOWN +722538817225 +# 1k ARIA RESORT & CASINO +316B8FAA12EF +A18D9F4E75AF +# 1k FAIRFIELD INN & SUITES MARRIOT 7AEB989A5525 7B3B589A5525 215E9DED9DDF 334E91BE3377 310308EC52EF -# 20230125-08, Moxy Hotels +# 1k RESIDENCE INN MARRIOT +F72CD208FDF9 +# 1k SHERATON +42FC522DE987 +# 1k millenium hotels +132F641C948B +# 1k MOXY HOTELS 20C166C00ADB 9EE3896C4530 -# 20230125-09, Westin Hotels & Resorts -7D0A1C277C05 -2058580A941F -8C29F8320617 -# 20230125-10, Westin Hotels & Resorts -C40964215509 -D44CFC178460 -5697519A8F02 -# 20230125-12, AC Hotels Marriott -7B56B2B38725 -# 20230125-13, AC Hotels Marriott -8EA8EC3F2320 -# 20230125-14, Waldorf Astoria Chicago -011C6CF459E8 -# 20230125-24, Aria Resort & Casino -A18D9F4E75AF -# 20230125-25, Aria Resort & Casino -316B8FAA12EF -# 20230125-26, Residence Inn Mariott +# 1k RESIDENCE INN MARRIOT 3122AE5341EB -# 20230125-27, Residence Inn Mariott -F72CD208FDF9 -# 20230125-28, Marriott -035C70558D7B -# 20230125-29, Marriott -12AB4C37BB8B -# 20230125-30, Marriott -9966588CB9A0 -# 20230125-31, Sheraton -42FC522DE987 -# 20230125-32, The Industrialist -2158E314C3DF -# 20230125-39, The Ritz-Carlton Balharbour -30FB20D0EFEF -# 20230125-40, The Ritz-Carlton Balharbour -66A3B064CC4B -# 20230125-41, The Ritz-Carlton Balharbour -D18296CD9E6E -# 20230125-42, The Ritz-Carlton Balharbour -D20289CD9E6E -# 20230125-44, Graduate Hotels -209A2B910545 -C49DAE1C6049 -# 20230125-46, AmericInn +# 1k AMERICINN 8AC04C1A4A25 -# 20230129-53, Marriott Bonvoy +# 1k THE INDUSTRIALIST +2158E314C3DF +# 1k WALDORF ASTORIA +011C6CF459E8 +# Marriott Bonvoy 6E029927600D 3E173F64C01C C670A9AD6066 -# 1k UNKNOWN -722538817225 -# 1k millenium hotels -132F641C948B ############### from https://github.com/Stepzor11/NFC_keys ############### CCCE24102003 49414556EF4D diff --git a/applications/main/nfc/scenes/nfc_scene_supported_card.c b/applications/main/nfc/scenes/nfc_scene_supported_card.c index cea55b783..e32571bf3 100644 --- a/applications/main/nfc/scenes/nfc_scene_supported_card.c +++ b/applications/main/nfc/scenes/nfc_scene_supported_card.c @@ -1,6 +1,5 @@ #include "nfc/nfc_app_i.h" -#include "nfc/helpers/nfc_supported_cards.h" #include "nfc/helpers/protocol_support/nfc_protocol_support_gui_common.h" void nfc_scene_supported_card_on_enter(void* context) { @@ -8,7 +7,7 @@ void nfc_scene_supported_card_on_enter(void* context) { FuriString* temp_str = furi_string_alloc(); - if(nfc_supported_cards_parse(instance->nfc_device, temp_str)) { + if(nfc_supported_cards_parse(instance->nfc_supported_cards, instance->nfc_device, temp_str)) { widget_add_text_scroll_element( instance->widget, 0, 0, 128, 52, furi_string_get_cstr(temp_str)); widget_add_button_element( diff --git a/lib/nfc/helpers/nfc_util.c b/lib/nfc/helpers/nfc_util.c index 8cb6d57f2..b7a9f5ec9 100644 --- a/lib/nfc/helpers/nfc_util.c +++ b/lib/nfc/helpers/nfc_util.c @@ -35,6 +35,19 @@ uint64_t nfc_util_bytes2num(const uint8_t* src, uint8_t len) { return res; } +uint64_t nfc_util_bytes2num_little_endian(const uint8_t* src, uint8_t len) { + furi_assert(src); + furi_assert(len <= 8); + + uint64_t res = 0; + uint8_t shift = 0; + while(len--) { + res |= ((uint64_t)*src) << (8 * shift++); + src++; + } + return res; +} + uint8_t nfc_util_even_parity32(uint32_t data) { // data ^= data >> 16; // data ^= data >> 8; diff --git a/lib/nfc/helpers/nfc_util.h b/lib/nfc/helpers/nfc_util.h index a9d5a3f8a..39eb40171 100644 --- a/lib/nfc/helpers/nfc_util.h +++ b/lib/nfc/helpers/nfc_util.h @@ -10,6 +10,8 @@ void nfc_util_num2bytes(uint64_t src, uint8_t len, uint8_t* dest); uint64_t nfc_util_bytes2num(const uint8_t* src, uint8_t len); +uint64_t nfc_util_bytes2num_little_endian(const uint8_t* src, uint8_t len); + uint8_t nfc_util_even_parity32(uint32_t data); uint8_t nfc_util_odd_parity8(uint8_t data); diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index d684cc9e9..c166e78ee 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,49.2,, +Version,+,49.3,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 92bff9ced..aa47c10aa 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,49.2,, +Version,+,49.3,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/main/archive/helpers/archive_helpers_ext.h,, Header,+,applications/services/applications.h,, @@ -2574,6 +2574,7 @@ Function,+,nfc_set_mask_receive_time_fc,void,"Nfc*, uint32_t" Function,+,nfc_start,void,"Nfc*, NfcEventCallback, void*" Function,+,nfc_stop,void,Nfc* Function,+,nfc_util_bytes2num,uint64_t,"const uint8_t*, uint8_t" +Function,+,nfc_util_bytes2num_little_endian,uint64_t,"const uint8_t*, uint8_t" Function,+,nfc_util_even_parity32,uint8_t,uint32_t Function,+,nfc_util_num2bytes,void,"uint64_t, uint8_t, uint8_t*" Function,+,nfc_util_odd_parity,void,"const uint8_t*, uint8_t*, uint8_t"