Quellcode durchsuchen

Track sam command sent for better response handling

Eric Betts vor 1 Jahr
Ursprung
Commit
5c13f3588a
4 geänderte Dateien mit 48 neuen und 34 gelöschten Zeilen
  1. 2 2
      ccid.c
  2. 44 31
      sam_api.c
  3. 1 0
      seader_i.h
  4. 1 1
      seader_worker.h

+ 2 - 2
ccid.c

@@ -309,7 +309,7 @@ size_t seader_ccid_process(Seader* seader, uint8_t* cmd, size_t cmd_len) {
                     FURI_LOG_I(TAG, "SAM ATR!");
                     FURI_LOG_I(TAG, "SAM ATR!");
                     hasSAM = true;
                     hasSAM = true;
                     sam_slot = message.bSlot;
                     sam_slot = message.bSlot;
-                    seader_worker_send_version(seader_worker);
+                    seader_worker_send_version(seader);
                     if(seader_worker->callback) {
                     if(seader_worker->callback) {
                         seader_worker->callback(
                         seader_worker->callback(
                             SeaderWorkerEventSamPresent, seader_worker->context);
                             SeaderWorkerEventSamPresent, seader_worker->context);
@@ -318,7 +318,7 @@ size_t seader_ccid_process(Seader* seader, uint8_t* cmd, size_t cmd_len) {
                     FURI_LOG_I(TAG, "SAM ATR2!");
                     FURI_LOG_I(TAG, "SAM ATR2!");
                     hasSAM = true;
                     hasSAM = true;
                     sam_slot = message.bSlot;
                     sam_slot = message.bSlot;
-                    seader_worker_send_version(seader_worker);
+                    seader_worker_send_version(seader);
                     if(seader_worker->callback) {
                     if(seader_worker->callback) {
                         seader_worker->callback(
                         seader_worker->callback(
                             SeaderWorkerEventSamPresent, seader_worker->context);
                             SeaderWorkerEventSamPresent, seader_worker->context);

+ 44 - 31
sam_api.c

@@ -232,7 +232,10 @@ void seader_send_response(
     ASN_STRUCT_FREE(asn_DEF_Payload, payload);
     ASN_STRUCT_FREE(asn_DEF_Payload, payload);
 }
 }
 
 
-void sendRequestPacs(SeaderUartBridge* seader_uart) {
+void seader_send_request_pacs(Seader* seader) {
+    SeaderWorker* seader_worker = seader->worker;
+    SeaderUartBridge* seader_uart = seader_worker->uart;
+
     RequestPacs_t* requestPacs = 0;
     RequestPacs_t* requestPacs = 0;
     requestPacs = calloc(1, sizeof *requestPacs);
     requestPacs = calloc(1, sizeof *requestPacs);
     assert(requestPacs);
     assert(requestPacs);
@@ -244,6 +247,8 @@ void sendRequestPacs(SeaderUartBridge* seader_uart) {
     assert(samCommand);
     assert(samCommand);
 
 
     samCommand->present = SamCommand_PR_requestPacs;
     samCommand->present = SamCommand_PR_requestPacs;
+    seader->samCommand = samCommand->present;
+
     samCommand->choice.requestPacs = *requestPacs;
     samCommand->choice.requestPacs = *requestPacs;
 
 
     Payload_t* payload = 0;
     Payload_t* payload = 0;
@@ -260,13 +265,16 @@ void sendRequestPacs(SeaderUartBridge* seader_uart) {
     ASN_STRUCT_FREE(asn_DEF_Payload, payload);
     ASN_STRUCT_FREE(asn_DEF_Payload, payload);
 }
 }
 
 
-void seader_worker_send_serial_number(SeaderWorker* seader_worker) {
+void seader_worker_send_serial_number(Seader* seader) {
+    SeaderWorker* seader_worker = seader->worker;
     SeaderUartBridge* seader_uart = seader_worker->uart;
     SeaderUartBridge* seader_uart = seader_worker->uart;
+
     SamCommand_t* samCommand = 0;
     SamCommand_t* samCommand = 0;
     samCommand = calloc(1, sizeof *samCommand);
     samCommand = calloc(1, sizeof *samCommand);
     assert(samCommand);
     assert(samCommand);
 
 
     samCommand->present = SamCommand_PR_serialNumber;
     samCommand->present = SamCommand_PR_serialNumber;
+    seader->samCommand = samCommand->present;
 
 
     Payload_t* payload = 0;
     Payload_t* payload = 0;
     payload = calloc(1, sizeof *payload);
     payload = calloc(1, sizeof *payload);
@@ -281,13 +289,16 @@ void seader_worker_send_serial_number(SeaderWorker* seader_worker) {
     ASN_STRUCT_FREE(asn_DEF_Payload, payload);
     ASN_STRUCT_FREE(asn_DEF_Payload, payload);
 }
 }
 
 
-void seader_worker_send_version(SeaderWorker* seader_worker) {
+void seader_worker_send_version(Seader* seader) {
+    SeaderWorker* seader_worker = seader->worker;
+
     SeaderUartBridge* seader_uart = seader_worker->uart;
     SeaderUartBridge* seader_uart = seader_worker->uart;
     SamCommand_t* samCommand = 0;
     SamCommand_t* samCommand = 0;
     samCommand = calloc(1, sizeof *samCommand);
     samCommand = calloc(1, sizeof *samCommand);
     assert(samCommand);
     assert(samCommand);
 
 
     samCommand->present = SamCommand_PR_version;
     samCommand->present = SamCommand_PR_version;
+    seader->samCommand = samCommand->present;
 
 
     Payload_t* payload = 0;
     Payload_t* payload = 0;
     payload = calloc(1, sizeof *payload);
     payload = calloc(1, sizeof *payload);
@@ -302,7 +313,9 @@ void seader_worker_send_version(SeaderWorker* seader_worker) {
     ASN_STRUCT_FREE(asn_DEF_Payload, payload);
     ASN_STRUCT_FREE(asn_DEF_Payload, payload);
 }
 }
 
 
-void seader_send_card_detected(SeaderUartBridge* seader_uart, CardDetails_t* cardDetails) {
+void seader_send_card_detected(Seader* seader, CardDetails_t* cardDetails) {
+    SeaderWorker* seader_worker = seader->worker;
+    SeaderUartBridge* seader_uart = seader_worker->uart;
     CardDetected_t* cardDetected = 0;
     CardDetected_t* cardDetected = 0;
     cardDetected = calloc(1, sizeof *cardDetected);
     cardDetected = calloc(1, sizeof *cardDetected);
     assert(cardDetected);
     assert(cardDetected);
@@ -314,6 +327,7 @@ void seader_send_card_detected(SeaderUartBridge* seader_uart, CardDetails_t* car
     assert(samCommand);
     assert(samCommand);
 
 
     samCommand->present = SamCommand_PR_cardDetected;
     samCommand->present = SamCommand_PR_cardDetected;
+    seader->samCommand = samCommand->present;
     samCommand->choice.cardDetected = *cardDetected;
     samCommand->choice.cardDetected = *cardDetected;
 
 
     Payload_t* payload = 0;
     Payload_t* payload = 0;
@@ -505,33 +519,37 @@ bool seader_parse_serial_number(Seader* seader, uint8_t* buf, size_t size) {
 
 
 bool seader_parse_sam_response(Seader* seader, SamResponse_t* samResponse) {
 bool seader_parse_sam_response(Seader* seader, SamResponse_t* samResponse) {
     SeaderWorker* seader_worker = seader->worker;
     SeaderWorker* seader_worker = seader->worker;
-    SeaderUartBridge* seader_uart = seader_worker->uart;
 
 
-    if(samResponse->size == 0) {
-        if(requestPacs) {
-            FURI_LOG_D(TAG, "samResponse %d => requesting PACS", samResponse->size);
-            sendRequestPacs(seader_uart);
-            requestPacs = false;
-        } else {
-            FURI_LOG_D(
-                TAG, "samResponse %d, PACS already requested, pushing view", samResponse->size);
-            view_dispatcher_send_custom_event(
-                seader->view_dispatcher, SeaderCustomEventWorkerExit);
-        }
-    } else if(seader_parse_version(seader_worker, samResponse->buf, samResponse->size)) {
-        seader_worker_send_serial_number(seader_worker);
-        // checking requestPacs to make sure we ignore messages at the end of the crednetial request.
-        //TODO: refactor this to track what request was sent to better know what request to expect back
-    } else if(requestPacs && seader_parse_serial_number(seader, samResponse->buf, samResponse->size)) {
-        // no-op
-    } else if(seader_unpack_pacs(seader, samResponse->buf, samResponse->size)) {
+    switch (seader->samCommand) {
+      case SamCommand_PR_requestPacs:
+        FURI_LOG_I(TAG, "samResponse SamCommand_PR_requestPacs");
+        seader_unpack_pacs(seader, samResponse->buf, samResponse->size);
         view_dispatcher_send_custom_event(seader->view_dispatcher, SeaderCustomEventPollerSuccess);
         view_dispatcher_send_custom_event(seader->view_dispatcher, SeaderCustomEventPollerSuccess);
-    } else {
+        seader->samCommand = SamCommand_PR_NOTHING;
+        break;
+      case SamCommand_PR_version:
+        FURI_LOG_I(TAG, "samResponse SamCommand_PR_version");
+        seader_parse_version(seader_worker, samResponse->buf, samResponse->size);
+        seader_worker_send_serial_number(seader);
+        break;
+      case SamCommand_PR_serialNumber:
+        FURI_LOG_I(TAG, "samResponse SamCommand_PR_serialNumber");
+        seader_parse_serial_number(seader, samResponse->buf, samResponse->size);
+        seader->samCommand = SamCommand_PR_NOTHING;
+        break;
+      case SamCommand_PR_cardDetected:
+        FURI_LOG_I(TAG, "samResponse SamCommand_PR_cardDetected");
+        seader_send_request_pacs(seader);
+        break;
+      case SamCommand_PR_NOTHING:
+        FURI_LOG_I(TAG, "samResponse SamCommand_PR_NOTHING");
         memset(display, 0, sizeof(display));
         memset(display, 0, sizeof(display));
         for(uint8_t i = 0; i < samResponse->size; i++) {
         for(uint8_t i = 0; i < samResponse->size; i++) {
             snprintf(display + (i * 2), sizeof(display), "%02x", samResponse->buf[i]);
             snprintf(display + (i * 2), sizeof(display), "%02x", samResponse->buf[i]);
         }
         }
-        FURI_LOG_D(TAG, "Unknown samResponse %d: %s", samResponse->size, display);
+        FURI_LOG_I(TAG, "Unknown samResponse %d: %s", samResponse->size, display);
+        view_dispatcher_send_custom_event(seader->view_dispatcher, SeaderCustomEventWorkerExit);
+        break;
     }
     }
 
 
     return false;
     return false;
@@ -875,11 +893,6 @@ NfcCommand seader_worker_card_detect(
     UNUSED(ats);
     UNUSED(ats);
     UNUSED(ats_len);
     UNUSED(ats_len);
 
 
-    // We're telling the SAM we've seen a new card, so reset out requestPacs check
-    requestPacs = true;
-
-    SeaderWorker* seader_worker = seader->worker;
-    SeaderUartBridge* seader_uart = seader_worker->uart;
     SeaderCredential* credential = seader->credential;
     SeaderCredential* credential = seader->credential;
 
 
     CardDetails_t* cardDetails = 0;
     CardDetails_t* cardDetails = 0;
@@ -912,7 +925,7 @@ NfcCommand seader_worker_card_detect(
         }
         }
     }
     }
 
 
-    seader_send_card_detected(seader_uart, cardDetails);
+    seader_send_card_detected(seader, cardDetails);
 
 
     ASN_STRUCT_FREE(asn_DEF_CardDetails, cardDetails);
     ASN_STRUCT_FREE(asn_DEF_CardDetails, cardDetails);
     return NfcCommandContinue;
     return NfcCommandContinue;

+ 1 - 0
seader_i.h

@@ -93,6 +93,7 @@ struct Seader {
     SceneManager* scene_manager;
     SceneManager* scene_manager;
     SeaderUartBridge* uart;
     SeaderUartBridge* uart;
     SeaderCredential* credential;
     SeaderCredential* credential;
+    SamCommand_PR samCommand;
 
 
     char text_store[SEADER_TEXT_STORE_SIZE + 1];
     char text_store[SEADER_TEXT_STORE_SIZE + 1];
     FuriString* text_box_store;
     FuriString* text_box_store;

+ 1 - 1
seader_worker.h

@@ -62,7 +62,7 @@ void seader_worker_start(
 
 
 void seader_worker_stop(SeaderWorker* seader_worker);
 void seader_worker_stop(SeaderWorker* seader_worker);
 bool seader_worker_process_sam_message(Seader* seader, CCID_Message* message);
 bool seader_worker_process_sam_message(Seader* seader, CCID_Message* message);
-void seader_worker_send_version(SeaderWorker* seader_worker);
+void seader_worker_send_version(Seader* seader);
 
 
 NfcCommand seader_worker_poller_callback_iso14443_4a(NfcGenericEvent event, void* context);
 NfcCommand seader_worker_poller_callback_iso14443_4a(NfcGenericEvent event, void* context);