Eric Betts 9 месяцев назад
Родитель
Сommit
e2b18f49f2
4 измененных файлов с 46 добавлено и 1 удалено
  1. 0 1
      scenes/seos_scene_emulate.c
  2. 10 0
      scenes/seos_scene_start.c
  3. 1 0
      seos_common.h
  4. 35 0
      seos_emulator.c

+ 0 - 1
scenes/seos_scene_emulate.c

@@ -13,7 +13,6 @@ void seos_scene_emulate_on_enter(void* context) {
     popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61);
 
     nfc_device_load(seos->nfc_device, APP_ASSETS_PATH("seos.nfc"));
-    FURI_LOG_I(TAG, "file loaded");
 
     const Iso14443_4aData* data = nfc_device_get_data(seos->nfc_device, NfcProtocolIso14443_4a);
     seos->listener = nfc_listener_alloc(seos->nfc, NfcProtocolIso14443_4a, data);

+ 10 - 0
scenes/seos_scene_start.c

@@ -9,6 +9,7 @@ enum SubmenuIndex {
     SubmenuIndexScannerMenu,
     SubmenuIndexBLECredInterrogate,
     SubmenuIndexAbout,
+    SubmenuIndexInspect,
 };
 
 static SeosHci* seos_hci = NULL;
@@ -49,6 +50,9 @@ void seos_scene_start_on_update(void* context) {
             seos);
             */
     }
+    submenu_add_item(
+        submenu, "Inspect", SubmenuIndexInspect, seos_scene_start_submenu_callback, seos);
+
     submenu_add_item(submenu, "About", SubmenuIndexAbout, seos_scene_start_submenu_callback, seos);
 
     submenu_set_selected_item(
@@ -99,6 +103,12 @@ bool seos_scene_start_on_event(void* context, SceneManagerEvent event) {
             scene_manager_set_scene_state(seos->scene_manager, SeosSceneStart, SubmenuIndexSaved);
             scene_manager_next_scene(seos->scene_manager, SeosSceneFileSelect);
             consumed = true;
+        } else if(event.event == SubmenuIndexInspect) {
+            scene_manager_set_scene_state(
+                seos->scene_manager, SeosSceneStart, SubmenuIndexInspect);
+            seos->flow_mode = FLOW_INSPECT;
+            scene_manager_next_scene(seos->scene_manager, SeosSceneEmulate);
+            consumed = true;
         } else if(event.event == SubmenuIndexAbout) {
             scene_manager_set_scene_state(seos->scene_manager, SeosSceneStart, SubmenuIndexAbout);
             scene_manager_next_scene(seos->scene_manager, SeosSceneAbout);

+ 1 - 0
seos_common.h

@@ -39,6 +39,7 @@ typedef enum {
     FLOW_CRED,
     FLOW_READER_SCANNER,
     FLOW_CRED_SCANNER,
+    FLOW_INSPECT,
 } FlowMode;
 
 typedef enum {

+ 35 - 0
seos_emulator.c

@@ -483,6 +483,36 @@ void seos_emulator_select_adf(
     seos_log_bitbuffer(TAG, "Select ADF (0xcd02...)", tx_buffer);
 }
 
+NfcCommand seos_worker_listener_inspect_reader(Seos* seos) {
+    SeosEmulator* seos_emulator = seos->seos_emulator;
+    BitBuffer* tx_buffer = seos_emulator->tx_buffer;
+    NfcCommand ret = NfcCommandContinue;
+
+    const uint8_t* rx_data = bit_buffer_get_data(seos_emulator->rx_buffer);
+    bool NAD = (rx_data[0] & NAD_MASK) == NAD_MASK;
+    uint8_t offset = NAD ? 2 : 1;
+
+    // + x to skip stuff before APDU
+    const uint8_t* apdu = rx_data + offset;
+
+    if(memcmp(apdu, select_header, sizeof(select_header)) == 0) {
+        if(memcmp(
+               apdu + sizeof(select_header) + 1, OPERATION_SELECTOR, sizeof(OPERATION_SELECTOR)) ==
+           0) {
+            uint8_t enableInspection[] = {
+                0x6f, 0x08, 0x85, 0x06, 0x02, 0x01, 0x40, 0x02, 0x01, 0x00};
+
+            bit_buffer_append_bytes(tx_buffer, enableInspection, sizeof(enableInspection));
+            view_dispatcher_send_custom_event(seos->view_dispatcher, SeosCustomEventAIDSelected);
+        }
+    } else if(bit_buffer_get_size_bytes(seos_emulator->rx_buffer) > offset) {
+        FURI_LOG_I(TAG, "NFC stop");
+        ret = NfcCommandStop;
+    }
+
+    return ret;
+}
+
 NfcCommand seos_worker_listener_process_message(Seos* seos) {
     SeosEmulator* seos_emulator = seos->seos_emulator;
     BitBuffer* tx_buffer = seos_emulator->tx_buffer;
@@ -651,6 +681,8 @@ NfcCommand seos_worker_listener_callback(NfcGenericEvent event, void* context) {
 
         if(seos->flow_mode == FLOW_CRED) {
             ret = seos_worker_listener_process_message(seos);
+        } else if(seos->flow_mode == FLOW_INSPECT) {
+            ret = seos_worker_listener_inspect_reader(seos);
         }
 
         if(bit_buffer_get_size_bytes(seos_emulator->tx_buffer) >
@@ -693,5 +725,8 @@ NfcCommand seos_worker_listener_callback(NfcGenericEvent event, void* context) {
         break;
     }
 
+    if(ret == NfcCommandStop) {
+        view_dispatcher_send_custom_event(seos->view_dispatcher, SeosCustomEventReaderError);
+    }
     return ret;
 }