Quellcode durchsuchen

NFC Maker: Generate SLIX files

Willy-JL vor 9 Monaten
Ursprung
Commit
c2d0b0431d
3 geänderte Dateien mit 98 neuen und 0 gelöschten Zeilen
  1. 26 0
      nfc_maker/nfc_maker.c
  2. 7 0
      nfc_maker/nfc_maker.h
  3. 65 0
      nfc_maker/scenes/nfc_maker_scene_save_generate.c

+ 26 - 0
nfc_maker/nfc_maker.c

@@ -81,6 +81,32 @@ const CardDef cards[CardMAX] = {
             .protocol = NfcProtocolMfClassic,
             .generator = NfcDataGeneratorTypeMfClassic4k_7b,
         },
+
+    // Slix (size excludes first block which is Capability Container)
+    [CardSlix] =
+        {
+            .name = "SLIX (108B)",
+            .size = (28 - 1) * SLIX_BLOCK_SIZE,
+            .protocol = NfcProtocolSlix,
+        },
+    [CardSlixS] =
+        {
+            .name = "SLIX-S (156B)",
+            .size = (40 - 1) * SLIX_BLOCK_SIZE,
+            .protocol = NfcProtocolSlix,
+        },
+    [CardSlixL] =
+        {
+            .name = "SLIX-L (28B)",
+            .size = (8 - 1) * SLIX_BLOCK_SIZE,
+            .protocol = NfcProtocolSlix,
+        },
+    [CardSlix2] =
+        {
+            .name = "SLIX2 (316B)",
+            .size = (80 - 1) * SLIX_BLOCK_SIZE,
+            .protocol = NfcProtocolSlix,
+        },
 };
 
 static bool nfc_maker_custom_event_callback(void* context, uint32_t event) {

+ 7 - 0
nfc_maker/nfc_maker.h

@@ -33,6 +33,7 @@ extern const Icon I_WarningDolphinFlip_45x42;
 #endif
 #include <lib/nfc/protocols/mf_ultralight/mf_ultralight.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>
 
 #define MAC_INPUT_LEN   (GAP_MAC_ADDR_SIZE)
@@ -59,6 +60,12 @@ typedef enum {
     CardMfClassic4K4b,
     CardMfClassic4K7b,
 
+    // Slix
+    CardSlix,
+    CardSlixS,
+    CardSlixL,
+    CardSlix2,
+
     CardMAX,
 } Card;
 typedef struct {

+ 65 - 0
nfc_maker/scenes/nfc_maker_scene_save_generate.c

@@ -369,6 +369,68 @@ static void nfc_maker_scene_save_generate_populate_device_mfc(NfcMaker* app, Car
     mf_classic_free(data);
 }
 
+static void nfc_maker_scene_save_generate_populate_device_slix(NfcMaker* app, Card card_type) {
+    SlixData* data = slix_alloc();
+
+    size_t block_count = 0;
+    data->iso15693_3_data->system_info.flags =
+        ISO15693_3_SYSINFO_FLAG_DSFID | ISO15693_3_SYSINFO_FLAG_AFI |
+        ISO15693_3_SYSINFO_FLAG_MEMORY | ISO15693_3_SYSINFO_FLAG_IC_REF;
+    uint8_t uid[8];
+    furi_hal_random_fill_buf(uid, sizeof(uid));
+    uid[0] = 0xE0; // All ISO15693-3 cards must have this as first UID byte
+    uid[1] = 0x04; // NXP manufacturer code
+
+    switch(card_type) {
+    case CardSlix:
+        block_count = 28;
+        uid[2] = 0x01; // ICODE Type
+        uid[3] &= ~(0x03 << 3);
+        uid[3] |= 0x02 << 3; // Type Indicator
+        break;
+    case CardSlixS:
+        block_count = 40;
+        uid[2] = 0x02; // ICODE Type
+        break;
+    case CardSlixL:
+        block_count = 8;
+        uid[2] = 0x03; // ICODE Type
+        break;
+    case CardSlix2:
+        block_count = 80;
+        uid[2] = 0x01; // ICODE Type
+        uid[3] &= ~(0x03 << 3);
+        uid[3] |= 0x01 << 3; // Type Indicator
+        break;
+    default:
+        break;
+    }
+
+    slix_set_uid(data, uid, sizeof(uid));
+    const size_t block_size = SLIX_BLOCK_SIZE;
+    const size_t data_area = block_count * block_size;
+    data->iso15693_3_data->system_info.block_size = block_size;
+    data->iso15693_3_data->system_info.block_count = block_count;
+    simple_array_init(data->iso15693_3_data->block_data, data_area);
+    simple_array_init(data->iso15693_3_data->block_security, block_count);
+
+    uint8_t* blocks = simple_array_get_data(data->iso15693_3_data->block_data);
+    memcpy(&blocks[1 * block_size], app->ndef_buffer, app->ndef_size);
+
+    // https://community.nxp.com/pwmxy87654/attachments/pwmxy87654/nfc/7583/1/EEOL_2011FEB16_EMS_RFD_AN_01.pdf
+    // Format Capability Container
+    blocks[0] = 0xE1; // NFC Magic Number
+    blocks[1] = 0x40; // 0x4X: Version 1, 0xX0: Full R/W access
+    blocks[2] = data_area / 8; // Data Area Size: Total byte size / 8
+    blocks[3] = 0x01; // MBREAD: Supports Multiple Block Read command
+
+    free(app->ndef_buffer);
+    app->ndef_buffer = NULL;
+
+    nfc_device_set_data(app->nfc_device, NfcProtocolSlix, data);
+    slix_free(data);
+}
+
 void nfc_maker_scene_save_generate_submenu_callback(void* context, uint32_t index) {
     NfcMaker* app = context;
     view_dispatcher_send_custom_event(app->view_dispatcher, index);
@@ -414,6 +476,9 @@ bool nfc_maker_scene_save_generate_on_event(void* context, SceneManagerEvent eve
         case NfcProtocolMfClassic:
             nfc_maker_scene_save_generate_populate_device_mfc(app, event.event);
             break;
+        case NfcProtocolSlix:
+            nfc_maker_scene_save_generate_populate_device_slix(app, event.event);
+            break;
         default:
             break;
         }