This commit is contained in:
assasinfil 2023-11-21 11:54:06 +03:00
parent baca59927b
commit 7fd921227c
2 changed files with 79 additions and 38 deletions

View file

@ -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;

View file

@ -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;