From 7fd921227cfc498a1124d883109660f8ddd57bdd Mon Sep 17 00:00:00 2001 From: assasinfil Date: Tue, 21 Nov 2023 11:54:06 +0300 Subject: [PATCH] Fixes --- .../plugins/supported_cards/social_moscow.c | 14 +-- .../main/nfc/plugins/supported_cards/troika.c | 103 ++++++++++++------ 2 files changed, 79 insertions(+), 38 deletions(-) diff --git a/applications/main/nfc/plugins/supported_cards/social_moscow.c b/applications/main/nfc/plugins/supported_cards/social_moscow.c index 56cb88d45..79704ee54 100644 --- a/applications/main/nfc/plugins/supported_cards/social_moscow.c +++ b/applications/main/nfc/plugins/supported_cards/social_moscow.c @@ -511,7 +511,7 @@ void from_minutes_to_datetime(uint32_t minutes, FuriHalRtcDateTime* datetime, ui bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { uint16_t transport_departament = bit_lib_get_bits_16(block->data, 0, 10); - FURI_LOG_D(TAG, "Transport departament: %x", transport_departament); + FURI_LOG_I(TAG, "Transport departament: %x", transport_departament); uint16_t layout_type = bit_lib_get_bits_16(block->data, 52, 4); if(layout_type == 0xE) { @@ -520,7 +520,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { layout_type = bit_lib_get_bits_16(block->data, 52, 14); } - FURI_LOG_D(TAG, "Layout type %x", layout_type); + FURI_LOG_I(TAG, "Layout type %x", layout_type); uint16_t card_view = 0; uint16_t card_type = 0; @@ -1483,8 +1483,7 @@ static bool social_moscow_verify_type(Nfc* nfc, MfClassicType type) { } static bool social_moscow_verify(Nfc* nfc) { - return social_moscow_verify_type(nfc, MfClassicType1k) || - social_moscow_verify_type(nfc, MfClassicType4k); + return social_moscow_verify_type(nfc, MfClassicType4k); } static bool social_moscow_read(Nfc* nfc, NfcDevice* device) { @@ -1564,12 +1563,13 @@ static bool social_moscow_parse(const NfcDevice* device, FuriString* parsed_data data->block[60].data[14], furi_string_get_cstr(metro_result), furi_string_get_cstr(ground_result)); - furi_string_free(metro_result); - furi_string_free(ground_result); + parsed = true; } else { - return false; + parsed = false; } + furi_string_free(ground_result); + furi_string_free(metro_result); } while(false); return parsed; diff --git a/applications/main/nfc/plugins/supported_cards/troika.c b/applications/main/nfc/plugins/supported_cards/troika.c index 24101ed8e..5c44f086f 100644 --- a/applications/main/nfc/plugins/supported_cards/troika.c +++ b/applications/main/nfc/plugins/supported_cards/troika.c @@ -530,7 +530,7 @@ void from_minutes_to_datetime(uint32_t minutes, FuriHalRtcDateTime* datetime, ui bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { uint16_t transport_departament = bit_lib_get_bits_16(block->data, 0, 10); - FURI_LOG_D(TAG, "Transport departament: %x", transport_departament); + FURI_LOG_I(TAG, "Transport departament: %x", transport_departament); uint16_t layout_type = bit_lib_get_bits_16(block->data, 52, 4); if(layout_type == 0xE) { @@ -539,7 +539,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { layout_type = bit_lib_get_bits_16(block->data, 52, 14); } - FURI_LOG_D(TAG, "Layout type %x", layout_type); + FURI_LOG_I(TAG, "Layout type %x", layout_type); uint16_t card_view = 0; uint16_t card_type = 0; @@ -612,6 +612,31 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_write_enabled, card_rfu2, card_crc16_2); + if(card_valid_by_date == 0) { + return false; + } + FuriHalRtcDateTime 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}; + from_minutes_to_datetime( + (card_start_trip_date) * 24 * 60 + card_start_trip_time, + &card_start_trip_minutes_s, + 1992); + furi_string_printf( + result, + "Number: %010lu\nValid for: %02d.%02d.%04d\nTrips: %d\nTrip from: %02d.%02d.%04d %02d:%02d\nValidator: %05d", + card_number, + card_use_before_date_s.day, + card_use_before_date_s.month, + card_use_before_date_s.year, + card_total_trips, + card_start_trip_minutes_s.day, + card_start_trip_minutes_s.month, + card_start_trip_minutes_s.year, + card_start_trip_minutes_s.hour, + card_start_trip_minutes_s.minute, + card_validator); break; } case 0x06: { @@ -668,11 +693,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_crc16_2); card_validator = card_validator1 * 1024 + card_validator2; FuriHalRtcDateTime card_use_before_date_s = {0}; - from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992); + from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992); FuriHalRtcDateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( - (card_start_trip_date - 1) * 24 * 60 + card_start_trip_time, + (card_start_trip_date) * 24 * 60 + card_start_trip_time, &card_start_trip_minutes_s, 1992); furi_string_printf( @@ -730,7 +755,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_valid_from_date, card_rfu3); FuriHalRtcDateTime card_use_before_date_s = {0}; - from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992); + from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); furi_string_printf( result, @@ -783,11 +808,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_transport_type4, card_hash); FuriHalRtcDateTime card_use_before_date_s = {0}; - from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 2016); + from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2016); FuriHalRtcDateTime card_start_trip_minutes_s = {0}; - from_minutes_to_datetime( - card_start_trip_minutes - (2 * 24 * 60), &card_start_trip_minutes_s, 2016); + from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016); furi_string_printf( result, "Number: %010lu\nValid for: %02d.%02d.%04d\nTrip from: %02d.%02d.%04d %02d:%02d\nTrips left: %d\nValidator: %05d", @@ -844,10 +868,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_rfu3, card_transfer_in_metro); FuriHalRtcDateTime card_use_before_date_s = {0}; - from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992); + from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); FuriHalRtcDateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( - (card_start_trip_date - 1) * 24 * 60 + card_start_trip_time, + (card_start_trip_date) * 24 * 60 + card_start_trip_time, &card_start_trip_minutes_s, 1992); furi_string_printf( @@ -925,10 +949,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_rfu5, card_transfer_in_metro); FuriHalRtcDateTime card_use_before_date_s = {0}; - from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992); + from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); FuriHalRtcDateTime card_start_trip_minutes_s = {0}; from_minutes_to_datetime( - (card_start_trip_date - 1) * 24 * 60 + card_start_trip_time, + (card_start_trip_date) * 24 * 60 + card_start_trip_time, &card_start_trip_minutes_s, 1992); furi_string_printf( @@ -995,11 +1019,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_zoo, card_hash); FuriHalRtcDateTime card_use_before_date_s = {0}; - from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992); + from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992); FuriHalRtcDateTime card_start_trip_minutes_s = {0}; - from_minutes_to_datetime( - card_start_trip_minutes - (2 * 24 * 60), &card_start_trip_minutes_s, 1992); + from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 1992); furi_string_printf( result, "Number: %010lu\nValid for: %02d.%02d.%04d\nTrip from: %02d.%02d.%04d %02d:%02d\nValidator: %05d", @@ -1065,12 +1088,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_extended, card_hash); FuriHalRtcDateTime card_use_before_date_s = {0}; - from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 2016); + from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2016); FuriHalRtcDateTime 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, + (card_valid_to_date) * 24 * 60 + card_valid_for_minutes - card_start_trip_neg_minutes, &card_start_trip_minutes_s, 2016); //-time furi_string_printf( @@ -1405,7 +1427,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_type4, card_hash); FuriHalRtcDateTime card_use_before_date_s = {0}; - from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992); + from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992); furi_string_printf( result, @@ -1441,7 +1463,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) { card_valid_by_date, card_hash); FuriHalRtcDateTime card_use_before_date_s = {0}; - from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992); + from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992); furi_string_printf( result, @@ -1464,10 +1486,10 @@ static bool troika_get_card_config(TroikaCardConfig* config, MfClassicType type) bool success = true; if(type == MfClassicType1k) { - config->data_sector = 11; + config->data_sector = 4; config->keys = troika_1k_keys; } else if(type == MfClassicType4k) { - config->data_sector = 11; + config->data_sector = 8; config->keys = troika_4k_keys; } else { success = false; @@ -1573,20 +1595,39 @@ static bool troika_parse(const NfcDevice* device, FuriString* parsed_data) { FuriString* metro_result = furi_string_alloc(); FuriString* ground_result = furi_string_alloc(); + FuriString* tat_result = furi_string_alloc(); bool result1 = parse_transport_block(&data->block[32], metro_result); bool result2 = parse_transport_block(&data->block[28], ground_result); - if(result1 || result2) { + bool result3 = parse_transport_block(&data->block[16], tat_result); + furi_string_printf(parsed_data, "#Troyka\n"); + if(result1) { furi_string_printf( parsed_data, - "\e#Troika\n%s\n\e#Ediniy\n%s\n\e#TAT\n", - furi_string_get_cstr(metro_result), - furi_string_get_cstr(ground_result)); - furi_string_free(metro_result); - furi_string_free(ground_result); - parsed = true; - } else { - return false; + "%s\n\e#Metro\n%s\n", + furi_string_get_cstr(parsed_data), + furi_string_get_cstr(metro_result)); + FURI_LOG_D(TAG, "Metro branch"); } + if(result2) { + furi_string_printf( + parsed_data, + "%s\e#Ediniy\n%s\n", + furi_string_get_cstr(parsed_data), + furi_string_get_cstr(ground_result)); + FURI_LOG_D(TAG, "Ediny branch"); + } + if(result3) { + furi_string_printf( + parsed_data, + "%s\e#TAT\n%s\n", + furi_string_get_cstr(parsed_data), + furi_string_get_cstr(tat_result)); + FURI_LOG_D(TAG, "TAT branch"); + } + furi_string_free(tat_result); + furi_string_free(ground_result); + furi_string_free(metro_result); + parsed = result1 || result2 || result3; } while(false); return parsed;