Explorar el Código

Merge passy from https://github.com/bettse/passy

Willy-JL hace 9 meses
padre
commit
e1247ae33d

+ 3 - 0
passy/.catalog/changelog.md

@@ -1,3 +1,6 @@
+## 1.2
+ - Fix bug with detecting wrong protocol
+ - Confirmed British passport support
 ## 1.1
  - ISO14443a-4 support for French passports (Thanks @luu176)
 ## 1.0

BIN
passy/.catalog/screenshots/read_success.png


+ 1 - 1
passy/application.fam

@@ -8,7 +8,7 @@ App(
     stack_size=2 * 1024,
     fap_category="NFC",
     # Optional values
-    fap_version="1.1",
+    fap_version="1.2",
     fap_icon="passy.png",  # 10x10 1-bit PNG
     fap_description="eMRTD Reader",
     fap_author="bettse",

+ 1 - 0
passy/passy_i.h

@@ -51,6 +51,7 @@ enum PassyCustomEvent {
     // Read card events
     PassyCustomEventReaderError,
     PassyCustomEventReaderSuccess,
+    PassyCustomEventReaderRestart,
     PassyCustomEventReaderDetected,
     PassyCustomEventReaderAuthenticated,
     PassyCustomEventReaderReading,

+ 4 - 3
passy/passy_reader.c

@@ -95,7 +95,7 @@ NfcCommand passy_reader_send(PassyReader* passy_reader) {
         Iso14443_4aPoller* iso14443_4a_poller = passy_reader->iso14443_4a_poller;
         Iso14443_4aError error;
 
-        // passy_log_bitbuffer(TAG, "NFC transmit", tx_buffer);
+        passy_log_bitbuffer(TAG, "NFC transmit", tx_buffer);
         error = iso14443_4a_poller_send_block(iso14443_4a_poller, tx_buffer, rx_buffer);
         if(error != Iso14443_4aErrorNone) {
             FURI_LOG_W(TAG, "iso14443_4a_poller_send_block error %d", error);
@@ -105,7 +105,7 @@ NfcCommand passy_reader_send(PassyReader* passy_reader) {
         Iso14443_4bPoller* iso14443_4b_poller = passy_reader->iso14443_4b_poller;
         Iso14443_4bError error;
 
-        // passy_log_bitbuffer(TAG, "NFC transmit", tx_buffer);
+        passy_log_bitbuffer(TAG, "NFC transmit", tx_buffer);
         error = iso14443_4b_poller_send_block(iso14443_4b_poller, tx_buffer, rx_buffer);
         if(error != Iso14443_4bErrorNone) {
             FURI_LOG_W(TAG, "iso14443_4b_poller_send_block error %d", error);
@@ -113,7 +113,7 @@ NfcCommand passy_reader_send(PassyReader* passy_reader) {
         }
     }
     bit_buffer_reset(tx_buffer);
-    // passy_log_bitbuffer(TAG, "NFC response", rx_buffer);
+    passy_log_bitbuffer(TAG, "NFC response", rx_buffer);
 
     // Check SW
     size_t length = bit_buffer_get_size_bytes(rx_buffer);
@@ -293,6 +293,7 @@ NfcCommand passy_reader_read_binary(
     }
 
     secure_messaging_unwrap_rapdu(passy_reader->secure_messaging, passy_reader->rx_buffer);
+    passy_log_bitbuffer(TAG, "NFC response (decrypted)", passy_reader->rx_buffer);
     const uint8_t* decrypted_data = bit_buffer_get_data(passy_reader->rx_buffer);
     memcpy(output_buffer, decrypted_data, Le);
 

+ 2 - 0
passy/scenes/passy_scene_advanced_menu.c

@@ -115,6 +115,8 @@ void passy_scene_advanced_menu_on_enter(void* context) {
     free(com);
     com = 0;
 
+    submenu_set_selected_item(
+        submenu, scene_manager_get_scene_state(passy->scene_manager, PassySceneAdvancedMenu));
     view_dispatcher_switch_to_view(passy->view_dispatcher, PassyViewMenu);
 }
 

+ 2 - 0
passy/scenes/passy_scene_main_menu.c

@@ -56,6 +56,8 @@ void passy_scene_main_menu_on_enter(void* context) {
             passy);
     }
 
+    submenu_set_selected_item(
+        submenu, scene_manager_get_scene_state(passy->scene_manager, PassySceneMainMenu));
     view_dispatcher_switch_to_view(passy->view_dispatcher, PassyViewMenu);
 }
 

+ 13 - 4
passy/scenes/passy_scene_read.c

@@ -9,6 +9,7 @@ static PassyReader* passy_reader = NULL;
 void passy_scene_detect_scan_callback(NfcScannerEvent event, void* context) {
     furi_assert(context);
     Passy* passy = context;
+    passy->proto = NULL;
 
     // detect the type of protocol, either 4a/4b and then run the specific poller callback functions yada yada yada
     if(event.type == NfcScannerEventTypeDetected) {
@@ -17,10 +18,15 @@ void passy_scene_detect_scan_callback(NfcScannerEvent event, void* context) {
         } else if(event.data.protocols && *event.data.protocols == NfcProtocolIso14443_4b) {
             passy->proto = "4b";
         } else {
-            passy->proto = "";
-            // just continue as expected..
+            FURI_LOG_E(TAG, "Unknown protocol detected, %d", *event.data.protocols);
+        }
+        if(passy->proto && strlen(passy->proto) > 0) {
+            view_dispatcher_send_custom_event(
+                passy->view_dispatcher, PassyCustomEventReaderDetected);
+        } else {
+            view_dispatcher_send_custom_event(
+                passy->view_dispatcher, PassyCustomEventReaderRestart);
         }
-        view_dispatcher_send_custom_event(passy->view_dispatcher, PassyCustomEventReaderDetected);
     }
 }
 
@@ -58,6 +64,10 @@ bool passy_scene_read_on_event(void* context, SceneManagerEvent event) {
             passy->last_sw = passy_reader->last_sw;
             scene_manager_next_scene(passy->scene_manager, PassySceneReadError);
             consumed = true;
+        } else if(event.event == PassyCustomEventReaderRestart) {
+            nfc_scanner_stop(passy->scanner);
+            nfc_scanner_start(passy->scanner, passy_scene_detect_scan_callback, passy);
+            consumed = true;
         } else if(event.event == PassyCustomEventReaderDetected) {
             nfc_scanner_stop(passy->scanner);
             nfc_scanner_free(passy->scanner);
@@ -66,7 +76,6 @@ bool passy_scene_read_on_event(void* context, SceneManagerEvent event) {
                 FURI_LOG_I(TAG, "detected 4B protocol");
                 passy->poller = nfc_poller_alloc(passy->nfc, NfcProtocolIso14443_4b);
                 passy_reader = passy_reader_alloc(passy);
-                FURI_LOG_I(TAG, "mhm");
                 nfc_poller_start(passy->poller, passy_reader_poller_callback, passy_reader);
                 passy->bytes_total = 0;
             } else if(strcmp(passy->proto, "4a") == 0) {