From 9298e567d0aa76d1c0d1818207a22f677c0b723c Mon Sep 17 00:00:00 2001 From: wooferguy Date: Thu, 15 Feb 2024 18:53:57 +1300 Subject: [PATCH 1/8] SubGhz: Magellan Event Code Update Interpret Magellan event codes correctly. --- lib/subghz/protocols/magellan.c | 96 +++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 21 deletions(-) diff --git a/lib/subghz/protocols/magellan.c b/lib/subghz/protocols/magellan.c index a8c7f6342..9d28afb31 100644 --- a/lib/subghz/protocols/magellan.c +++ b/lib/subghz/protocols/magellan.c @@ -360,15 +360,38 @@ static void subghz_protocol_magellan_check_remote_controller(SubGhzBlockGeneric* * * 0x1275EC => 0x12-event codes, 0x75EC-serial (dec 117236) * -* event codes -* bit_0: 1-Open/Motion, 0-close/ok -* bit_1: 1-Tamper On (alarm), 0-Tamper Off (ok) -* bit_2: ? -* bit_3: 1-power on -* bit_4: model type - wireless reed -* bit_5: model type - motion sensor -* bit_6: ? -* bit_7: ? +* Event codes consist of two parts: +* - The upper nibble (bits 7-4) represents the event type: +* - 0x00: Nothing +* - 0x01: Door +* - 0x02: Motion +* - 0x03: Smoke Alarm +* - 0x04: REM1 +* - 0x05: REM1 with subtype Off1 +* - 0x06: REM2 +* - 0x07: REM2 with subtype Off1 +* - Others: Unknown +* - The lower nibble (bits 3-0) represents the event subtype, which varies based on the model type: +* - If the model type is greater than 0x03 (e.g., REM1 or REM2): +* - 0x00: Arm1 +* - 0x01: Btn1 +* - 0x02: Btn2 +* - 0x03: Btn3 +* - 0x08: Reset +* - 0x09: LowBatt +* - 0x0A: BattOk +* - 0x0B: Learn +* - Others: Unknown +* - Otherwise: +* - 0x00: Sealed +* - 0x01: Alarm +* - 0x02: Tamper +* - 0x03: Alarm + Tamper +* - 0x08: Reset +* - 0x09: LowBatt +* - 0x0A: BattOk +* - 0x0B: Learn +* - Others: Unknown * */ uint64_t data_rev = subghz_protocol_blocks_reverse_key(instance->data >> 8, 24); @@ -377,18 +400,49 @@ static void subghz_protocol_magellan_check_remote_controller(SubGhzBlockGeneric* } static void subghz_protocol_magellan_get_event_serialize(uint8_t event, FuriString* output) { - furi_string_cat_printf( - output, - "%s%s%s%s%s%s%s%s", - ((event >> 4) & 0x1 ? (event & 0x1 ? " Open" : " Close") : - (event & 0x1 ? " Motion" : " Ok")), - ((event >> 1) & 0x1 ? ", Tamper On\n(Alarm)" : ""), - ((event >> 2) & 0x1 ? ", ?" : ""), - ((event >> 3) & 0x1 ? ", Power On" : ""), - ((event >> 4) & 0x1 ? ", MT:Wireless_Reed" : ""), - ((event >> 5) & 0x1 ? ", MT:Motion_\nSensor" : ""), - ((event >> 6) & 0x1 ? ", ?" : ""), - ((event >> 7) & 0x1 ? ", ?" : "")); + const char* event_type; + const char* event_subtype; + + switch ((event >> 4) & 0x0F) { + case 0x00: event_type = "Nothing"; break; + case 0x01: event_type = "Door"; break; + case 0x02: event_type = "Motion"; break; + case 0x03: event_type = "Smoke Alarm"; break; + case 0x04: event_type = "REM1"; break; + case 0x05: + event_type = "REM1"; + event_subtype = "Off1"; + furi_string_cat_printf(output, "%s - %s", event_type, event_subtype); + return; + case 0x06: + event_type = "REM2"; + event_subtype = "Off1"; + furi_string_cat_printf(output, "%s - %s", event_type, event_subtype); + return; + default: event_type = "Unknown"; break; + } + + switch (event & 0x0F) { + case 0x00: + event_subtype = (((event >> 4) & 0x0F) > 0x03) ? "Arm1" : "Sealed"; + break; + case 0x01: + event_subtype = (((event >> 4) & 0x0F) > 0x03) ? "Btn1" : "Alarm"; + break; + case 0x02: + event_subtype = (((event >> 4) & 0x0F) > 0x03) ? "Btn2" : "Tamper"; + break; + case 0x03: + event_subtype = (((event >> 4) & 0x0F) > 0x03) ? "Btn3" : "Alarm + Tamper"; + break; + case 0x08: event_subtype = "Reset"; break; + case 0x09: event_subtype = "LowBatt"; break; + case 0x0A: event_subtype = "BattOk"; break; + case 0x0B: event_subtype = "Learn"; break; + default: event_subtype = "Unknown"; break; + } + + furi_string_cat_printf(output, "%s - %s", event_type, event_subtype); } uint8_t subghz_protocol_decoder_magellan_get_hash_data(void* context) { From 597d295743211ae3da7478fc3fb5fe7bdd128e29 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:08:10 +0300 Subject: [PATCH 2/8] merge fixes [ci skip] parsers will be fixed after --- applications/main/clock_app/clock_app.c | 8 ++++---- applications/main/clock_app/clock_app.h | 2 +- applications/main/subghz/scenes/subghz_scene_save_name.c | 2 +- applications/main/subghz/subghz_history.c | 8 ++++---- applications/main/subghz/subghz_history.h | 4 ++-- applications/main/subghz/subghz_i.h | 2 +- lib/toolbox/name_generator.c | 6 +++--- lib/toolbox/name_generator.h | 4 ++-- targets/f7/api_symbols.csv | 4 ++-- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/applications/main/clock_app/clock_app.c b/applications/main/clock_app/clock_app.c index d2c178903..8f4bbd8df 100644 --- a/applications/main/clock_app/clock_app.c +++ b/applications/main/clock_app/clock_app.c @@ -24,9 +24,9 @@ static void clock_render_callback(Canvas* const canvas, void* ctx) { return; } - FuriHalRtcDateTime curr_dt; + DateTime curr_dt; furi_hal_rtc_get_datetime(&curr_dt); - uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt); + uint32_t curr_ts = datetime_datetime_to_timestamp(&curr_dt); char time_string[TIME_LEN]; char date_string[DATE_LEN]; @@ -191,9 +191,9 @@ int32_t clock_app(void* p) { case InputKeyOk:; // START/STOP TIMER - FuriHalRtcDateTime curr_dt; + DateTime curr_dt; furi_hal_rtc_get_datetime(&curr_dt); - uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt); + uint32_t curr_ts = datetime_datetime_to_timestamp(&curr_dt); if(plugin_state->timer_running) { // Update stopped seconds diff --git a/applications/main/clock_app/clock_app.h b/applications/main/clock_app/clock_app.h index 693bdfac0..74648ba33 100644 --- a/applications/main/clock_app/clock_app.h +++ b/applications/main/clock_app/clock_app.h @@ -30,7 +30,7 @@ typedef struct { typedef struct { LocaleDateFormat date_format; LocaleTimeFormat time_format; - FuriHalRtcDateTime datetime; + DateTime datetime; FuriMutex* mutex; FuriMessageQueue* event_queue; uint32_t timer_start_timestamp; diff --git a/applications/main/subghz/scenes/subghz_scene_save_name.c b/applications/main/subghz/scenes/subghz_scene_save_name.c index c0768de4b..0b2a25959 100644 --- a/applications/main/subghz/scenes/subghz_scene_save_name.c +++ b/applications/main/subghz/scenes/subghz_scene_save_name.c @@ -23,7 +23,7 @@ void subghz_scene_save_name_on_enter(void* context) { FuriString* dir_name = furi_string_alloc(); char file_name_buf[SUBGHZ_MAX_LEN_NAME] = {0}; - FuriHalRtcDateTime* datetime = subghz->save_datetime_set ? &subghz->save_datetime : NULL; + DateTime* datetime = subghz->save_datetime_set ? &subghz->save_datetime : NULL; subghz->save_datetime_set = false; if(!subghz_path_is_file(subghz->file_path)) { SubGhzProtocolDecoderBase* decoder_result = subghz_txrx_get_decoder(subghz->txrx); diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index 2f0371985..0bc0d633d 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -12,7 +12,7 @@ typedef struct { FlipperFormat* flipper_string; uint8_t type; SubGhzRadioPreset* preset; - FuriHalRtcDateTime datetime; + DateTime datetime; } SubGhzHistoryItem; ARRAY_DEF(SubGhzHistoryItemArray, SubGhzHistoryItem, M_POD_OPLIST) @@ -131,13 +131,13 @@ const char* subghz_history_get_protocol_name(SubGhzHistory* instance, uint16_t i return furi_string_get_cstr(instance->tmp_string); } -FuriHalRtcDateTime subghz_history_get_datetime(SubGhzHistory* instance, uint16_t idx) { +DateTime subghz_history_get_datetime(SubGhzHistory* instance, uint16_t idx) { furi_assert(instance); SubGhzHistoryItem* item = SubGhzHistoryItemArray_get(instance->history->data, idx); if(item) { return item->datetime; } else { - return (FuriHalRtcDateTime){}; + return (DateTime){}; } } @@ -175,7 +175,7 @@ void subghz_history_get_text_item_menu(SubGhzHistory* instance, FuriString* outp void subghz_history_get_time_item_menu(SubGhzHistory* instance, FuriString* output, uint16_t idx) { SubGhzHistoryItem* item = SubGhzHistoryItemArray_get(instance->history->data, idx); - FuriHalRtcDateTime* t = &item->datetime; + DateTime* t = &item->datetime; furi_string_printf(output, "%.2d:%.2d:%.2d ", t->hour, t->minute, t->second); } diff --git a/applications/main/subghz/subghz_history.h b/applications/main/subghz/subghz_history.h index 2e940a8d8..a0f95a0dd 100644 --- a/applications/main/subghz/subghz_history.h +++ b/applications/main/subghz/subghz_history.h @@ -74,9 +74,9 @@ const char* subghz_history_get_protocol_name(SubGhzHistory* instance, uint16_t i * * @param instance - SubGhzHistory instance * @param idx - record index - * @return datetime - FuriHalRtcDateTime received timestamp + * @return datetime - DateTime received timestamp */ -FuriHalRtcDateTime subghz_history_get_datetime(SubGhzHistory* instance, uint16_t idx); +DateTime subghz_history_get_datetime(SubGhzHistory* instance, uint16_t idx); /** Get string item menu to history[idx] * diff --git a/applications/main/subghz/subghz_i.h b/applications/main/subghz/subghz_i.h index 09caed7a9..d89dcceae 100644 --- a/applications/main/subghz/subghz_i.h +++ b/applications/main/subghz/subghz_i.h @@ -80,7 +80,7 @@ struct SubGhz { bool raw_send_only; bool save_datetime_set; - FuriHalRtcDateTime save_datetime; + DateTime save_datetime; SubGhzLastSettings* last_settings; diff --git a/lib/toolbox/name_generator.c b/lib/toolbox/name_generator.c index 541622b88..9748a7648 100644 --- a/lib/toolbox/name_generator.c +++ b/lib/toolbox/name_generator.c @@ -48,7 +48,7 @@ void name_generator_make_auto_datetime( char* name, size_t max_name_size, const char* prefix, - FuriHalRtcDateTime* custom_time) { + DateTime* custom_time) { if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDetailedFilename)) { name_generator_make_detailed_datetime(name, max_name_size, prefix, custom_time); } else { @@ -88,12 +88,12 @@ void name_generator_make_detailed_datetime( char* name, size_t max_name_size, const char* prefix, - FuriHalRtcDateTime* custom_time) { + DateTime* custom_time) { furi_assert(name); furi_assert(max_name_size); furi_assert(prefix); - FuriHalRtcDateTime dateTime; + DateTime dateTime; if(custom_time) { dateTime = *custom_time; } else { diff --git a/lib/toolbox/name_generator.h b/lib/toolbox/name_generator.h index ac9cdf6f5..e6c443688 100644 --- a/lib/toolbox/name_generator.h +++ b/lib/toolbox/name_generator.h @@ -19,7 +19,7 @@ void name_generator_make_auto_datetime( char* name, size_t max_name_size, const char* prefix, - FuriHalRtcDateTime* custom_time); + DateTime* custom_time); /** Generates random name * @@ -41,7 +41,7 @@ void name_generator_make_detailed_datetime( char* name, size_t max_name_size, const char* prefix, - FuriHalRtcDateTime* custom_time); + DateTime* custom_time); #ifdef __cplusplus } diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index b6b331003..d07360337 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -2604,9 +2604,9 @@ Function,-,music_worker_set_volume,void,"MusicWorker*, float" Function,-,music_worker_start,void,MusicWorker* Function,-,music_worker_stop,void,MusicWorker* Function,+,name_generator_make_auto,void,"char*, size_t, const char*" -Function,+,name_generator_make_auto_datetime,void,"char*, size_t, const char*, FuriHalRtcDateTime*" +Function,+,name_generator_make_auto_datetime,void,"char*, size_t, const char*, DateTime*" Function,+,name_generator_make_detailed,void,"char*, size_t, const char*" -Function,+,name_generator_make_detailed_datetime,void,"char*, size_t, const char*, FuriHalRtcDateTime*" +Function,+,name_generator_make_detailed_datetime,void,"char*, size_t, const char*, DateTime*" Function,+,name_generator_make_random,void,"char*, size_t" Function,+,name_generator_make_random_prefixed,void,"char*, size_t, const char*" Function,-,nan,double,const char* From 2c5973be2258713b5dd190b4bedc8669fab542e5 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:09:49 +0300 Subject: [PATCH 3/8] better naming [ci skip] 16 clock merged but still not working, waiting for updates in OFW --- lib/lfrfid/protocols/lfrfid_protocols.c | 4 ++-- lib/lfrfid/protocols/lfrfid_protocols.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/lfrfid/protocols/lfrfid_protocols.c b/lib/lfrfid/protocols/lfrfid_protocols.c index a8d0ff280..10998399a 100644 --- a/lib/lfrfid/protocols/lfrfid_protocols.c +++ b/lib/lfrfid/protocols/lfrfid_protocols.c @@ -20,8 +20,8 @@ const ProtocolBase* lfrfid_protocols[] = { [LFRFIDProtocolEM4100] = &protocol_em4100, - [LFRFIDProtocolEM410032] = &protocol_em4100_32, - [LFRFIDProtocolEM410016] = &protocol_em4100_16, + [LFRFIDProtocolEM4100_32] = &protocol_em4100_32, + [LFRFIDProtocolEM4100_16] = &protocol_em4100_16, [LFRFIDProtocolH10301] = &protocol_h10301, [LFRFIDProtocolIdteck] = &protocol_idteck, [LFRFIDProtocolIndala26] = &protocol_indala26, diff --git a/lib/lfrfid/protocols/lfrfid_protocols.h b/lib/lfrfid/protocols/lfrfid_protocols.h index 64a9fcba2..2c7ed828d 100644 --- a/lib/lfrfid/protocols/lfrfid_protocols.h +++ b/lib/lfrfid/protocols/lfrfid_protocols.h @@ -9,8 +9,8 @@ typedef enum { typedef enum { LFRFIDProtocolEM4100, - LFRFIDProtocolEM410032, - LFRFIDProtocolEM410016, + LFRFIDProtocolEM4100_32, + LFRFIDProtocolEM4100_16, LFRFIDProtocolH10301, LFRFIDProtocolIdteck, LFRFIDProtocolIndala26, From 7b01a33b3fc8189e085b54e95e88d85f9b505c53 Mon Sep 17 00:00:00 2001 From: Methodius Date: Thu, 15 Feb 2024 21:53:06 +0900 Subject: [PATCH 4/8] read transactions fail on some cards fixed --- .../helpers/protocol_support/emv/emv_render.c | 1 + lib/nfc/protocols/emv/emv_poller.c | 6 +- lib/nfc/protocols/emv/emv_poller.h | 2 +- lib/nfc/protocols/emv/emv_poller_i.c | 124 +++++++++--------- lib/nfc/protocols/emv/emv_poller_i.h | 1 + targets/f7/api_symbols.csv | 2 +- 6 files changed, 72 insertions(+), 64 deletions(-) diff --git a/applications/main/nfc/helpers/protocol_support/emv/emv_render.c b/applications/main/nfc/helpers/protocol_support/emv/emv_render.c index 9e315ff47..ba6866a50 100644 --- a/applications/main/nfc/helpers/protocol_support/emv/emv_render.c +++ b/applications/main/nfc/helpers/protocol_support/emv/emv_render.c @@ -112,6 +112,7 @@ void nfc_render_emv_transactions(const EmvApplication* apl, FuriString* str) { if(!apl->trans[i].amount) { furi_string_cat_printf(str, "???"); } else { + FURI_LOG_D("EMV Render", "Amount: %llX\n", apl->trans[i].amount); uint8_t amount_bytes[6]; bit_lib_num_to_bytes_le(apl->trans[i].amount, 6, amount_bytes); diff --git a/lib/nfc/protocols/emv/emv_poller.c b/lib/nfc/protocols/emv/emv_poller.c index 9acb854d6..3042352fe 100644 --- a/lib/nfc/protocols/emv/emv_poller.c +++ b/lib/nfc/protocols/emv/emv_poller.c @@ -99,7 +99,8 @@ static NfcCommand emv_poller_handler_get_processing_options(EmvPoller* instance) } static NfcCommand emv_poller_handler_read_files(EmvPoller* instance) { - emv_poller_read_afl(instance); + // Search PAN + emv_poller_read_afl(instance, false, &instance->records_mask); emv_poller_read_log_entry(instance); instance->state = EmvPollerStateReadExtra; @@ -110,6 +111,9 @@ static NfcCommand emv_poller_handler_read_extra_data(EmvPoller* instance) { emv_poller_get_last_online_atc(instance); emv_poller_get_pin_try_counter(instance); + // Search cardholder name. This operation may break communication with the card, so it should be the last one + emv_poller_read_afl(instance, true, &instance->records_mask); + instance->state = EmvPollerStateReadSuccess; return NfcCommandContinue; } diff --git a/lib/nfc/protocols/emv/emv_poller.h b/lib/nfc/protocols/emv/emv_poller.h index 64bd0be9d..9cae80195 100644 --- a/lib/nfc/protocols/emv/emv_poller.h +++ b/lib/nfc/protocols/emv/emv_poller.h @@ -46,7 +46,7 @@ EmvError emv_poller_get_processing_options(EmvPoller* instance); EmvError emv_poller_read_sfi_record(EmvPoller* instance, uint8_t sfi, uint8_t record_num); -EmvError emv_poller_read_afl(EmvPoller* instance); +EmvError emv_poller_read_afl(EmvPoller* instance, bool bruteforce_sfi, uint16_t* readed_mask); EmvError emv_poller_read_log_entry(EmvPoller* instance); diff --git a/lib/nfc/protocols/emv/emv_poller_i.c b/lib/nfc/protocols/emv/emv_poller_i.c index e72432287..74734c894 100644 --- a/lib/nfc/protocols/emv/emv_poller_i.c +++ b/lib/nfc/protocols/emv/emv_poller_i.c @@ -621,75 +621,77 @@ EmvError emv_poller_read_sfi_record(EmvPoller* instance, uint8_t sfi, uint8_t re return error; } -EmvError emv_poller_read_afl(EmvPoller* instance) { +EmvError emv_poller_read_afl(EmvPoller* instance, bool bruteforce_sfi, uint16_t* readed_mask) { EmvError error = EmvErrorNone; - - APDU* afl = &instance->data->emv_application.afl; - - if(afl->size == 0) { - return false; - } - - FURI_LOG_D(TAG, "Search PAN in SFI"); - - uint8_t sfi_2_mask = 0; - uint8_t sfi_3_mask = 0; - bool pan_fetched = (instance->data->emv_application.pan_len); - - // Iterate through all files - for(size_t i = 0; i < instance->data->emv_application.afl.size; i += 4) { - uint8_t sfi = afl->data[i] >> 3; - uint8_t record_start = afl->data[i + 1]; - uint8_t record_end = afl->data[i + 2]; - // Iterate through all records in file - for(uint8_t record = record_start; record <= record_end; ++record) { - if((sfi == 2) && (record < 8)) FURI_BIT_SET(sfi_2_mask, record); - if((sfi == 3) && (record < 8)) FURI_BIT_SET(sfi_3_mask, record); - - error = emv_poller_read_sfi_record(instance, sfi, record); - if(error != EmvErrorNone) break; - - if(!emv_decode_response_tlv( - bit_buffer_get_data(instance->rx_buffer), - bit_buffer_get_size_bytes(instance->rx_buffer), - &instance->data->emv_application)) { - error = EmvErrorProtocol; - FURI_LOG_T(TAG, "Failed to parse SFI 0x%X record %d", sfi, record); - } - - if(instance->data->emv_application.pan_len) pan_fetched = true; // Card number fetched - } - } bool cardholder_name_fetched = strlen(instance->data->emv_application.cardholder_name); - // Bruteforse files 2-3 - FURI_LOG_T(TAG, "Bruteforce files 2-3"); - for(size_t sfi = 2; sfi <= 3; sfi++) { - // Iterate through records 1-5 in file - for(size_t record = 1; record <= 5; record++) { - // Skip previously readed sfi - if(sfi == 2) { - if((sfi_2_mask >> record) & (0b1)) continue; - } - if(sfi == 3) { - if((sfi_3_mask >> record) & (0b1)) continue; - } - if(strlen(instance->data->emv_application.cardholder_name)) - cardholder_name_fetched = true; - error = emv_poller_read_sfi_record(instance, sfi, record); - if(error != EmvErrorNone) break; + if(!bruteforce_sfi) { + // SEARCH PAN, RETURN WHEN FOUND + APDU* afl = &instance->data->emv_application.afl; - if(!emv_decode_response_tlv( - bit_buffer_get_data(instance->rx_buffer), - bit_buffer_get_size_bytes(instance->rx_buffer), - &instance->data->emv_application)) { - error = EmvErrorProtocol; - FURI_LOG_T(TAG, "Failed to parse SFI 0x%X record %d", sfi, record); + if(afl->size == 0) { + return false; + } + + FURI_LOG_D(TAG, "Search PAN in SFI"); + + // Iterate through all files + for(size_t i = 0; i < instance->data->emv_application.afl.size; i += 4) { + uint8_t sfi = afl->data[i] >> 3; + uint8_t record_start = afl->data[i + 1]; + uint8_t record_end = afl->data[i + 2]; + // Iterate through all records in file + for(uint8_t record = record_start; record <= record_end; ++record) { + if((sfi <= 3) && (record <= 5)) + FURI_BIT_SET( + *readed_mask, + record + ((sfi - 2) * 8)); //black magic: mask 0003333300022222 + + error = emv_poller_read_sfi_record(instance, sfi, record); + if(error != EmvErrorNone) break; + + if(!emv_decode_response_tlv( + bit_buffer_get_data(instance->rx_buffer), + bit_buffer_get_size_bytes(instance->rx_buffer), + &instance->data->emv_application)) { + error = EmvErrorProtocol; + FURI_LOG_T(TAG, "Failed to parse SFI 0x%X record %d", sfi, record); + } + + if(instance->data->emv_application.pan_len) { + pan_fetched = true; + break; + } // Card number fetched + } + if(pan_fetched) break; + } + } else { // BRUTFORCE FILES 2-3. SEARCH CARDHOLDER NAME + FURI_LOG_T(TAG, "Bruteforce files 2-3"); + for(size_t sfi = 2; sfi <= 3; sfi++) { + // Iterate through records 1-5 in file + for(size_t record = 1; record <= 5; record++) { + // Skip previously readed sfi + if((*readed_mask >> (record + ((sfi - 2) * 8))) & (0b1)) continue; + + error = emv_poller_read_sfi_record(instance, sfi, record); + if(error != EmvErrorNone) break; + + if(!emv_decode_response_tlv( + bit_buffer_get_data(instance->rx_buffer), + bit_buffer_get_size_bytes(instance->rx_buffer), + &instance->data->emv_application)) { + error = EmvErrorProtocol; + FURI_LOG_T(TAG, "Failed to parse SFI 0x%X record %d", sfi, record); + } + + if(strlen(instance->data->emv_application.cardholder_name)) + cardholder_name_fetched = true; } } } - if(pan_fetched || cardholder_name_fetched) + + if((pan_fetched && (!bruteforce_sfi)) || (cardholder_name_fetched && bruteforce_sfi)) return EmvErrorNone; else return error; diff --git a/lib/nfc/protocols/emv/emv_poller_i.h b/lib/nfc/protocols/emv/emv_poller_i.h index 704365747..cec48f800 100644 --- a/lib/nfc/protocols/emv/emv_poller_i.h +++ b/lib/nfc/protocols/emv/emv_poller_i.h @@ -39,6 +39,7 @@ struct EmvPoller { EmvPollerEvent emv_event; NfcGenericEvent general_event; NfcGenericCallback callback; + uint16_t records_mask; void* context; }; diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 84bae90ab..a2b2b6614 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -909,7 +909,7 @@ Function,+,emv_load,_Bool,"EmvData*, FlipperFormat*, uint32_t" Function,+,emv_poller_get_last_online_atc,EmvError,EmvPoller* Function,+,emv_poller_get_pin_try_counter,EmvError,EmvPoller* Function,+,emv_poller_get_processing_options,EmvError,EmvPoller* -Function,+,emv_poller_read_afl,EmvError,EmvPoller* +Function,+,emv_poller_read_afl,EmvError,"EmvPoller*, _Bool, uint16_t*" Function,+,emv_poller_read_log_entry,EmvError,EmvPoller* Function,+,emv_poller_read_sfi_record,EmvError,"EmvPoller*, uint8_t, uint8_t" Function,+,emv_poller_select_application,EmvError,EmvPoller* From 913659325ba27966f2b16e31719151ae903e946c Mon Sep 17 00:00:00 2001 From: Methodius Date: Fri, 16 Feb 2024 00:32:30 +0900 Subject: [PATCH 5/8] build fixed. finally, datetime --- .../nfc/plugins/supported_cards/clipper.c | 2 +- .../main/nfc/plugins/supported_cards/emv.c | 2 - .../main/nfc/plugins/supported_cards/itso.c | 2 +- .../main/nfc/plugins/supported_cards/kazan.c | 8 +-- .../main/nfc/plugins/supported_cards/mykey.c | 3 +- .../main/nfc/plugins/supported_cards/opal.c | 2 +- .../plugins/supported_cards/social_moscow.c | 64 ++++++++--------- .../main/nfc/plugins/supported_cards/troika.c | 68 +++++++++---------- .../nfc/plugins/supported_cards/two_cities.c | 5 +- .../main/nfc/plugins/supported_cards/umarsh.c | 4 +- .../plugins/supported_cards/zolotaya_korona.c | 8 +-- .../supported_cards/zolotaya_korona_online.c | 1 - 12 files changed, 82 insertions(+), 87 deletions(-) diff --git a/applications/main/nfc/plugins/supported_cards/clipper.c b/applications/main/nfc/plugins/supported_cards/clipper.c index 00820721a..62d06e6ef 100644 --- a/applications/main/nfc/plugins/supported_cards/clipper.c +++ b/applications/main/nfc/plugins/supported_cards/clipper.c @@ -25,7 +25,7 @@ #include #include -#include +#include #include // diff --git a/applications/main/nfc/plugins/supported_cards/emv.c b/applications/main/nfc/plugins/supported_cards/emv.c index 26bfe265b..22ec653d2 100644 --- a/applications/main/nfc/plugins/supported_cards/emv.c +++ b/applications/main/nfc/plugins/supported_cards/emv.c @@ -23,8 +23,6 @@ #include "protocols/emv/emv.h" #include "helpers/nfc_emv_parser.h" -#include - #define TAG "EMV" bool emv_get_currency_name(uint16_t cur_code, FuriString* currency_name) { diff --git a/applications/main/nfc/plugins/supported_cards/itso.c b/applications/main/nfc/plugins/supported_cards/itso.c index 2385696d7..ea7314048 100644 --- a/applications/main/nfc/plugins/supported_cards/itso.c +++ b/applications/main/nfc/plugins/supported_cards/itso.c @@ -5,7 +5,7 @@ #include #include -#include +#include static const MfDesfireApplicationId itso_app_id = {.data = {0x16, 0x02, 0xa0}}; static const MfDesfireFileId itso_file_id = 0x0f; diff --git a/applications/main/nfc/plugins/supported_cards/kazan.c b/applications/main/nfc/plugins/supported_cards/kazan.c index 361f7826b..ffd3a4871 100644 --- a/applications/main/nfc/plugins/supported_cards/kazan.c +++ b/applications/main/nfc/plugins/supported_cards/kazan.c @@ -22,7 +22,7 @@ #include #include -#include +#include #define TAG "Kazan" @@ -282,12 +282,12 @@ static bool kazan_parse(const NfcDevice* device, FuriString* parsed_data) { enum SubscriptionType subscription_type = get_subscription_type(block_start_ptr[0], tariff_name); - FuriHalRtcDateTime valid_from; + DateTime valid_from; valid_from.year = 2000 + block_start_ptr[1]; valid_from.month = block_start_ptr[2]; valid_from.day = block_start_ptr[3]; - FuriHalRtcDateTime valid_to; + DateTime valid_to; valid_to.year = 2000 + block_start_ptr[4]; valid_to.month = block_start_ptr[5]; valid_to.day = block_start_ptr[6]; @@ -295,7 +295,7 @@ static bool kazan_parse(const NfcDevice* device, FuriString* parsed_data) { const uint8_t last_trip_block_number = 2; block_start_ptr = &data->block[start_block_num + last_trip_block_number].data[1]; - FuriHalRtcDateTime last_trip; + DateTime last_trip; last_trip.year = 2000 + block_start_ptr[0]; last_trip.month = block_start_ptr[1]; last_trip.day = block_start_ptr[2]; diff --git a/applications/main/nfc/plugins/supported_cards/mykey.c b/applications/main/nfc/plugins/supported_cards/mykey.c index 8e2d5cf11..70b9fa6a9 100644 --- a/applications/main/nfc/plugins/supported_cards/mykey.c +++ b/applications/main/nfc/plugins/supported_cards/mykey.c @@ -1,9 +1,10 @@ #include "nfc_supported_card_plugin.h" #include -#include #include +#include + #define TAG "MyKey" const uint32_t blankBlock18 = 0x480FCD8F, blankBlock19 = 0x070082C0; diff --git a/applications/main/nfc/plugins/supported_cards/opal.c b/applications/main/nfc/plugins/supported_cards/opal.c index b994733af..f6a4d22a2 100644 --- a/applications/main/nfc/plugins/supported_cards/opal.c +++ b/applications/main/nfc/plugins/supported_cards/opal.c @@ -34,7 +34,7 @@ #include #include -#include +#include static const MfDesfireApplicationId opal_app_id = {.data = {0x31, 0x45, 0x53}}; diff --git a/applications/main/nfc/plugins/supported_cards/social_moscow.c b/applications/main/nfc/plugins/supported_cards/social_moscow.c index 673a67d4b..6f26cf833 100644 --- a/applications/main/nfc/plugins/supported_cards/social_moscow.c +++ b/applications/main/nfc/plugins/supported_cards/social_moscow.c @@ -4,7 +4,7 @@ #include #include -#include +#include #define TAG "Social_Moscow" @@ -61,24 +61,24 @@ static const MfClassicKeyPair social_moscow_4k_keys[] = { #define TOPBIT(X) (1 << ((X)-1)) -void from_days_to_datetime(uint16_t days, FuriHalRtcDateTime* datetime, uint16_t start_year) { +void from_days_to_datetime(uint16_t days, DateTime* datetime, uint16_t start_year) { uint32_t timestamp = days * 24 * 60 * 60; - FuriHalRtcDateTime start_datetime = {0}; + DateTime start_datetime = {0}; start_datetime.year = start_year - 1; start_datetime.month = 12; start_datetime.day = 31; - timestamp += furi_hal_rtc_datetime_to_timestamp(&start_datetime); - furi_hal_rtc_timestamp_to_datetime(timestamp, datetime); + timestamp += datetime_datetime_to_timestamp(&start_datetime); + datetime_timestamp_to_datetime(timestamp, datetime); } -void from_minutes_to_datetime(uint32_t minutes, FuriHalRtcDateTime* datetime, uint16_t start_year) { +void from_minutes_to_datetime(uint32_t minutes, DateTime* datetime, uint16_t start_year) { uint32_t timestamp = minutes * 60; - FuriHalRtcDateTime start_datetime = {0}; + DateTime start_datetime = {0}; start_datetime.year = start_year - 1; start_datetime.month = 12; start_datetime.day = 31; - timestamp += furi_hal_rtc_datetime_to_timestamp(&start_datetime); - furi_hal_rtc_timestamp_to_datetime(timestamp, datetime); + timestamp += datetime_datetime_to_timestamp(&start_datetime); + datetime_timestamp_to_datetime(timestamp, datetime); } bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { @@ -221,10 +221,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_extended, card_crc16_2); card_validator = card_validator1 * 1024 + card_validator2; - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_start_trip_date)*24 * 60 + card_start_trip_time, &card_start_trip_minutes_s, @@ -283,7 +283,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_hash, card_valid_from_date, card_rfu3); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); furi_string_printf( @@ -336,10 +336,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_transport_type3, card_transport_type4, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 2016); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( card_start_trip_minutes - (2 * 24 * 60), &card_start_trip_minutes_s, 2016); furi_string_printf( @@ -397,9 +397,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_transport_type, card_rfu3, card_transfer_in_metro); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_start_trip_date - 1) * 24 * 60 + card_start_trip_time, &card_start_trip_minutes_s, @@ -478,9 +478,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_transport_type2, card_rfu5, card_transfer_in_metro); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_start_trip_date - 1) * 24 * 60 + card_start_trip_time, &card_start_trip_minutes_s, @@ -548,10 +548,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_blocked, card_zoo, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( card_start_trip_minutes - (2 * 24 * 60), &card_start_trip_minutes_s, 1992); furi_string_printf( @@ -618,10 +618,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_blocked, card_extended, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 2016); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_valid_to_date - 1) * 24 * 60 + card_valid_for_minutes - card_start_trip_neg_minutes, @@ -684,10 +684,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_transport_type3, card_transport_type4, card_blocked); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016); furi_string_printf( result, @@ -760,10 +760,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_blocked, card_extended, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2016); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_use_before_date + 1) * 24 * 60 + card_valid_for_minutes - card_start_trip_neg_minutes, @@ -825,11 +825,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_route, card_passages_ground_transport, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2019); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( card_start_trip_minutes - (24 * 60), &card_start_trip_minutes_s, 2019); furi_string_printf( @@ -893,10 +893,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_extended, card_route, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 2019); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( card_valid_from_date + card_valid_for_minutes - card_start_trip_neg_minutes - 24 * 60, &card_start_trip_minutes_s, @@ -959,7 +959,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_app_code4, card_type4, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992); furi_string_printf( @@ -995,7 +995,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_valid_to_minutes, card_valid_by_date, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992); furi_string_printf( diff --git a/applications/main/nfc/plugins/supported_cards/troika.c b/applications/main/nfc/plugins/supported_cards/troika.c index bc3992a39..991d5be09 100644 --- a/applications/main/nfc/plugins/supported_cards/troika.c +++ b/applications/main/nfc/plugins/supported_cards/troika.c @@ -4,7 +4,7 @@ #include #include -#include +#include #define TAG "Troika" @@ -62,24 +62,24 @@ static const MfClassicKeyPair troika_4k_keys[] = { #define TOPBIT(X) (1 << ((X)-1)) -void from_days_to_datetime(uint16_t days, FuriHalRtcDateTime* datetime, uint16_t start_year) { +void from_days_to_datetime(uint16_t days, DateTime* datetime, uint16_t start_year) { uint32_t timestamp = days * 24 * 60 * 60; - FuriHalRtcDateTime start_datetime = {0}; + DateTime start_datetime = {0}; start_datetime.year = start_year - 1; start_datetime.month = 12; start_datetime.day = 31; - timestamp += furi_hal_rtc_datetime_to_timestamp(&start_datetime); - furi_hal_rtc_timestamp_to_datetime(timestamp, datetime); + timestamp += datetime_datetime_to_timestamp(&start_datetime); + datetime_timestamp_to_datetime(timestamp, datetime); } -void from_minutes_to_datetime(uint32_t minutes, FuriHalRtcDateTime* datetime, uint16_t start_year) { +void from_minutes_to_datetime(uint32_t minutes, DateTime* datetime, uint16_t start_year) { uint32_t timestamp = minutes * 60; - FuriHalRtcDateTime start_datetime = {0}; + DateTime start_datetime = {0}; start_datetime.year = start_year - 1; start_datetime.month = 12; start_datetime.day = 31; - timestamp += furi_hal_rtc_datetime_to_timestamp(&start_datetime); - furi_hal_rtc_timestamp_to_datetime(timestamp, datetime); + timestamp += datetime_datetime_to_timestamp(&start_datetime); + datetime_timestamp_to_datetime(timestamp, datetime); } bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { @@ -170,10 +170,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { if(card_valid_by_date == 0) { return false; } - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_start_trip_date)*24 * 60 + card_start_trip_time, &card_start_trip_minutes_s, @@ -247,10 +247,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_extended, card_crc16_2); card_validator = card_validator1 * 1024 + card_validator2; - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_start_trip_date)*24 * 60 + card_start_trip_time, &card_start_trip_minutes_s, @@ -309,7 +309,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_hash, card_valid_from_date, card_rfu3); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); furi_string_printf( @@ -362,10 +362,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_transport_type3, card_transport_type4, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2016); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016); furi_string_printf( result, @@ -422,9 +422,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_transport_type, card_rfu3, card_transfer_in_metro); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_start_trip_date)*24 * 60 + card_start_trip_time, &card_start_trip_minutes_s, @@ -503,9 +503,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_transport_type2, card_rfu5, card_transfer_in_metro); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_start_trip_date)*24 * 60 + card_start_trip_time, &card_start_trip_minutes_s, @@ -573,10 +573,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_blocked, card_zoo, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 1992); furi_string_printf( result, @@ -642,10 +642,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_blocked, card_extended, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2016); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_valid_to_date)*24 * 60 + card_valid_for_minutes - card_start_trip_neg_minutes, &card_start_trip_minutes_s, @@ -707,10 +707,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_transport_type3, card_transport_type4, card_blocked); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016); furi_string_printf( result, @@ -783,10 +783,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_blocked, card_extended, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2016); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( (card_use_before_date + 1) * 24 * 60 + card_valid_for_minutes - card_start_trip_neg_minutes, @@ -848,11 +848,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_route, card_passages_ground_transport, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2019); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2019); furi_string_printf( result, @@ -915,10 +915,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_extended, card_route, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2019); - FuriHalRtcDateTime card_start_trip_minutes_s = {0}; + DateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( card_valid_from_date + card_valid_for_minutes - card_start_trip_neg_minutes, &card_start_trip_minutes_s, @@ -981,7 +981,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_app_code4, card_type4, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992); furi_string_printf( @@ -1017,7 +1017,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_valid_to_minutes, card_valid_by_date, card_hash); - FuriHalRtcDateTime card_use_before_date_s = {0}; + DateTime card_use_before_date_s = {0}; from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992); furi_string_printf( diff --git a/applications/main/nfc/plugins/supported_cards/two_cities.c b/applications/main/nfc/plugins/supported_cards/two_cities.c index 93fd55db7..c957a9c43 100644 --- a/applications/main/nfc/plugins/supported_cards/two_cities.c +++ b/applications/main/nfc/plugins/supported_cards/two_cities.c @@ -1,11 +1,10 @@ #include "nfc_supported_card_plugin.h" - #include -#include -#include #include +#include + #define TAG "TwoCities" typedef struct { diff --git a/applications/main/nfc/plugins/supported_cards/umarsh.c b/applications/main/nfc/plugins/supported_cards/umarsh.c index 19716c8b1..9ee8e48ce 100644 --- a/applications/main/nfc/plugins/supported_cards/umarsh.c +++ b/applications/main/nfc/plugins/supported_cards/umarsh.c @@ -29,9 +29,7 @@ #include "protocols/mf_classic/mf_classic.h" #include -#include -#include -#include +#include #define TAG "Umarsh" diff --git a/applications/main/nfc/plugins/supported_cards/zolotaya_korona.c b/applications/main/nfc/plugins/supported_cards/zolotaya_korona.c index e1aa9abcf..5ca9b3517 100644 --- a/applications/main/nfc/plugins/supported_cards/zolotaya_korona.c +++ b/applications/main/nfc/plugins/supported_cards/zolotaya_korona.c @@ -97,8 +97,8 @@ static bool zolotaya_korona_parse(const NfcDevice* device, FuriString* parsed_da const uint8_t last_refill_amount_kop = last_refill_amount % 100; const uint16_t refill_counter = bit_lib_bytes_to_num_le(block_start_ptr + 10, 2); - FuriHalRtcDateTime last_refill_datetime = {0}; - furi_hal_rtc_timestamp_to_datetime(last_refill_timestamp, &last_refill_datetime); + DateTime last_refill_datetime = {0}; + datetime_timestamp_to_datetime(last_refill_timestamp, &last_refill_datetime); // block 2: trip block block_start_ptr = &data->block[start_trip_block_number + 2].data[0]; @@ -110,8 +110,8 @@ static bool zolotaya_korona_parse(const NfcDevice* device, FuriString* parsed_da const uint32_t prev_balance_rub = prev_balance / 100; const uint8_t prev_balance_kop = prev_balance % 100; - FuriHalRtcDateTime last_trip_datetime = {0}; - furi_hal_rtc_timestamp_to_datetime(last_trip_timestamp, &last_trip_datetime); + DateTime last_trip_datetime = {0}; + datetime_timestamp_to_datetime(last_trip_timestamp, &last_trip_datetime); // PARSE DATA FROM PURSE SECTOR const uint8_t start_purse_block_number = diff --git a/applications/main/nfc/plugins/supported_cards/zolotaya_korona_online.c b/applications/main/nfc/plugins/supported_cards/zolotaya_korona_online.c index 3dbd509bb..1c43f5776 100644 --- a/applications/main/nfc/plugins/supported_cards/zolotaya_korona_online.c +++ b/applications/main/nfc/plugins/supported_cards/zolotaya_korona_online.c @@ -23,7 +23,6 @@ #include "protocols/mf_classic/mf_classic.h" #include -#include #define TAG "Zolotaya Korona Online" From 4d73794100d21bf30d027c9ec5a1d9232586a15e Mon Sep 17 00:00:00 2001 From: Methodius Date: Fri, 16 Feb 2024 00:47:03 +0900 Subject: [PATCH 6/8] emv parser day ??->dd --- applications/main/nfc/plugins/supported_cards/emv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/main/nfc/plugins/supported_cards/emv.c b/applications/main/nfc/plugins/supported_cards/emv.c index 663f9a608..0f2c04c45 100644 --- a/applications/main/nfc/plugins/supported_cards/emv.c +++ b/applications/main/nfc/plugins/supported_cards/emv.c @@ -99,7 +99,7 @@ static bool emv_parse(const NfcDevice* device, FuriString* parsed_data) { } if(app.effective_month) { - char day[] = "??"; + char day[] = "dd"; if(app.effective_day) itoa(app.effective_day, day, 16); if(day[1] == '\0') { day[1] = day[0]; @@ -117,7 +117,7 @@ static bool emv_parse(const NfcDevice* device, FuriString* parsed_data) { } if(app.exp_month) { - char day[] = "??"; + char day[] = "dd"; if(app.exp_day) itoa(app.exp_day, day, 16); if(day[1] == '\0') { day[1] = day[0]; From 698d0b4b4960ea1a3c92e1f2cf36fdfc7551646b Mon Sep 17 00:00:00 2001 From: Methodius Date: Fri, 16 Feb 2024 01:26:31 +0900 Subject: [PATCH 7/8] emv parser day dd->-- --- applications/main/nfc/plugins/supported_cards/emv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/main/nfc/plugins/supported_cards/emv.c b/applications/main/nfc/plugins/supported_cards/emv.c index 8bef98c74..4d9372be6 100644 --- a/applications/main/nfc/plugins/supported_cards/emv.c +++ b/applications/main/nfc/plugins/supported_cards/emv.c @@ -97,7 +97,7 @@ static bool emv_parse(const NfcDevice* device, FuriString* parsed_data) { } if(app.effective_month) { - char day[] = "dd"; + char day[] = "--"; if(app.effective_day) itoa(app.effective_day, day, 16); if(day[1] == '\0') { day[1] = day[0]; @@ -115,7 +115,7 @@ static bool emv_parse(const NfcDevice* device, FuriString* parsed_data) { } if(app.exp_month) { - char day[] = "dd"; + char day[] = "--"; if(app.exp_day) itoa(app.exp_day, day, 16); if(day[1] == '\0') { day[1] = day[0]; From 4adb492e293454144ed5febfd619c40bdb309c93 Mon Sep 17 00:00:00 2001 From: Methodius Date: Fri, 16 Feb 2024 01:33:42 +0900 Subject: [PATCH 8/8] nevermind. target 18 --- targets/f18/api_symbols.csv | 43 +------------------------------------ 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index 9a6b425d6..6d994653b 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -621,20 +621,11 @@ Function,+,ble_glue_start,_Bool, Function,+,ble_glue_thread_stop,void, Function,+,ble_glue_wait_for_c2_start,_Bool,int32_t Function,-,bsearch,void*,"const void*, const void*, size_t, size_t, __compar_fn_t" -Function,?,bt_disable_peer_key_update,void,Bt* Function,+,bt_disconnect,void,Bt* -Function,?,bt_enable_peer_key_update,void,Bt* Function,+,bt_forget_bonded_devices,void,Bt* -Function,?,bt_get_profile_adv_name,const char*,Bt* -Function,?,bt_get_profile_mac_address,const uint8_t*,Bt* -Function,?,bt_get_profile_pairing_method,GapPairing,Bt* Function,+,bt_keys_storage_set_default_path,void,Bt* Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*" -Function,?,bt_remote_rssi,_Bool,"Bt*, uint8_t*" Function,+,bt_set_profile,_Bool,"Bt*, BtProfile" -Function,?,bt_set_profile_adv_name,void,"Bt*, const char*, ..." -Function,?,bt_set_profile_mac_address,void,"Bt*, const uint8_t[6]" -Function,?,bt_set_profile_pairing_method,void,"Bt*, GapPairing" Function,+,bt_set_status_changed_callback,void,"Bt*, BtStatusChangedCallback, void*" Function,+,buffered_file_stream_alloc,Stream*,Storage* Function,+,buffered_file_stream_close,_Bool,Stream* @@ -656,7 +647,6 @@ Function,+,button_panel_free,void,ButtonPanel* Function,+,button_panel_get_view,View*,ButtonPanel* Function,+,button_panel_reserve,void,"ButtonPanel*, size_t, size_t" Function,+,button_panel_reset,void,ButtonPanel* -Function,?,button_panel_reset_selection,void,ButtonPanel* Function,+,byte_input_alloc,ByteInput*, Function,+,byte_input_free,void,ByteInput* Function,+,byte_input_get_view,View*,ByteInput* @@ -667,7 +657,6 @@ Function,+,calloc,void*,"size_t, size_t" Function,+,canvas_clear,void,Canvas* Function,+,canvas_commit,void,Canvas* Function,+,canvas_current_font_height,uint8_t,const Canvas* -Function,?,canvas_current_font_width,uint8_t,const Canvas* Function,+,canvas_draw_bitmap,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, const uint8_t*" Function,+,canvas_draw_box,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t" Function,+,canvas_draw_circle,void,"Canvas*, uint8_t, uint8_t, uint8_t" @@ -677,7 +666,6 @@ Function,+,canvas_draw_frame,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t" Function,+,canvas_draw_glyph,void,"Canvas*, uint8_t, uint8_t, uint16_t" Function,+,canvas_draw_icon,void,"Canvas*, uint8_t, uint8_t, const Icon*" Function,+,canvas_draw_icon_animation,void,"Canvas*, uint8_t, uint8_t, IconAnimation*" -Function,?,canvas_draw_icon_bitmap,void,"Canvas*, uint8_t, uint8_t, int16_t, int16_t, const Icon*" Function,+,canvas_draw_icon_ex,void,"Canvas*, uint8_t, uint8_t, const Icon*, IconRotation" Function,+,canvas_draw_line,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t" Function,+,canvas_draw_rbox,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t" @@ -821,7 +809,6 @@ Function,+,elements_multiline_text_framed,void,"Canvas*, uint8_t, uint8_t, const Function,+,elements_progress_bar,void,"Canvas*, uint8_t, uint8_t, uint8_t, float" Function,+,elements_progress_bar_with_text,void,"Canvas*, uint8_t, uint8_t, uint8_t, float, const char*" Function,+,elements_scrollable_text_line,void,"Canvas*, uint8_t, uint8_t, uint8_t, FuriString*, size_t, _Bool" -Function,?,elements_scrollable_text_line_str,void,"Canvas*, uint8_t, uint8_t, uint8_t, const char*, size_t, _Bool, _Bool" Function,+,elements_scrollbar,void,"Canvas*, uint16_t, uint16_t" Function,+,elements_scrollbar_pos,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint16_t, uint16_t" Function,+,elements_slightly_rounded_box,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t" @@ -1045,24 +1032,16 @@ Function,+,furi_event_flag_wait,uint32_t,"FuriEventFlag*, uint32_t, uint32_t, ui Function,+,furi_get_tick,uint32_t, Function,+,furi_hal_bt_change_app,_Bool,"FuriHalBtProfile, GapEventCallback, void*" Function,+,furi_hal_bt_clear_white_list,_Bool, -Function,?,furi_hal_bt_custom_adv_set,_Bool,"const uint8_t*, size_t" -Function,?,furi_hal_bt_custom_adv_start,_Bool,"uint16_t, uint16_t, uint8_t, const uint8_t[( 6 )], uint8_t" -Function,?,furi_hal_bt_custom_adv_stop,_Bool, Function,+,furi_hal_bt_dump_state,void,FuriString* Function,+,furi_hal_bt_ensure_c2_mode,_Bool,BleGlueC2Mode -Function,?,furi_hal_bt_get_conn_rssi,uint32_t,uint8_t* Function,-,furi_hal_bt_get_hardfault_info,const FuriHalBtHardfaultInfo*, Function,+,furi_hal_bt_get_key_storage_buff,void,"uint8_t**, uint16_t*" -Function,?,furi_hal_bt_get_profile_adv_name,const char*,FuriHalBtProfile -Function,?,furi_hal_bt_get_profile_mac_addr,const uint8_t*,FuriHalBtProfile -Function,?,furi_hal_bt_get_profile_pairing_method,GapPairing,FuriHalBtProfile Function,+,furi_hal_bt_get_radio_stack,FuriHalBtStack, Function,+,furi_hal_bt_get_rssi,float, Function,+,furi_hal_bt_get_transmitted_packets,uint32_t, Function,+,furi_hal_bt_hid_consumer_key_press,_Bool,uint16_t Function,+,furi_hal_bt_hid_consumer_key_release,_Bool,uint16_t Function,+,furi_hal_bt_hid_consumer_key_release_all,_Bool, -Function,?,furi_hal_bt_hid_get_led_state,uint8_t, Function,+,furi_hal_bt_hid_kb_press,_Bool,uint16_t Function,+,furi_hal_bt_hid_kb_release,_Bool,uint16_t Function,+,furi_hal_bt_hid_kb_release_all,_Bool, @@ -1077,13 +1056,11 @@ Function,-,furi_hal_bt_init,void, Function,+,furi_hal_bt_is_active,_Bool, Function,+,furi_hal_bt_is_alive,_Bool, Function,+,furi_hal_bt_is_ble_gatt_gap_supported,_Bool, -Function,?,furi_hal_bt_is_connected,_Bool, Function,+,furi_hal_bt_is_testing_supported,_Bool, Function,+,furi_hal_bt_lock_core2,void, Function,+,furi_hal_bt_nvm_sram_sem_acquire,void, Function,+,furi_hal_bt_nvm_sram_sem_release,void, Function,+,furi_hal_bt_reinit,void, -Function,?,furi_hal_bt_reverse_mac_addr,void,uint8_t[( 6 )] Function,+,furi_hal_bt_serial_notify_buffer_is_empty,void, Function,+,furi_hal_bt_serial_set_event_callback,void,"uint16_t, FuriHalBtSerialCallback, void*" Function,+,furi_hal_bt_serial_set_rpc_status,void,FuriHalBtSerialRpcStatus @@ -1091,9 +1068,6 @@ Function,+,furi_hal_bt_serial_start,void, Function,+,furi_hal_bt_serial_stop,void, Function,+,furi_hal_bt_serial_tx,_Bool,"uint8_t*, uint16_t" Function,+,furi_hal_bt_set_key_storage_change_callback,void,"BleGlueKeyStorageChangedCallback, void*" -Function,?,furi_hal_bt_set_profile_adv_name,void,"FuriHalBtProfile, const char[( ( 1 + 8 + ( 8 + 1 ) ) + 1 )]" -Function,?,furi_hal_bt_set_profile_mac_addr,void,"FuriHalBtProfile, const uint8_t[( 6 )]" -Function,?,furi_hal_bt_set_profile_pairing_method,void,"FuriHalBtProfile, GapPairing" Function,+,furi_hal_bt_start_advertising,void, Function,+,furi_hal_bt_start_app,_Bool,"FuriHalBtProfile, GapEventCallback, void*" Function,+,furi_hal_bt_start_packet_rx,void,"uint8_t, uint8_t" @@ -1288,6 +1262,7 @@ Function,+,furi_hal_random_init,void, Function,+,furi_hal_region_get,const FuriHalRegion*, Function,+,furi_hal_region_get_band,const FuriHalRegionBand*,uint32_t Function,+,furi_hal_region_get_name,const char*, +Function,-,furi_hal_region_init,void, Function,+,furi_hal_region_is_frequency_allowed,_Bool,uint32_t Function,+,furi_hal_region_is_provisioned,_Bool, Function,+,furi_hal_region_set,void,FuriHalRegion* @@ -1408,8 +1383,6 @@ Function,+,furi_hal_version_get_hw_connect,uint8_t, Function,+,furi_hal_version_get_hw_display,FuriHalVersionDisplay, Function,+,furi_hal_version_get_hw_region,FuriHalVersionRegion, Function,+,furi_hal_version_get_hw_region_name,const char*, -Function,?,furi_hal_version_get_hw_region_name_otp,const char*, -Function,?,furi_hal_version_get_hw_region_otp,FuriHalVersionRegion, Function,+,furi_hal_version_get_hw_target,uint8_t, Function,+,furi_hal_version_get_hw_timestamp,uint32_t, Function,+,furi_hal_version_get_hw_version,uint8_t, @@ -1422,9 +1395,7 @@ Function,+,furi_hal_version_get_ncc_id,const char*, Function,+,furi_hal_version_get_otp_version,FuriHalVersionOtpVersion, Function,+,furi_hal_version_get_srrc_id,const char*, Function,-,furi_hal_version_init,void, -Function,?,furi_hal_version_set_name,void,const char* Function,+,furi_hal_version_uid,const uint8_t*, -Function,?,furi_hal_version_uid_default,const uint8_t*, Function,+,furi_hal_version_uid_size,size_t, Function,-,furi_hal_vibro_init,void, Function,+,furi_hal_vibro_on,void,_Bool @@ -1597,7 +1568,6 @@ Function,-,gamma,double,double Function,-,gamma_r,double,"double, int*" Function,-,gammaf,float,float Function,-,gammaf_r,float,"float, int*" -Function,?,gap_get_remote_conn_rssi,uint32_t,int8_t* Function,-,gap_get_state,GapState, Function,-,gap_init,_Bool,"GapConfig*, GapEventCallback, void*" Function,-,gap_start_advertising,void, @@ -2072,11 +2042,8 @@ Function,-,music_worker_set_volume,void,"MusicWorker*, float" Function,-,music_worker_start,void,MusicWorker* Function,-,music_worker_stop,void,MusicWorker* Function,+,name_generator_make_auto,void,"char*, size_t, const char*" -Function,?,name_generator_make_auto_datetime,void,"char*, size_t, const char*, FuriHalRtcDateTime*" Function,+,name_generator_make_detailed,void,"char*, size_t, const char*" -Function,?,name_generator_make_detailed_datetime,void,"char*, size_t, const char*, FuriHalRtcDateTime*" Function,+,name_generator_make_random,void,"char*, size_t" -Function,?,name_generator_make_random_prefixed,void,"char*, size_t, const char*" Function,-,nan,double,const char* Function,-,nanf,float,const char* Function,-,nanl,long double,const char* @@ -2192,7 +2159,6 @@ Function,+,power_get_pubsub,FuriPubSub*,Power* Function,+,power_is_battery_healthy,_Bool,Power* Function,+,power_off,void,Power* Function,+,power_reboot,void,PowerBootMode -Function,?,power_trigger_ui_update,void,Power* Function,+,powf,float,"float, float" Function,-,powl,long double,"long double, long double" Function,+,pretty_format_bytes_hex_canonical,void,"FuriString*, size_t, const char*, const uint8_t*, size_t" @@ -2525,13 +2491,11 @@ Function,-,strverscmp,int,"const char*, const char*" Function,-,strxfrm,size_t,"char*, const char*, size_t" Function,-,strxfrm_l,size_t,"char*, const char*, size_t, locale_t" Function,+,submenu_add_item,void,"Submenu*, const char*, uint32_t, SubmenuItemCallback, void*" -Function,?,submenu_add_lockable_item,void,"Submenu*, const char*, uint32_t, SubmenuItemCallback, void*, _Bool, const char*" Function,+,submenu_alloc,Submenu*, Function,+,submenu_free,void,Submenu* Function,+,submenu_get_view,View*,Submenu* Function,+,submenu_reset,void,Submenu* Function,+,submenu_set_header,void,"Submenu*, const char*" -Function,?,submenu_set_orientation,void,"Submenu*, ViewOrientation" Function,+,submenu_set_selected_item,void,"Submenu*, uint32_t" Function,-,system,int,const char* Function,-,tan,double,double @@ -2570,7 +2534,6 @@ Function,+,text_input_get_validator_callback_context,void*,TextInput* Function,+,text_input_get_view,View*,TextInput* Function,+,text_input_reset,void,TextInput* Function,+,text_input_set_header_text,void,"TextInput*, const char*" -Function,?,text_input_set_minimum_length,void,"TextInput*, size_t" Function,+,text_input_set_result_callback,void,"TextInput*, TextInputCallback, void*, char*, size_t, _Bool" Function,+,text_input_set_validator,void,"TextInput*, TextInputValidatorCallback, void*" Function,-,tgamma,double,double @@ -2606,7 +2569,6 @@ Function,+,variable_item_get_current_value_index,uint8_t,VariableItem* Function,+,variable_item_list_add,VariableItem*,"VariableItemList*, const char*, uint8_t, VariableItemChangeCallback, void*" Function,+,variable_item_list_alloc,VariableItemList*, Function,+,variable_item_list_free,void,VariableItemList* -Function,?,variable_item_list_get,VariableItem*,"VariableItemList*, uint8_t" Function,+,variable_item_list_get_selected_item_index,uint8_t,VariableItemList* Function,+,variable_item_list_get_view,View*,VariableItemList* Function,+,variable_item_list_reset,void,VariableItemList* @@ -2614,7 +2576,6 @@ Function,+,variable_item_list_set_enter_callback,void,"VariableItemList*, Variab Function,+,variable_item_list_set_selected_item,void,"VariableItemList*, uint8_t" Function,+,variable_item_set_current_value_index,void,"VariableItem*, uint8_t" Function,+,variable_item_set_current_value_text,void,"VariableItem*, const char*" -Function,?,variable_item_set_locked,void,"VariableItem*, _Bool, const char*" Function,+,variable_item_set_values_count,void,"VariableItem*, uint8_t" Function,-,vasiprintf,int,"char**, const char*, __gnuc_va_list" Function,-,vasniprintf,char*,"char*, size_t*, const char*, __gnuc_va_list" @@ -2624,7 +2585,6 @@ Function,-,vdiprintf,int,"int, const char*, __gnuc_va_list" Function,-,vdprintf,int,"int, const char*, __gnuc_va_list" Function,+,version_get,const Version*, Function,+,version_get_builddate,const char*,const Version* -Function,?,version_get_custom_name,const char*,const Version* Function,+,version_get_dirty_flag,_Bool,const Version* Function,+,version_get_firmware_origin,const char*,const Version* Function,+,version_get_git_origin,const char*,const Version* @@ -2633,7 +2593,6 @@ Function,+,version_get_gitbranchnum,const char*,const Version* Function,+,version_get_githash,const char*,const Version* Function,+,version_get_target,uint8_t,const Version* Function,+,version_get_version,const char*,const Version* -Function,?,version_set_custom_name,void,"Version*, const char*" Function,-,vfiprintf,int,"FILE*, const char*, __gnuc_va_list" Function,-,vfiscanf,int,"FILE*, const char*, __gnuc_va_list" Function,-,vfprintf,int,"FILE*, const char*, __gnuc_va_list"