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

Load and persis diversified keys, adf, and adf response

Eric Betts 8 месяцев назад
Родитель
Сommit
25b51c27bb
4 измененных файлов с 49 добавлено и 3 удалено
  1. 22 0
      seos.c
  2. 2 0
      seos_common.h
  3. 17 3
      seos_emulator.c
  4. 8 0
      seos_reader.c

+ 22 - 0
seos.c

@@ -123,6 +123,9 @@ Seos* seos_alloc() {
     seos->dialogs = furi_record_open(RECORD_DIALOGS);
     seos->load_path = furi_string_alloc();
 
+    seos->credential.diversifier_len = 0;
+    seos->credential.sio_len = 0;
+    seos->credential.adf_oid_len = 0;
     seos->seos_emulator = seos_emulator_alloc(&seos->credential);
 
     seos->keys_loaded = seos_load_keys(seos);
@@ -239,6 +242,25 @@ bool seos_credential_save(Seos* seos, const char* dev_name) {
             break;
         if(!flipper_format_write_hex(file, "SIO", seos->credential.sio, seos->credential.sio_len))
             break;
+        if(!flipper_format_write_hex(
+               file, "Priv Key", seos->credential.priv_key, sizeof(seos->credential.priv_key)))
+            break;
+        if(!flipper_format_write_hex(
+               file, "Auth Key", seos->credential.auth_key, sizeof(seos->credential.auth_key)))
+            break;
+        if(seos->credential.adf_response[0] != 0) {
+            flipper_format_write_hex(
+                file,
+                "ADF Response",
+                seos->credential.adf_response,
+                sizeof(seos->credential.adf_response));
+        }
+        if(seos->credential.adf_oid_len > 0) {
+            flipper_format_write_uint32(
+                file, "ADF OID Length", (uint32_t*)&(seos->credential.adf_oid_len), 1);
+            flipper_format_write_hex(
+                file, "ADF OID", seos->credential.adf_oid, seos->credential.adf_oid_len);
+        }
 
         saved = true;
     } while(false);

+ 2 - 0
seos_common.h

@@ -57,6 +57,8 @@ typedef struct {
     size_t sio_len;
     uint8_t priv_key[16];
     uint8_t auth_key[16];
+    size_t adf_oid_len;
+    uint8_t adf_oid[32];
     uint8_t adf_response[72];
 } SeosCredential;
 

+ 17 - 3
seos_emulator.c

@@ -32,9 +32,14 @@ SeosEmulator* seos_emulator_alloc(SeosCredential* credential) {
     SeosEmulator* seos_emulator = malloc(sizeof(SeosEmulator));
     memset(seos_emulator, 0, sizeof(SeosEmulator));
 
-    // Using DES for greater compatibilty
-    seos_emulator->params.cipher = TWO_KEY_3DES_CBC_MODE;
-    seos_emulator->params.hash = SHA1;
+    if(credential->adf_response[0] == 0) {
+        // Using DES for greater compatibilty
+        seos_emulator->params.cipher = TWO_KEY_3DES_CBC_MODE;
+        seos_emulator->params.hash = SHA1;
+    } else {
+        seos_emulator->params.cipher = credential->adf_response[2];
+        seos_emulator->params.hash = credential->adf_response[3];
+    }
 
     memset(seos_emulator->params.rndICC, 0x0d, sizeof(seos_emulator->params.rndICC));
     memset(seos_emulator->params.rNonce, 0x0c, sizeof(seos_emulator->params.rNonce));
@@ -150,6 +155,15 @@ static bool
             "ADF Response",
             seos_emulator->credential->adf_response,
             sizeof(seos_emulator->credential->adf_response));
+
+        flipper_format_read_uint32(
+            file, "ADF OID Length", (uint32_t*)&(seos_emulator->credential->adf_oid_len), 1);
+        flipper_format_read_hex(
+            file,
+            "ADF OID",
+            seos_emulator->credential->adf_oid,
+            seos_emulator->credential->adf_oid_len);
+
         parsed = true;
     } while(false);
 

+ 8 - 0
seos_reader.c

@@ -260,6 +260,11 @@ bool seos_reader_select_adf_response(
     }
     params->cipher = rx_data[2];
     params->hash = rx_data[3];
+    memset(credential->adf_response, 0, sizeof(credential->adf_response));
+    memcpy(
+        credential->adf_response,
+        rx_data,
+        bit_buffer_get_size_bytes(rx_buffer) - offset - sizeof(success));
 
     size_t bufLen = 0;
     uint8_t clear[0x40];
@@ -425,6 +430,9 @@ NfcCommand seos_state_machine(Seos* seos, Iso14443_4aPoller* iso14443_4a_poller)
         if(ret == NfcCommandStop) break;
 
         if(seos_reader_request_sio(seos_reader)) {
+            SeosCredential* credential = seos_reader->credential;
+            credential->adf_oid_len = SEOS_ADF_OID_LEN;
+            memcpy(credential->adf_oid, SEOS_ADF_OID, sizeof(credential->adf_oid));
             view_dispatcher_send_custom_event(seos->view_dispatcher, SeosCustomEventReaderSuccess);
         }