Explorar o código

NFC Maker: Generate Type 4 Tag files

Willy-JL hai 9 meses
pai
achega
f7b2ff6e4a

+ 26 - 0
nfc_maker/nfc_maker.c

@@ -45,6 +45,32 @@ const CardDef cards[CardMAX] = {
             .generator = NfcDataGeneratorTypeNTAGI2C2k,
         },
 
+    // Type4Tag (no TLV, so +3 for < 255b message or +5 for larger messages)
+    [CardNtag413DNA] =
+        {
+            .name = "NTAG 413 DNA (126B)",
+            .size = 126 + 3,
+            .protocol = NfcProtocolType4Tag,
+        },
+    [CardNtag424DNA] =
+        {
+            .name = "NTAG 424 DNA (254B)",
+            .size = 254 + 3,
+            .protocol = NfcProtocolType4Tag,
+        },
+    [CardMfDesfire] =
+        {
+            .name = "MIFARE DESFire (2046B)",
+            .size = TYPE_4_TAG_MF_DESFIRE_NDEF_SIZE + 5,
+            .protocol = NfcProtocolType4Tag,
+        },
+    [CardType4Generic] =
+        {
+            .name = "Generic Type 4 Tag",
+            .size = -1,
+            .protocol = NfcProtocolType4Tag,
+        },
+
     // MfClassic (size excludes sector trailers and MAD1/2 sectors)
     [CardMfClassicMini] =
         {

+ 7 - 0
nfc_maker/nfc_maker.h

@@ -32,6 +32,7 @@ extern const Icon I_WarningDolphinFlip_45x42;
 #define NFC_APP_EXTENSION ".nfc"
 #endif
 #include <lib/nfc/protocols/mf_ultralight/mf_ultralight.h>
+#include <lib/nfc/protocols/type_4_tag/type_4_tag.h>
 #include <lib/nfc/protocols/mf_classic/mf_classic.h>
 #include <lib/nfc/protocols/slix/slix.h>
 #include <lib/nfc/helpers/nfc_data_generator.h>
@@ -53,6 +54,12 @@ typedef enum {
     CardNtagI2C1K,
     CardNtagI2C2K,
 
+    // Type4Tag
+    CardNtag413DNA,
+    CardNtag424DNA,
+    CardMfDesfire,
+    CardType4Generic,
+
     // MfClassic
     CardMfClassicMini,
     CardMfClassic1K4b,

+ 39 - 0
nfc_maker/scenes/nfc_maker_scene_save_generate.c

@@ -306,6 +306,42 @@ static void nfc_maker_scene_save_generate_populate_device_mful(NfcMaker* app, Ca
     mf_ultralight_free(data);
 }
 
+static void nfc_maker_scene_save_generate_populate_device_t4t(NfcMaker* app, Card card_type) {
+    Type4TagData* data = type_4_tag_alloc();
+
+    uint8_t uid[7];
+    data->iso14443_4a_data->iso14443_3a_data->uid_len = sizeof(uid);
+    furi_hal_random_fill_buf(uid, sizeof(uid));
+    if(card_type != CardType4Generic) {
+        uid[0] = 0x04; // NXP manufacturer code
+    }
+    type_4_tag_set_uid(data, uid, sizeof(uid));
+
+    data->iso14443_4a_data->iso14443_3a_data->atqa[0] = 0x44;
+    data->iso14443_4a_data->iso14443_3a_data->atqa[1] = 0x03;
+    data->iso14443_4a_data->iso14443_3a_data->sak = 0x20;
+
+    data->iso14443_4a_data->ats_data.tl = 6;
+    data->iso14443_4a_data->ats_data.t0 = 0x77;
+    data->iso14443_4a_data->ats_data.ta_1 = 0x77;
+    data->iso14443_4a_data->ats_data.tb_1 = 0x71;
+    data->iso14443_4a_data->ats_data.tc_1 = 0x02;
+    simple_array_init(data->iso14443_4a_data->ats_data.t1_tk, 1);
+    uint8_t* historical_bytes = simple_array_get_data(data->iso14443_4a_data->ats_data.t1_tk);
+    historical_bytes[0] = 0x80;
+
+    const bool is_short_record = app->ndef_buffer[1] < 0xFF;
+    const size_t ndef_message_size = app->ndef_size - (is_short_record ? 3 : 5);
+    const uint8_t* ndef_message = &app->ndef_buffer[is_short_record ? 2 : 4];
+    simple_array_init(data->ndef_data, ndef_message_size);
+    memcpy(simple_array_get_data(data->ndef_data), ndef_message, ndef_message_size);
+    free(app->ndef_buffer);
+    app->ndef_buffer = NULL;
+
+    nfc_device_set_data(app->nfc_device, NfcProtocolType4Tag, data);
+    type_4_tag_free(data);
+}
+
 static void nfc_maker_scene_save_generate_populate_device_mfc(NfcMaker* app, Card card_type) {
     const CardDef* card = &cards[card_type];
 
@@ -485,6 +521,9 @@ bool nfc_maker_scene_save_generate_on_event(void* context, SceneManagerEvent eve
         case NfcProtocolMfUltralight:
             nfc_maker_scene_save_generate_populate_device_mful(app, event.event);
             break;
+        case NfcProtocolType4Tag:
+            nfc_maker_scene_save_generate_populate_device_t4t(app, event.event);
+            break;
         case NfcProtocolMfClassic:
             nfc_maker_scene_save_generate_populate_device_mfc(app, event.event);
             break;