diff --git a/applications/nfc/nfc_device.c b/applications/nfc/nfc_device.c index 0771a1ef..63f0c3cc 100644 --- a/applications/nfc/nfc_device.c +++ b/applications/nfc/nfc_device.c @@ -195,6 +195,10 @@ static bool nfc_device_save_mifare_df_key_settings( string_printf(key, "%s Key Changeable", prefix); if(!flipper_format_write_bool(file, string_get_cstr(key), &ks->master_key_changeable, 1)) break; + if(ks->flags) { + string_printf(key, "%s Flags", prefix); + if(!flipper_format_write_hex(file, string_get_cstr(key), &ks->flags, 1)) break; + } string_printf(key, "%s Max Keys", prefix); if(!flipper_format_write_hex(file, string_get_cstr(key), &ks->max_keys, 1)) break; for(MifareDesfireKeyVersion* kv = ks->key_version_head; kv; kv = kv->next) { @@ -230,8 +234,14 @@ bool nfc_device_load_mifare_df_key_settings( string_printf(key, "%s Key Changeable", prefix); if(!flipper_format_read_bool(file, string_get_cstr(key), &ks->master_key_changeable, 1)) break; + string_printf(key, "%s Flags", prefix); + if(flipper_format_key_exist(file, string_get_cstr(key))) { + if(!flipper_format_read_hex(file, string_get_cstr(key), &ks->flags, 1)) break; + } string_printf(key, "%s Max Keys", prefix); if(!flipper_format_read_hex(file, string_get_cstr(key), &ks->max_keys, 1)) break; + ks->flags |= ks->max_keys >> 4; + ks->max_keys &= 0xF; MifareDesfireKeyVersion** kv_head = &ks->key_version_head; for(int key_id = 0; key_id < ks->max_keys; key_id++) { string_printf(key, "%s Key %d Version", prefix, key_id); diff --git a/lib/nfc_protocols/mifare_desfire.c b/lib/nfc_protocols/mifare_desfire.c index 4f02e839..6f28dc5d 100644 --- a/lib/nfc_protocols/mifare_desfire.c +++ b/lib/nfc_protocols/mifare_desfire.c @@ -115,6 +115,9 @@ void mf_df_cat_key_settings(MifareDesfireKeySettings* ks, string_t out) { string_cat_printf(out, "freeCreateDelete %d\n", ks->free_create_delete); string_cat_printf(out, "freeDirectoryList %d\n", ks->free_directory_list); string_cat_printf(out, "masterChangeable %d\n", ks->master_key_changeable); + if(ks->flags) { + string_cat_printf(out, "flags %d\n", ks->flags); + } string_cat_printf(out, "maxKeys %d\n", ks->max_keys); for(MifareDesfireKeyVersion* kv = ks->key_version_head; kv; kv = kv->next) { string_cat_printf(out, "key %d version %d\n", kv->id, kv->version); @@ -274,7 +277,8 @@ bool mf_df_parse_get_key_settings_response( out->free_create_delete = (buf[0] & 0x4) != 0; out->free_directory_list = (buf[0] & 0x2) != 0; out->master_key_changeable = (buf[0] & 0x1) != 0; - out->max_keys = buf[1]; + out->flags = buf[1] >> 4; + out->max_keys = buf[1] & 0xF; return true; } diff --git a/lib/nfc_protocols/mifare_desfire.h b/lib/nfc_protocols/mifare_desfire.h index 809f1782..dbe0802e 100644 --- a/lib/nfc_protocols/mifare_desfire.h +++ b/lib/nfc_protocols/mifare_desfire.h @@ -56,6 +56,7 @@ typedef struct { bool free_create_delete; bool free_directory_list; bool master_key_changeable; + uint8_t flags; uint8_t max_keys; MifareDesfireKeyVersion* key_version_head; } MifareDesfireKeySettings;