Просмотр исходного кода

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

Willy-JL 1 год назад
Родитель
Сommit
e6d5a160ce

+ 22 - 2
seader/ccid.c

@@ -19,12 +19,21 @@ uint8_t getSequence(uint8_t slot) {
     return sequence[slot]++;
     return sequence[slot]++;
 }
 }
 
 
-size_t seader_ccid_add_lrc(uint8_t* data, size_t len) {
+uint8_t seader_ccid_calc_lrc(uint8_t* data, size_t len) {
     uint8_t lrc = 0;
     uint8_t lrc = 0;
     for(size_t i = 0; i < len; i++) {
     for(size_t i = 0; i < len; i++) {
         lrc ^= data[i];
         lrc ^= data[i];
     }
     }
-    data[len] = lrc;
+    return lrc;
+}
+
+bool seader_ccid_validate_lrc(uint8_t* data, size_t len) {
+    uint8_t lrc = seader_ccid_calc_lrc(data, len - 1);
+    return lrc == data[len - 1];
+}
+
+size_t seader_ccid_add_lrc(uint8_t* data, size_t len) {
+    data[len] = seader_ccid_calc_lrc(data, len);
     return len + 1;
     return len + 1;
 }
 }
 
 
@@ -234,10 +243,21 @@ size_t seader_ccid_process(Seader* seader, uint8_t* cmd, size_t cmd_len) {
         }
         }
 
 
         if(cmd_len < 2 + 10 + message.dwLength + 1) {
         if(cmd_len < 2 + 10 + message.dwLength + 1) {
+            // Incomplete
             return message.consumed;
             return message.consumed;
         }
         }
         message.consumed += 2 + 10 + message.dwLength + 1;
         message.consumed += 2 + 10 + message.dwLength + 1;
 
 
+        if(seader_ccid_validate_lrc(cmd, 2 + 10 + message.dwLength + 1) == false) {
+            FURI_LOG_W(
+                TAG,
+                "Invalid LRC.  Recv: %02x vs Calc: %02x",
+                cmd[2 + 10 + message.dwLength + 1],
+                seader_ccid_calc_lrc(cmd, 2 + 10 + message.dwLength));
+            // TODO: Should I respond with an error?
+            return message.consumed;
+        }
+
         /*
         /*
         if(message.dwLength == 0) {
         if(message.dwLength == 0) {
             FURI_LOG_D(
             FURI_LOG_D(

+ 4 - 0
seader/scenes/seader_scene_read_14a.c

@@ -32,6 +32,10 @@ bool seader_scene_read_14a_on_event(void* context, SceneManagerEvent event) {
             seader->credential->type = SeaderCredentialType14A;
             seader->credential->type = SeaderCredentialType14A;
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
             consumed = true;
             consumed = true;
+        } else if(event.event == SeaderCustomEventPollerDetect) {
+            Popup* popup = seader->popup;
+            popup_set_header(popup, "DON'T\nMOVE", 68, 30, AlignLeft, AlignTop);
+            consumed = true;
         } else if(event.event == SeaderCustomEventPollerSuccess) {
         } else if(event.event == SeaderCustomEventPollerSuccess) {
             seader->credential->type = SeaderCredentialType14A;
             seader->credential->type = SeaderCredentialType14A;
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);

+ 2 - 0
seader/scenes/seader_scene_read_card_success.c

@@ -43,6 +43,8 @@ void seader_scene_read_card_success_on_enter(void* context) {
             furi_string_set(type_str, "14443A");
             furi_string_set(type_str, "14443A");
         } else if(credential->type == SeaderCredentialTypePicopass) {
         } else if(credential->type == SeaderCredentialTypePicopass) {
             furi_string_set(type_str, "Picopass");
             furi_string_set(type_str, "Picopass");
+        } else if(credential->type == SeaderCredentialTypeMifareClassic) {
+            furi_string_set(type_str, "Mifare Classic");
         } else {
         } else {
             furi_string_set(type_str, "");
             furi_string_set(type_str, "");
         }
         }

+ 4 - 0
seader/scenes/seader_scene_read_mfc.c

@@ -36,6 +36,10 @@ bool seader_scene_read_mfc_on_event(void* context, SceneManagerEvent event) {
             seader->credential->type = SeaderCredentialTypeMifareClassic;
             seader->credential->type = SeaderCredentialTypeMifareClassic;
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
             consumed = true;
             consumed = true;
+        } else if(event.event == SeaderCustomEventPollerDetect) {
+            Popup* popup = seader->popup;
+            popup_set_header(popup, "DON'T\nMOVE", 68, 30, AlignLeft, AlignTop);
+            consumed = true;
         } else if(event.event == SeaderCustomEventPollerSuccess) {
         } else if(event.event == SeaderCustomEventPollerSuccess) {
             seader->credential->type = SeaderCredentialTypeMifareClassic;
             seader->credential->type = SeaderCredentialTypeMifareClassic;
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);

+ 4 - 0
seader/scenes/seader_scene_read_picopass.c

@@ -31,6 +31,10 @@ bool seader_scene_read_picopass_on_event(void* context, SceneManagerEvent event)
             seader->credential->type = SeaderCredentialTypePicopass;
             seader->credential->type = SeaderCredentialTypePicopass;
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
             consumed = true;
             consumed = true;
+        } else if(event.event == SeaderCustomEventPollerDetect) {
+            Popup* popup = seader->popup;
+            popup_set_header(popup, "DON'T\nMOVE", 68, 30, AlignLeft, AlignTop);
+            consumed = true;
         } else if(event.event == SeaderCustomEventPollerSuccess) {
         } else if(event.event == SeaderCustomEventPollerSuccess) {
             seader->credential->type = SeaderCredentialTypePicopass;
             seader->credential->type = SeaderCredentialTypePicopass;
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);

+ 1 - 0
seader/seader_i.h

@@ -71,6 +71,7 @@ enum SeaderCustomEvent {
     SeaderCustomEventByteInputDone,
     SeaderCustomEventByteInputDone,
     SeaderCustomEventTextInputDone,
     SeaderCustomEventTextInputDone,
 
 
+    SeaderCustomEventPollerDetect,
     SeaderCustomEventPollerSuccess,
     SeaderCustomEventPollerSuccess,
 };
 };
 
 

+ 8 - 0
seader/seader_worker.c

@@ -265,6 +265,9 @@ NfcCommand seader_worker_poller_callback_iso14443_4a(NfcGenericEvent event, void
 
 
     if(iso14443_4a_event->type == Iso14443_4aPollerEventTypeReady) {
     if(iso14443_4a_event->type == Iso14443_4aPollerEventTypeReady) {
         if(seader_worker->stage == SeaderPollerEventTypeCardDetect) {
         if(seader_worker->stage == SeaderPollerEventTypeCardDetect) {
+            view_dispatcher_send_custom_event(
+                seader->view_dispatcher, SeaderCustomEventPollerDetect);
+
             nfc_device_set_data(
             nfc_device_set_data(
                 seader->nfc_device, NfcProtocolIso14443_4a, nfc_poller_get_data(seader->poller));
                 seader->nfc_device, NfcProtocolIso14443_4a, nfc_poller_get_data(seader->poller));
 
 
@@ -321,6 +324,9 @@ NfcCommand seader_worker_poller_callback_mfc(NfcGenericEvent event, void* contex
 
 
     if(mfc_event->type == MfClassicPollerEventTypeSuccess) {
     if(mfc_event->type == MfClassicPollerEventTypeSuccess) {
         if(seader_worker->stage == SeaderPollerEventTypeCardDetect) {
         if(seader_worker->stage == SeaderPollerEventTypeCardDetect) {
+            view_dispatcher_send_custom_event(
+                seader->view_dispatcher, SeaderCustomEventPollerDetect);
+
             const MfClassicData* mfc_data = nfc_poller_get_data(seader->poller);
             const MfClassicData* mfc_data = nfc_poller_get_data(seader->poller);
             uint8_t sak = iso14443_3a_get_sak(mfc_data->iso14443_3a_data);
             uint8_t sak = iso14443_3a_get_sak(mfc_data->iso14443_3a_data);
             size_t uid_len = 0;
             size_t uid_len = 0;
@@ -356,6 +362,8 @@ NfcCommand seader_worker_poller_callback_picopass(PicopassPollerEvent event, voi
         seader_worker->stage = SeaderPollerEventTypeCardDetect;
         seader_worker->stage = SeaderPollerEventTypeCardDetect;
     } else if(event.type == PicopassPollerEventTypeSuccess) {
     } else if(event.type == PicopassPollerEventTypeSuccess) {
         if(seader_worker->stage == SeaderPollerEventTypeCardDetect) {
         if(seader_worker->stage == SeaderPollerEventTypeCardDetect) {
+            view_dispatcher_send_custom_event(
+                seader->view_dispatcher, SeaderCustomEventPollerDetect);
             uint8_t* csn = picopass_poller_get_csn(instance);
             uint8_t* csn = picopass_poller_get_csn(instance);
             seader_worker_card_detect(seader, 0, NULL, csn, sizeof(PicopassSerialNum), NULL, 0);
             seader_worker_card_detect(seader, 0, NULL, csn, sizeof(PicopassSerialNum), NULL, 0);
             furi_thread_set_current_priority(FuriThreadPriorityLowest);
             furi_thread_set_current_priority(FuriThreadPriorityLowest);