Skip to content

Commit 00b1018

Browse files
committed
Fixed validating
1 parent 9c92338 commit 00b1018

File tree

2 files changed

+47
-41
lines changed

2 files changed

+47
-41
lines changed

applications/main/nfc/plugins/supported_cards/social_moscow.c

+28-25
Original file line numberDiff line numberDiff line change
@@ -649,11 +649,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
649649
card_crc16_2);
650650
card_validator = card_validator1 * 1024 + card_validator2;
651651
FuriHalRtcDateTime card_use_before_date_s = {0};
652-
from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992);
652+
from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992);
653653

654654
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
655655
from_minutes_to_datetime(
656-
(card_start_trip_date - 1) * 24 * 60 + card_start_trip_time,
656+
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
657657
&card_start_trip_minutes_s,
658658
1992);
659659
furi_string_printf(
@@ -711,7 +711,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
711711
card_valid_from_date,
712712
card_rfu3);
713713
FuriHalRtcDateTime card_use_before_date_s = {0};
714-
from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992);
714+
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992);
715715

716716
furi_string_printf(
717717
result,
@@ -1483,7 +1483,8 @@ static bool social_moscow_verify_type(Nfc* nfc, MfClassicType type) {
14831483
}
14841484

14851485
static bool social_moscow_verify(Nfc* nfc) {
1486-
return social_moscow_verify_type(nfc, MfClassicType4k);
1486+
return social_moscow_verify_type(nfc, MfClassicType1k) ||
1487+
social_moscow_verify_type(nfc, MfClassicType4k);
14871488
}
14881489

14891490
static bool social_moscow_read(Nfc* nfc, NfcDevice* device) {
@@ -1546,27 +1547,29 @@ static bool social_moscow_parse(const NfcDevice* device, FuriString* parsed_data
15461547

15471548
FuriString* metro_result = furi_string_alloc();
15481549
FuriString* ground_result = furi_string_alloc();
1549-
1550-
parse_transport_block(&data->block[4], metro_result);
1551-
parse_transport_block(&data->block[16], ground_result);
1552-
1553-
furi_string_printf(
1554-
parsed_data,
1555-
"\e#Social \ecard\nNumber: %lx %x %llx %x\nOMC: %llx\nValid for: %02x/%02x %02x%02x\n%s\n%s",
1556-
card_code,
1557-
card_region,
1558-
card_number,
1559-
card_control,
1560-
omc_number,
1561-
month,
1562-
year,
1563-
data->block[60].data[13],
1564-
data->block[60].data[14],
1565-
furi_string_get_cstr(metro_result),
1566-
furi_string_get_cstr(ground_result));
1567-
furi_string_free(metro_result);
1568-
furi_string_free(ground_result);
1569-
parsed = true;
1550+
bool result1 = parse_transport_block(&data->block[4], metro_result);
1551+
bool result2 = parse_transport_block(&data->block[16], ground_result);
1552+
if(result1 || result2) {
1553+
furi_string_printf(
1554+
parsed_data,
1555+
"\e#Social \ecard\nNumber: %lx %x %llx %x\nOMC: %llx\nValid for: %02x/%02x %02x%02x\n\e#Metro\n%s\n\e#Ground\n%s",
1556+
card_code,
1557+
card_region,
1558+
card_number,
1559+
card_control,
1560+
omc_number,
1561+
month,
1562+
year,
1563+
data->block[60].data[13],
1564+
data->block[60].data[14],
1565+
furi_string_get_cstr(metro_result),
1566+
furi_string_get_cstr(ground_result));
1567+
furi_string_free(metro_result);
1568+
furi_string_free(ground_result);
1569+
parsed = true;
1570+
} else {
1571+
return false;
1572+
}
15701573
} while(false);
15711574

15721575
return parsed;

applications/main/nfc/plugins/supported_cards/troika.c

+19-16
Original file line numberDiff line numberDiff line change
@@ -1276,8 +1276,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
12761276
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2019);
12771277

12781278
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
1279-
from_minutes_to_datetime(
1280-
card_start_trip_minutes - (24 * 60), &card_start_trip_minutes_s, 2019);
1279+
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2019);
12811280
furi_string_printf(
12821281
result,
12831282
"Number: %010lu\nValid for: %02d.%02d.%04d\nBalance: %ld rub\nTrip from: %02d.%02d.%04d %02d:%02d\nValidator: %05d",
@@ -1340,11 +1339,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
13401339
card_route,
13411340
card_hash);
13421341
FuriHalRtcDateTime card_use_before_date_s = {0};
1343-
from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 2019);
1342+
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2019);
13441343

13451344
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
13461345
from_minutes_to_datetime(
1347-
card_valid_from_date + card_valid_for_minutes - card_start_trip_neg_minutes - 24 * 60,
1346+
card_valid_from_date + card_valid_for_minutes - card_start_trip_neg_minutes,
13481347
&card_start_trip_minutes_s,
13491348
2019); //-time
13501349
furi_string_printf(
@@ -1465,10 +1464,10 @@ static bool troika_get_card_config(TroikaCardConfig* config, MfClassicType type)
14651464
bool success = true;
14661465

14671466
if(type == MfClassicType1k) {
1468-
config->data_sector = 8;
1467+
config->data_sector = 11;
14691468
config->keys = troika_1k_keys;
14701469
} else if(type == MfClassicType4k) {
1471-
config->data_sector = 4;
1470+
config->data_sector = 11;
14721471
config->keys = troika_4k_keys;
14731472
} else {
14741473
success = false;
@@ -1574,16 +1573,20 @@ static bool troika_parse(const NfcDevice* device, FuriString* parsed_data) {
15741573

15751574
FuriString* metro_result = furi_string_alloc();
15761575
FuriString* ground_result = furi_string_alloc();
1577-
parse_transport_block(&data->block[32], metro_result);
1578-
parse_transport_block(&data->block[28], ground_result);
1579-
furi_string_printf(
1580-
parsed_data,
1581-
"\e#Troika\n%s\n%s",
1582-
furi_string_get_cstr(metro_result),
1583-
furi_string_get_cstr(ground_result));
1584-
furi_string_free(metro_result);
1585-
furi_string_free(ground_result);
1586-
parsed = true;
1576+
bool result1 = parse_transport_block(&data->block[32], metro_result);
1577+
bool result2 = parse_transport_block(&data->block[28], ground_result);
1578+
if(result1 || result2) {
1579+
furi_string_printf(
1580+
parsed_data,
1581+
"\e#Troika\n%s\n\e#Ediniy\n%s\n\e#TAT\n",
1582+
furi_string_get_cstr(metro_result),
1583+
furi_string_get_cstr(ground_result));
1584+
furi_string_free(metro_result);
1585+
furi_string_free(ground_result);
1586+
parsed = true;
1587+
} else {
1588+
return false;
1589+
}
15871590
} while(false);
15881591

15891592
return parsed;

0 commit comments

Comments
 (0)