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

Prevent crash scanning an NTAG215 with the MFC choice

Eric Betts 1 год назад
Родитель
Сommit
1d9cf6c569
1 измененных файлов с 15 добавлено и 13 удалено
  1. 15 13
      sam_api.c

+ 15 - 13
sam_api.c

@@ -1099,19 +1099,7 @@ NfcCommand seader_worker_card_detect(
     OCTET_STRING_t atqa_string = {.buf = atqa, .size = 2};
     OCTET_STRING_t atqa_string = {.buf = atqa, .size = 2};
     uint8_t protocol_bytes[] = {0x00, 0x00};
     uint8_t protocol_bytes[] = {0x00, 0x00};
 
 
-    if(sak == 0 && atqa == NULL) { // picopass
-        protocol_bytes[1] = FrameProtocol_iclass;
-        OCTET_STRING_fromBuf(
-            &cardDetails->protocol, (const char*)protocol_bytes, sizeof(protocol_bytes));
-        memcpy(credential->diversifier, uid, uid_len);
-        credential->diversifier_len = uid_len;
-        credential->isDesfire = false;
-    } else if(atqa == 0) { // MFC
-        protocol_bytes[1] = FrameProtocol_nfc;
-        OCTET_STRING_fromBuf(
-            &cardDetails->protocol, (const char*)protocol_bytes, sizeof(protocol_bytes));
-        cardDetails->sak = &sak_string;
-    } else { // type 4
+    if(sak != 0 && atqa != NULL) { // type 4
         protocol_bytes[1] = FrameProtocol_nfc;
         protocol_bytes[1] = FrameProtocol_nfc;
         OCTET_STRING_fromBuf(
         OCTET_STRING_fromBuf(
             &cardDetails->protocol, (const char*)protocol_bytes, sizeof(protocol_bytes));
             &cardDetails->protocol, (const char*)protocol_bytes, sizeof(protocol_bytes));
@@ -1122,6 +1110,20 @@ NfcCommand seader_worker_card_detect(
             memcpy(credential->diversifier, uid, uid_len);
             memcpy(credential->diversifier, uid, uid_len);
             credential->diversifier_len = uid_len;
             credential->diversifier_len = uid_len;
         }
         }
+    } else if(sak != 0 && atqa == NULL) { // MFC
+        protocol_bytes[1] = FrameProtocol_nfc;
+        OCTET_STRING_fromBuf(
+            &cardDetails->protocol, (const char*)protocol_bytes, sizeof(protocol_bytes));
+        cardDetails->sak = &sak_string;
+    } else if(uid_len == 8) { // picopass
+        protocol_bytes[1] = FrameProtocol_iclass;
+        OCTET_STRING_fromBuf(
+            &cardDetails->protocol, (const char*)protocol_bytes, sizeof(protocol_bytes));
+        memcpy(credential->diversifier, uid, uid_len);
+        credential->diversifier_len = uid_len;
+        credential->isDesfire = false;
+    } else {
+        FURI_LOG_D(TAG, "Unknown card type");
     }
     }
 
 
     seader_send_card_detected(seader, cardDetails);
     seader_send_card_detected(seader, cardDetails);