Merge branch 'dev' of https://github.com/DarkFlippers/unleashed-firmware into xfw-dev --nobuild

This commit is contained in:
Willy-JL
2024-01-07 17:25:36 +00:00
3 changed files with 38 additions and 9 deletions

View File

@@ -16,6 +16,35 @@ static bool mykey_has_lockid(const St25tbData* data) {
return (data->blocks[5] & 0xFF) == 0x7F;
}
static bool check_invalid_low_nibble(uint8_t value) {
uint8_t value_lo = value & 0xF;
return value_lo >= 0xA;
}
static bool mykey_get_production_date(
const St25tbData* data,
uint16_t* year_ptr,
uint8_t* month_ptr,
uint8_t* day_ptr) {
uint32_t date_block = data->blocks[8];
uint8_t year = date_block >> 16 & 0xFF;
uint8_t month = date_block >> 8 & 0xFF;
uint8_t day = date_block & 0xFF;
// dates are coded in a peculiar way, the hexadecimal value should in fact be interpreted as a decimal value
// so anything in range A-F is invalid.
if(day > 0x31 || month > 0x12 || day == 0 || month == 0 || year == 0) {
return false;
}
if(check_invalid_low_nibble(day) || check_invalid_low_nibble(month) ||
check_invalid_low_nibble(year) || check_invalid_low_nibble(year >> 4)) {
return false;
}
*year_ptr = year + 0x2000;
*month_ptr = month;
*day_ptr = day;
return true;
}
static bool mykey_parse(const NfcDevice* device, FuriString* parsed_data) {
furi_assert(device);
furi_assert(parsed_data);
@@ -34,7 +63,10 @@ static bool mykey_parse(const NfcDevice* device, FuriString* parsed_data) {
}
}
if((data->blocks[8] >> 16 & 0xFF) > 0x31 || (data->blocks[8] >> 8 & 0xFF) > 0x12) {
uint16_t mfg_year;
uint8_t mfg_month, mfg_day;
if(!mykey_get_production_date(data, &mfg_year, &mfg_month, &mfg_day)) {
FURI_LOG_D(TAG, "bad mfg date");
return false;
}
@@ -56,13 +88,8 @@ static bool mykey_parse(const NfcDevice* device, FuriString* parsed_data) {
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");
uint32_t block8 = data->blocks[8];
furi_string_cat_printf(
parsed_data,
"Prod. date: %02lX/%02lX/%04lX",
block8 >> 16 & 0xFF,
block8 >> 8 & 0xFF,
0x2000 + (block8 & 0xFF));
parsed_data, "Prod. date: %02X/%02X/%04X", mfg_day, mfg_month, mfg_year);
if(!is_blank) {
furi_string_cat_printf(
@@ -127,4 +154,4 @@ static const FlipperAppPluginDescriptor mykey_plugin_descriptor = {
/* Plugin entry point - must return a pointer to const descriptor */
const FlipperAppPluginDescriptor* mykey_plugin_ep() {
return &mykey_plugin_descriptor;
}
}

View File

@@ -173,6 +173,7 @@ void nfc_scene_mf_classic_dict_attack_on_enter(void* context) {
instance->poller = nfc_poller_alloc(instance->nfc, NfcProtocolMfClassic);
nfc_poller_start(instance->poller, nfc_dict_attack_worker_callback, instance);
instance->nfc_dict_context.is_card_present = true;
}
static void nfc_scene_mf_classic_dict_attack_notify_read(NfcApp* instance) {

View File

@@ -4,7 +4,8 @@
static void nfc_scene_set_atqa_byte_input_changed_callback(void* context) {
NfcApp* instance = context;
iso14443_3a_set_atqa(instance->iso14443_3a_edit_data, instance->byte_input_store);
uint8_t atqa_msb[2] = {instance->byte_input_store[1], instance->byte_input_store[0]};
iso14443_3a_set_atqa(instance->iso14443_3a_edit_data, atqa_msb);
}
void nfc_scene_set_atqa_on_enter(void* context) {