Преглед на файлове

Store approx SIO length

Eric Betts преди 2 години
родител
ревизия
6257bb3080
променени са 3 файла, в които са добавени 12 реда и са изтрити 5 реда
  1. 8 5
      sam_api.c
  2. 3 0
      seader_credential.c
  3. 1 0
      seader_credential.h

+ 8 - 5
sam_api.c

@@ -321,7 +321,7 @@ bool seader_unpack_pacs(Seader* seader, uint8_t* buf, size_t size) {
 
 
             memset(display, 0, sizeof(display));
             memset(display, 0, sizeof(display));
             if(seader_credential->sio[0] == 0x30) {
             if(seader_credential->sio[0] == 0x30) {
-                for(uint8_t i = 0; i < sizeof(seader_credential->sio); i++) {
+                for(uint8_t i = 0; i < seader_credential->sio_len; i++) {
                     snprintf(
                     snprintf(
                         display + (i * 2), sizeof(display), "%02x", seader_credential->sio[i]);
                         display + (i * 2), sizeof(display), "%02x", seader_credential->sio[i]);
                 }
                 }
@@ -478,22 +478,25 @@ void seader_capture_sio(BitBuffer* tx_buffer, BitBuffer* rx_buffer, SeaderCreden
     if(credential->type == SeaderCredentialTypePicopass) {
     if(credential->type == SeaderCredentialTypePicopass) {
         if(memcmp(buffer, read4Block6, len) == 0 && rxBuffer[0] == 0x30) {
         if(memcmp(buffer, read4Block6, len) == 0 && rxBuffer[0] == 0x30) {
             memcpy(credential->sio, rxBuffer, 32);
             memcpy(credential->sio, rxBuffer, 32);
+            credential->sio_len += 32;
         } else if(memcmp(buffer, read4Block10, len) == 0 && rxBuffer[0] == 0x30) {
         } else if(memcmp(buffer, read4Block10, len) == 0 && rxBuffer[0] == 0x30) {
             memcpy(credential->sio, rxBuffer, 32);
             memcpy(credential->sio, rxBuffer, 32);
+            credential->sio_len += 32;
         } else if(memcmp(buffer, read4Block9, len) == 0) {
         } else if(memcmp(buffer, read4Block9, len) == 0) {
             memcpy(credential->sio + 32, rxBuffer + 8, 24);
             memcpy(credential->sio + 32, rxBuffer + 8, 24);
+            credential->sio_len += 24;
         } else if(memcmp(buffer, read4Block13, len) == 0) {
         } else if(memcmp(buffer, read4Block13, len) == 0) {
             memcpy(credential->sio + 32, rxBuffer + 8, 24);
             memcpy(credential->sio + 32, rxBuffer + 8, 24);
+            credential->sio_len += 24;
         }
         }
     } else if(credential->type == SeaderCredentialType14A) {
     } else if(credential->type == SeaderCredentialType14A) {
         // Desfire EV1 passes SIO in the clear
         // Desfire EV1 passes SIO in the clear
         uint8_t desfire_read[] = {
         uint8_t desfire_read[] = {
             0x90, 0xbd, 0x00, 0x00, 0x07, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
             0x90, 0xbd, 0x00, 0x00, 0x07, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
         if(memcmp(buffer, desfire_read, len) == 0 && rxBuffer[0] == 0x30) {
         if(memcmp(buffer, desfire_read, len) == 0 && rxBuffer[0] == 0x30) {
-            memcpy(
-                credential->sio,
-                rxBuffer,
-                bit_buffer_get_size_bytes(rx_buffer) - 2); // -2 for the APDU response bytes
+            credential->sio_len =
+                bit_buffer_get_size_bytes(rx_buffer) - 2; // -2 for the APDU response bytes
+            memcpy(credential->sio, rxBuffer, credential->sio_len);
         }
         }
     }
     }
 }
 }

+ 3 - 0
seader_credential.c

@@ -71,6 +71,7 @@ static bool seader_credential_load(SeaderCredential* cred, FuriString* path, boo
 
 
         // Optional SIO/Diversifier
         // Optional SIO/Diversifier
         flipper_format_read_hex(file, "SIO", cred->sio, sizeof(cred->sio));
         flipper_format_read_hex(file, "SIO", cred->sio, sizeof(cred->sio));
+        cred->sio_len = sizeof(cred->sio); // No way to know real length;
         flipper_format_read_hex(file, "Diversifier", cred->diversifier, sizeof(cred->diversifier));
         flipper_format_read_hex(file, "Diversifier", cred->diversifier, sizeof(cred->diversifier));
         cred->diversifier_len = sizeof(cred->diversifier); // No way to know real length;
         cred->diversifier_len = sizeof(cred->diversifier); // No way to know real length;
 
 
@@ -363,6 +364,7 @@ bool seader_credential_save_agnostic(SeaderCredential* cred, const char* name) {
                file, "Credential", (uint8_t*)&swapped, sizeof(cred->credential)))
                file, "Credential", (uint8_t*)&swapped, sizeof(cred->credential)))
             break;
             break;
         if(cred->sio[0] == 0x30) {
         if(cred->sio[0] == 0x30) {
+            // TODO: update to writing sio_len bytes, when that value has been seen to work well
             if(!flipper_format_write_hex(file, "SIO", cred->sio, sizeof(cred->sio))) break;
             if(!flipper_format_write_hex(file, "SIO", cred->sio, sizeof(cred->sio))) break;
             if(!flipper_format_write_hex(
             if(!flipper_format_write_hex(
                    file, "Diversifier", cred->diversifier, cred->diversifier_len))
                    file, "Diversifier", cred->diversifier, cred->diversifier_len))
@@ -643,6 +645,7 @@ void seader_credential_clear(SeaderCredential* cred) {
     cred->bit_length = 0;
     cred->bit_length = 0;
     cred->type = SeaderCredentialTypeNone;
     cred->type = SeaderCredentialTypeNone;
     memset(cred->sio, 0, sizeof(cred->sio));
     memset(cred->sio, 0, sizeof(cred->sio));
+    cred->sio_len = 0;
     memset(cred->diversifier, 0, sizeof(cred->diversifier));
     memset(cred->diversifier, 0, sizeof(cred->diversifier));
     cred->diversifier_len = 0;
     cred->diversifier_len = 0;
     furi_string_reset(cred->load_path);
     furi_string_reset(cred->load_path);

+ 1 - 0
seader_credential.h

@@ -36,6 +36,7 @@ typedef struct {
     uint64_t credential;
     uint64_t credential;
     size_t bit_length;
     size_t bit_length;
     uint8_t sio[128];
     uint8_t sio[128];
+    uint8_t sio_len;
     uint8_t diversifier[8];
     uint8_t diversifier[8];
     uint8_t diversifier_len;
     uint8_t diversifier_len;
     SeaderCredentialType type;
     SeaderCredentialType type;